@elevasis/ui 2.32.0 → 2.33.1

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 (91) hide show
  1. package/dist/app/index.d.ts +3 -0
  2. package/dist/app/index.js +3 -3
  3. package/dist/{chunk-LLRXA7D7.js → chunk-2VYMDNJ3.js} +1 -1
  4. package/dist/{chunk-7KZINJLP.js → chunk-3YZRKADM.js} +4 -4
  5. package/dist/{chunk-MOY4VOHF.js → chunk-4AAZXKLL.js} +1 -1
  6. package/dist/{chunk-RQTWIXJ5.js → chunk-53436UTQ.js} +1 -1
  7. package/dist/{chunk-WQPX44YM.js → chunk-AV2TKVVV.js} +673 -168
  8. package/dist/chunk-CLDCYJQT.js +1 -0
  9. package/dist/chunk-DWXDNT7P.js +145 -0
  10. package/dist/{chunk-T35FWDAB.js → chunk-DYIDXUJS.js} +1089 -158
  11. package/dist/{chunk-IQHU7O5Y.js → chunk-F3MXFE72.js} +1 -1
  12. package/dist/{chunk-5FJJ72HU.js → chunk-FOUYP4JX.js} +1 -1
  13. package/dist/{chunk-QQHOKTJA.js → chunk-H6EFQP2P.js} +39 -2
  14. package/dist/{chunk-5J4PDX26.js → chunk-KW7ZNQD7.js} +16 -2
  15. package/dist/{chunk-ZQOKIGZP.js → chunk-NCEQGEW5.js} +4 -4
  16. package/dist/{chunk-6DWD423K.js → chunk-PIS24NIV.js} +1 -1
  17. package/dist/{chunk-4MFNGNHF.js → chunk-QVTIOT73.js} +2 -2
  18. package/dist/{chunk-GCOQ3TBG.js → chunk-SWMQTF2H.js} +2 -2
  19. package/dist/{chunk-4QK76KIF.js → chunk-UNVRVCXZ.js} +1 -1
  20. package/dist/{chunk-VRNMNB3O.js → chunk-UYRT7SPM.js} +1 -1
  21. package/dist/{chunk-IZWTVFJ2.js → chunk-V6SZ4ECN.js} +6 -3
  22. package/dist/{chunk-YLQEVSOR.js → chunk-WGUEIGPC.js} +202 -54
  23. package/dist/{chunk-QXCDKE2O.js → chunk-WJOE76FI.js} +9 -28
  24. package/dist/{chunk-QTI3KC7D.js → chunk-YENKDBUU.js} +106 -43
  25. package/dist/components/index.d.ts +117 -4
  26. package/dist/components/index.js +24 -23
  27. package/dist/components/navigation/index.js +4 -3
  28. package/dist/execution/index.d.ts +8 -3
  29. package/dist/features/auth/index.d.ts +3 -0
  30. package/dist/features/clients/index.js +8 -7
  31. package/dist/features/crm/index.d.ts +3 -0
  32. package/dist/features/crm/index.js +10 -9
  33. package/dist/features/dashboard/index.d.ts +113 -3
  34. package/dist/features/dashboard/index.js +9 -8
  35. package/dist/features/delivery/index.d.ts +3 -0
  36. package/dist/features/delivery/index.js +9 -8
  37. package/dist/features/knowledge/index.js +8 -18
  38. package/dist/features/lead-gen/index.js +10 -9
  39. package/dist/features/monitoring/index.js +10 -9
  40. package/dist/features/monitoring/requests/index.d.ts +2 -2
  41. package/dist/features/monitoring/requests/index.js +8 -7
  42. package/dist/features/operations/index.d.ts +560 -93
  43. package/dist/features/operations/index.js +13 -12
  44. package/dist/features/settings/index.d.ts +3 -0
  45. package/dist/features/settings/index.js +9 -8
  46. package/dist/hooks/delivery/index.d.ts +3 -0
  47. package/dist/hooks/index.d.ts +210 -6
  48. package/dist/hooks/index.js +8 -7
  49. package/dist/hooks/operations/command-view/utils/transformCommandViewData.d.ts +205 -4
  50. package/dist/hooks/published.d.ts +210 -6
  51. package/dist/hooks/published.js +8 -7
  52. package/dist/index.d.ts +565 -95
  53. package/dist/index.js +8 -7
  54. package/dist/initialization/index.d.ts +3 -0
  55. package/dist/knowledge/index.d.ts +577 -215
  56. package/dist/knowledge/index.js +1180 -689
  57. package/dist/knowledge-search-index-P7PR626V.js +1514 -0
  58. package/dist/layout/index.js +1 -1
  59. package/dist/profile/index.d.ts +3 -0
  60. package/dist/provider/index.d.ts +447 -73
  61. package/dist/provider/index.js +7 -6
  62. package/dist/provider/published.d.ts +447 -73
  63. package/dist/provider/published.js +5 -4
  64. package/dist/supabase/index.d.ts +6 -0
  65. package/dist/types/index.d.ts +208 -4
  66. package/dist/utils/index.d.ts +113 -3
  67. package/package.json +39 -39
  68. package/src/README.md +29 -29
  69. package/src/api/README.md +18 -18
  70. package/src/app/README.md +24 -24
  71. package/src/auth/README.md +18 -18
  72. package/src/components/README.md +24 -24
  73. package/src/execution/README.md +16 -16
  74. package/src/features/README.md +28 -28
  75. package/src/graph/README.md +16 -16
  76. package/src/hooks/README.md +23 -23
  77. package/src/initialization/README.md +19 -19
  78. package/src/knowledge/README.md +31 -31
  79. package/src/organization/README.md +18 -18
  80. package/src/profile/README.md +19 -19
  81. package/src/provider/README.md +32 -32
  82. package/src/router/README.md +18 -18
  83. package/src/sse/README.md +13 -13
  84. package/src/test-utils/README.md +7 -7
  85. package/src/theme/README.md +23 -23
  86. package/src/theme/presets/README.md +19 -19
  87. package/src/types/README.md +16 -16
  88. package/src/utils/README.md +18 -18
  89. package/src/zustand/README.md +18 -18
  90. package/dist/chunk-UROTM5OR.js +0 -172
  91. package/dist/knowledge-search-index-5KYPO746.js +0 -1479
@@ -1,1479 +0,0 @@
1
- import './chunk-I2KLQ2HA.js';
2
-
3
- // src/knowledge/_generated/knowledge-search-index.json
4
- var knowledge_search_index_default = [
5
- {
6
- id: "knowledge.outreach-playbook",
7
- title: "Outreach Sequence Playbook",
8
- summary: "Step-by-step runbook for launching a cold outreach campaign: prospect sourcing, copy review, sending schedule, and reply handling.",
9
- bodyText: "Overview\n\nThis playbook covers the end-to-end process for launching a cold outreach campaign using the Elevasis lead-gen pipeline.\n\nSteps\n\n1. Source prospects via the Lead Gen feature.\n2. Review and approve copy in the CRM campaign editor.\n3. Schedule sends using the Task Scheduler.\n4. Monitor replies in the CRM inbox and route to the appropriate deal stage."
10
- },
11
- {
12
- id: "knowledge.lead-gen-strategy",
13
- title: "Lead Gen Targeting Strategy",
14
- summary: "Defines ICP signal prioritization, firmographic filters, and scoring thresholds used by the lead-gen pipeline.",
15
- bodyText: "Strategy\n\nThe lead-gen pipeline targets SMBs with 10-200 employees in recession-resistant verticals (manufacturing, logistics, professional services). Firmographic filters: revenue \\>$1M, HQ in US/CA/AU, tech stack includes at least one SaaS CRM.\n\nScoring Thresholds\n\n- High priority: ICP score \\>= 80\n- Medium priority: ICP score 60-79\n- Low priority: \\< 60 (excluded from active outreach)"
16
- },
17
- {
18
- id: "knowledge.org-model-reference",
19
- title: "Organization Model Schema Reference",
20
- summary: "Technical reference for the OrganizationModel Zod schema: all top-level domains, the graph contract orientation, authored primitives versus projected graph nodes, and versioning rules.",
21
- bodyText: "Schema\n\nThe OrganizationModel schema is defined in packages/core/src/organization-model/schema.ts. It is versioned at version: 1 and composed from domain sub-schemas. The OM is the authoritative contract for the organization: downstream surfaces including Command View, the Knowledge Browser, and the navigation shell are all derived projections from this schema.\n\nTop-Level Domains\n\nThese are the current top-level fields on OrganizationModel. There is no live features or capabilities top-level field -- those terms are legacy wording and should not appear as authored OM primitives.\n\n- version -- schema version, currently locked at 1\n- domainMetadata -- per-domain version and lastModified tracking\n- branding -- organization name, logo, color identity\n- navigation -- surfaces, groups, and defaultSurfaceId for shell routing\n- sales -- sales domain including pipeline entity references\n- prospecting -- lead generation stages, entity references, and pipeline config\n- projects -- project, milestone, and task entity references\n- identity -- organization identity fields\n- customers -- customer segment definitions\n- offerings -- product and service definitions linked to customer segments\n- roles -- role definitions with reportsToId hierarchy and agentId holder support\n- goals -- OKR-style objectives with period ranges and system links\n- systems -- the backbone: hierarchical bounded contexts with dotted IDs and parentSystemId\n- resources -- governance descriptors for workflows, agents, integrations, triggers, and scripts; resource identity lives here, not in a separate deployment manifest\n- actions -- the invokable semantic layer; actions map to resources, affect entities, bind to knowledge, and expose invocation types (slash command, MCP tool, API endpoint, script execution)\n- entities -- business objects owned by systems, with table metadata, state catalogs, and typed entity links\n- policies -- governance rules applied to systems, actions, resources, and roles\n- statuses -- runtime semantic status registry\n- knowledge -- first-class OM content backed by inline nodes and MDX source nodes\n\nGraph Contract\n\nThe OM is projected into a typed graph by buildOrganizationGraph() in packages/core/src/organization-model/graph/build.ts.\n\nNode kinds: organization, system, role, action, entity, event, policy, stage, resource, knowledge\n\nEdge kinds: contains, references, mapsto, uses, governs, links, affects, emits, originatesfrom, triggers, appliesto, effects\n\nThe resourceType overlay on resource nodes is a separate enum: workflow, agent, trigger, integration, external, humancheckpoint, script.\n\nAuthored Primitives vs Projected Graph Nodes\n\nAuthored primitives are what you write directly in the OM: systems, roles, resources, actions, entities, policies, knowledge. The graph builder reads these and emits a richer set of typed nodes and edges. Events, for example, are not authored directly -- they are projected from resource emits declarations. Stages are projected from prospecting stage catalogs.\n\nCommand View\n\nCommand View is a derived operational projection of the OM graph. It visualizes systems, resources, actions, entities, and relationships using the same node and edge taxonomy as buildOrganizationGraph(). It does not have a separate deployment manifest model -- the OM resources domain is the single source of resource identity."
22
- },
23
- {
24
- id: "knowledge.seo-lead-gen-playbook",
25
- title: "SEO-to-Lead-Gen Handoff Playbook",
26
- summary: "Runbook for promoting SEO-qualified prospects into the active lead-gen pipeline: signal capture, scoring override, and campaign assignment.",
27
- bodyText: "Overview\n\nThis playbook governs the handoff from SEO-sourced traffic to the lead-gen pipeline.\n\nSteps\n\n1. SEO feature captures visitor signal (form fill or intent data).\n2. Score the lead using the standard ICP scoring thresholds.\n3. If score \\>= 60, inject into the lead-gen prospect list.\n4. Assign to the appropriate outreach campaign in the CRM."
28
- },
29
- {
30
- id: "knowledge.outreach-campaign-playbook",
31
- title: "Campaign Playbook",
32
- summary: "Codified rules, benchmarks, and standard operating procedures for Instantly cold email campaigns -- testing methodology, personalization tiers, sequence structure, optimization loop, and batch readiness queries.",
33
- bodyText: 'Benchmarks\n\nB2B cold email benchmarks (2025-2026). Use these as evaluation thresholds when running ist-analytics-workflow.\n\n| Metric | Bad | Needs Work | Good | Excellent |\n| --- | --- | --- | --- | --- |\n| Open Rate | \\<20% | 20-30% | 30-45% | 45%+ |\n| Reply Rate | \\<1% | 1-3% | 3-8% | 8%+ |\n| Positive Reply Rate | \\<0.5% | 0.5-1% | 1-3% | 3%+ |\n| Bounce Rate | \\>5% | 2-5% | 1-2% | \\<1% |\n\nCampaign Sizing Rules\n\n- 100-200 contacts per campaign segment -- small enough for meaningful personalization, large enough for statistical learning\n- 1-2 contacts per company -- reply rates drop from 8% to 4% when blasting 10+ people at the same company\n- 30-50 emails/day max per sending account\n- 50-100 emails/day total during testing (weeks 1-4), scaling to 500+/day once a winning formula is found\n\nTesting Priority\n\n1. Subject lines -- highest leverage, easiest to isolate\n2. Opening line / hook -- determines if they keep reading\n3. CTA type -- meeting request vs. soft question vs. value offer\n4. Body copy angle -- pain-point framing vs. benefit lead vs. social proof\n5. Send timing -- Tuesday-Thursday outperform Monday/Friday for B2B\n\nSequence Structure\n\n3 emails total (1 opener + 2 follow-ups). 87-95% of replies come within the first 3 emails.\n\n| Step | Timing | Strategy |\n| --- | --- | --- |\n| Email 1 | Day 0 | Cold read opener + EMRG social proof + interest-based CTA |\n| Email 2 | Day 3 | Short bump in same thread |\n| Email 3 | Day 5 | Breakup email. Soft close, loss aversion |\n\nAgent Optimization Loop\n\nPhase 1 (Launch): Verify batch readiness \u2192 Personalize \u2192 Create campaign \u2192 Create tracking list \u2192 Upload \u2192 Activate\n\nPhase 2 (Analyze Day 7-14): Run ist-campaign-review-workflow \u2192 Run ist-analytics-workflow \u2192 Interpret results\n\nPhase 3 (Optimize): Fix based on Phase 2 analysis (subject lines, personalization, bounce cleanup)\n\nPhase 4 (Scale): Document winning combination \u2192 Replicate to new segments \u2192 Maintain hygiene\n\nOffer Framing\n\n"We find one bottleneck, build an AI solution to fix it, and you only pay if it actually saves you time or makes you money."\n\n- Never use "free" in subject lines -- triggers spam filters\n- Frame as conditional, not charitable\n- Low-commitment CTAs get 2x more replies than direct meeting requests'
34
- },
35
- {
36
- id: "knowledge.outreach-copy-strategy",
37
- title: "Copy Strategy",
38
- summary: "Reusable email copy framework, tone rules, personalization input guidance, subject line patterns, and offer framing for cold outreach campaigns.",
39
- bodyText: `Base reference for writing and evaluating campaign copy. Batch-specific email text lives in each batch tracker's Campaign Strategy section.
40
-
41
- Offer
42
-
43
- Core message: "We find one bottleneck in your business, build an AI solution to fix it, and you only pay if it actually saves you time or makes you money."
44
-
45
- - Never use "free" in subject lines or body copy
46
- - Frame as conditional, not charitable
47
- - Don't mention pricing in outreach
48
-
49
- Tone
50
-
51
- - Voice: First person singular ("I" not "we")
52
- - Register: Conversational, direct, no jargon
53
- - Formatting: Plain text only. No bold, no links in body, no HTML
54
-
55
- 3-Email Sequence Framework
56
-
57
- Email 1 \u2014 Hook + Offer (Day 0, 80 words)
58
-
59
- Hi {{firstName | there}},
60
-
61
- {{openingline}}
62
-
63
- {{categorypain}}
64
-
65
- I built 4 automations for a company that worked with Google and Sony Music. The first one alone saved them over $1,500 a month. I do the same thing for businesses like yours \u2014 you only pay if it actually works.
66
-
67
- Worth a quick look?
68
-
69
- {{sendingAccountFirstName}}
70
-
71
- Email 2 \u2014 Bump (Day 3, 40 words)
72
-
73
- Hi {{firstName | there}},
74
-
75
- Wanted to circle back on this \u2014 I've been helping a few companies like {{companyName}} free up their team by automating the repetitive stuff that eats up the day.
76
-
77
- Happy to take a 10-minute look \u2014 no pitch, just observations.
78
-
79
- {{sendingAccountFirstName}}
80
-
81
- Email 3 \u2014 Breakup (Day 5, 25 words)
82
-
83
- Totally understand if this isn't the right time. If you ever want a second pair of eyes on what could be automated at {{companyName}}, the offer stands.
84
-
85
- {{sendingAccountFirstName}}
86
-
87
- Subject Lines
88
-
89
- | Variant | Subject | Pattern |
90
- | --- | --- | --- |
91
- | A | quick thought | Colleague-camo |
92
- | B | about {{companyName}} | Observation-trigger |
93
-
94
- - Target 21-40 characters
95
- - Personalized subjects: 46% open rate vs 35% without
96
- - No "free," "guaranteed," "urgent," "risk-free"`
97
- },
98
- {
99
- id: "knowledge.personalization-strategy",
100
- title: "Personalization Strategy",
101
- summary: "4-tier personalization waterfall, workflow inputs, quality rules, diagnostic process, and vertical adaptation for cold outreach opening line generation.",
102
- bodyText: `How we generate personalized opening lines for Email 1. The ist-personalization-workflow produces ONLY the opening line.
103
-
104
- 4-Tier Waterfall
105
-
106
- | Tier | Name | Trigger | Expected Reply Rate |
107
- | --- | --- | --- | --- |
108
- | 1 | Individual Signal | contact.enrichmentData.linkedin.summary exists | 10-15% |
109
- | 2 | Company Signal | Company has businessDescription OR services[] | 5-10% |
110
- | 3 | Basic Context | Company has categoryName OR category | 3-5% |
111
- | 4 | Minimal | Only company name and/or contact title | 1-3% |
112
-
113
- Workflow Inputs
114
-
115
- | Input | Purpose |
116
- | --- | --- |
117
- | batchId | Which contacts to personalize |
118
- | emailBody | Rest of Email 1 after {openingline} |
119
- | industryContext | Audience framing for LLM |
120
- | creativeDirection | Override default creative guidance |
121
- | performanceContext | Feedback from campaign results |
122
- | overwrite | Re-personalize existing opening lines |
123
-
124
- Quality Rules
125
-
126
- Core principle: Wrong personalization is worse than none. Accuracy > depth.
127
-
128
- Opening Line Style: Cold Read
129
-
130
- The opening line must earn attention through recognition, not create tension through a pitch setup. Take one real fact from enrichment data and make an observation that shows you actually looked at their business.
131
-
132
- Good examples:
133
- - "4,400 reviews since 2018 \u2014 that kind of growth in Orange County is honestly wild."
134
- - "60 years family-owned with a proprietary Clean Green method \u2014 that's rare in pest control."
135
-
136
- Anti-patterns:
137
- - "You do termite inspections \u2014 how many follow-up calls get missed?" (Implication \u2014 signals selling)
138
- - "Great company you've built!" (Generic flattery)`
139
- },
140
- {
141
- id: "knowledge.vertical-messaging-playbook",
142
- title: "Vertical Messaging Playbook",
143
- summary: "Research-backed messaging strategy per vertical \u2014 verified claims, owner voice, language guides, pain point framing, and copy guidelines for outreach messaging.",
144
- bodyText: `Purpose
145
-
146
- Reference doc for writing and evaluating vertical-specific outreach copy. Captures verified research, owner voice and language, and per-vertical messaging strategy.
147
-
148
- Grounded Relatability Strategy
149
-
150
- Layer 1: Claim Verification
151
- Web-research every statistical claim. Grade each as Tier 1 (Verified), Tier 2 (Plausible), or Tier 3 (Unverified). Drop or soften anything Tier 3.
152
-
153
- Layer 2: Voice-of-Customer Research
154
- Search Reddit, trade forums, and industry communities for how owners actually talk about their frustrations.
155
-
156
- Layer 3: Scenario-First Copy
157
- Combine verified claims with owner language to write copy that sounds like a peer, not a vendor:
158
- 1. Lead with the scenario
159
- 2. Use their vocabulary
160
- 3. Reinforce with stats only if they pass the "would I trust this from a stranger?" test
161
- 4. Name concrete capabilities
162
-
163
- Universal Owner Patterns
164
-
165
- - The Identity Gap: They started the business to do the craft. Acknowledging this resonates deeply.
166
- - Phone = Business: The owner's phone IS the business.
167
- - Software Cynicism: Every vertical has been sold to aggressively by SaaS vendors.
168
-
169
- Words That Work Everywhere: "Stop losing...", "Without lifting a finger", "Less software, not more"
170
-
171
- Words That Fail Everywhere: "AI-powered", "Scale your business", "Digital transformation"
172
-
173
- Copy Principles
174
-
175
- Lead with Scenarios, Not Statistics
176
-
177
- | Weak (stat-first) | Strong (scenario-first) |
178
- | --- | --- |
179
- | "78% of homeowners hire the first contractor who responds." | "When you're on a job, you can't answer the phone \u2014 but the homeowner already called two other plumbers." |
180
-
181
- Claim Strength Tiers:
182
- - Tier 1 (Verified): Named source, specific methodology. Use confidently.
183
- - Tier 2 (Plausible): Widely cited, directionally correct. Use the insight, soften the specific number.
184
- - Tier 3 (Unverified): No credible source found. Do not use specific numbers.`
185
- },
186
- {
187
- id: "knowledge.cold-email-research-2026",
188
- title: "Copy Research (March 2026)",
189
- summary: "Cold email research findings from 2025-2026 benchmark reports, A/B test data, and industry studies \u2014 reply rates, subject lines, CTAs, sequence structure, social proof, and vertical-specific angles.",
190
- bodyText: `Research findings that inform our copy strategy and campaign decisions. Sourced from Instantly's 2026 Benchmark Report (3M+ emails), industry studies, and platform data.
191
-
192
- Last researched: 2026-03-18
193
-
194
- Reply Rate Benchmarks (2026)
195
-
196
- | Tier | Reply Rate | What It Takes |
197
- | --- | --- | --- |
198
- | Average B2B | 3.4% | Basic targeting, template emails |
199
- | Top quartile | 5.5% | Segmentation + follow-ups |
200
- | Top performers | 10%+ | Signal-based personalization + tight ICP |
201
- | Best-in-class | 15-25% | Hyper-personalization + intent signals |
202
-
203
- Advanced personalization doubles reply rates: 18% vs 9% for generic.
204
-
205
- Email Length
206
-
207
- - Under 80 words = 2.4x higher reply rate than emails over 200 words
208
- - Sweet spot: 50-125 words
209
-
210
- Subject Lines
211
-
212
- 21-40 characters = 49.1% open rate -- long enough to communicate value, short enough for mobile.
213
-
214
- - Personalized subject lines: 46% open rate vs 35% without
215
- - Numbers in subject lines: 113% improvement in open rates
216
- - Questions in subject lines: 21% increase in open rates
217
- - Lowercase always -- title case reads as marketing email
218
-
219
- CTA Research
220
-
221
- - Interest-based CTAs: 30% success rate -- 2x any other type
222
- - Timeline-based CTAs ("Worth 15 minutes this week?"): 3.4x meeting rate vs problem-based
223
- - Keep Email 1 CTA short -- one sentence max
224
-
225
- Sequence Length
226
-
227
- 87-95% of replies come within the first 3 emails. Additional emails triple spam complaints without meaningful reply lift (Belkins, 16.5M emails).`
228
- },
229
- {
230
- id: "knowledge.bounce-recovery-protocol",
231
- title: "Bounce Recovery Protocol",
232
- summary: `Step-by-step protocol for handling campaigns that enter Instantly's "Bounces" status, including cleanup mechanics, root cause investigation, and decision framework for continuing vs. restarting.`,
233
- bodyText: `When to Use
234
-
235
- A campaign enters Instantly's "Bounces" status (typically \\>5% bounce rate).
236
-
237
- Key Mechanics
238
-
239
- Bounce Rate Is Historical: Instantly's bounce rate = bounced / sent. Removing bounced leads does not retroactively reduce the rate.
240
-
241
- What ist-cleanup-workflow does:
242
- - Stop sequence: marks lead as "not interested" in Instantly
243
- - Mark invalid in Lead DB: excludes from all future uploads
244
- - Delete from Instantly (only with removeFromInstantly: true)
245
-
246
- Protocol
247
-
248
- Step 1: Pause the Campaign
249
- bash
250
- pnpm exec elevasis --prod exec Elevasis/ist-campaign-pause-workflow --input '{"campaignId":"<campaign-id>"}'
251
-
252
- Step 2: Dry-Run Cleanup
253
- bash
254
- pnpm exec elevasis --prod exec Elevasis/ist-cleanup-workflow --input '{"campaignIds":["<campaign-id>"],"dryRun":true}' --async
255
-
256
- Step 3: Run Cleanup
257
- bash
258
- pnpm exec elevasis --prod exec Elevasis/ist-cleanup-workflow --input '{"campaignIds":["<id>"],"removeFromInstantly":true}' --async
259
-
260
- Step 4: Decide -- Continue or Restart
261
-
262
- | Scenario | Action |
263
- | --- | --- |
264
- | Most leads unsent (campaign was early) | Continue -- reactivate |
265
- | Most leads already received emails | Let it finish |
266
- | Bounce rate \\>10% or account health degraded | Restart -- fresh campaign |
267
-
268
- Step 5: Investigate Root Cause
269
-
270
- Common root causes: catch-all domains, stale data, verification false positives, generic/role addresses (info@, service@).
271
-
272
- Step 6: Update Batch Tracker
273
-
274
- Log bounce count, leads cleaned, root cause, and resolution in the batch tracker doc.`
275
- },
276
- {
277
- id: "knowledge.lead-gen-pipeline-playbook",
278
- title: "Lead-Gen Playbook",
279
- summary: "Empirical benchmarks, threshold guidance, provider economics, and codified learnings from 3 completed batches of the lead-gen pipeline.",
280
- bodyText: "Performance Benchmarks\n\nPer-stage success rates across the 3 completed Orange County batches (vet-1, auto-1, home-1).\n\nStage 1: Scrape (Raw to Filtered)\n\n| Metric | vet-1 | auto-1 | home-1 | Benchmark |\n| --- | --- | --- | --- | --- |\n| Raw results | 480 | 800 | 1000 | -- |\n| Companies created | 393 | 566 | 701 | -- |\n| Active in DB | 322 | 428 | 640 | -- |\n\nStage 3: Company Qualification Rate\n\n| Metric | vet-1 | auto-1 | home-1 | Benchmark |\n| --- | --- | --- | --- | --- |\n| Qualified | 213 (76%) | 284 (79%) | 326 (60%) | 60-80% |\n| Disqualified | 66 (24%) | 74 (21%) | 222 (40%) | 20-40% |\n\nStage 5: Email Verification\n\nVALID rate: 33-41% of discovered emails across batches. Target bounce rate \\<2%.\n\nModel Selection\n\nUse Gemini Flash models for high-volume qualification steps (cost/quality balance). Use GPT for personalization where quality matters most.\n\nProvider Economics\n\nTomba domain search provides the best cost-per-verified-contact for local SMBs. Dual-verify (Tomba + Mails.so) catches most false positives.\n\nPipeline Stages\n\n1. Scrape (Google Maps via Apify)\n2. LLM Extract (website crawl \u2192 structured data)\n3. Company Qualification (LLM ICP scoring)\n4. Email Discovery (Tomba domain search)\n5. Email Verification (Mails.so)\n6. Opening Line Generation (ist-personalization-workflow)\n7. Campaign Upload (ist-upload-workflow)"
281
- },
282
- {
283
- id: "knowledge.upwork-proposal-playbook",
284
- title: "Proposal Playbook",
285
- summary: "Data-backed strategies for writing winning Upwork proposals \u2014 structure, pricing, timing, client qualification, and benchmarks.",
286
- bodyText: `The Numbers That Matter
287
-
288
- | Metric | Benchmark |
289
- | --- | --- |
290
- | Personalized proposals | 30% higher reply rate vs generic |
291
- | Proposals within first 2 hours | 3x response rate vs 24h+ |
292
- | First-hour proposals | 3-5x interview rate boost |
293
-
294
- Proposal Structure
295
-
296
- Keep proposals 150-200 words, mobile-scannable.
297
-
298
- The Five-Part Formula
299
-
300
- 1. Hook (1-2 sentences) \u2014 Lead with what you do and why it's relevant. Never use "caught my attention" \u2014 overused clich\xE9.
301
- 2. Proof (1-2 sentences) \u2014 One concrete metric from past work.
302
- 3. Plan (2-3 lines) \u2014 Maximum 3 steps.
303
- 4. Discovery Questions (exactly 2) \u2014 Smart, role-specific questions. End with a binary CTA.
304
- 5. Sample (optional) \u2014 Loom video (2-3 min).
305
-
306
- Opening Lines
307
-
308
- The first line decides 80% of reply outcomes. Always use the client's name or company name.
309
-
310
- Good openers: "Hi \u2014 I build {whattheyneed} for a living and run my own business on them daily."
311
-
312
- Never open with: "The part that caught my attention..." / "What stood out..."
313
-
314
- Elevasis-Specific Positioning
315
-
316
- Dogfooding (Strongest Differentiator): We run our own 7-stage client acquisition pipeline on the platform: Scrape \u2192 Extract \u2192 Qualify \u2192 Email Discovery \u2192 Verify \u2192 Personalize \u2192 Outreach.
317
-
318
- The 4 Principles (Use in Discovery Questions):
319
- 1. Integrated \u2014 Works with existing tools
320
- 2. Improving \u2014 Learns from every human decision
321
- 3. Observable \u2014 Real-time visibility
322
- 4. Governed \u2014 Humans approve what matters`
323
- },
324
- {
325
- id: "knowledge.upwork-response-templates",
326
- title: "Response Templates",
327
- summary: "Templates and guidelines for responding to Upwork messages, offers, and client communications.",
328
- bodyText: `Offer Acceptance Response
329
-
330
- When a client sends an offer and invites a call:
331
- 1. Thank them for the offer (brief, no flattery)
332
- 2. Confirm the call with a specific day/time and timezone
333
- 3. Ask 2-3 qualifying questions to show engagement
334
- 4. Sign off with first name (Alex, not Alexander)
335
-
336
- Template
337
-
338
- Hi {name},
339
-
340
- Thanks for the offer and for reaching out, I'll book a time for {day} {time} ({timezone}). I look forward to learning more about your setup!
341
-
342
- Just a few questions:
343
- 1. {qualifying question about current tools/stack}
344
- 2. {qualifying question about current process/pain}
345
- 3. {qualifying question about scope/direction}
346
-
347
- Thanks!
348
- Alex
349
-
350
- Qualifying Question Bank
351
-
352
- - Current stack: "What do you currently use for workflows / automation?"
353
- - Pain points: "What's the most time-consuming repetitive task right now?"
354
- - Approval flow: "What do you currently use for approval control?"
355
- - Consolidation: "Are you using multiple tools or interested in custom software?"
356
- - Team size: "How many people will be using these workflows?"
357
- - Priority: "What's the first workflow you'd want built?"
358
-
359
- Style Rules
360
-
361
- - Tone: Warm but concise. No filler, no over-enthusiasm.
362
- - Length: 3-6 sentences max.
363
- - Timezone: Always specify timezone when confirming times (PDT/PST).
364
- - No selling: The call is for learning, not pitching.`
365
- },
366
- {
367
- id: "knowledge.seo-playbook",
368
- title: "SEO Playbook",
369
- summary: "Operational playbook for the SEO/AEO system \u2014 vertical launch workflow, content quality gates, AEO formatting rules, stale content management, metrics interpretation, and rollout phases.",
370
- bodyText: "Vertical Launch Workflow\n\nEnd-to-end process for launching a new vertical (e.g., hvac-contractors):\n\nStep 1: Research vertical data\n\nFind real, citable industry statistics: pain points, automation ROI, market context. Sources: trade associations, industry surveys, government data (BLS, Census).\n\nStep 2: Generate pages\n\nbash\nPillar page\npnpm tsx scripts/seo/generate-pages.ts --vertical hvac-contractors --type pillar --dry-run\npnpm tsx scripts/seo/generate-pages.ts --vertical hvac-contractors --type pillar\n\nCluster pages\npnpm tsx scripts/seo/generate-pages.ts --vertical hvac-contractors --type cluster\n\nStep 3: Backfill chart data\n\nCharts require post-generation patching. Write chart patch files using Step 1 research, then apply via content.ts patch.\n\nStep 4: AEO optimization\n\nEvery section must be self-contained. AI engines extract individual passages, not full pages.\n- Lead with a 30-50 word standalone answer in the first sentence of each section\n- 78% of AI Overview answers use list format\n- Frame headings as questions when possible\n\nStep 5: Post-publish distribution\n\nUpdate llms.txt, ping IndexNow, submit sitemap segments to Search Console.\n\nData Sourcing Rules\n\n- Tier 1 (Verified): Named source, specific methodology. Use confidently.\n- Tier 2 (Plausible): Widely cited, directionally correct. Soften the specific number.\n- Tier 3 (Unverified): No credible source. Do not use specific numbers."
371
- },
372
- {
373
- id: "knowledge.seo-content-guide",
374
- title: "SEO Content Writing Guide",
375
- summary: "Tactical guide for writing SEO and AEO-optimized content \u2014 page structure, keyword strategy, AI engine citation optimization, E-E-A-T signals, and CTA patterns.",
376
- bodyText: 'Overview\n\nThis guide covers how to write SEO content that ranks in traditional search AND gets cited by AI answer engines \u2014 ChatGPT, Perplexity, Google AI Overviews, and Gemini.\n\nThe distribution channel is split: 69% of Google searches result in zero clicks, while AI platforms generated 1.13 billion referral visits in June 2025 alone.\n\nPage Structure\n\nSection Architecture\n\nEvery section must be self-contained. AI engines extract individual passages, not full pages.\n\n- Lead with a 30-50 word standalone answer in the first sentence of each section\n- Paragraphs: 2-4 sentences max\n- 78% of AI Overview answers use list format -- use bullets and numbered lists extensively\n- Heading hierarchy: one H1 (page title), H2 for major sections, H3 for subsections\n- Frame headings as questions when possible\n\nSection Length\n\n- Pillar pages: 2,000-3,000 words total\n- Cluster pages: 1,000-2,000 words total\n- Each major section: 150-300 words\n\nConciseness Rules\n\n1. Two-paragraph intro max\n2. No stat duplication between intro and problem section\n3. Section character budget: Intro 450-600 chars, Problem 250-400 chars, Solution 300-550 chars\n\nE-E-A-T Signals\n\n- Brand name "Elevasis" must appear explicitly minimum 3x per page\n- Vertical names used as proper noun concepts\n- Organization + Service + SoftwareApplication schema markup reinforces entity recognition'
377
- },
378
- {
379
- id: "knowledge.seo-distribution-playbook",
380
- title: "Distribution & Citation Building",
381
- summary: "Post-publish distribution playbook \u2014 AI crawler discovery, directory citations, Google Business Profile, community seeding, monitoring cadence, and AEO optimization tactics.",
382
- bodyText: 'Overview\n\nEverything that happens after pages are published and sitemap/IndexNow pings are sent. Evergreen reference for maximizing visibility across traditional search, AI answer engines, and buyer-intent directories.\n\nAI Crawler Discovery\n\nllms.txt\n\nA plain-text Markdown file at the domain root that gives LLMs a structured map of key content. Location: apps/website/public/llms.txt.\n\nUpdate whenever pillar or cluster pages are published.\n\nSitemap Segmentation\n\n| Segment ID | Contents | Priority |\n| --- | --- | --- |\n| 0 | Static pages | Default |\n| 1 | Pillar pages (9) | 0.9 |\n| 2 | Cluster pages (52) | 0.8 |\n\nEntity Density Rules\n\nPages with 15+ recognized entities show 4.8x higher selection probability for AI citations.\n- Brand name "Elevasis" must appear explicitly (minimum 3x per page)\n- Stat density target: one statistic every 150-200 words\n\nDirectory Citations\n\nTier 1 (Buyer Intent): G2, Capterra, Product Hunt, AppSumo (direct buyer intent, high domain authority)\n\nTier 2 (Authority): Crunchbase, AngelList, LinkedIn company page, industry association directories\n\nGoogle Business Profile\n\nClaim and verify GBP listing. Category: "Software Company". Keep NAP (Name, Address, Phone) consistent across all citations.'
383
- },
384
- {
385
- id: "knowledge.content-playbook",
386
- title: "Content Playbook",
387
- summary: "Content creation guide \u2014 pillars, platform rules, format specs, repurposing chain, and metrics benchmarks for multi-platform distribution",
388
- bodyText: 'Content Pillars\n\nEvery content piece maps to one of five pillars.\n\n| Pillar | What It Is | Target Frequency |\n| --- | --- | --- |\n| dogfooding | How we run Elevasis using our own platform | 1-2x/week |\n| education | 4 Pattern Framework and AI orchestration concepts | 1x/week |\n| demo | "Watch AI Work" \u2014 showing the platform in action | 1x/2 weeks |\n| pain-point | SMB pain points backed by data | 1x/week |\n| founder-journey | Solo founder building with AI | 1x/week |\n\nThe 90-10 Rule\n\n90% educational value, 10% promotional. Keeping promotional content to \\<15% ensures your audience stays receptive when you do make an offer.\n\nContent Creation Workflow\n\n1. Capture the Idea \u2014 Insert into acqcontent with status: idea\n2. Draft the Source Content \u2014 Write core idea in acqcontent.body. LinkedIn first.\n3. Adapt for Platforms \u2014 Repurpose from LinkedIn to YouTube, Instagram, X\n4. Schedule and Publish \u2014 Use platform-native scheduling\n5. Track Performance \u2014 Monitor in acqcontent via Command Center\n\nPlatform Priority\n\n1. LinkedIn \u2014 #1 priority, 3x/week\n2. YouTube \u2014 #2 priority, 1x/week + Shorts\n3. Instagram \u2014 #3 priority, 2-3x/week, repurpose from LinkedIn/YouTube\n4. X \u2014 #4 priority, 2-3x/week, threads from LinkedIn'
389
- },
390
- {
391
- id: "knowledge.inbound-reply-handling-playbook",
392
- title: "Stage 01: Reply Handling",
393
- summary: "Classify email replies, create CRM contact, and send booking link to interested leads",
394
- bodyText: `Overview
395
-
396
- Classify incoming email replies, create CRM contact for interested leads, and send booking link. Uses value-first approach: offer a free one-time AI service instead of passive content.
397
-
398
- Classification
399
-
400
- Four-way classification with confidence-based HITL routing. Auto-replies detected deterministically before any LLM call.
401
-
402
- | Category | Examples | Action |
403
- | --- | --- | --- |
404
- | Interested | "Yes I'm interested", "Tell me more" | CRM \u2192 HITL task with LLM-drafted follow-up |
405
- | Not Interested | "Unsubscribe", "Not interested" | Stop outreach sequence |
406
- | Bounced | mailer-daemon@, "Undeliverable" | Stop outreach \u2192 Mark Lead DB INVALID \u2192 Skip CRM |
407
- | Auto-Reply | Out-of-office, ticketing acknowledgments | No action \u2014 campaign continues |
408
-
409
- Auto-Reply Detection (Pre-LLM)
410
-
411
- Caught deterministically via regex:
412
- - Sender address prefix: noreply, no-reply, donotreply, auto, mailer
413
- - Subject patterns: "auto-reply", "out of office", "OOO"
414
- - Body patterns: "this is an automated message", vacation auto-responders
415
-
416
- Routing Notes
417
-
418
- - NOTINTERESTED and BOUNCED: sequence stopped via Instantly update-interest-status
419
- - INTERESTED: does NOT stop sequence \u2014 proceeds to CRM creation and HITL queue
420
- - AUTO-REPLY: no CRM, no sequence stop, no reply
421
-
422
- HITL Strategy
423
-
424
- For INTERESTED replies, an LLM drafts a follow-up response. Admin reviews and approves via Command Queue before anything sends.`
425
- },
426
- {
427
- id: "knowledge.inbound-booking-playbook",
428
- title: "Stage 02: Booking",
429
- summary: "Cal.com booking handling -- create, reschedule, and cancel discovery call bookings",
430
- bodyText: 'Overview\n\nWhen a prospect books a discovery call via Cal.com, the booking handler manages CRM updates, notifications, and reminder scheduling across all booking lifecycle events.\n\nBooking Handler Workflow\n\nTriggers: Cal.com webhooks (BOOKINGCREATED, BOOKINGRESCHEDULED, BOOKINGCANCELLED)\n\nEvent Flows\n\nBOOKINGCREATED:\n1. create-contact \u2014 Create or update Attio Person record, resolve Deal via metadata or email, update Deal stage to booked, create Discovery Call Prep note, cancel brochure follow-ups\n2. notify-created \u2014 Send platform notification to admin\n3. schedule-reminders \u2014 Create absolute schedule with pre-computed -24h and -1h reminder times\n\nBOOKINGRESCHEDULED:\n1. update-schedule \u2014 Cancel existing reminders, schedule new ones at updated times\n2. finish-reschedule \u2014 Update Deal stage, notify admin\n\nBOOKINGCANCELLED:\n1. cancel-schedule \u2014 Cancel all scheduled reminders\n2. finish-cancel \u2014 Update Deal stage to cancelled, notify admin\n\nReminder Schedule\n\nTwo automated reminders per booking:\n- -24h reminder: "Looking forward to our call tomorrow"\n- -1h reminder: "See you in 1 hour" with discovery form link\n\nReminders are scheduled as absolute times (not relative), so rescheduling correctly cancels and re-schedules them.'
431
- },
432
- {
433
- id: "knowledge.discovery-call-playbook",
434
- title: "Stage 03: Discovery",
435
- summary: "Discovery form submission, qualification routing, and data storage -- the pipeline endpoint",
436
- bodyText: "Overview\n\nThe discovery form is filled during the call by the salesperson. On submission, the workflow stores structured data, updates the CRM, and routes based on qualification.\n\nThis is the current pipeline endpoint \u2014 qualified leads receive a HITL task for manual follow-up; no automated stages exist beyond this point.\n\nWorkflow Steps\n\n1. route-by-action \u2014 Route to submission or no-show flow\n2. compute-cost \u2014 Calculate totalAnnualCost from bottlenecks\n3. store-discovery \u2014 Save discoverydata JSONB to acqdeals\n4. find-deal \u2014 Find Attio Deal (acqdeals \u2192 URL context \u2192 Attio API)\n5. update-attio-stage \u2014 Update Deal.stage based on qualification\n6. create-summary-note \u2014 Add markdown Note to Deal\n7. create-hitl-task \u2014 Create HITL approval item for qualified leads\n\nQualification Routing\n\n- Qualified: Deal moves to qualified stage; HITL task created for admin follow-up\n- Not Qualified: Deal moves to closedlost stage; no further automation\n- No-Show: Deal moves to noshow stage; timeout checker handles re-engagement\n\nDiscovery Form Structure\n\nThe form captures: company size, current tools, 3 biggest bottlenecks, estimated time wasted per week, budget comfort range, urgency, decision-making authority."
437
- },
438
- {
439
- id: "knowledge.pipeline-management-playbook",
440
- title: "Pipeline Management",
441
- summary: "Automated pipeline maintenance workflows for the inbound pipeline, covering timeout monitoring, stale deal handling, unsubscribe cleanup, and full contact reset.",
442
- bodyText: "Overview\n\nPipeline management keeps the inbound pipeline clean without manual intervention.\n\n- Timeout monitoring \u2014 Detecting deals that have gone stale in a stage\n- Unsubscribe cleanup \u2014 Closing deals and cancelling automation when a contact opts out\n- Full cleanup \u2014 Complete removal of all pipeline data for a contact\n\nNo timeout action transitions a deal automatically. All stage changes from the timeout system require admin approval via a HITL Command Queue item.\n\nTimeout System\n\nTimeout Checker (inb-pipeline-timeout-checker-workflow)\n\nScans all active pipeline stages. For each stale deal, creates a HITL approval item in the Command Queue. Never modifies deal records directly.\n\nTimeout rules by stage:\n\n| Stage | Condition | Timeout |\n| --- | --- | --- |\n| interested | No activity | 30 days |\n| booked | Meeting time has passed | 3 hours after meeting |\n| discovery | No form submission | 24 hours after call |\n\nAction Workflows\n\n4 action workflows triggered by admin approval:\n- Nurture: Move to nurture sequence\n- Close-Lost: Mark deal closed, stop all automation\n- No-Show: Re-send booking link with personal note\n- Follow-Up: Send soft re-engagement email\n\nUnsubscribe Cleanup\n\nWhen a contact opts out:\n1. Find all active automation for the contact\n2. Cancel scheduled reminders\n3. Update Deal stage to unsubscribed\n4. Mark contact as unsubscribed in Attio"
443
- },
444
- {
445
- id: "knowledge.communications-map",
446
- title: "Communications Map",
447
- summary: "All lead-facing messages across the active client acquisition pipeline (stages 01-03). Stages 04-08 communications are archived.",
448
- bodyText: 'Overview\n\nEvery message sent to a lead across the active acquisition pipeline \u2014 outreach, follow-ups, reminders, and event-triggered emails. 10 total active messages (3 outreach + 1 reply + 2 subsequent reply + 2 discovery reminders + 1 timeout follow-up + 1 timeout re-engagement).\n\nStages 04-08 communications (proposal follow-ups, payment reminders, nurture sequences) are archived.\n\nActive Pipeline Phases\n\n1. Outreach (Instantly) 2. Reply Handling 3. Discovery Reminders\n 3 emails 1 email + 2 HITL 2 reminders\n Day 0/3/7 On reply -24h/-1h\n\nPhase 1: Outreach (Instantly)\n\n| # | Day | Subject | Angle | Purpose |\n| --- | --- | --- | --- | --- |\n| 1 | 0 | idea for {{companyName}} | Earn attention | Personal, specific |\n| 2 | 3 | where do business hours actually go? | New angle | Peer-level, intriguing |\n| 3 | 7 | the offer (whenever useful) | Permission to close | Warm, zero pressure |\n\nPhase 2: Reply Handling (Resend)\n\nSent only to INTERESTED replies. LLM drafts; admin approves via HITL before sending.\n\nPhase 3: Discovery Reminders (Resend)\n\nTwo automated reminders per booking:\n- -24h: "Looking forward to our call tomorrow"\n- -1h: "See you in 1 hour" with discovery form link\n\nAll scheduled/event emails signed "Alex". Plain text.'
449
- },
450
- {
451
- id: "knowledge.reddit-monitoring-playbook",
452
- title: "Social Monitoring",
453
- summary: "Automated Reddit monitoring pipeline \u2014 4-step workflow (search, LLM score, LLM draft, store) with tiered subreddit scraping via Apify, Gemini-powered scoring and response drafting, and lead-gen optimized responses via the AlexElevasis account.",
454
- bodyText: "Overview\n\nSocial monitoring surfaces Reddit posts where business owners discuss operational challenges, manual processes, and automation needs.\n\nCron Trigger (3x/day: 16:00, 22:00, 04:00 UTC)\n \u2192 mnt-reddit-monitor-workflow (4-step pipeline)\n \u2192 Step 1: Search \u2014 4 sequential Apify actors (one per tier)\n \u2192 Step 2: Score \u2014 Gemini Flash Lite (concurrency 5)\n \u2192 Step 3: Draft \u2014 Gemini Flash (high-score only)\n \u2192 Step 4: Report \u2014 Store to acqsocialposts, log breakdown\n \u2192 Command Center: /acquisition/monitoring\n\nStatus: Paused until further notice (2026-03-31). Pipeline technically validated but ROI is low without deep vertical expertise.\n\nVelocity Batches\n\nSubreddits grouped by posting velocity, each with its own maxPostsPerSource.\n\n| Batch | Subs | Posts/Source | Example Subreddits |\n| --- | --- | --- | --- |\n| Medium Velocity | 2 | 5 | Accounting, Plumbing |\n| Buyer Low-Volume | 10 | 3 | CRM, EntrepreneurRideAlong, sweatystartup |\n| Trade Niche | 10 | 2 | electricians, Dentists, InsuranceAgent |\n| Decision Niche | 3 | 2 | logistics, FreightBrokers, healthIT |\n\nScoring\n\nPosts scored 0-100 by Gemini Flash Lite for business automation opportunity relevance. Posts scoring \\>= 60 get response drafts via Gemini Flash.\n\nAlexElevasis Account\n\nAll responses posted via the AlexElevasis Reddit account. See Reddit Account strategy doc for warmup playbook and karma thresholds."
455
- },
456
- {
457
- id: "knowledge.reddit-account-strategy",
458
- title: "Reddit Account",
459
- summary: "AlexElevasis Reddit account strategy \u2014 warm-up playbook, karma thresholds, posting rules, and lead generation approach for the social monitoring pipeline.",
460
- bodyText: 'Account Details\n\n| Field | Value |\n| --- | --- |\n| Username | AlexElevasis |\n| Created | 2026-03-26 |\n| Purpose | Lead generation via Reddit monitoring pipeline |\n| Persona | Alexander, founder of an AI automation company |\n\nThe username serves double duty: every helpful comment puts "Elevasis" in front of the reader.\n\nWarm-Up Playbook\n\nDays 1-3 \u2014 Cold Start:\n- Browse, upvote, follow target subs\n- 1 comment per day max\n- No links, no self-promotion, no CTAs\n\nDays 4-14 \u2014 Gradual Ramp:\n- Increase to 2-3 comments/day\n- Genuine, helpful answers \u2014 no copy-paste across threads\n- Still no links or CTAs\n\nAfter 30 Days + 100 Karma \u2014 Activation:\n- Most automod filters cleared\n- Start using monitoring pipeline drafts\n- 300+ karma unlocks more restrictive subs (r/Entrepreneur, r/startups)\n\nKarma Thresholds\n\n| Karma | Access Level |\n| --- | --- |\n| 100 | Bypasses most automod filters |\n| 300+ | Access to restrictive subs |\n| 1,000+ | Considered established community member |\n\nPosting Rules\n\n- Genuine value first \u2014 no pitching without established reputation\n- 30-day account age required before using pipeline drafts\n- Open questions in responses (not CTAs) per pipeline draft conventions'
461
- },
462
- {
463
- id: "knowledge.linkedin-strategy",
464
- title: "LinkedIn Strategy",
465
- summary: "LinkedIn posting strategy \u2014 algorithm deep dive, format rankings, hook techniques, carousel optimization, newsletter strategy, engagement tactics, profile optimization, and growth playbook for B2B SaaS (2025-2026)",
466
- bodyText: 'Overview\n\nLinkedIn is the #1 priority platform. The algorithm heavily favors personal profiles over company pages. In 2025-2026, LinkedIn shifted from viral reach to depth and authority \u2014 topical consistency is now the single biggest strategic lever.\n\nCadence: 3-5x/week (Wed/Thu/Fri strongest, Monday weakest)\n\nAlgorithm Deep Dive\n\nRanking Signals (by weight)\n\n| Signal | Weight | Notes |\n| --- | --- | --- |\n| Comments | Highest | 15x more valuable than likes |\n| Saves and sends | Very high | Added to analytics in late 2025 |\n| Dwell time | High | 15+ seconds = meaningful |\n| "See more" clicks | High | Whether people expand the full post |\n| Reactions/likes | Lowest | Significantly de-emphasized |\n\nTopical Authority\n\nThe algorithm rewards consistent publishing within a defined area of expertise. Pick a lane (AI automation) and stay in it.\n\nPost Formats\n\n1. Carousels \u2014 Highest avg engagement; 10-slide with text + data\n2. Text posts \u2014 Quick takes, contrarian observations, founder stories\n3. Documents/PDFs \u2014 In-depth guides, playbooks, frameworks\n4. Videos \u2014 Native upload outperforms external links by 5x\n\nHook Techniques\n\n- Lead with the most surprising/counterintuitive insight\n- Use "I" not "we" \u2014 personal profile posts outperform company pages\n- 3 lines max before "...see more" break\n- Questions outperform statements for comments engagement'
467
- },
468
- {
469
- id: "knowledge.instagram-strategy",
470
- title: "Instagram Strategy",
471
- summary: "Comprehensive Instagram posting strategy for B2B SaaS founder content \u2014 algorithm deep dive, Reels, carousels, Stories, SEO, hashtags, captions, profile optimization, growth tactics, and analytics benchmarks (2025-2026)",
472
- bodyText: 'Overview\n\nInstagram is the #3 priority platform. Carousels repurpose easily from LinkedIn, and Reels come directly from YouTube Shorts.\n\nCadence: 3-5x/week feed posts + daily Stories\n\nB2B Reality Check: Instagram is a complementary channel for B2B SaaS, not a primary lead gen tool. Decision-makers are on Instagram (76% of B2B companies use it), but they are in consumer mode.\n\nAlgorithm Deep Dive (2025-2026)\n\nReels Algorithm (Most Important for Reach)\n\nReels are designed for discovery: 55% of Reels views come from non-followers.\n\nThree priority signals:\n| Signal | Weight | How to Optimize |\n| --- | --- | --- |\n| Watch time | #1 | Hook in first 1.7s; optimize for completion |\n| Sends per reach | Highest for new audiences | "Send this to someone" content |\n| Likes per reach | Highest for followers | Valuable content followers engage with |\n\nContent Strategy\n\n- Repurpose from LinkedIn: Carousel slides \u2192 Instagram carousel\n- Repurpose from YouTube: Long-form \u2192 Reels (cut 30-60s clips)\n- Stories: Daily touchpoints, polls, Q&A, behind-the-scenes\n\nCarousel Optimization\n\n- Slide 1: Hook (bold claim or question)\n- Slides 2-9: Value delivery (one point per slide)\n- Slide 10: CTA (follow, DM, link in bio)'
473
- },
474
- {
475
- id: "knowledge.x-strategy",
476
- title: "X (Twitter) Strategy",
477
- summary: "X/Twitter posting strategy \u2014 algorithm signals, thread tactics, engagement weights, Premium ROI, video specs, growth playbook, and B2B SaaS niche tactics",
478
- bodyText: "Overview\n\nX is the #4 priority platform. Most content is repurposed from LinkedIn text posts as threads.\n\nCadence: 3-5 posts/day (mix of original posts + replies + quote tweets), 2-3 threads/week\n\nPrerequisite: Get X Premium ($8/mo) \u2014 verified accounts get 10x more impressions. Non-Premium accounts posting links receive near-zero engagement as of 2026.\n\nAlgorithm Deep Dive\n\nEngagement Weight Scoring\n\n| Signal | Weight | vs. Like |\n| --- | --- | --- |\n| Reply engaged by author | +75 | 150x |\n| Reply | +13.5 | 27x |\n| Profile click + engagement | +12.0 | 24x |\n| Bookmark | +10.0 | 20x |\n| Retweet | +1.0 | 2x |\n| Like | +0.5 | 1x |\n\nCritical takeaway: Replying to your own replies is worth 150x a like.\n\nPenalties\n\n- External links: 30-50% reach reduction\n- Multiple hashtags: 40% penalty\n\nThread Strategy\n\n- First tweet = hook (bold claim or surprising stat)\n- 5-10 tweets per thread\n- Last tweet = CTA (follow for more, link to extended content)\n- Reply to your own threads within the first hour to boost algorithmic velocity"
479
- },
480
- {
481
- id: "knowledge.youtube-channel-strategy",
482
- title: "Channel Strategy",
483
- summary: 'Unified YouTube channel strategy \u2014 channel setup, content pipeline, differentiation positioning, launch queue, and production workflow for "Alexander Le | Elevasis" channel',
484
- bodyText: `Objective
485
-
486
- Build the "Alexander Le | Elevasis" YouTube channel as an evergreen discovery engine for Elevasis. YouTube is the #1 content priority \u2014 evergreen discovery, SEO compounding, and 53% of B2B buyers watch video before requesting demos.
487
-
488
- Channel Identity
489
-
490
- - Name: "Alexander Le | Elevasis" \u2014 personal-brand hybrid with clear business association
491
- - Handle: @AlexanderElevasis
492
- - Why personal-brand hybrid: People subscribe to people. Algorithm favors creator-branded channels over faceless brands.
493
-
494
- Content Format: Face Bubble Intro \u2192 Screen Recording
495
-
496
- Primary format: Quick face-cam intro (circle overlay, 15-30s) to build trust, then full-screen recording.
497
-
498
- Why this works:
499
- - 40%+ of YouTube's top 1,000 channels never show a presenter \u2014 faceless works
500
- - Screen recording tutorials rank extremely well on YouTube + Google
501
- - Face in thumbnails gets 921K more views on average
502
-
503
- Differentiation
504
-
505
- Compete on substance, not production quality:
506
- - Real execution data, real costs, real results (not simulations)
507
- - "Document the build" format: record while building, editing, deploying
508
- - Show Command Center in action \u2014 no equivalent content exists
509
-
510
- Launch Queue
511
-
512
- 3 priority video types for channel launch:
513
- 1. Platform demo walkthroughs (Command Center, workflow execution)
514
- 2. Founder journey episodes (building in public)
515
- 3. Educational explainers (AI orchestration concepts)`
516
- },
517
- {
518
- id: "knowledge.youtube-tactics",
519
- title: "YouTube Strategy",
520
- summary: "YouTube posting strategy \u2014 upload optimization, Shorts tactics, algorithm signals, SEO, first-48-hour playbook, faceless content tips, and small channel growth for B2B SaaS",
521
- bodyText: `Overview
522
-
523
- YouTube is the #2 priority platform and the only one with true evergreen discovery. Videos keep gaining views months/years after posting.
524
-
525
- Cadence: 1 long-form/week + 3-5 Shorts/week
526
-
527
- Upload Checklist
528
-
529
- Title
530
- - Keep meaningful part in first 60 chars (mobile truncation)
531
- - Front-load primary keyword: "AI Automation for Veterinary Clinics (Full Walkthrough)"
532
- - Long-tail titles outperform generic for small channels
533
-
534
- Thumbnail
535
- - 1280x720px, 16:9, max 2MB
536
- - 4 words max of bold, high-contrast text
537
- - Use YouTube's Test & Compare \u2014 upload 3 thumbnails, YouTube A/B tests and reports CTR
538
-
539
- Description
540
- - First 125 chars = what shows in search results
541
- - Add timestamps/chapters \u2014 improve retention + create extra search ranking hooks
542
-
543
- Shorts Strategy
544
-
545
- - Cut 30-60s clips from long-form: best moments, surprising reveals, "before/after"
546
- - Repurpose from YouTube to Instagram Reels and TikTok
547
- - Hook in first 1-2 seconds: start with the payoff, not the setup
548
-
549
- First-48-Hour Playbook
550
-
551
- 1. Publish during peak hours (12pm-3pm ET Tuesday-Thursday)
552
- 2. Post about the video on LinkedIn immediately after upload
553
- 3. Reply to every comment within the first 24 hours
554
- 4. Share in relevant communities (not spam \u2014 genuine value)`
555
- },
556
- {
557
- id: "knowledge.youtube-growth-playbook",
558
- title: "YouTube Growth Playbook",
559
- summary: "Practical YouTube optimization guide for Elevasis screen-recorded demos, founder-led walkthroughs, Shorts, SEO, and launch review loops",
560
- bodyText: 'Overview\n\nThis playbook maps YouTube growth tactics to the current Elevasis content format: screen recordings, Command Center walkthroughs, founder commentary, proof assets, and short clips cut from real demos.\n\nThe goal is to make real AI orchestration visible enough that buyers and technical peers understand what Elevasis does.\n\nCore Format\n\n| Format | Use For | Notes |\n| --- | --- | --- |\n| Face intro \u2192 screen recording | Flagship demos, founder-led walkthroughs | 15-30 second intro, then full-screen product work |\n| Screen recording only | Tutorials, Shorts source material | Fastest to produce |\n| Data walkthrough | Campaign metrics, cost tracking, workflow results | Use only real data |\n| Concept explainer | AI agents, orchestration, human oversight | Keep tied to concrete business workflows |\n\nCTR Optimization\n\nThumbnails should show the result or system, not abstract concepts:\n1. Command Center, workflow graph, campaign analytics, or visible output\n2. Optional face overlay when it improves trust\n3. Three to five words of context. High contrast, readable at mobile size.\n\nTitle rules:\n- Front-load the topic\n- Use real numbers only when current and verifiable\n- Prefer "Watch", "Real", "Live", "Actual", "Walkthrough" over hype language\n- Make the title and thumbnail say different things\n\nRetention\n\nOpen with the payoff:\n1. Show the final dashboard, result, or workflow output\n2. Explain what the viewer is about to see\n3. Switch into the walkthrough quickly\n\nFirst-24-Hour Workflow\n\nAlgorithm watches first 30-60 minutes closely. A video getting 10 replies in 15 minutes dramatically outperforms one getting 10 replies over 24 hours.'
561
- },
562
- {
563
- id: "knowledge.youtube-mental-prep",
564
- title: "Mental Preparation \u2014 Creator Anxiety Playbook",
565
- summary: "Research-backed strategies for overcoming publishing anxiety, the spotlight effect, graduated exposure, and building comfort on camera \u2014 practical guide for a technical founder starting YouTube",
566
- bodyText: `Why This Exists
567
-
568
- Recording yourself and putting your ideas out publicly is genuinely uncomfortable. This doc captures the research and practical strategies so you can reference them when the anxiety spikes \u2014 not as motivation, but as evidence that the discomfort is normal, finite, and navigable.
569
-
570
- The Core Insight
571
-
572
- Readiness is a product of exposure, not a prerequisite for it. You don't stop feeling afraid and then start. You start, and the fear gradually recedes.
573
-
574
- What You're Actually Afraid Of
575
-
576
- The Spotlight Effect (Gilovich et al., 2000)
577
-
578
- People overestimate how much others notice and judge them by roughly 2x. Early videos get almost zero views \u2014 you're practicing in an empty room.
579
-
580
- The Five Common Fears (in order of prevalence)
581
-
582
- 1. Judgment from people you know \u2014 not strangers. The #1 blocker.
583
- 2. Perfectionism as procrastination \u2014 "I'll start when I have better equipment." This is avoidance.
584
- 3. Impostor syndrome \u2014 "Who am I to teach this?"
585
- 4. Permanence anxiety \u2014 "This will be on the internet forever"
586
- 5. Voice/face aversion \u2014 Most people dislike their recorded voice (bone conduction gap)
587
-
588
- The Real Fear: Cringe
589
-
590
- People tolerate a video that flops quietly. What they can't tolerate is creating something they later find embarrassing.
591
-
592
- Graduated Exposure Protocol
593
-
594
- 1. Screen recording only (no face, no voice) \u2014 2 videos
595
- 2. Screen recording + voiceover (no face) \u2014 5 videos
596
- 3. Face bubble intro (15-30s) + screen recording \u2014 ongoing
597
-
598
- Each stage desensitizes one fear at a time. Never skip ahead. The goal is consistency, not perfection.`
599
- },
600
- {
601
- id: "knowledge.what-is-elevasis",
602
- title: "What is Elevasis",
603
- summary: "Company overview, positioning, value proposition, and pricing for the AI orchestration platform",
604
- bodyText: 'Executive Summary\n\nCompany: Bootstrapped AI orchestration platform for done-for-you business automation\n\nFounder: Solo (Alex, 34), bootstrapped\n\nMarket: Service-based SMBs that need practical AI automation without building internal AI teams\n\nGTM: Content-led marketing, proof assets, consultative sales, and land-and-expand pricing\n\nCompany Overview\n\nCurrent Status\n\nThe platform core is production-ready enough to support client-facing demonstrations and implementation work. Current business focus is client acquisition, proof-building, and turning the platform into a repeatable service delivery system.\n\nFounder Profile\n\nAlex, 34 \u2014 Solo founder with software engineering background (BSCS degree). Previous: Ecommerce platforms, Streaming technology. No formal AI background \u2014 practitioner, not academic.\n\nWhat We Are\n\nOperating layer for AI automation. We help SMBs operate with closed-loop feedback, decision capture, and continuous learning \u2014 at SMB pricing with done-for-you implementation (NOT self-service).\n\nTarget Market\n\nICP: Service-based SMBs (2-50 employees, USA, $200K-$5M revenue)\n\nCore Pain: Capacity crisis, pipeline problems, operational chaos, growth blockers \u2014 too busy serving clients to grow their own business.\n\nPricing (Land-and-Expand)\n\n- Tier 1 \u2014 Foundation (1-2 workflows): $500-2k/mo\n- Tier 2 \u2014 Scaled Operations (3-5 workflows): $2k-5k/mo\n- Tier 3 \u2014 AI-Powered Systems (6+ workflows): $5k-15k+/mo\n\nAdditional workflows cost less due to shared infrastructure.\n\nValue Proposition\n\n"We find one bottleneck in your business, build an AI solution to fix it, and you only pay if it actually saves you time or makes you money."'
605
- },
606
- {
607
- id: "knowledge.platform-systems-overview",
608
- title: "Platform Systems Overview",
609
- summary: "Authoritative overview of the Elevasis AI Orchestration Platform systems -- what's built, what each system does, and how the pieces fit together",
610
- bodyText: "Overview\n\nElevasis is a production AI orchestration platform that coordinates workflows, autonomous agents, and human approvals into a unified operating layer for SMBs. Everything described below is implemented and running in production.\n\nCore Architecture:\n\n| Layer | What It Does | Key Components |\n| --- | --- | --- |\n| Execution | Runs workflows and agents with schema validation | Workflow Engine, Agent Framework, Execution Runner |\n| Control | Human oversight, approvals, and decision capture | Command Queue (HITL), Dynamic Forms, Action System |\n| Intelligence | Autonomous reasoning, tool use, and memory management | ReAct Agents, Knowledge Map, Session Memory |\n| Observability | Real-time visibility into cost, performance, and health | Cost Tracking, Metrics, Activity Log, SSE Streaming |\n| Platform | Multi-tenancy, security, scheduling, integrations | Registry, RLS, Scheduler, Credential Vault, SDK |\n\nExecution Engine\n\nAI Workflows\n\nGraph-based workflow execution with schema-validated steps and conditional routing. Steps define explicit routing: linear, conditional (rule-based branching), or terminal. Context flows through the entire workflow.\n\nAutonomous Agents\n\nProduction-grade ReAct-style agents with tool use, memory management, and security hardening.\n\nLLM Provider Support: OpenAI (GPT-5), Google (Gemini 3 Flash), Anthropic (Claude Sonnet 4.5), OpenRouter (GLM-5)\n\nHuman-in-the-Loop (HITL)\n\nThe Command Queue surfaces pending approvals as structured tasks. Admin reviews, approves or edits, and the workflow continues. Every critical decision \u2014 sending emails to prospects, updating customer records, publishing content \u2014 requires human approval.\n\nKnowledge Map\n\nOrganizational knowledge loaded lazily into agent context. 80-95% token savings vs. always-loading full context. Nodes link to features, teams, and other nodes.\n\nIntegrations (13 active)\n\nAttio CRM, Cal.com, Instantly (cold email), Resend, Apify, Google Maps, Tomba, Mails.so, Supabase, Stripe, OpenAI, Google Gemini, Anthropic Claude.\n\nSDK\n\nTypeScript-based resource development with local testing, validation, and deployment pipeline. External consumers define workflows and agents in their own repos and deploy via elevasis-sdk deploy."
611
- },
612
- {
613
- id: "knowledge.client-testimonials",
614
- title: "Testimonials",
615
- summary: "Customer testimonials and case study permissions from previous client work",
616
- bodyText: `Status: 4 testimonials from 2 clients | Source: Upwork client work (2024)
617
-
618
- Testimonials
619
-
620
- Xero Automation \u2014 The Invoice Chase That Disappeared
621
-
622
- Client: Word of Mouth Agency
623
-
624
- Result: 10+ hours/week saved. Zero manual follow-up emails.
625
-
626
- > "Working with Alex at Elevasis to automate our Xero follow-ups has been a game-changer. We're set to save over 5 hours a week, but more importantly, it has completely removed the stress of chasing invoices. The process was smooth and professional."
627
-
628
- Permission: Case study approved with company name.
629
-
630
- Influencer Discovery \u2014 From Spreadsheet Hell to Strategic Decisions
631
-
632
- Client: Word of Mouth Agency (Perth, Australia)
633
-
634
- Result: 10+ hours/week saved. Research scope: 50 to 200+ influencers. Team focus shifted from data to strategy.
635
-
636
- > "Working with Alex at Elevasis to automate our Influencer Discovery has been a game-changer. We're set to save over 5 hours a week..."
637
-
638
- Permission: Case study approved with company name.
639
-
640
- EMRG Media \u2014 4 Automations for NYC's Premier Events Firm
641
-
642
- Client: EMRG Media (NYC, est. 2001). Clients include Google, YouTube, Sony Music, Fiverr, Equinox.
643
-
644
- What We Built:
645
- 1. Case Study Generator \u2014 7-10 hours \u2192 2 hours. Publication rate: 1/quarter \u2192 2/month.
646
- 2. EMRG Follow-Up Generator \u2014 Automated post-event follow-ups with signature management.
647
- 3. Event Sponsor Tracker \u2014 Automated sponsor pipeline tracking and communications.
648
- 4. Lead Scraper \u2014 Automated discovery of event planning prospects.
649
-
650
- Fame Stats:
651
- - 3,500+ attendees at The Event Planner Expo
652
- - 25+ year track record
653
- - Fortune 500 client roster
654
-
655
- Permission: Case study approved with company name.`
656
- },
657
- {
658
- id: "knowledge.understanding-elevasis",
659
- title: "Understanding Elevasis Overview",
660
- summary: "Company overview, product positioning, and platform systems context for Elevasis AI orchestration platform",
661
- bodyText: "Lean documentation explaining what Elevasis is and what the platform can do. This section provides the foundational context for business conversations and technical evaluation.\n\nElevasis is a done-for-you AI automation service backed by a production-grade platform. The company targets service-based SMBs (2-50 employees, $200K-$5M revenue) who are too busy serving clients to grow their own business.\n\nKey Facts\n\n- Stage: Pre-revenue, platform 100% complete, client acquisition active\n- Offer: Done-for-you AI automation -- we build and maintain the workflows, no coding required\n- ICP: Service-based SMBs (2-50 employees, $200K-$5M revenue, USA)\n- Pricing: $500-$2k/mo (Foundation) \u2192 $2k-$5k/mo (Scaled) \u2192 $5k-$15k+/mo (AI-Powered)\n- Market: Early Adopters stage, $23.77B TAM growing to $87.7B by 2032\n- Competitive position: No dominant done-for-you SMB AI provider exists; blue ocean\n\nWhen to Use Each Document\n\n| Situation | Document |\n| --- | --- |\n| First conversation with any audience | What is Elevasis |\n| Technical evaluation or demo prep | Platform Systems Overview |\n\nDocumentation\n\n- What is Elevasis \u2014 AI orchestration platform overview, company stage, value proposition, and pricing tiers\n- Platform Systems Overview \u2014 Authoritative overview of what is built, what each system does, and how the pieces fit together"
662
- },
663
- {
664
- id: "knowledge.marketing-overview",
665
- title: "Marketing Overview",
666
- summary: "Marketing documentation for Elevasis - strategy, website infrastructure, and content systems",
667
- bodyText: "Welcome to the Elevasis marketing documentation. This section covers marketing strategy, website implementation, and content systems.\n\nDocumentation\n\nStrategy\n\n- Overview \u2014 Channel strategy, inbound content system, and proof-led demand generation\n\nWebsite\n\nThe marketing website's technical infrastructure, setup, and SEO docs now live under Architecture \u2192 Website."
668
- },
669
- {
670
- id: "knowledge.ai-orchestration-principles",
671
- title: "AI Orchestration Principles",
672
- summary: "The 4 principles that separate production AI from toy automation",
673
- bodyText: `Most AI automation fails. Not because the technology is bad, but because it's implemented without the principles that make AI systems work in production.
674
-
675
- These four principles separate toy automation from AI systems that actually run businesses.
676
-
677
- The 4 Principles
678
-
679
- 1. Integrated: Works With Your Existing Systems
680
-
681
- Principle: AI must work with your existing tools, not replace them.
682
-
683
- AI that doesn't connect to your CRM, your email, your calendar, your existing workflows is a toy. Real AI automation works WITH what you already have \u2014 not instead of it.
684
-
685
- - Your 50 Zapier workflows keep running
686
- - Your CRM stays your CRM
687
- - AI adds intelligence on top, not a rip-and-replace
688
-
689
- The anti-pattern: "Use our AI instead of everything else." Creates vendor lock-in and throws away your existing investment.
690
-
691
- 2. Improving: Gets Smarter Over Time
692
-
693
- Principle: AI must learn from every decision and improve continuously.
694
-
695
- Static automation is just fancy if-then logic. Real AI captures every approval, rejection, and edit \u2014 then uses that data to get smarter.
696
-
697
- The anti-pattern: "Set it and forget it." Systems that don't learn stay dumb forever.
698
-
699
- 3. Observable: You See What AI Is Doing
700
-
701
- Principle: You must be able to see what AI systems are doing in real-time.
702
-
703
- Black-box automation is unacceptable for business operations. You need to see every action, every decision, every cost \u2014 as it happens.
704
-
705
- - Real-time activity feeds showing what's executing
706
- - Cost tracking per workflow, per execution
707
- - Token usage visibility
708
- - Execution logs for debugging
709
-
710
- The anti-pattern: "It just works, trust us." Systems without observability create anxiety and prevent adoption.
711
-
712
- 4. Governed: Humans Control What Matters
713
-
714
- Principle: Humans must approve important actions before execution.
715
-
716
- AI should handle the grunt work. But critical decisions \u2014 sending emails to prospects, updating customer records, publishing content \u2014 require human approval.
717
-
718
- - AI researches 50 prospects and drafts personalized emails
719
- - Before anything sends, it lands in your approval queue
720
- - You spend 10 minutes reviewing, approve or tweak
721
- - Only then does it execute
722
-
723
- The anti-pattern: "Fully autonomous AI." Systems without governance create risk and erode trust.`
724
- },
725
- {
726
- id: "knowledge.new-vertical-launch-playbook",
727
- title: "New Vertical Launch Playbook",
728
- summary: "Zero-to-first-campaign workflow for launching a new acquisition vertical: batch definition, tracker setup, lead generation stages, campaign launch, and monitoring.",
729
- bodyText: `Overview
730
-
731
- Use this playbook when launching a new acquisition vertical from zero to first campaign. A vertical launch turns an audience hypothesis such as independent dental practices, auto repair shops, or bookkeeping firms into a tracked lead generation batch, qualified contacts, a draft Instantly campaign, and an active monitoring loop.
732
-
733
- The workflow has five phases:
734
-
735
- 1. Define the batch and qualification rules.
736
- 2. Create the batch tracker.
737
- 3. Run the lead generation pipeline.
738
- 4. Launch the outreach campaign.
739
- 5. Monitor replies and campaign quality.
740
-
741
- Define the Batch
742
-
743
- Choose a batch ID using the acquisition naming convention: {vertical}-{number}, for example dental-1, auto-1, or home-1.
744
-
745
- Record the batch configuration in the tracker before running pipeline stages. At minimum, capture:
746
-
747
- - Target description, such as "independent dental practices in Orange County, California".
748
- - Search queries for the initial source pull.
749
- - Region: county, state, country, or other geography accepted by the scraper workflow.
750
- - Minimum review count and minimum rating, when Google Maps quality thresholds matter.
751
- - Custom disqualification rules, such as excluding chains, franchises, pediatric-only practices, or irrelevant subcategories.
752
- - Website crawl keywords, such as about, team, staff, contact, services, or vertical-specific service pages.
753
-
754
- Use packages/elevasis-operations/src/sales/prospecting/constants.ts as the batch registry. Current launch work should keep the tracker as the human-readable source and pass qualification criteria through the workflow input, list qualification metadata, or the registered batch config for the stage being run.
755
-
756
- Create the Batch Tracker
757
-
758
- Create a tracker from the acquisition batch template:
759
-
760
- text
761
- apps/docs/content/docs/operations/client-acquisition/outreach/batches/template.mdx
762
-
763
- Place the new tracker in the pending batch directory:
764
-
765
- text
766
- apps/docs/content/docs/operations/client-acquisition/outreach/batches/pending/{batch-id}.mdx
767
-
768
- Fill in the frontmatter with status: in-progress, then complete the batch configuration table before running pipeline work. The tracker should make it possible to reconstruct the vertical, region, search inputs, disqualification rules, and campaign state without reading execution logs.
769
-
770
- Run Lead Generation
771
-
772
- Run the lead generation stages with the platform CLI from the monorepo root so .env.development and .env.production resolve correctly.
773
-
774
- Stage 01: Google Maps Scrape
775
-
776
- Use the Google Maps scrape workflow to acquire initial companies:
777
-
778
- bash
779
- pnpm exec elevasis exec Elevasis/lgn-01a-google-maps-scrape-workflow --input '{"searchQueries":["dentist","dental clinic"],"county":"Orange County","state":"California"}' --async
780
-
781
- After the execution starts, record the execution ID and source counts in the batch tracker.
782
-
783
- Local Website Crawl
784
-
785
- Run the local website crawler against the batch:
786
-
787
- bash
788
- pnpm -C scripts/web-scraper run crawl -- {batch-id}
789
-
790
- The crawl should capture relevant sub-pages for LLM extraction. If vertical-specific keywords are not available in the active code path, use the default crawl coverage and note any manual crawl gaps in the tracker before extraction.
791
-
792
- Stage 02: Website Extract
793
-
794
- Extract structured company profile data from crawl output:
795
-
796
- bash
797
- pnpm exec elevasis exec Elevasis/lgn-02-website-extract-workflow --input '{"batchId":"{batch-id}"}' --async
798
-
799
- Stage 03: Company Qualification
800
-
801
- Qualify companies using the target description, review thresholds, rating thresholds, and custom rules captured in the tracker. If the workflow does not resolve criteria automatically for the batch, pass the criteria explicitly in the input or attach them through the list qualification surface before running the stage.
802
-
803
- bash
804
- pnpm exec elevasis exec Elevasis/lgn-03-company-qualification-workflow --input '{"batchId":"{batch-id}","criteria":{"targetDescription":"Independent dental practices in Orange County, California","minimumReviewCount":5,"minimumRating":3,"customRules":"Disqualify franchises and chains. Disqualify orthodontics-only and pediatric-only practices."}}' --async
805
-
806
- For list-oriented runs, use listId instead of batchId; list configuration takes priority over the batch registry unless an explicit criteria override is provided.
807
-
808
- Stage 04: Email Discovery
809
-
810
- Discover contacts for qualified companies:
811
-
812
- bash
813
- pnpm exec elevasis exec Elevasis/lgn-04-email-discovery-workflow --input '{"batchId":"{batch-id}"}' --async
814
-
815
- Stage 05: Email Verification
816
-
817
- Verify discovered emails before campaign upload:
818
-
819
- bash
820
- pnpm exec elevasis exec Elevasis/lgn-05-email-verification-workflow --input '{"batchId":"{batch-id}"}' --async
821
-
822
- When verification completes, update the tracker with company counts, contact counts, usable email counts, and set the batch status to ready if campaign launch prerequisites are satisfied.
823
-
824
- Launch the Campaign
825
-
826
- Use the acquisition outreach workflow to move a ready batch into Instantly:
827
-
828
- 1. Check account inventory with ist-account-inventory-workflow.
829
- 2. Personalize contacts with ist-personalization-workflow.
830
- 3. Create a draft campaign with ist-campaign-create-workflow and activate: false.
831
- 4. Create the tracking list with ist-campaign-list-workflow.
832
- 5. Upload contacts with ist-upload-workflow, dry run first and then real.
833
- 6. Activate with ist-campaign-activate-workflow.
834
- 7. Update the tracker to status: active and fill in campaign metadata.
835
-
836
- Keep the first campaign small enough to evaluate copy and deliverability. Prefer 100-200 contacts per segment, 1-2 contacts per company, and conservative sending volume until benchmarks are visible.
837
-
838
- Monitor and Optimize
839
-
840
- After launch, monitor both campaign metrics and inbound replies:
841
-
842
- - Use /acquisition --outreach for campaign review and analytics.
843
- - Use /acquisition --inbound status for reply handling and active deal state.
844
- - Watch open rate, reply rate, positive reply rate, and bounce rate.
845
- - Pause or repair the campaign if bounce rate rises above the accepted threshold.
846
- - Rework subject lines, personalization, or offer framing when reply rate is below target.
847
-
848
- Every optimization pass should write back to the tracker: what changed, why it changed, and what result would justify scaling the vertical.
849
-
850
- Launch Checklist
851
-
852
- - Batch ID selected with {vertical}-{number} naming.
853
- - Batch tracker created from the template.
854
- - Target description, geography, search queries, thresholds, and custom rules recorded.
855
- - Stage 01 scrape execution complete.
856
- - Website crawl complete or crawl gaps documented.
857
- - Stage 02 extraction complete.
858
- - Stage 03 qualification complete with explicit criteria source.
859
- - Stage 04 email discovery complete.
860
- - Stage 05 email verification complete.
861
- - Tracker status set to ready.
862
- - Draft Instantly campaign created.
863
- - Tracking list created and contacts uploaded.
864
- - Campaign activated.
865
- - Tracker status set to active with campaign metadata.`
866
- },
867
- {
868
- id: "knowledge.upwork-calibration-strategy",
869
- title: "Upwork Calibration Strategy",
870
- summary: "Deep calibration process for Upwork queries, including scan parameters, scoring, duplicate handling, output format, verdict criteria, and current calibration results.",
871
- bodyText: "Overview\n\nUse this playbook when running a deep calibration scan for one or more Upwork queries. Calibration is separate from daily scanning: it evaluates query quality, competition, uniqueness, and noise patterns so the active saved-query set stays healthy.\n\nUse calibration when:\n\n- Testing a new query candidate before adding it to active scans.\n- Re-evaluating an active query whose health score has declined.\n- Running periodic re-calibration of the full active query set. Quarterly is the default cadence.\n\nUse knowledge.upwork-query-strategy for the active query table and knowledge.upwork-scanning-playbook for the daily scan workflow.\n\nScan Parameters\n\n| Parameter | Value | Rationale |\n| --------- | ----- | --------- |\n| Max posts | 20 per query | Enough for confidence without turning calibration into an archive. |\n| Max age | 2 weeks | Captures 2 full hiring cycles; older posts are stale. |\n| Filters | U.S. only, Most Recent | Matches the standard scan surface while preserving full competition visibility. |\n| Proposal filter | None | Calibration needs to see competition levels, not hide them. |\n| Extraction | Search page script | Capture title, snippet, budget, proposals, and client info without click-in enrichment. |\n\nCalibration Process\n\n1. Check the Upwork query registry for the exact candidate query and close variants.\n2. Re-test a dropped query only if the search terms or market conditions have changed.\n3. Navigate to https://www.upwork.com/nx/search/jobs/.\n4. Enter the query and apply U.S. only plus Most Recent sort.\n5. Run the search-card extraction script from the operations docs.\n6. If more than 20 results are visible, analyze only the first 20.\n7. If fewer than 20 results are visible, analyze all visible posts.\n8. Record the exact result count shown by Upwork in the search header.\n9. Score each extracted post with the calibration relevance rubric.\n10. For each post scoring 50+, check whether it appears in other query calibration docs.\n11. Write the per-query calibration doc and update the summary results.\n\nRelevance Rubric\n\nFor each extracted post, assign a relevance score from 0 to 100. The core question is whether the client needs a system, workflow, integration, automation, or operational build that Elevasis can deliver.\n\n| Score Range | Tier | Meaning |\n| ----------- | ---- | ------- |\n| 75-100 | Strong fit | Clear build intent, named platforms or tools, business context, and specific deliverable. |\n| 50-74 | Possible fit | Some build signals, but scope or domain is ambiguous. |\n| 25-49 | Weak fit | Marginally related and mostly noise. |\n| 0-24 | Irrelevant | Hiring posts, marketing or design work, personal projects, manual work, or VA work. |\n\nAuto-score disqualifiers in the 0-10 range even if they contain automation language:\n\n- Hiring for a role.\n- Marketing, design, or funnel work.\n- Manual or VA tasks.\n- Personal, non-business projects.\n\nDuplicate Handling\n\nFor each post scoring 50+, check whether the same job appeared in another query's calibration output. Mark it with DUPE: Q{N} when found.\n\nTrack total relevance and unique relevance separately. A query with 60% relevance but 0% unique relevance is usually not worth keeping because it adds scan time without adding opportunity coverage.\n\nOutput Format\n\nPer-query calibration docs use this naming pattern:\n\ntext\nq{NN}-{slug}.mdx\ncandidate-{slug}.mdx\nsummary.mdx\n\nUse active-query filenames such as q15-system-nouns.mdx and candidate filenames such as candidate-pipedrive.mdx.\n\nEach per-query doc should include:\n\n- Frontmatter with title, exact query, scan date, total Upwork result count, analyzed post count, relevant count, and verdict.\n- A ## Posts section with post-level scoring.\n- A ## Summary section with relevance rate, high-relevance count, perfect fits, low-competition gems, unique posts, noise patterns, why the query works or fails, and final verdict.\n\nKeep irrelevant posts short. Relevant posts should include budget, proposals, posted age, client signal, description snippet, relevance rationale, and uniqueness or duplicate marker.\n\nVerdict Criteria\n\n| Verdict | Criteria |\n| ------- | -------- |\n| KEEP (strong) | More than 40% relevance, more than 20% unique relevance, more than 2 low-competition gems, and fresh posts within 1 week. |\n| KEEP (borderline) | 25-40% relevance, or low unique relevance but useful low-competition gems. Trial for 3 scans. |\n| MONITOR | Relevant posts exist but are flooded with 20-50 proposals. Cherry-pick only; do not treat as a core saved search. |\n| DROP | Less than 20% relevance, 0 low-competition gems, dead volume under 5 results, or all stale posts older than 2 weeks. |\n\nQuick vs Deep Calibration\n\n| Aspect | Quick Screening | Deep Calibration |\n| ------ | --------------- | ---------------- |\n| Purpose | Fast keep/drop triage for new candidates. | Full analysis for active-query management. |\n| Posts | All visible, no hard max. | Max 20, max 2 weeks old. |\n| Scoring | Inline summary table. | Per-post entries with rationale. |\n| Output | Task notes or conversation. | Dedicated calibration MDX document. |\n| Duplicate check | Informal overlap note. | Formal cross-reference with post numbers. |\n| Use case | Bulk screening 5+ candidates. | Promotion, quarterly review, or declined health score. |\n\nCurrent Calibration Results\n\nLast full calibration: 2026-03-29.\n\nDeep scan results exist as original scan session notes. Formal per-query calibration files have not yet been written.\n\n| Current Q# | Query | Total | Rel | Unique Rel | Calibration Status |\n| ---------- | ----- | ----- | --- | ---------- | ------------------ |\n| Q1 | System nouns | 47 | 60% | 30% | Not yet written: q15-system-nouns.mdx. |\n| Q2 | GHL | 111 | 50% | 45% | Not yet written: q16-ghl.mdx. |\n| Q3 | AR/AP/Collections | 66 | 40% | 30% | Not yet written: q01-ar-ap-collections.mdx. |\n| Q4 | Inventory | 69 | 40% | 35% | Not yet written: q06-inventory.mdx. |\n| Q5 | Invoice/billing | 67 | 55% | 30% | Not yet written: q04-invoice-billing.mdx. |\n| Q6 | CRM | 370 | 40% | 20% | Not yet written: q08-crm.mdx. |\n| Q7 | API integration | 298 | 40% | 15% | Not yet written: q14-api-integrate.mdx. |\n| Q8 | Pipedrive | 10 | 40% | 30% | Quick scan only; no deep calibration file yet. |\n\nThe current query numbers match knowledge.upwork-query-strategy. The older calibration filenames reflect original 16-query scan numbering.\n\nNoise Patterns\n\nCommon noise patterns across calibrated queries:\n\n- Hiring posts: the top noise source across all queries, especially CRM and API searches.\n- Marketing and funnel work: especially common in GHL-adjacent searches.\n- Bookkeeper and accountant roles: common in AR/AP and invoice searches.\n- BI and analytics specialist work: common in invoice/billing and API searches.\n- High competition: broad CRM and API queries often attract 20-50+ proposals.\n\nCross-Query Overlap\n\nThe highest-overlap pairs from calibration:\n\n- Q3 AR/AP and Q5 Invoice/billing overlap heavily on financial automation posts.\n- Q6 CRM and Q7 API catch many of each other's broad integration posts.\n- Q1 System nouns produces the most unique gems and remains the strongest standalone query."
872
- },
873
- {
874
- id: "knowledge.upwork-query-strategy",
875
- title: "Upwork Query Strategy",
876
- summary: "Active saved-query set, tiering, calibration outcomes, query-design principles, and failure modes for the Upwork acquisition channel.",
877
- bodyText: 'Overview\n\nUse this reference to choose which Upwork saved searches to scan, understand why each query is active, and avoid repeating failed discovery work. The active query set targets niche operations and business-process automation jobs rather than broad "AI automation" searches, which are usually saturated.\n\nUse knowledge.upwork-scanning-playbook for the scan workflow and knowledge.upwork-calibration-strategy for deep query calibration.\n\nActive Saved Queries\n\nThe active saved-query set has 14 queries as of 2026-03-31. Q1-Q7 were kept after the full calibration scan of the original 16 queries. Q8 Pipedrive was added after SaaS platform calibration. Q9-Q14 are formerly monitor-tier queries moved into active scanning with stricter freshness and competition discipline.\n\n| Tier | # | Query | Relevance | Unique Rel | Rationale |\n| ---- | -- | ----- | --------- | ---------- | --------- |\n| T1 | 1 | ("booking system" OR "intake form" OR "scheduling system" OR "ticketing system" OR "tracking system" OR "reservation system" OR "billing system" OR "payment system") AND (build OR automate OR custom) | 60% | 30% | Best query. SMB owners describe systems they need built. Lowest competition and highest ROI per connect. |\n| T1 | 2 | ("GoHighLevel" OR "GHL") AND (build OR setup OR integration OR workflow OR automate) | 50% | 45% | GHL niche with high unique relevance. "Funnel" was removed because it pulled marketing noise; "automate" replaced it. |\n| T2 | 3 | ("accounts receivable" OR "accounts payable" OR "collections") AND automate | 40% | 30% | "Automate" catches real builds and maps to the Xero testimonial. Some overlap with Q1 and Q7. |\n| T2 | 4 | "inventory" AND ("automation" OR "integration" OR "sync") | 40% | 35% | Inventory system builds are unique to this query. Low cross-query overlap. |\n| T3 | 5 | ("invoice" OR "billing") AND ("automate" OR "integration") | 55% | 30% | Finds healthcare EDI, Stripe Connect, and Power Automate AP work. Heavy Q3 overlap. |\n| T3 | 6 | "CRM" AND ("integration" OR "automate" OR "migrate") | 40% | 20% | Finds Twenty CRM, HubSpot Service Hub, and Zoho automation. Noisy and high-volume. |\n| T3 | 7 | "integrate" AND "API" AND (build OR develop OR custom) | 40% | 15% | Finds strong integration work such as Authorize.Net webhooks and Email-to-ERP pipelines. Competition is often high. |\n| T3 | 8 | "Pipedrive" AND (build OR setup OR integration OR workflow OR automate) | 40% | 30% | CRM setup and automation builds. Only platform query besides GHL to pass calibration. Trial query; evaluate after 3 scans. |\n| T4 | 9 | ("Zapier" OR "Make.com" OR "n8n") AND (automate OR build OR workflow) | Very high | -- | High relevance but competition risk. Apply only to posts with fewer than 10 proposals. |\n| T4 | 10 | "SaaS" AND ("MVP" OR "prototype") AND (build OR develop) | High | -- | Bimodal competition: some low-proposal gems, some flooded posts. Skip flooded posts. |\n| T4 | 11 | "Google Sheets" AND (automate OR app OR dashboard OR replace) | 40% | -- | Fresh and even competition spread. Good posts get flooded quickly, so prioritize speed. |\n| T4 | 12 | "chatbot" AND (build OR custom OR develop) | 25% | -- | Low relevance baseline. Pulls AI engineering hiring and chat UI work, but occasional SMB gems exist. |\n| T4 | 13 | ("voice agent" OR "AI receptionist") AND (build OR develop OR custom) | High | -- | Very low volume, often 1-2 results. High quality when fresh posts appear. |\n| T4 | 14 | "sales funnel" AND (automate OR build OR system OR custom) | 40% | -- | Fresh GHL integrations and CRM builds mixed with affiliate-funnel noise. Filter hard. |\n\nAll active queries use the Upwork proposal-count filters "Less than 5" and "5 to 10". Tier 1 queries are the primary scan focus. Tier 2 queries are solid contributors. Tier 3 queries are borderline and should be dropped if health scores decline across 3 or more scans. Tier 4 queries have higher competition risk and should only be applied to fresh, low-proposal posts.\n\nQuery Design Principles\n\nStrong Upwork queries describe the system the buyer needs, not the freelancer category they think they are hiring.\n\nUse:\n\n- Specific operational system nouns such as booking system, intake form, scheduling system, ticketing system, tracking system, reservation system, billing system, and payment system.\n- Action verbs such as build, automate, custom, develop, setup, integration, and workflow.\n- Platform-specific searches when system-build intent overlaps with implementation work, such as GoHighLevel, Pipedrive, CRM, API integration, and inventory sync.\n- The Q1 pattern: specific system noun plus action verb. This catches clients describing the thing they need built.\n- The proposal-count filter from 0-10 proposals. Competition control is non-negotiable.\n\nAvoid:\n\n- Vertical keywords such as clinic, contractor, salon, or real estate. On Upwork these usually pull marketing or hiring posts for that industry, not system buyers from that industry.\n- Pain-signal phrases such as "hours per week", "manual", "repetitive", or "bottleneck". On Upwork these usually mean the client is hiring humans to perform the work.\n- Migration terms such as migrate, replace, or switch unless tied to a concrete platform or system. Generic migration queries pull website and email platform changes.\n- Broad tool or category nouns such as portal, dashboard, tool, or custom without a specific system type.\n- Solution-first keywords such as AI automation, AI agent, and workflow automation. They attract the saturated AI freelancer crowd.\n- Revenue-proximity service terms such as cold email, outbound, nurture, appointment setting, and qualify leads. These are proposal-positioning angles, not good Upwork query filters.\n- Professional-service terms such as contract review, due diligence, or reputation management. They pull human professionals rather than system builds.\n\nQuery Evolution\n\nDiscovery is complete for the current strategy: 127 queries were tested across 18 rounds and calibrated to 14 active queries. The current ROI lever is execution quality: faster scans, stronger proposal targeting, and query-health monitoring.\n\nQ1 has 8 proven system nouns:\n\n- Booking system.\n- Intake form.\n- Scheduling system.\n- Ticketing system.\n- Tracking system.\n- Reservation system.\n- Billing system.\n- Payment system.\n\nTwenty-three other system nouns were tested and failed. Before testing any new query, check the Upwork query registry in the operations docs for prior verdicts and failure modes.\n\nKnown Limitations\n\n- The "U.S. only" checkbox does not persist with saved searches. It is a session-only filter and must be manually checked each time a saved search loads.\n- Upwork search is not strict phrase matching. A quoted phrase such as "client portal" can still match posts containing the words separately.\n- Relevance percentages are from the expanded 2026-03-29 evaluation: 147 jobs across 15 queries plus 32-query discovery analysis. Re-evaluate monthly as job mix shifts.\n\nLive Reference Docs\n\nPreserve these operations docs because they remain live working references rather than migrated Knowledge Map content:\n\n- apps/docs/content/docs/operations/client-acquisition/upwork/query-registry.mdx tracks all 127 tested queries, verdicts, and failure modes.\n- apps/docs/content/docs/operations/client-acquisition/upwork/scripts.mdx stores runnable browser extraction scripts and current Upwork DOM notes.'
878
- },
879
- {
880
- id: "knowledge.upwork-scanning-playbook",
881
- title: "Upwork Scanning Playbook",
882
- summary: "Stable scanning, scoring, freshness, and query-health workflow for the Upwork acquisition channel.",
883
- bodyText: 'Overview\n\nUse this playbook to run the Upwork acquisition scanning loop. The goal is to find fresh, low-competition jobs where Elevasis can deliver a real business system, score them consistently, and turn the best opportunities into proposals through the Upwork proposal playbook.\n\nThe scanning loop has six phases:\n\n1. Confirm browser and login readiness.\n2. Run saved search queries with the right filters.\n3. Extract fresh job cards.\n4. Deduplicate, score, and enrich strong candidates.\n5. Write the scan output.\n6. Review query health before the next scan.\n\nProposal copy and response handling are intentionally separate. Use knowledge.upwork-proposal-playbook for proposal strategy and knowledge.upwork-response-templates for client replies.\n\nPreconditions\n\nBefore scanning, verify the browser automation surface is available and Upwork is logged in.\n\n- Chrome tooling must be available through the active browser automation tools.\n- The Upwork search page must load at https://www.upwork.com/nx/search/jobs/.\n- The page must show the job search interface, not a login prompt.\n- If login is required, stop and log in manually before scanning again.\n\nDo not try to work around a missing browser session by inventing scan results. The scan depends on live Upwork search pages, current saved-search filters, and the visible result cards.\n\nScan Surface\n\nRun scans from the Upwork search page:\n\ntext\nhttps://www.upwork.com/nx/search/jobs/\n\nEach saved query is run individually. Apply the filters every time, because Upwork search state is session-dependent and not always persisted across queries.\n\n| Filter | Value | Reason |\n| --------- | ----------- | ---------------------------------------------------------------------- |\n| U.S. only | Checked | Higher-quality clients, stronger timezone fit, more verified payments. |\n| Sort by | Most Recent | Freshness is the strongest conversion lever. |\n| Proposals | \\<5, 5-10 | Low competition is required before spending connects. |\n\nUse saved queries as the primary scan source. The strategy targets operational system-build terms, not generic "AI automation" searches that attract high competition.\n\nFreshness Rule\n\nOnly collect posts from the last 12 hours. Results should be sorted by Most Recent, so stop extracting for a query once the visible posts are older than 12 hours. Do not do catch-up windows.\n\nFreshness priority:\n\n| Post age | Action |\n| ---------- | ---------------------------------------------------------------- |\n| 0-1 hour | Highest priority. Client is most likely active and shortlisting. |\n| 1-12 hours | Valid scan window. Still worth scoring if competition is low. |\n| 12+ hours | Skip. The client has usually already formed the shortlist. |\n\nRecord the scan timestamp as lastscanned in the daily scan doc frontmatter. This timestamp helps avoid reprocessing posts from prior scans, but the hard 12-hour cap still applies.\n\nRun Each Query\n\nFor each active saved query:\n\n1. Clear the search box.\n2. Enter the query string and submit.\n3. Apply U.S. only, Most Recent, and proposal-count filters.\n4. Wait for results to render.\n5. Extract visible job cards from the search page.\n6. Stop once a post exceeds the freshness cutoff.\n7. Tag each job with the source query.\n\nThe first page of most-recent, low-proposal results is the high-value slice. Do not paginate unless a specific investigation requires it.\n\nWhile scanning the API integration query, flag custom dashboard opportunities where a custom build is likely better than Power BI, Looker, Tableau, or a spreadsheet. Strong signs include 3+ data sources, live dashboard requirements, AI-generated summaries, anomaly detection, or workflow triggers.\n\nExtract Job Card Data\n\nThe search-card extraction should capture the fields needed for initial triage:\n\n- Title.\n- Upwork job URL path.\n- Posted age.\n- Proposal count.\n- Budget or hourly range.\n- Payment verification.\n- Client rating.\n- Total client spend.\n- Description snippet.\n- Source query.\n\nDeduplicate by Upwork job URL path after all queries finish. If a job appears under multiple queries, keep one row and note the overlap.\n\nScore and Enrich\n\nScoring has two stages.\n\nStage 1: Relevance\n\nScore relevance from 0 to 100 by asking whether the client needs a system, workflow, integration, automation, or operational build that Elevasis can deliver.\n\n| Range | Label | Criteria |\n| ------ | ------------ | ------------------------------------------------------------------------- |\n| 75-100 | Strong fit | Clear build intent, specific business workflow, named tools or outputs. |\n| 50-74 | Possible fit | Some build signals, but scope or buyer intent is ambiguous. |\n| 25-49 | Weak fit | Marginally related, mostly noise, low business-system signal. |\n| 0-24 | Irrelevant | Hiring, marketing, design, manual VA work, personal projects, or errands. |\n\nDisqualify posts that are clearly hiring a role, outsourcing manual work, asking for generic marketing/design help, or describing a personal/non-business project.\n\nStage 2: Application Priority\n\nApply tactical modifiers after relevance scoring. The final score determines whether to draft a proposal.\n\n| Signal | Positive indicators | Negative indicators |\n| -------------- | ---------------------------------------------------- | ------------------------------------------- |\n| Freshness | \\<1h or same-session post. | 8-12h old, or outside the scan window. |\n| Competition | \\<5 proposals, or 5-10 with strong fit. | 10+ proposals, especially 20+. |\n| Client quality | Payment verified, spend history, good rating, hires. | Unverified, no history, 0% hire rate. |\n| Budget | Fixed \\>$5K or hourly \\>$75/hr. | Fixed \\<$1K or hourly \\<$40/hr. |\n| Fit | Workflow, integration, dashboard, CRM, operations. | Copywriting, funnels, ads, hiring, support. |\n\nOnly enrich posts with a strong enough relevance score to matter, usually 65+. For those posts, open the job detail view and capture:\n\n- Hire rate.\n- Jobs posted.\n- Member since.\n- Company size.\n- Last viewed by client.\n- Interviewing count.\n\nUse this data to avoid over-ranking stale or low-quality clients that have a good-sounding job description but weak application ROI.\n\nWrite the Scan Output\n\nWrite scan docs under:\n\ntext\napps/docs/content/docs/operations/client-acquisition/upwork/scans/{YYYY-MM-DD}.mdx\n\nIf a scan doc already exists for the day, append the new scan as a later section instead of creating a second daily file.\n\nEach scan output should include:\n\n- Date and timestamp.\n- Freshness cutoff.\n- Queries scanned.\n- Total posts collected.\n- Deduplicated count.\n- Top opportunities only.\n- Comparison table.\n- Query health table.\n- Draft proposals section, when proposals are generated.\n\nKeep scan docs as decision tools, not archives. Include the top 10 ranked opportunities rather than every collected post.\n\nQuery Health\n\nAfter scoring, compute a query-health score so weak searches can be removed over time.\n\n| Metric | Measurement | Weight |\n| --------------- | ----------------------------------------------------------------- | ------ |\n| Fresh posts | Count within cutoff, normalized against 5 posts. | 25% |\n| Low competition | Percent with fewer than 10 proposals. | 25% |\n| Relevance | Percent actionable after deduplication and disqualification. | 30% |\n| Client quality | Percent with verified payment and useful spend or rating signals. | 20% |\n\nQueries that score 0 across 3+ consecutive scans are drop candidates. Compare the latest query-health table with the previous scan before changing the active query set.\n\nActive Query Principles\n\nStrong Upwork queries describe the system the buyer needs, not the freelancer category they think they are hiring.\n\nUse:\n\n- Specific operational system nouns such as booking system, intake form, scheduling system, ticketing system, tracking system, reservation system, billing system, and payment system.\n- Action verbs such as build, automate, custom, develop, setup, integration, and workflow.\n- Platform-specific searches where system-build intent overlaps with implementation work, such as GoHighLevel, Pipedrive, CRM, API integration, or inventory sync.\n\nAvoid:\n\n- Broad solution-first terms such as AI automation, AI agent, workflow automation, portal, dashboard, tool, or custom without a specific system noun.\n- Vertical keywords such as clinic, contractor, salon, or real estate unless paired with concrete system intent.\n- Pain-signal phrases that usually mean the client is hiring a human to perform manual work.\n- Revenue-proximity service terms such as cold email, appointment setting, outbound specialist, or funnel work.\n\nBefore testing a new query, read knowledge.upwork-query-strategy and check the Upwork query registry in the operations docs so old failure modes are not repeated. Use knowledge.upwork-calibration-strategy when promoting, dropping, or re-evaluating saved searches.\n\nProposal Handoff\n\nAfter the scan, draft proposals only for opportunities that remain strong after relevance, tactical modifiers, and client-quality checks.\n\nFor proposal drafting:\n\n1. Load knowledge.upwork-proposal-playbook.\n2. Read the top opportunities from the latest scan doc.\n3. Select the right proposal template by scope, budget, and relevance.\n4. Tailor the opening, proof point, plan, and two discovery questions.\n5. Append draft proposals to the scan doc under ## Draft Proposals.\n\nUse knowledge.upwork-response-templates after a client replies or sends an offer.\n\nScan Checklist\n\n- Browser tooling available.\n- Upwork logged in.\n- Search page loaded.\n- U.S. only filter applied.\n- Sort set to Most Recent.\n- Proposal-count filters applied.\n- All active saved queries scanned.\n- Posts older than 12 hours skipped.\n- Jobs deduplicated by URL path.\n- Relevance scores assigned.\n- Strong candidates enriched from detail view.\n- Final scores sorted descending.\n- Daily scan doc created or appended.\n- Query health table written.\n- Top proposal candidates handed to knowledge.upwork-proposal-playbook.'
884
- },
885
- {
886
- id: "knowledge.client-cli-overview",
887
- title: "Client CLI Overview",
888
- summary: "Reference for the seven client:* SDK CLI commands -- list, get, status, resolve, create, update, and delete -- with drill-down recipes for navigating client lineage, org-wide rollups, and write operations.",
889
- bodyText: `Overview
890
-
891
- The client: commands expose the clients hub through the SDK CLI. Use them to paginate clients, inspect individual client lineage, check org-wide status rollups, resolve a fuzzy name to a client ID, and mutate clients with create, update, and delete operations.
892
-
893
- All examples below use the canonical monorepo invocation pattern. Tenant projects inside their own operations/ directory drop the -C packages/elevasis-operations prefix and run pnpm exec elevasis-sdk <cmd> directly.
894
-
895
- client:list
896
-
897
- Lists clients for the authenticated organization with optional filtering and pagination.
898
-
899
- Purpose: Paginate all clients or narrow by status or search term to find the right client ID before drilling in with client:get.
900
-
901
- Monorepo invocation:
902
-
903
- bash
904
- pnpm -C packages/elevasis-operations exec elevasis-sdk client:list
905
-
906
- Tenant invocation (from inside operations/):
907
-
908
- bash
909
- pnpm exec elevasis-sdk client:list
910
-
911
- Key flags:
912
-
913
- - --status <value> -- filter by client status (e.g. active, inactive, prospect)
914
- - --search <term> -- full-text search against client name
915
- - --limit <n> -- maximum rows to return (default varies by server)
916
- - --offset <n> -- pagination offset
917
- - --pretty -- pretty-print JSON output
918
-
919
- Drill-down recipe:
920
-
921
- 1. Run client:list --pretty to scan names and IDs.
922
- 2. Use --search to narrow when the list is long.
923
- 3. Copy the id from a row and pass it to client:get <id> for the full lineage payload (linked deal, primary company, primary contact, projects).
924
-
925
- client:get
926
-
927
- Fetches a single client record with its full lineage payload.
928
-
929
- Purpose: Inspect one client in detail -- its associated deal, primary company, primary contact, and linked projects. Use this to confirm linkage after wiring a project to a client via project:update --client.
930
-
931
- Monorepo invocation:
932
-
933
- bash
934
- pnpm -C packages/elevasis-operations exec elevasis-sdk client:get <clientId>
935
-
936
- Tenant invocation:
937
-
938
- bash
939
- pnpm exec elevasis-sdk client:get <clientId>
940
-
941
- Key flags:
942
-
943
- - --pretty -- pretty-print JSON output
944
-
945
- Drill-down recipe:
946
-
947
- 1. Obtain <clientId> from client:list or client:resolve.
948
- 2. Run client:get <clientId> --pretty.
949
- 3. Check projects array to confirm which projects are linked.
950
- 4. If projects is empty and a linkage was expected, run project:update <projectId> --client <clientId> to attach it.
951
- 5. Re-run client:get to verify the lineage updated.
952
-
953
- client:status
954
-
955
- Returns an org-wide rollup of client counts grouped by status.
956
-
957
- Purpose: High-level health check -- how many clients are active, how many are in each pipeline stage -- without enumerating every record.
958
-
959
- Monorepo invocation:
960
-
961
- bash
962
- pnpm -C packages/elevasis-operations exec elevasis-sdk client:status
963
-
964
- Tenant invocation:
965
-
966
- bash
967
- pnpm exec elevasis-sdk client:status
968
-
969
- Key flags:
970
-
971
- - --pretty -- pretty-print JSON output
972
-
973
- Drill-down recipe:
974
-
975
- 1. Run client:status --pretty to see counts per status bucket.
976
- 2. If a bucket looks unexpectedly large or small, run client:list --status <value> to enumerate the records in that bucket.
977
- 3. Use client:get <id> on specific records to investigate lineage gaps.
978
-
979
- client:resolve
980
-
981
- Fuzzy-resolves a client name to a client ID.
982
-
983
- Purpose: Convert a partial or approximate name to the canonical UUID before passing --client to project commands. Mirrors project:resolve in shape.
984
-
985
- Monorepo invocation:
986
-
987
- bash
988
- pnpm -C packages/elevasis-operations exec elevasis-sdk client:resolve "<query>"
989
-
990
- Tenant invocation:
991
-
992
- bash
993
- pnpm exec elevasis-sdk client:resolve "<query>"
994
-
995
- Key flags:
996
-
997
- None beyond the positional <query> argument. Output is the resolved client ID (or a ranked list if multiple matches exist).
998
-
999
- Drill-down recipe:
1000
-
1001
- 1. Run client:resolve "partial name" -- the command returns the best-match client ID.
1002
- 2. Pass the returned ID to project:create --client <id>, project:update --client <id>, or project:list --client <id>.
1003
- 3. If multiple matches are returned, refine the query or use client:list --search "<term>" to inspect candidates before committing.
1004
-
1005
- client:create
1006
-
1007
- Creates a new client record for the authenticated organization.
1008
-
1009
- Purpose: Provision a client directly from the CLI -- useful for scripted onboarding or bulk imports where no source deal exists yet. The only required field is --name; all relationship IDs are optional and can be set later via client:update.
1010
-
1011
- Monorepo invocation:
1012
-
1013
- bash
1014
- pnpm -C packages/elevasis-operations exec elevasis-sdk client:create --name "Acme Corp"
1015
-
1016
- Tenant invocation (from inside operations/):
1017
-
1018
- bash
1019
- pnpm exec elevasis-sdk client:create --name "Acme Corp"
1020
-
1021
- Key flags:
1022
-
1023
- - --name <name> -- (required) client display name
1024
- - --status <value> -- initial status: active | onboarding | paused | completed | churned
1025
- - --source-deal-id <uuid> -- UUID of the originating deal
1026
- - --primary-company-id <uuid> -- UUID of the primary company record
1027
- - --primary-contact-id <uuid> -- UUID of the primary contact record
1028
- - --metadata <json> -- arbitrary metadata as a JSON string (e.g. '{"tier":"enterprise"}')
1029
- - --pretty -- render a human-readable summary instead of raw JSON
1030
-
1031
- Drill-down recipe:
1032
-
1033
- 1. Run client:create --name "Acme Corp" --status onboarding --pretty to create and confirm the new record.
1034
- 2. Copy the ID from the pretty output (or id from raw JSON) for subsequent commands.
1035
- 3. Run client:get <id> --pretty to verify the full lineage payload was initialized correctly.
1036
- 4. If a source deal exists, pass --source-deal-id <uuid> at create time or backfill with client:update <id> --source-deal-id <uuid>.
1037
-
1038
- client:update
1039
-
1040
- Updates one or more fields on an existing client. Accepts a UUID or fuzzy name as the \\<id\\> argument.
1041
-
1042
- Purpose: Rename a client, change its status, swap or clear relationship IDs, or patch arbitrary metadata -- without leaving the CLI. The command enforces a client-side "at-least-one-field" guard and rejects mutually exclusive flag pairs before making any API call.
1043
-
1044
- Monorepo invocation:
1045
-
1046
- bash
1047
- pnpm -C packages/elevasis-operations exec elevasis-sdk client:update <id> --status active
1048
-
1049
- Tenant invocation:
1050
-
1051
- bash
1052
- pnpm exec elevasis-sdk client:update <id> --status active
1053
-
1054
- Key flags:
1055
-
1056
- - --name <name> -- new client display name
1057
- - --status <value> -- new status: active | onboarding | paused | completed | churned
1058
- - --source-deal-id <uuid> -- set or replace the source deal link
1059
- - --clear-source-deal -- remove the source deal link (sets sourceDealId to null; mutually exclusive with --source-deal-id)
1060
- - --primary-company-id <uuid> -- set or replace the primary company
1061
- - --clear-primary-company -- remove the primary company link (mutually exclusive with --primary-company-id)
1062
- - --primary-contact-id <uuid> -- set or replace the primary contact
1063
- - --clear-primary-contact -- remove the primary contact link (mutually exclusive with --primary-contact-id)
1064
- - --metadata <json> -- replace metadata with the provided JSON string
1065
- - --pretty -- render a human-readable summary instead of raw JSON
1066
-
1067
- Drill-down recipe:
1068
-
1069
- 1. Obtain \\<id\\> from client:list, client:resolve, or the output of client:create.
1070
- 2. Pass only the fields to change -- the command patches rather than replaces the record.
1071
- 3. To unlink a relationship (e.g. remove the source deal), use --clear-source-deal rather than omitting the flag; omitting leaves the existing value unchanged.
1072
- 4. After update, run client:get <id> --pretty to confirm all fields reflect the expected state.
1073
- 5. If the command exits with CONFLICTINGFLAGS on stderr, you passed both a set flag and its --clear- counterpart -- remove one and retry.
1074
-
1075
- client:delete
1076
-
1077
- Deletes a client record. Accepts a UUID or fuzzy name as the \\<id\\> argument.
1078
-
1079
- Purpose: Remove a client that was created in error or is no longer relevant. The API enforces a 409 Conflict when the client has linked rows (deals, projects, companies, contacts). The CLI surfaces the API error message verbatim so you know which links to resolve first.
1080
-
1081
- Monorepo invocation:
1082
-
1083
- bash
1084
- pnpm -C packages/elevasis-operations exec elevasis-sdk client:delete <id>
1085
-
1086
- Tenant invocation:
1087
-
1088
- bash
1089
- pnpm exec elevasis-sdk client:delete <id>
1090
-
1091
- Key flags:
1092
-
1093
- - --pretty -- render a human-readable confirmation instead of raw JSON
1094
- - --api-url <url> -- override the API base URL (advanced; rarely needed)
1095
-
1096
- Drill-down recipe:
1097
-
1098
- 1. Run client:get <id> --pretty to confirm which projects and deal links are attached before attempting deletion.
1099
- 2. Run client:delete <id> --pretty.
1100
- 3. If the API returns a 409, the error message lists the linked record counts (deals, projects, companies, contacts). Unlink or reassign those records first:
1101
- - Projects: project:update <projectId> --clear-client (or reassign with --client <otherId>)
1102
- - Deals: handled via the acquisition domain; no dedicated CLI command today
1103
- 4. Retry client:delete <id> --pretty once all links are resolved.
1104
- 5. Confirm deletion with client:list --search "<name>" -- the record should no longer appear.
1105
-
1106
- Typical Workflow
1107
-
1108
- A common session combining read and write commands:
1109
-
1110
- 1. client:status --pretty -- check org-wide distribution.
1111
- 2. client:resolve "Acme" -- get the Acme client ID.
1112
- 3. client:get <id> --pretty -- confirm lineage (deal, company, contact, projects).
1113
- 4. project:update <projectId> --client <id> -- link a project if missing.
1114
- 5. client:get <id> --pretty -- verify the linkage appears in the projects array.
1115
- 6. client:create --name "New Corp" --status onboarding --pretty -- provision a new client.
1116
- 7. client:update <id> --status active --pretty -- transition a client to active.
1117
- 8. client:delete <id> --pretty -- remove a client (API rejects with 409 if linked rows exist).`
1118
- },
1119
- {
1120
- id: "knowledge.youtube-obs-recording-setup",
1121
- title: "YouTube OBS Recording Setup",
1122
- summary: "Canonical OBS Studio recording setup for Elevasis YouTube production, covering 1080p60 screen capture, safe recording format, NVENC quality settings, audio routing, face-camera scenes, and pre-recording checks.",
1123
- bodyText: `Overview
1124
-
1125
- Use this setup for Elevasis YouTube recordings that combine a short face-camera intro with Command Center or workflow screen capture. The target output is a clean 1080p60 source file that YouTube can re-encode without avoidable motion, audio, or color artifacts.
1126
-
1127
- Baseline configuration:
1128
-
1129
- text
1130
- Video: 1920x1080, 60fps, NV12, Rec. 709 Partial
1131
- Encode: NVENC H.264, CQP 18, P5 preset, High profile
1132
- Format: MKV with automatic remux to MP4
1133
- Audio: 48 kHz stereo, 320 kbps AAC, mixed plus mic-only tracks
1134
- Camera: Insta360 Link 2C at 1080p60 with circle mask
1135
- Scenes: Face + Screen on F5, Screen Only on F6
1136
-
1137
- Prefer 1080p60 over 4K30 for screen recordings. Smooth cursor motion, scrolling, typing, and app transitions matter more than pixel density, and most viewers watch at 1080p or below. 4K30 produces larger files, slower editing, and visibly choppier screen motion.
1138
-
1139
- Recording Output
1140
-
1141
- Record to MKV, not MP4. MKV writes continuously, so a crash usually leaves the file usable. MP4 writes its index at the end, so a crash can corrupt the recording.
1142
-
1143
- Enable automatic remux:
1144
-
1145
- text
1146
- Settings > Advanced > Recording > Automatically remux to mp4
1147
-
1148
- After each recording, upload the remuxed MP4 and keep the MKV as the backup.
1149
-
1150
- Use the advanced recording output mode:
1151
-
1152
- text
1153
- Settings > Output > Output Mode: Advanced
1154
- Recording Tab:
1155
- Type: Standard
1156
- Recording Format: mkv
1157
- Encoder: NVIDIA NVENC H.264
1158
- Rate Control: CQP
1159
- CQ Level: 18
1160
- Keyframe Interval: 2
1161
- Preset: P5 (Slow)
1162
- Profile: high
1163
- Look-ahead: checked
1164
- Psycho Visual Tuning: checked
1165
- Max B-frames: 2
1166
-
1167
- CQP 18 is the stable quality target for screen content. It is visually lossless for this use case and gives YouTube a high-quality source before its VP9 or AV1 re-encode.
1168
-
1169
- Fallback encoders:
1170
-
1171
- - AMD GPU: use AMD HW H.264 (AMF) with equivalent CQP settings.
1172
- - No dedicated GPU: use x264, CRF 18, CPU preset slow, or medium if the CPU struggles.
1173
-
1174
- Set audio bitrates:
1175
-
1176
- text
1177
- Output > Advanced > Audio:
1178
- Track 1: 320 kbps
1179
- Track 2: 320 kbps
1180
-
1181
- Video Settings
1182
-
1183
- Use a 1080p canvas and output:
1184
-
1185
- text
1186
- Settings > Video:
1187
- Base (Canvas) Resolution: 1920x1080
1188
- Output (Scaled) Resolution: 1920x1080
1189
- Downscale Filter: Lanczos (36 samples)
1190
- Common FPS Values: 60
1191
-
1192
- Use Rec. 709 limited-range color:
1193
-
1194
- text
1195
- Settings > Advanced:
1196
- Color Format: NV12
1197
- Color Space: 709
1198
- Color Range: Partial
1199
-
1200
- YouTube expects Rec. 709 limited range. Full range can produce washed-out or overly contrasty results after processing.
1201
-
1202
- For a 3440x1440 ultrawide monitor, crop the display capture to the center 16:9 region before it is downscaled:
1203
-
1204
- 1. Add Display Capture for the primary monitor.
1205
- 2. Right-click the source and open Transform > Edit Transform.
1206
- 3. Set Crop Left to 440 and Crop Right to 440.
1207
- 4. Right-click the source again and select Transform > Fit to Screen.
1208
-
1209
- This crops the capture to the center 2560x1440 region. Keep recorded windows inside that center area. A Windows 11 FancyZones center 16:9 zone is useful for keeping Command Center, browser, and terminal windows inside the captured area.
1210
-
1211
- Use Window Capture only when the recording is limited to one browser window. Display Capture is better for tutorials that switch windows, show the taskbar, or tile terminal and browser views.
1212
-
1213
- Audio Settings
1214
-
1215
- Global audio settings:
1216
-
1217
- text
1218
- Settings > Audio:
1219
- Sample Rate: 48 kHz
1220
- Channels: Stereo
1221
- Desktop Audio: Default
1222
- Mic/Auxiliary Audio: Focusrite USB Audio (Scarlett 2i2)
1223
-
1224
- Set the Focusrite input in Windows before recording:
1225
-
1226
- 1. Open Windows Sound Settings.
1227
- 2. Select the Focusrite USB Audio input.
1228
- 3. Set format to 48000 Hz, 24-bit.
1229
-
1230
- Physical Focusrite setup:
1231
-
1232
- - Turn 48V phantom power on for the Lewitt LCT 240 PRO condenser.
1233
- - Start input gain at 12 o'clock and adjust so peaks land around -12 dB.
1234
- - Keep Direct Monitor off to avoid double-monitoring.
1235
-
1236
- Apply OBS mic filters to the Mic/Aux source in this exact order:
1237
-
1238
- | Order | Filter | Settings |
1239
- | ----- | ----------------- | ------------------------------------------------------------------------ |
1240
- | 1 | Noise Suppression | RNNoise |
1241
- | 2 | Noise Gate | Close -40 dB, Open -35 dB, Attack 10 ms, Hold 200 ms, Release 100 ms |
1242
- | 3 | Compressor | Ratio 3:1, Threshold -18 dB, Attack 6 ms, Release 60 ms, Output Gain 6 dB |
1243
- | 4 | Limiter | Threshold -3 dB, Release 60 ms |
1244
-
1245
- This order removes steady noise first, gates silence-period noise second, evens speech dynamics third, and catches peaks last. Do not add a Gain filter unless the signal is still too quiet after setting the Scarlett gain.
1246
-
1247
- Multi-Track Audio
1248
-
1249
- Record mixed audio and isolated mic audio:
1250
-
1251
- text
1252
- Settings > Output > Advanced > Recording Tab:
1253
- Audio Track: check 1 and 2
1254
-
1255
- Route tracks in Audio Mixer > Advanced Audio Properties:
1256
-
1257
- | Source | Track 1 | Track 2 |
1258
- | ------------- | ------- | ------- |
1259
- | Desktop Audio | checked | empty |
1260
- | Mic/Aux | checked | checked |
1261
-
1262
- Track 1 is YouTube-ready mixed audio. Track 2 is mic-only audio for cleanup or editing.
1263
-
1264
- Scene Setup
1265
-
1266
- Create two scenes.
1267
-
1268
- Face + Screen
1269
-
1270
- Use this scene for the intro and occasional commentary call-ins.
1271
-
1272
- Sources from bottom to top:
1273
-
1274
- 1. Display Capture named Screen.
1275
- 2. Video Capture Device named Facecam.
1276
- 3. Optional image source for a circle border or glow.
1277
-
1278
- Display Capture settings:
1279
-
1280
- text
1281
- Source: Display Capture
1282
- Display: Primary monitor
1283
- Capture Method: Windows 10 (1903 and later)
1284
- Capture Cursor: checked
1285
-
1286
- Apply the ultrawide crop to this source when recording from the 3440x1440 monitor.
1287
-
1288
- Facecam settings:
1289
-
1290
- text
1291
- Device: Insta360 Link 2C
1292
- Resolution: 1920x1080
1293
- FPS: 60
1294
- Video Format: MJPEG or default
1295
-
1296
- Create a 512x512 PNG with a white circle on a black background and store it permanently, for example:
1297
-
1298
- text
1299
- E:\\OBS\\circle-mask.png
1300
-
1301
- Apply it to the Facecam source:
1302
-
1303
- text
1304
- Filters > Image Mask/Blend:
1305
- Type: Alpha Mask (Colour Channel)
1306
- Path: E:\\OBS\\circle-mask.png
1307
-
1308
- Resize the facecam source to roughly 300-400 px diameter and place it in a lower corner.
1309
-
1310
- Screen Only
1311
-
1312
- Use this scene for the main tutorial content.
1313
-
1314
- Add the existing Screen source from the Face + Screen scene. Do not duplicate the display capture source.
1315
-
1316
- Hotkeys:
1317
-
1318
- text
1319
- Settings > Hotkeys:
1320
- Switch to Scene "Face + Screen": F5
1321
- Switch to Scene "Screen Only": F6
1322
- Start Recording: Ctrl+F9
1323
- Stop Recording: Ctrl+F10
1324
-
1325
- Avoid hotkeys that collide with the app being recorded. If using F5 inside a browser-heavy recording, choose a different key because F5 refreshes the page.
1326
-
1327
- Recording flow:
1328
-
1329
- 1. Start on Face + Screen.
1330
- 2. Press Ctrl+F9.
1331
- 3. Record a 15-30 second face-camera intro.
1332
- 4. Press F6 for Screen Only.
1333
- 5. Record the screen walkthrough.
1334
- 6. Optionally press F5 to bring face-camera back for commentary.
1335
- 7. Press Ctrl+F10 to stop.
1336
-
1337
- For a fade, set Scene Transitions to Fade with a 300 ms duration.
1338
-
1339
- Windows 11 Checks
1340
-
1341
- Before a recording session:
1342
-
1343
- - Disable Xbox Game Bar.
1344
- - Leave GPU scheduling enabled.
1345
- - Run OBS as Administrator if frame drops or black-screen capture occur.
1346
- - Set OBS process priority to Above Normal if the recording drops frames.
1347
- - Use the High Performance power plan during recording.
1348
-
1349
- Upload Quality
1350
-
1351
- YouTube re-encodes every upload. The goal is to provide clean source material.
1352
-
1353
- - Do not upload at YouTube's minimum recommended bitrate.
1354
- - Do not run the recording through HandBrake or another extra encode just to save space.
1355
- - Upload the OBS-remuxed MP4 directly unless the video was edited.
1356
- - If editing in DaVinci Resolve or Premiere, render H.264 at 50 Mbps CBR for 1080p60 or use the YouTube preset.
1357
-
1358
- The OBS output should match YouTube's expected upload shape: MP4 container, H.264 video, AAC-LC audio, 48 kHz stereo, Rec. 709 limited range.
1359
-
1360
- Pre-Recording Checklist
1361
-
1362
- - Scarlett 2i2 phantom power is on and voice peaks around -12 dB.
1363
- - Correct OBS scene is selected, usually Face + Screen.
1364
- - Insta360 Link Controller has AI tracking and HDR enabled when needed.
1365
- - Door is closed, fan or AC is off, and the room is controlled.
1366
- - OBS mic meter peaks in green or yellow, never red.
1367
- - A 10-second test recording has been played back for audio, video quality, and facecam position.
1368
- - The 12-minute warm-up from knowledge.youtube-mental-prep is complete when recording on camera.`
1369
- },
1370
- {
1371
- id: "knowledge.finance-operations-playbook",
1372
- title: "Finance Operations Playbook",
1373
- summary: "Operating playbook for Elevasis finance: Xero as the system of record, Stripe payment collection and payout reconciliation, invoicing and AR cadence, tax estimates, deductions, 1099s, and annual filing prep.",
1374
- bodyText: "Overview\n\nElevasis finance operations run through Xero, with Stripe handling payment collection. Xero is the single source of truth for financial records: business checking bank feeds, Stripe payouts, contractor payments, expenses, invoices, receivables, and year-end exports.\n\nThe finance loop has three connected parts:\n\n1. Invoicing captures client revenue through monthly retainers and Stripe Checkout.\n2. Accounting records and reconciles bank transactions, Stripe payouts, contractor payments, and operating expenses.\n3. Taxes use accurate Xero records for quarterly estimates, deductions, 1099s, and annual filing.\n\nAccounting and Reconciliation\n\nReconcile bank transactions in Xero weekly. Match each bank feed entry to its real-world source before month end.\n\n- Stripe payouts should match against Stripe bank feed activity.\n- Contractor payments should match checking account transfers.\n- Software subscriptions such as Railway, Vercel, Supabase, WorkOS, and OpenAI should be categorized as operating expenses.\n- Unmatched or ambiguous transactions should be flagged for manual review before monthly close.\n\nMaintain the core chart of accounts around revenue, cost of sales, operating expenses, and owner draws. Revenue includes client retainers and one-time project fees. Cost of sales covers contractor labor directly tied to client work. Operating expenses cover SaaS tools, hosting, banking fees, and professional services. Owner draws track business distributions.\n\nConfigure Xero with the connected business checking account, the default tax rate for the business jurisdiction, and the correct financial year end in organization settings.\n\nInvoicing and Accounts Receivable\n\nClient billing runs on a monthly retainer model. Create invoices in Xero at the start of each billing period, send them by Xero email or Stripe Checkout link, record payment after Stripe confirms checkout completion, and reconcile the Stripe payout in Xero.\n\nUse Xero repeating invoices for monthly retainers:\n\n- Frequency: monthly.\n- Start date: billing cycle start date.\n- Approval: automatic approval where the billing terms are stable.\n\nConfigure invoice reminders around the due date: a courtesy reminder 3 days before due date, an overdue notice 1 day after due date, and an escalation notice 7 days after due date.\n\nFor invoices more than 14 days overdue, contact the client directly through the active communication channel, pause active work pending payment confirmation, and resolve the balance before the next billing cycle.\n\nTaxes\n\nTax work depends on accurate Xero records throughout the year. As a pass-through entity, Elevasis business income flows to the owner personal return, so quarterly estimates reduce underpayment risk and year-end exports should be clean enough for a CPA or tax preparer.\n\nQuarterly estimated payment targets:\n\n- Q1: April 15.\n- Q2: June 15.\n- Q3: September 15.\n- Q4: January 15 of the following year.\n\nEstimate payments as roughly 25-30% of net profit for the quarter and pay via IRS Direct Pay or EFTPS.\n\nTrack deductible expenses in Xero during the year: SaaS subscriptions, contractor payments, home office expenses where applicable, professional development, courses, and business banking fees. Keep digital receipts organized by year in the business records folder.\n\nIssue 1099-NEC forms to US-based contractors paid more than $600 in a calendar year. Collect a W-9 before first payment, track annual contractor totals in Xero, file 1099-NEC forms by January 31 of the following year, and file the 1096 summary with the IRS when required.\n\nAt year end, export the Xero profit and loss statement and balance sheet. Provide them to the CPA or tax preparer with issued 1099s, bank statements for the business year, mileage logs if applicable, and home office documentation if applicable."
1375
- },
1376
- {
1377
- id: "knowledge.org-model-actions",
1378
- title: "Organization Model Actions",
1379
- summary: "Actions are the invokable semantic layer of the Organization Model -- they map to resources, affect entities, bind to knowledge, and expose four invocation types.",
1380
- bodyText: `Overview
1381
-
1382
- Actions are the invokable semantic layer of the Organization Model. They declare what an organization can do: what resources implement them, which entities they affect, and how they can be called.
1383
-
1384
- Actions are authored in the OM.actions domain map and projected as action graph nodes by buildOrganizationGraph(). Each action emits a contains edge from the organization root and optional mapsto, affects, and triggers edges based on its declared fields.
1385
-
1386
- Source schema: packages/core/src/organization-model/domains/actions.ts
1387
-
1388
- What Actions Are
1389
-
1390
- An action is a named, typed, invokable operation. It is not executable code -- it is a semantic declaration that says "this operation exists, it can be called this way, it affects these business objects, and it is implemented by this resource."
1391
-
1392
- Actions answer questions like:
1393
-
1394
- - What operations does the sales.lead-gen system expose?
1395
- - Which workflow implements the lead-gen.company.qualify operation?
1396
- - What entities does this action modify?
1397
- - How can this action be invoked from the CLI, an API, or an MCP client?
1398
-
1399
- ActionInvocation Kinds
1400
-
1401
- Each action can declare one or more invocations. An invocation describes how the action is called.
1402
-
1403
- | Kind | Fields | Description |
1404
- | ------------------ | ---------------------------------------------------------- | ----------------------------------------- |
1405
- | slash-command | command (must start with /), optional toolFactory | Called from the CLI or agent tool surface |
1406
- | mcp-tool | server, name | Exposed as an MCP tool on a named server |
1407
- | api-endpoint | method (GET/POST/PATCH/DELETE), path, optional schemas | Called via HTTP API endpoint |
1408
- | script-execution | resourceId | Executed by running a script resource |
1409
-
1410
- Multiple invocations on one action mean the same semantic operation is reachable through multiple surfaces.
1411
-
1412
- Scope
1413
-
1414
- Actions are either global or domain-scoped.
1415
-
1416
- - Global (scope: 'global'): available across all systems.
1417
- - Domain-scoped (scope: { domain: '<modelId>' }): associated with a specific OM domain such as sales.
1418
-
1419
- Systems reference actions through ActionRef entries on system.actions[], with an intent of exposes (the system owns the action) or consumes (the system calls the action). This relationship emits a uses edge from the system to the action in the graph.
1420
-
1421
- Affects and Knowledge Bindings
1422
-
1423
- Actions can declare which entities they modify via the affects field (array of entity IDs). Each entry emits an affects edge from the action to the entity node.
1424
-
1425
- Actions can also declare knowledge bindings (array of knowledge node IDs) that reference relevant reference material. These bindings are not graph edges; they associate documentation with the action for surfacing in the Knowledge Base.
1426
-
1427
- Resource Mapping
1428
-
1429
- The optional resourceId field links an action to its implementation resource. Setting resourceId emits a mapsto edge from the action node to the resource node. If the resource does not yet exist in OM.resources, the graph builder creates a stub resource node from the ID.
1430
-
1431
- Lifecycle States
1432
-
1433
- Actions follow a five-stage lifecycle: draft, beta, active, deprecated, archived. The default is active. Lifecycle state is authored on the action entry and is reflected in the graph node.`
1434
- },
1435
- {
1436
- id: "knowledge.org-model-entities",
1437
- title: "Organization Model Entities",
1438
- summary: "Entities model business objects owned by systems -- with table metadata, state catalogs, and typed entity links.",
1439
- bodyText: "Overview\n\nEntities are the business objects of the Organization Model. Each entity is a named, typed object owned by a system -- it corresponds to a database table, optionally participates in a state catalog, and can declare typed relationships to other entities.\n\nEntities are authored in the OM.entities domain map and projected as entity graph nodes by buildOrganizationGraph(). Each entity emits a contains edge from its owning system node and optional links edges to related entities.\n\nSource schema: packages/core/src/organization-model/domains/entities.ts\n\nWhat Entities Are\n\nAn entity declaration answers questions like:\n\n- What business objects does the sales.crm system own?\n- Which database table backs the crm.deal entity?\n- What states can a leadgen.company pass through?\n- How are crm.deal and crm.contact related?\n\nEntities are not executable. They are semantic declarations that describe the shape of business data: who owns it, where it lives, what states it can be in, and how it connects to other objects.\n\nownedBySystemId\n\nEvery entity must declare ownedBySystemId -- the ID of the system responsible for it. The graph builder emits a contains edge from system:<ownedBySystemId> to the entity node. An entity can only be owned by one system.\n\nTable and Row Schema\n\nThe optional table field names the backing database table (e.g. crmdeals). The optional rowSchema field references a schema identifier that describes the row shape. These fields are informational references; they are not validated against the database at OM parse time.\n\nstateCatalogId\n\nThe optional stateCatalogId field links the entity to a state catalog. The graph builder uses this to project event nodes for each state transition:\n\n- For general status catalogs, the builder walks OM.statuses entries whose semanticClass matches the catalog ID.\n- For crm.pipeline, the builder also walks pipeline stages from OM.sales.\n- For delivery.task, the builder walks task statuses from OM.projects.\n- For lead-gen.company and lead-gen.contact, the builder walks the lead-gen stage catalog.\n\nEach matching status or stage generates an event node with an originatesfrom edge pointing back to the entity.\n\nTyped Entity Links\n\nThe links field declares typed relationships to other entities. Each link has:\n\n- toEntity -- the target entity ID.\n- kind -- one of belongs-to, has-many, has-one, or many-to-many.\n- via -- optional join key or junction table name.\n- label -- optional display label for the relationship.\n\nEach link emits a links edge from the entity node to the target entity node in the graph.\n\nExample Entity Shape\n\nA crm.deal entity owned by sales.crm, backed by the crmdeals table, in the crm.pipeline state catalog, with a has-many link to crm.contact via the dealcontacts junction:\n\n- id: crm.deal\n- ownedBySystemId: sales.crm\n- table: crmdeals\n- stateCatalogId: crm.pipeline\n- links: [{ toEntity: 'crm.contact', kind: 'has-many', via: 'dealcontacts' }]"
1440
- },
1441
- {
1442
- id: "knowledge.org-model-events",
1443
- title: "Organization Model Events",
1444
- summary: "Events are projected signals -- the OM has no authored event domain. They emit from resources and originate from entity state catalogs.",
1445
- bodyText: "Overview\n\nEvents are projected graph nodes. The Organization Model has no OM.events domain map that authors edit directly. Instead, events are derived by buildOrganizationGraph() from two sources: EventEmissionDescriptor entries on workflow and agent resources, and state catalog entries on entities.\n\nEvery event node carries a unique ID formed as \\<ownerId\\>:\\<eventKey\\>, a human-readable label, and an edge that connects it back to the node that produced it.\n\nProjection logic: packages/core/src/organization-model/graph/build.ts\n\nAuthored vs. Projected\n\nThe distinction matters because it determines where you change event data.\n\nEvents are never edited in a standalone events file. To change an event you must change its source:\n\n- To change a resource-emitted event, update the emits array on the workflow or agent entry in OM.resources.\n- To change an entity state-transition event, update the entity's stateCatalogId or the underlying status/stage entry in the relevant catalog domain.\n\nThe graph builder projects these into event graph nodes automatically on the next call to buildOrganizationGraph().\n\nEventEmissionDescriptor on Resources\n\nWorkflow and agent resource entries can declare an emits array. Each element is an EventEmissionDescriptor:\n\n| Field | Type | Description |\n| --------------- | --------------- | ------------------------------------------------------------- |\n| eventKey | ModelIdSchema | Short key scoped to the owner resource (e.g. enrolled) |\n| label | string | Human-readable label for the event |\n| payloadSchema | ModelIdSchema | Optional reference to a schema that describes the payload |\n| lifecycle | lifecycle enum | Optional: draft, beta, active, deprecated, archived |\n\nThe graph builder constructs the full EventDescriptor by combining ownerId (the resource ID), ownerKind: 'resource', and the emission descriptor fields. The resulting event ID is \\<resourceId\\>:\\<eventKey\\>.\n\nAn emits edge is then projected from the resource node to the event node.\n\nOnly workflow and agent resource kinds support emits. integration and script resources do not.\n\noriginatesfrom Edges from Entity State Catalogs\n\nWhen an entity declares a stateCatalogId, the graph builder projects one event node per state transition available to that entity. These events use ownerKind: 'entity' and the resulting event ID is \\<entityId\\>:\\<eventKey\\>.\n\nA reversed originatesfrom edge is projected from the event node pointing back to the entity node. This edge direction is the opposite of emits: it signals that the event represents a state change that originates from the entity, not that the entity actively fires the event.\n\nThe builder resolves state catalogs as follows:\n\n- General status catalogs: walks OM.statuses entries whose semanticClass matches the entity's stateCatalogId.\n- crm.pipeline: also walks pipeline stages from OM.sales that reference the entity.\n- delivery.task: also walks task statuses from OM.projects.\n- lead-gen.company and lead-gen.contact: walks the LEADGENSTAGECATALOG constant, filtering by entity type.\n\ntriggers Edges to Policies\n\nWhen a policy declares trigger.kind: 'event', the graph builder looks up the projected event node by event ID and emits a triggers edge from the event node to the policy node. This edge is only emitted if the event node was already projected by the time the policy loop runs.\n\nPolicy triggers are the primary way events connect to downstream behavior. No triggers edge is emitted for events that no policy references.\n\nEventDescriptor Full Shape\n\nEventDescriptor is the resolved type used internally by the graph builder. It extends EventEmissionDescriptor with identity fields:\n\n| Field | Type | Description |\n| --------------- | -------------------------- | ----------------------------------------------------- |\n| id | EventIdSchema | Composite: \\<ownerId\\>:\\<eventKey\\> |\n| ownerId | resource ID or model ID | ID of the resource or entity that is the event source |\n| ownerKind | 'resource' or 'entity' | Discriminates between the two projection paths |\n| eventKey | ModelIdSchema | Short key, unique within the owner |\n| label | string | Human-readable label |\n| payloadSchema | ModelIdSchema (opt) | Schema reference for payload shape |\n| lifecycle | lifecycle enum (opt) | Lifecycle state from the emission descriptor |\n\nEventDescriptor is not stored in the graph node itself -- it is used transiently during graph construction to build the node and emit edges. The graph node stores id, kind: 'event', label, and sourceId.\n\nGraph Summary\n\n| Edge kind | Direction | When emitted |\n| ----------------- | --------------------------- | -------------------------------------------- |\n| emits | resource node -> event node | Resource emits[] array is non-empty |\n| originatesfrom | event node -> entity node | Entity has a stateCatalogId |\n| triggers | event node -> policy node | Policy trigger.kind === 'event' matches ID |"
1446
- },
1447
- {
1448
- id: "knowledge.org-model-graph-contract",
1449
- title: "Organization Model Graph Contract",
1450
- summary: "The canonical graph node and edge contract -- 10 node kinds, 12 edge kinds, and the resource-type overlay derived from the Organization Model.",
1451
- bodyText: "Overview\n\nThe Organization Model graph contract defines the typed node and edge taxonomy emitted by buildOrganizationGraph(). Every surface that reads or visualizes the OM -- including Command View -- works against this contract.\n\nThe graph has two categories of nodes: authored nodes derived directly from OM domain maps, and projected nodes derived by the graph builder from authored content. Events and stages are projected; all other node kinds are authored.\n\nSource schema: packages/core/src/organization-model/graph/schema.ts\nProjection logic: packages/core/src/organization-model/graph/build.ts\n\nNode Kinds\n\nTen node kinds are valid in the graph.\n\n| Kind | Authored / Projected | Source |\n| -------------- | -------------------- | ------------------------------------------------------- |\n| organization | Projected | Root node; always present; id is organization-model |\n| system | Authored | OM.systems domain map |\n| role | Authored | OM.roles domain map |\n| action | Authored | OM.actions domain map |\n| entity | Authored | OM.entities domain map |\n| event | Projected | Derived from resource emits and entity state catalogs |\n| policy | Authored | OM.policies domain map |\n| stage | Projected | Derived from OM.prospecting stage catalogs |\n| resource | Authored | OM.resources domain map |\n| knowledge | Authored | OM.knowledge.nodes array |\n\nEdge Kinds\n\nTwelve edge kinds are valid in the graph.\n\n| Kind | Direction | Meaning |\n| ----------------- | ------------------------------------- | ------------------------------------------------------------- |\n| contains | parent -> child | Containment: organization to system, system to resource, etc. |\n| references | source -> target | Cross-reference: role reports-to, agent invokes action |\n| mapsto | action -> resource | Action is implemented by a resource |\n| uses | system -> action, stage -> action | System or stage uses an action |\n| governs | knowledge -> target, role -> system | Knowledge node or role governs a target |\n| links | entity -> entity | Typed entity relationship (belongs-to, has-many, etc.) |\n| affects | action -> entity | Action modifies or reads an entity |\n| emits | resource -> event | Resource produces an observable event |\n| originatesfrom | event -> entity | Event originates from an entity state transition |\n| triggers | event -> policy, action -> policy | Event or action invocation triggers a policy evaluation |\n| appliesto | policy -> system/action/resource/role | Policy governs the target |\n| effects | policy -> action/role | Policy effect invokes an action or notifies a role |\n\nResource Type Overlay\n\nResource nodes carry an optional resourceType field that is a separate enum from kind. It is set by the graph builder from the OM resource kind field or from Command View data.\n\n| Value | Description |\n| ------------------ | --------------------------------- |\n| workflow | Deterministic automation pipeline |\n| agent | LLM-driven reasoning resource |\n| trigger | Event-driven entry point |\n| integration | External service connector |\n| external | Third-party system reference |\n| humancheckpoint | Human-in-the-loop review gate |\n| script | One-shot executable script |\n\nAuthored vs. Projected Fields\n\nAuthored nodes\n\nSystem, role, action, entity, policy, resource, and knowledge nodes are authored in the OM domain maps. Their id, label, description, and domain-specific fields are set from OM source data.\n\nProjected nodes\n\n- Organization node: always present; id is always organization-model.\n- Event nodes: derived from two sources. Resource events come from resource.emits declarations on workflow and agent resources. Entity events come from the entity's stateCatalogId -- the builder walks the matching statuses and pipeline/project stage catalogs to generate one event node per transition.\n- Stage nodes: derived from OM.prospecting.companyStages and OM.prospecting.contactStages.\n\nProjected nodes are never authored directly. To add an event, declare emits on a resource or assign stateCatalogId to an entity.\n\nGraph Node Shape\n\nEach node has: id (graph-unique string), kind (one of the 10 kinds), label (display name), optional sourceId (OM domain ID), optional description, optional icon, optional enabled flag, and optional resourceType (resource nodes only).\n\nEach edge has: id (graph-unique string), kind (one of the 12 kinds), sourceId, targetId, optional label, and optional relationshipType (triggers, uses, or approval)."
1452
- },
1453
- {
1454
- id: "knowledge.org-model-policies",
1455
- title: "Organization Model Policies",
1456
- summary: "Policies govern systems, actions, resources, and roles -- with discriminated triggers, predicates, and effects.",
1457
- bodyText: "Overview\n\nPolicies are cross-cutting governance rules in the Organization Model. They declare what should happen when a trigger fires, under what conditions, and with what effect. Policies are authored in the OM.policies domain map and projected as policy graph nodes by buildOrganizationGraph().\n\nEvery policy emits a contains edge from the organization root and appliesto edges to each system, action, resource, or role it governs. When the trigger is event-based or action-based, an additional triggers edge connects the source node to the policy.\n\nSource schema: packages/core/src/organization-model/domains/policies.ts\n\nPolicyTrigger\n\nThe trigger is a discriminated union on kind that defines what activates the policy.\n\n| Kind | Required fields | Description |\n| ------------------- | --------------- | --------------------------------------------------------- |\n| event | eventId | Fires when the referenced event is projected in the graph |\n| action-invocation | actionId | Fires when the referenced action is invoked |\n| schedule | cron | Fires on a cron schedule (max 120 chars) |\n| manual | none | Fires only when explicitly triggered by a user or process |\n\nFor event triggers, the graph builder looks up the projected event node by eventId and emits a triggers edge from that event node to the policy node. For action-invocation triggers, a triggers edge is emitted from the action node to the policy node. Schedule and manual triggers produce no additional graph edges.\n\nPolicyPredicate\n\nThe predicate is a discriminated union on kind that defines the condition under which the policy effect is applied.\n\n| Kind | Required fields | Description |\n| ------------ | ------------------------------- | ---------------------------------------------------------- |\n| always | none | Condition is unconditionally true; effect always fires |\n| expression | expression (string, max 2000) | Arbitrary expression evaluated at runtime |\n| threshold | metric, operator, value | Numeric threshold check: lt, lte, eq, gte, or gt |\n\nThe default predicate if not specified is { kind: 'always' }.\n\nPolicyEffect\n\nThe actions field holds an ordered array of effects (PolicyEffect[]). At least one effect is required. Effects are a discriminated union on kind.\n\n| Kind | Required fields | Description |\n| ------------------ | ------------------- | ----------------------------------------------------------- |\n| require-approval | roleId (optional) | Blocks execution until a human approves; routes to the role |\n| invoke-action | actionId | Invokes the referenced action as a consequence |\n| notify-role | roleId | Sends a notification to the specified role |\n| block | none | Stops execution entirely; no approval path |\n\nFor invoke-action effects, the graph builder emits an effects edge from the policy node to the referenced action node. For notify-role and require-approval effects that include a roleId, an effects edge is emitted from the policy node to the role node.\n\nappliesTo\n\nThe appliesTo field declares which OM entities the policy governs. It contains four ID arrays, all defaulting to empty:\n\n| Field | Target kind | Graph edge emitted |\n| ------------- | ----------- | ----------------------------------------- |\n| systemIds | system | appliesto from policy to system node |\n| actionIds | action | appliesto from policy to action node |\n| resourceIds | resource | appliesto from policy to resource node |\n| roleIds | role | appliesto from policy to role node |\n\nA policy can apply to any combination of these targets simultaneously. A policy with all four arrays empty is valid but produces no appliesto edges.\n\nLifecycle\n\nPolicies follow the same five-stage lifecycle as systems and actions: draft, beta, active, deprecated, archived. The default is active. Lifecycle is authored on the policy entry and is reflected in the graph node.\n\nThe order field controls domain-map iteration order. The convention is multiples of 10 (10, 20, 30, ...) to allow easy insertion between existing entries.\n\nGraph Summary\n\n| Edge kind | Direction | When emitted |\n| ------------ | ------------------------------------------ | ---------------------------------------------------------------------------------- |\n| contains | organization root -> policy node | Always; every policy is contained by the organization root |\n| appliesto | policy node -> system/action/resource/role | For each non-empty appliesTo.Ids entry |\n| triggers | event or action node -> policy node | When trigger.kind is event or action-invocation |\n| effects | policy node -> action or role node | For invoke-action, notify-role, and require-approval effects with a roleId |"
1458
- },
1459
- {
1460
- id: "knowledge.platform-command-view",
1461
- title: "Platform Command View",
1462
- summary: "Reference for Command View, the visual Organization Model graph surface that projects systems, resources, actions, entities, events, and policies into an explorable operational view.",
1463
- bodyText: "Overview\n\nCommand View is the visual surface for the Organization Model graph. It projects the OM -- systems, resources, actions, entities, events, and policies -- into an explorable graph using the same node and edge taxonomy emitted by buildOrganizationGraph().\n\nIt answers operational questions such as:\n\n- What systems own which resources?\n- What does this agent map to in the OM?\n- Which actions affect which entities?\n- If a resource goes offline, what policies or actions reference it?\n- What events originate from this entity or resource?\n\nAccess Command View through the Knowledge area at /knowledge/command-view.\n\nHow Command View Works\n\nCommand View is a projection of the Organization Model graph, not a separate deployment manifest.\n\nThe OM resources domain is the single source of resource identity. The actions domain is the invokable semantic layer. The systems domain is the backbone. Command View merges the graph emitted by buildOrganizationGraph() with optional live Command View data (deployed resource metadata) to render a unified operational picture.\n\nGraph projection pipeline:\n\n1. Organization Model is authored in packages/elevasis-core/src/organization-model/.\n2. buildOrganizationGraph() projects the OM into typed nodes and edges.\n3. Command View data (deployed resource metadata) is optionally merged as an overlay.\n4. The merged graph is serialized and cached.\n5. The frontend visualizes the cached graph.\n\nCommand View does not own resource identity. It reads what the OM declares.\n\nNode Kinds\n\nCommand View renders the same node kinds as the OM graph:\n\n| Kind | Source | Description |\n| -------------- | -------------- | -------------------------------------------------------------------------- |\n| organization | Root | The organization-model root node |\n| system | OM.systems | Bounded contexts with dotted IDs and parentSystemId hierarchy |\n| role | OM.roles | Named roles with hierarchy and holder assignments |\n| action | OM.actions | Invokable operations with invocation type metadata |\n| entity | OM.entities | Business objects owned by systems |\n| event | Projected | Derived from resource emits declarations and entity state catalogs |\n| policy | OM.policies | Governance rules applied to systems, actions, resources, and roles |\n| stage | Projected | Derived from prospecting stage catalogs |\n| resource | OM.resources | Workflows, agents, integrations, triggers, scripts, and external resources |\n| knowledge | OM.knowledge | Knowledge nodes governed by systems |\n\nThe resourceType overlay on resource nodes is a separate enum: workflow, agent, trigger, integration, external, humancheckpoint, script.\n\nEdge Kinds\n\n| Kind | Meaning |\n| ----------------- | ------------------------------------------------------------------------------ |\n| contains | Parent-to-child containment (organization to system, system to resource, etc.) |\n| references | Cross-reference between nodes (role reports-to, agent invokes action) |\n| mapsto | Action mapped to a resource implementation |\n| uses | System or stage uses an action |\n| governs | Knowledge node or role governs a system or target |\n| links | Entity links to another entity |\n| affects | Action affects an entity |\n| emits | Resource or entity emits an event |\n| originatesfrom | Event originates from an entity |\n| triggers | Event or action triggers a policy |\n| appliesto | Policy applies to a system, action, resource, or role |\n| effects | Policy effect invokes an action or notifies a role |\n\nVisualization Modes\n\nCommand View uses Cytoscape graph modes:\n\n- Map: preserves organization structure and honors hidden-resource visibility.\n- Trace: resolves directed paths and reveals resources for the active trace.\n- Impact: pivots around the selected node and reveals related resources for impact review.\n\nFilter panel:\n\n- Search across nodes, relationships, and IDs.\n- Filter by node kind, resource type, environment, topology presence, integrations, and resource facets.\n- Toggle resource visibility and diagnostic/testing resource visibility.\n- Show visible and hidden resource counts in the same control surface.\n\nHidden resource behavior:\n\n- Resource nodes are hidden by default so the organization structure remains readable.\n- Structural nodes remain visible as the navigation skeleton.\n- Selecting a visible node can reveal directly connected hidden resources.\n- Diagnostic and testing resources are hidden by default and can be revealed from the filter panel.\n\nExpand Around behavior:\n\n- Select a node, open Details, and use Expand Around to preview nearby graph context before revealing it.\n- Semantic presets cover coverage, operational dependencies, organization context, and impact paths.\n- System and entity nodes default to Coverage.\n- Resource nodes default to Operational Dependencies.\n- Preview counts show hidden resources before Apply reveals the graph patch.\n\nRead-only constraints:\n\n- No drag and drop.\n- No connection editing.\n- No graph mutation from the visualization layer.\n\nOrganization Model as the Source of Truth\n\nResource identity lives in OM.resources, not in a separate manifest. To add a resource to Command View:\n\n1. Add the resource to OM.resources in the organization model.\n2. Link it to a system via systemPath.\n3. Optionally link actions to the resource via action.resourceId.\n4. Deploy the organization model. Command View reflects the new resource automatically.\n\nThere is no separate DeploymentSpec.relationships declaration required for OM-declared resources. The graph builder derives containment and relationship edges directly from the OM contract.\n\nLive resource metadata (deployed name, description, runtime status) can be overlaid from Command View data when available, but the OM contract is primary.\n\nUsing Command View\n\nSystem Understanding\n\nUseful exploration questions:\n\n- What systems own which resources and entities?\n- What actions does this system expose, and what do they map to?\n- Which knowledge nodes govern this system?\n- What policies apply to this system?\n- What events originate from this entity?\n- What roles are responsible for this system?\n\nVisual patterns:\n\n- Hub nodes with many edges indicate central resources or pivotal systems.\n- Linear chains show sequential workflow pipelines.\n- Branching shows conditional routing or multiple action paths.\n- Isolated nodes may indicate unused or draft resources.\n\nManifest Debugging\n\nUse Command View to verify:\n\n1. Resources appear as nodes under the correct system.\n2. Actions map to the expected resources.\n3. Entities link to the correct systems and each other.\n4. Policies apply to the correct systems, actions, or resources.\n5. Events appear for resources with emits declarations.\n6. Orphaned resources are intentional.\n\nCommon issues:\n\n- Resource declared in OM but assigned to the wrong systemPath.\n- Action resourceId points to a resource ID that does not exist.\n- Entity ownedBySystemId references an unknown system.\n- Policy appliesTo references a system, action, or resource that was removed.\n\nTroubleshooting\n\nEmpty Graph\n\nLikely causes:\n\n- Organization has no systems or resources defined.\n- Search, node kind, or resource type filters hide all graph elements.\n- Command View resources are hidden and no structural nodes match current filters.\n\nCheck:\n\n1. OM systems and resources domains have entries.\n2. Filter panel visibility and filter state.\n3. API response for the /api/command-view endpoint.\n\nFix:\n\n- Add systems and resources to the organization model.\n- Reveal resources or reset graph filters.\n\nMissing Nodes\n\nLikely causes:\n\n- Resource, action, or entity is defined in OM but omitted from the relevant domain map.\n- Node is hidden by visibility controls.\n- Status, resource type, or topology filters exclude the node.\n\nCheck:\n\n1. OM domain map includes the ID as a key and as id in the entry.\n2. Filter panel visibility and filter state.\n3. Node lifecycle or enabled field.\n\nFix by adding the entry to the correct domain map or revealing hidden nodes.\n\nMissing Edges\n\nLikely causes:\n\n- Action resourceId does not match any OM resource ID.\n- Entity ownedBySystemId references an unknown system.\n- Policy appliesTo references IDs that do not exist.\n- Knowledge node link uses a nodeId that has no matching OM node.\n\nCheck:\n\n1. Cross-reference IDs across OM domains.\n2. Run pnpm --filter @repo/core check-types to surface Zod validation errors.\n\nFix the OM entry to reference the correct ID.\n\nBest Practices\n\nKeep the OM up to date as systems and resources evolve:\n\n1. Add new resources to OM.resources with the correct systemPath.\n2. Map actions to resources via action.resourceId when the action calls a specific resource.\n3. Update entity.ownedBySystemId when entities move between systems.\n4. Update policy.appliesTo when systems, actions, or resources are renamed or removed.\n5. Declare resource.emits for workflows and agents that produce observable events.\n\nUse the OM graph as the authoritative reference for Command View structure. The graph builder derives the visualization from the OM contract -- do not expect Command View to show connections that are not declared in the OM.\n\nRelated References\n\n- /knowledge read knowledge.org-model-reference\n- /knowledge read knowledge.platform-composition-patterns\n- /knowledge read knowledge.platform-integration-patterns"
1464
- },
1465
- {
1466
- id: "knowledge.platform-composition-patterns",
1467
- title: "Platform Composition Patterns",
1468
- summary: "Reference for composing agents, workflows, integrations, tools, observability, scaling, error handling, and security into complete Elevasis automation systems.",
1469
- bodyText: "Overview\n\nUse this reference to choose how Elevasis resources compose into complete systems. The core decision is whether reasoning, deterministic orchestration, or a hybrid of both should own the business flow.\n\nThree primary patterns exist:\n\n- Agent-centric: an agent is the primary orchestrator, and workflows or integrations are tools.\n- Workflow-centric: a workflow is the deterministic pipeline, and agents appear only as processing steps.\n- Hybrid: agents decide what should happen, and workflows execute reliable sequences.\n\nSystem Architecture Patterns\n\nAgent-Centric Systems\n\nPattern: Agent is the primary orchestrator; workflows and integrations are tools.\n\ntext\nTrigger to Agent\n |- Tool: Integration A\n |- Tool: Integration B\n |- Tool: Workflow 1 via resource invocation\n - Tool: Workflow 2 via resource invocation\n\nUse this pattern for ambiguous goals, dynamic decision-making, multi-turn conversations, and business logic that requires judgment.\n\nStrengths:\n\n- Flexible and adaptive.\n- Handles ambiguity well.\n- Can delegate to specialist resources.\n- Supports natural language interaction.\n\nWeaknesses:\n\n- Token cost per execution.\n- Non-deterministic LLM variance.\n- Requires strong observability for debugging.\n- Usually slower than deterministic workflows.\n\nWorkflow-Centric Systems\n\nPattern: Workflow is the pipeline; agents are processing steps.\n\ntext\nTrigger to Workflow\n |- Step 1: Integration A reads data\n |- Step 2: Agent processes or reasons\n |- Step 3: Integration B writes result\n - Step 4: Conditional routing\n\nUse this pattern for predictable sequences, data transformation pipelines, integration orchestration, and fixed business logic.\n\nStrengths:\n\n- Deterministic and reliable.\n- Fast execution.\n- Easy to debug step-by-step.\n- No token cost unless an agent step is included.\n\nWeaknesses:\n\n- Rigid, because steps are predefined.\n- Does not handle ambiguity well.\n- Requires code changes for logic updates.\n\nHybrid Systems\n\nPattern: Agents decide, workflows execute. This is the recommended default for complex automation.\n\ntext\nTrigger to Agent decides what to do\n |- Invokes: Workflow A\n |- Invokes: Workflow B\n - Uses: Integration C directly\n\nWorkflow A:\n |- Integration D reads\n |- Agent processes a specific subtask\n - Integration E writes\n\nUse this pattern when the system needs variable paths, reasoning, reliability, and a mix of predictable and unpredictable steps.\n\nStrengths:\n\n- Flexible where needed and reliable where possible.\n- Cost-efficient because workflows do not use tokens by default.\n- Good observability across agent reasoning and workflow steps.\n\nResource Composition Patterns\n\nAgent + Tools\n\nUse direct integration access for simple or frequent operations.\n\nTool categories:\n\n- Base tools: always available, high-frequency operations such as read queries or cached data access. Example: attiogetrecord.\n- Knowledge Map tools: lazy-loaded, low-frequency operations such as write operations or domain-specific capabilities. Examples: attiocreatecontact, dropboxuploadfile.\n- Resource invocation tools: delegate to workflows for deterministic sequences or call specialist agents.\n\nTool creation example:\n\ntypescript\nconst tool = createAttioCreateRecordTool('elevasis-attio')\n\nCredential names resolve to organization-scoped storage. RLS policies enforce organization isolation, credentials are encrypted at rest, and OAuth tokens can refresh automatically.\n\nAgent + Workflow\n\nUse an agent for reasoning and a workflow for deterministic execution.\n\ntext\nTrigger to Agent reasoning\n |- Direct tool: read integration\n |- Invoke tool: Workflow A\n - Invoke tool: Workflow B\n\nExecution flow:\n\n1. Agent analyzes the request.\n2. Agent invokes a workflow through a tool call.\n3. Workflow executes deterministic steps without token cost.\n4. Agent explains the result to the user.\n\nUse this pattern when the system needs both reasoning and reliability, has multiple execution paths, or should minimize token use by moving predictable work into workflows.\n\nWorkflow + Integration\n\nUse a workflow to orchestrate deterministic integration sequences.\n\ntext\nTrigger to Workflow\n |- Step 1: Integration A reads\n |- Step 2: Transform pure function\n |- Step 3: Integration B writes\n - Step 4: Notify\n\nUse this pattern for predictable step sequences, data transformation pipelines, integration orchestration, and cost-sensitive work that does not need LLM reasoning.\n\nPattern Selection Guide\n\n| Requirement | Pattern | Example |\n| --- | --- | --- |\n| Ambiguous goals | Agent-centric | Business orchestration with variable outcomes |\n| Predictable sequence | Workflow-centric | Shopify to CRM sync |\n| Hybrid needs | Agent + workflow | Support router where agent decides and workflow executes |\n| \\>10 tools | Knowledge Map | Agent with many domain capabilities |\n| High-frequency reads | Base tools | Attio read operations |\n| Low-frequency writes | Lazy-loaded tools | CRM updates or page creation |\n| External services | Integration tools | Attio, Gmail, Google Sheets |\n| Deterministic pipelines | Workflow + integration | Data transformation |\n\nComplexity guidelines:\n\n- Simple, 1-2 resources: agent with base tools, or workflow with 1-2 integrations.\n- Medium, 3-5 resources: agent plus Knowledge Map with 2-3 nodes, or workflow plus an agent step.\n- Complex, 6+ resources: agent plus Knowledge Map plus memory preload, or multi-integration workflows.\n\nCross-Cutting Concerns\n\nObservability\n\nTrack these surfaces:\n\n- Agent iterations, including reasoning and actions.\n- Workflow steps, including inputs and outputs.\n- Tool calls, including integration requests and responses.\n- Errors and retries.\n- Token usage and cost.\n\nPrimary tools:\n\n- Execution Logs for SSE-based debugging.\n- Activity Log for the real-time stream.\n- Execution Health for cost tracking and ROI review.\n- Command View for system architecture and dependency review.\n\nCost Tracking\n\nAgent cost comes from per-iteration token usage, model pricing, and tool execution cost. Workflow cost is usually zero token cost plus any external integration API fees.\n\nOptimization rules:\n\n- Use workflows for predictable tasks.\n- Lazy-load tools for 80-95% token savings.\n- Cache frequently accessed stable data.\n- Choose the appropriate model per task.\n\nScaling Strategies\n\nHorizontal scaling:\n\n- Keep agent execution stateless.\n- Store sessions in the database.\n- Let a load balancer distribute requests.\n\nVertical optimization:\n\n- Preload memory to reduce iteration count.\n- Lazy-load tools to reduce token usage.\n- Batch tool operations where possible.\n- Use parallel integration calls when the steps are independent.\n\nError Handling\n\nAgent error handling:\n\n- Tool errors are returned to the agent so it can reason about recovery.\n- Iteration limits prevent infinite loops.\n- Timeout protection constrains long-running tools and executions.\n- Graceful degradation explains what failed.\n\nWorkflow error handling:\n\n- Step retry logic uses exponential backoff, commonly 1, 4, and 9 minutes.\n- Conditional routing can send failures to an alternative step.\n- Manual intervention can route work to a human checkpoint.\n- Idempotent steps should be safe to retry.\n\nExample:\n\ntypescript\n{\n id: 'sync-to-crm',\n handler: async ({ input, context }) => {\n try {\n return await crmClient.createContact(input)\n } catch (error) {\n if (error.code === 'DUPLICATE') {\n return crmClient.updateContact(input)\n }\n\n throw error\n }\n },\n next: { type: 'linear', target: 'send-notification' }\n}\n\nSecurity\n\nCredential management:\n\n- Store credentials in the credentials table.\n- Encrypt values at rest.\n- Scope records by organization with RLS policies.\n- Refresh OAuth tokens automatically where supported.\n- Never store API keys in code.\n\nMulti-tenancy isolation layers:\n\n1. Database RLS on tenant-scoped tables.\n2. API middleware that requires organization context.\n3. Resource registry lookups scoped to the organization.\n4. Command View filtered by organization.\n\nBest Practices\n\n1. Start with a single agent or workflow, then add complexity only when needed.\n2. Build the working version before optimizing for caching or lazy loading.\n3. Put domain logic in agents and execution flow in workflows.\n4. Lazy-load large or low-frequency tool groups.\n5. Cache stable data, not fast-changing operational state.\n\nCommon mistakes:\n\n- Creating a Knowledge Map for fewer than five tools.\n- Using a workflow for one integration call when an agent tool would be simpler.\n- Loading more than ten tools as base tools.\n- Putting domain logic into workflows where it becomes hard to test and adapt.\n- Mixing unrelated concerns in one knowledge node.\n\nRelated References\n\n- /knowledge read knowledge.platform-integration-patterns\n- /knowledge read knowledge.platform-command-view"
1470
- },
1471
- {
1472
- id: "knowledge.platform-integration-patterns",
1473
- title: "Platform Integration Patterns",
1474
- summary: "Reference for connecting Elevasis agents and workflows to external services through adapters, OAuth, API keys, tenant-isolated credentials, retries, and tests.",
1475
- bodyText: "Overview\n\nIntegration patterns define how Elevasis agents and workflows connect to external services such as Gmail, Attio, Google Sheets, and custom APIs. The platform uses a standardized adapter pattern with OAuth 2.0 and API key authentication backed by tenant-isolated credentials.\n\nCore patterns:\n\n- Direct integration, where a resource uses integration tools directly.\n- Integration workflow, where a workflow coordinates multiple integrations.\n- Shared integration, where multiple resources use the same credential set.\n- Multi-account integration, where the same provider has separate credentials for different contexts.\n\nDirect Integration Pattern\n\nPattern: Resource uses an integration tool.\n\nUse direct integration tools when an agent or workflow performs frequent operations against a provider.\n\nCharacteristics:\n\n- Tools are always available to the resource.\n- There is no additional navigation overhead.\n- The pattern is optimized for frequent read-heavy operations.\n\nTool factory location:\n\ntext\npackages/core/src/execution/engine/tools/integration/server/adapters/{provider}/{provider}-tools.ts\n\nTool factories use createIntegrationTool() with a credentialName parameter. Example: createAttioCreateRecordTool(credentialName).\n\nIntegration Workflow Pattern\n\nPattern: Agent invokes a workflow, and the workflow uses integrations.\n\nUse an integration workflow for complex multi-step operations that need deterministic orchestration.\n\nExample lead capture flow:\n\n1. Webhook trigger receives the event.\n2. Workflow creates an Attio contact.\n3. Workflow sends a Gmail notification.\n4. Workflow returns confirmation.\n\nCharacteristics:\n\n- Deterministic execution order.\n- Step-level error handling and retry.\n- Multiple integrations coordinated in one place.\n- Built-in audit trail through workflow execution.\n\nShared Integration Pattern\n\nPattern: Multiple resources share the same integration.\n\nUse shared integrations for organization-wide providers that should use one credential set.\n\nExample:\n\ntext\npackages/elevasis-operations/src/index.ts\n\nCharacteristics:\n\n- One credential per integration.\n- Centralized credential management.\n- Shared across agents and workflows.\n\nMulti-Account Pattern\n\nPattern: Same provider, different credentials.\n\nUse this pattern for department-specific provider instances or separate dev/prod environments.\n\nExample:\n\ntypescript\nconst salesTool = createAttioCreateRecordTool('attio-sales')\nconst supportTool = createAttioCreateRecordTool('attio-support')\n\nDisambiguate multi-account tools with explicit tool names:\n\ntypescript\nconst tool = createAttioToolNamed(\n 'attiosalescreaterecord',\n 'attio-sales',\n 'createRecord'\n)\n\nAuthentication Patterns\n\nOAuth 2.0 vs API Key\n\n| Aspect | OAuth 2.0 | API key |\n| --- | --- | --- |\n| Auth flow | Browser redirect plus token exchange | Direct API key |\n| Setup complexity | High: client ID, secret, redirect URL | Low: single API key |\n| Token refresh | Automatic refresh token rotation | Manual key rotation |\n| Scope control | Granular permission scopes | Full access or none |\n| User context | Per-user authorization | Service-level access |\n| Revocation | User can revoke anytime | Manual key deletion |\n\nOAuth 2.0 Pattern\n\nProviders include Gmail and Google Sheets.\n\nCredential format:\n\ntypescript\ninterface OAuthToken {\n provider: string\n accessToken: string\n refreshToken: string\n expiresAt: string\n tokenType: 'Bearer'\n scope?: string\n}\n\nexpiresAt is an ISO 8601 timestamp. The platform handles token refresh when supported by the provider and credential implementation.\n\nAPI Key Pattern\n\nProviders include Attio and custom APIs.\n\nCredential format:\n\ntypescript\ninterface APIKeyCredentials {\n apiKey: string\n}\n\nProvider-specific validation belongs in the adapter. For Attio, see:\n\ntext\npackages/core/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts\n\nCredential Management\n\nCredentials are stored in the credentials table.\n\nKey columns:\n\n- organizationid for tenant isolation.\n- name, such as elevasis-attio.\n- provider, such as gmail or attio.\n- encryptedvalue containing encrypted JSON.\n\nSecurity rules:\n\n- RLS policies enforce tenant isolation.\n- Values are encrypted at rest.\n- Credentials do not cross organization boundaries.\n\nBest practices:\n\n- Store credentials encrypted in the database.\n- Use tenant-isolated credential names.\n- Validate credentials before API calls.\n- Rotate API keys regularly.\n- Use least-privilege OAuth scopes.\n\nDo not:\n\n- Hardcode credentials in code.\n- Share credentials across organizations.\n- Log credential values.\n- Store provider API keys in environment variables for tenant integrations.\n- Reuse the same credential name for dev and prod.\n\nCredential resolution flow:\n\n1. Tool requests a credential by name.\n2. Platform queries credentials with the current organizationid.\n3. Platform decrypts the credential.\n4. Adapter validates the credential against the provider schema.\n5. Tool passes the credential to the provider adapter.\n6. Usage is logged without credential values.\n\nImplementation reference:\n\ntext\npackages/core/src/execution/engine/tools/integration/tool.ts\n\nError Handling Patterns\n\nAdapters should convert provider errors into platform tooling errors.\n\nCommon error categories:\n\n- credentialsinvalid for invalid or missing credentials.\n- apierror for provider API errors.\n- networkerror for network or timeout failures.\n- validationerror for invalid parameters.\n- methodnotfound for unknown adapter methods.\n\nRetry strategy:\n\n- Network errors: retry with exponential backoff, commonly 1, 2, and 4 seconds.\n- Auth errors: fail immediately because the credential needs attention.\n- Validation errors: fail immediately because the input needs correction.\n- Rate limits: retry after reset when the provider exposes a reset time.\n- Workflow-level retries: commonly 3 attempts with 1, 4, and 9 minute delays.\n\nAdapter Development\n\nAdapter class location:\n\ntext\npackages/core/src/execution/engine/tools/integration/server/adapters/{provider}/{provider}-adapter.ts\n\nAdapter classes implement BaseIntegrationAdapter and contain call() and validateCredentials() methods.\n\nTool factory location:\n\ntext\npackages/core/src/execution/engine/tools/integration/server/adapters/{provider}/{provider}-tools.ts\n\nTool factories export create{Provider}{Operation}Tool(credentialName) functions.\n\nTests belong under:\n\ntext\npackages/core/src/execution/engine/tools/integration/server/adapters/{provider}/tests/\n\nRegistration happens in:\n\ntext\npackages/core/src/execution/engine/tools/integration/server/index.ts\n\nTesting Strategies\n\nUnit testing:\n\n- Mock external APIs.\n- Cover credential validation.\n- Cover API call construction.\n- Cover response parsing.\n- Cover error handling.\n\nIntegration testing:\n\n- Use real API calls only with test accounts or test workspaces.\n- Clean up test data after tests.\n- Run in CI only when secret credentials are available.\n- Keep provider behavior mocked in unit tests.\n\nAgent testing:\n\n- Test agents using integration tools at the resource boundary.\n- Tenant project agent tests normally live under external/{org}/src/agents/{agent}/tests/.\n\nRelated References\n\n- /knowledge read knowledge.platform-composition-patterns\n- /knowledge read knowledge.platform-command-view\n- /knowledge read knowledge.platform-systems-overview"
1476
- }
1477
- ];
1478
-
1479
- export { knowledge_search_index_default as default };