HotCRM Logo

@objectstack/spec Metadata Capability Evaluation

Detailed analysis of @objectstack/spec v3.0.0 metadata capabilities used and unused in HotCRM, with improvement recommendations.

@objectstack/spec Metadata Capability Evaluation

Version: @objectstack/spec v3.0.0 | Evaluated: February 12, 2026 | Last Updated: Phase 8
Scope: All 12 spec modules evaluated against HotCRM's 7 business packages + AI package
Validation Engine: Zod 4.3.6
v3.0.0 Breaking Changes: Removed hub, auth, driver, permission modules. New studio module added with defineStudioPlugin() and contributions API.

This document provides a comprehensive gap analysis between the metadata capabilities offered by @objectstack/spec and their actual adoption in HotCRM. It covers all 12 exported modules in v3.0.0 (data, system, kernel, ai, automation, api, ui, contracts, integration, security, studio), categorizes each capability as Used, Partially Used, or Not Used, and proposes an actionable improvement plan.

v3.0.0 Module List (12 modules)

ModuleImport PathPrimary Purpose
data@objectstack/spec/dataObject schemas, fields, hooks
system@objectstack/spec/systemCaching, notifications, audit
kernel@objectstack/spec/kernelPlugin system, events, manifests
ai@objectstack/spec/aiMCP tools, agents, RAG
automation@objectstack/spec/automationWorkflows, state machines
api@objectstack/spec/apiAPI endpoints, webhooks
ui@objectstack/spec/uiPages, views, dashboards, forms
contracts@objectstack/spec/contractsService contracts, typed interfaces
integration@objectstack/spec/integrationConnectors, external systems
security@objectstack/spec/securityPermissions, sharing rules
studio@objectstack/spec/studioStudio plugins, contributions API

Note on ObjectSchema.create() vs ObjectSchema.parse(): v3.0.0 introduced ObjectSchema.create() as the recommended lightweight API for defining objects. It provides the same type safety with less overhead than parse(). All 94 HotCRM objects use ObjectSchema.create().

Zod 4 Compatibility: @objectstack/spec v3.0.0 uses Zod 4.3.6 as its validation engine. Zod 4 is largely backward-compatible with Zod 3 patterns (z.string(), z.object(), z.enum(), etc.). Nine files across HotCRM import zod directly (see Zod 4 Compatibility section below). All existing patterns are compatible with Zod 4.


Executive Summary

CategoryUsedPartially UsedNot UsedAdoption Rate
Data Layer (/data)821040%
UI Layer (/ui)711137%
Automation (/automation)31727%
AI Layer (/ai)511722%
System (/system)30827%
API (/api)11146%
Integration (/integration)00100%
Security (/security)10517%
Kernel (/kernel)21720%
Contracts (/contracts)0040%
Studio (/studio)10325%
Total31796~25%

Key Finding: With Phase 8 work, HotCRM has significantly improved its spec adoption from ~13% to ~25%. UI schemas are now fully adopted (PageSchema, ViewSchema, DashboardSchema, FormViewSchema all validated). The studio module is adopted via defineStudioPlugin(). System-level configs (cache, notifications, audit) and API configs (webhooks) are now formally defined. The data layer remains the most heavily used module with expanded field type usage.


Module-by-Module Analysis

1. @objectstack/spec/data — Data Layer

The data module is HotCRM's most heavily used spec module, imported in all 94 object files and 71 hook files.

CapabilityStatusUsage Details
ObjectSchema.create()UsedAll 94 objects defined via ObjectSchema.create() — the recommended v3.0.0 lightweight API
Field.* type buildersUsed22 of 44 field types used (see Field Types section below)
Hook / HookContext typesUsedAll 47 hook files import Hook and HookContext types
ObjectCapabilities (enable config)Used91 of 94 objects use enable config with searchable, trackHistory, activities, feeds, files
Field.masterDetail()UsedUsed in invoice_line→invoice, case_comment→case, product_bundle_component→bundle, quote_line_item→quote
Field.summary()UsedUsed in invoice (line_item_count, calculated_subtotal), account (total_opportunities, total_open_opportunities_amount), product_bundle (component_count)
Field.image() / Field.file()Usedemployee.photo, product.product_image (image); case.attachments, knowledge_article.attachment (file)
Field.location() / Field.address()Usedaccount.headquarters_location, account.billing_address, account.shipping_address, employee.home_address
QuerySchema / FilterSchema⚠️ PartialObjectQL queries are used in hooks via ctx.ql.find(), but no direct use of QuerySchema.parse() for validation
ValidationRule schemas⚠️ PartialField-level validations (required, unique, maxLength, min, max) used; cross-field and data quality validations defined in CRM package
Datasource / Dataset❌ Not UsedExternal data source configuration not implemented
Document / DocumentTemplate❌ Not UsedDocument generation/management not implemented
ESignatureConfig❌ Not UsedElectronic signature not implemented
ExternalDataSource / ExternalLookup❌ Not UsedExternal system lookup not implemented
VectorConfig❌ Not UsedVector field type and vector search not used
FullTextSearch config❌ Not UsedFull-text search configuration not utilized
AggregationPipeline / Cube / AnalyticsQuery❌ Not UsedAnalytics/OLAP capabilities not configured
ComputedFieldCache❌ Not UsedComputed field caching not configured
ObjectExtension❌ Not UsedObject extension declarations not used
SoftDeleteConfig / VersioningConfig / PartitioningConfig❌ Not UsedAdvanced data lifecycle configurations not used

Field Types: Used vs Available

Used (22/44)Not Used (22/44)
text, textarea, number, boolean, select, select({multiple:true}), date, datetime, currency, percent, lookup, masterDetail, summary, email, phone, url, formula, autonumber, file, image, location, addressradio, checkboxes, toggle, time, password, markdown, html, richtext, json, code, avatar, video, audio, tree, color, rating, slider, signature, qrcode, progress, tags, vector

Progress: Field type usage has increased from 15 to 22 types. All CRM-critical relationship types (masterDetail, summary, lookup) are now in use. Geographic (location, address), media (file, image), and multi-select patterns are adopted.


2. @objectstack/spec/ui — UI Layer

CapabilityStatusUsage Details
PageSchema (record detail pages)UsedPage files use satisfies Page type and validate with PageSchema.parse(). Components include record:highlights, record:details, page:tabs, record:related_list
ViewSchema (list views)UsedView files use satisfies View type and validate with ViewSchema.parse(). Support columns, filters, sorting, pagination, conditional formatting, bulk actions
DashboardSchema / DashboardWidgetUsedDashboard files use satisfies Dashboard type and validate with DashboardSchema.parse(). Widget types: metric, kpi, funnel, line, bar, table
FormViewSchema / FormField / FormSectionUsedForm files use satisfies FormView type and validate with FormViewSchema.parse(). Support sections, columns, required fields, colSpan
conditionalFormattingUsedUsed in list views for visual status indicators (e.g., Hot Accounts, Needs Attention)
pagination / bulkActions / inlineEditUsedList views configure pageSize, pageSizeOptions, bulk delete/update/export, inline editing
record:related_list componentsUsedPage layouts include related lists with filters, sorting, and actions (opportunities, contacts, cases, contracts)
AppSchema (navigation/branding)⚠️ PartialNavigation configured in plugin files but not fully using AppSchema
ChartConfig / ChartSeries / ChartAxis❌ Not UsedDashboard widgets use simplified chart types; full chart config not used
Report / ReportColumn / ReportGrouping❌ Not UsedNo report definitions
Theme / ColorPalette / Typography❌ Not UsedNo theme customization
KanbanConfig / CalendarConfig / GanttConfig❌ Not UsedNo specialized view type configurations
Action (UI action buttons)❌ Not UsedPage actions defined as plain objects
WidgetManifest / custom widgets❌ Not UsedNo custom widget registrations
Animation / Breakpoints / ZIndex❌ Not UsedDesign system tokens not configured
ComponentProps variants❌ Not UsedAdvanced component prop types not used

Key Finding: UI schema adoption is now complete for core metadata types. All page layouts, list views, dashboards, and forms validate against their respective schemas using satisfies type checking and .parse() runtime validation.


3. @objectstack/spec/automation — Automation Layer

CapabilityStatusUsage Details
WorkflowRule (trigger-based rules)Used6 workflow files define workflow rules with triggerType, condition, actions. Validated with WorkflowRuleSchema.parse()
WorkflowAction types (fieldUpdate, emailAlert, taskCreation, httpCall, customAction)UsedAll 5 action types used across workflows
StateMachineConfig / state machinesUsedState machines formally defined via StateMachineSchema for case status, lead lifecycle
ApprovalProcess / ApprovalStep⚠️ PartialApproval workflows exist in products but don't fully use formal approval schema
Flow / FlowNode / FlowEdge (visual flows)❌ Not UsedNo visual flow definitions
TimeTrigger (scheduled triggers)❌ Not UsedSchedule defined inline in workflows
Webhook / WebhookReceiver❌ Not UsedWebhook configurations not defined via automation module
Connector / ConnectorInstance❌ Not UsedExternal system connectors not configured
ETLPipeline / ETLTransformation❌ Not UsedETL pipelines not defined
DataSyncConfig / Sync❌ Not UsedData sync configurations not used

Key Finding: Workflow definitions are now validated with WorkflowRuleSchema. State machines have been formally adopted for status lifecycle management.


4. @objectstack/spec/ai — AI Layer

CapabilityStatusUsage Details
MCPServerConfig / MCPServerConfigSchemaUsedFull MCP server config in ai/src/mcp_server.config.ts with .parse() validation
MCPTool / MCPToolSchemaUsed8 MCP tools defined (lead_scoring, opportunity_forecast, etc.)
MCPResource / MCPResourceSchemaUsed4 MCP resources defined (account_context, pipeline_summary, etc.)
MCPPrompt / MCPPromptSchemaUsed3 MCP prompts defined (sales_briefing, case_resolution, candidate_evaluation)
AgentSchemaUsedAI agent definitions validated with AgentSchema.parse()
Agent / AgentWorkflow⚠️ Partial6 AI agent workflows exist — core agents use formal schema, some use custom classes
RAGPipelineConfig / DocumentChunk / VectorStoreConfig❌ Not UsedRAG pipeline not configured via spec
NLQRequest / NLQResponse (Natural Language Query)❌ Not UsedNLQ not configured
ModelConfig / ModelRegistry / PromptTemplate❌ Not UsedModel registry defined in custom code
PredictiveModel / TrainingConfig❌ Not UsedML model definitions not using spec
DevOpsAgent / DevOpsTool❌ Not UsedDevOps AI not configured
AIOrchestration / AITask❌ Not UsedAI orchestration not using spec schemas
ConversationSession / ConversationMessage❌ Not UsedConversation management not formalized
CostAnalytics / CostReport❌ Not UsedAI cost tracking not configured
CodeGenerationConfig❌ Not UsedCode generation not configured
PluginComposition / PluginRecommendation❌ Not UsedAI-powered plugin suggestions not implemented

Key Finding: MCP integration is well-implemented and validated. Agent definitions now use AgentSchema for formal validation.


5. @objectstack/spec (root) + @objectstack/spec/kernel — Configuration & Plugin System

CapabilityStatusUsage Details
defineStack() helperUsedUsed in root objectstack.config.ts and all 6 package configs
ManifestSchema (app/plugin manifest)UsedManifest with id, namespace, version, type, name, description
PluginSchema / PluginContext⚠️ PartialPlugins use PluginSchema in most packages; some legacy plugins still typed as any
PluginCapability / PluginCapabilityManifest❌ Not UsedPlugin capabilities not declared
EventSchema / EventBusConfig❌ Not UsedEvent bus not configured
FeatureFlag❌ Not UsedFeature flags not implemented
MetadataLoaderContract / MetadataManagerConfig❌ Not UsedMetadata management not formalized
PluginHealthCheck / PluginHealthReport❌ Not UsedPlugin health monitoring not configured
PluginDependencyResolution❌ Not UsedDependency resolution not formalized
StartupOptions / startup orchestration❌ Not UsedStartup not configured

6. @objectstack/spec/system — System Layer

CapabilityStatusUsage Details
CacheConfig / CacheStrategyUsedCache configuration defined in products/src/system/cache.config.ts
NotificationConfig / NotificationChannelUsedNotification configuration defined in support/src/system/notification.config.ts
AuditConfig / AuditEventUsedAudit configuration defined in crm/src/system/audit.config.ts
MessageQueueConfig / TopicConfig❌ Not UsedNo message queue setup
StorageProvider / ObjectStorageConfig❌ Not UsedNo storage configuration
SearchConfig / SearchProvider❌ Not UsedNo search engine configuration
LoggerConfig / LoggingConfig❌ Not UsedNo logging configuration
MetricsConfig / MetricDefinition❌ Not UsedNo metrics/observability setup
TracingConfig / TraceContext❌ Not UsedNo distributed tracing
ServerCapabilities / HttpServerConfig❌ Not UsedNo server capabilities declared
EncryptionConfig / FieldEncryption❌ Not UsedNo encryption configuration

7. @objectstack/spec/api — API Layer

CapabilityStatusUsage Details
WebhookConfigUsedWebhook configuration defined in crm/src/system/webhook.config.ts
ApiEndpoint / ApiRoutes⚠️ PartialAPI endpoint configuration defined in crm/src/system/api.config.ts; not all packages have API configs
GraphQLConfig / GraphQLQueryConfig❌ Not UsedNo GraphQL configuration
OData / ODataQuery❌ Not UsedNo OData support
WebSocketConfig / realtime events❌ Not UsedNo WebSocket/realtime configuration
BatchConfig / BatchOperationResult❌ Not UsedNo batch API configuration
CacheControl / ETag❌ Not UsedNo HTTP caching
ApiVersioningConfig❌ Not UsedNo API versioning
DispatcherConfig / route registration❌ Not UsedNo route dispatcher
OpenApiSpec / API documentation❌ Not UsedNo OpenAPI spec generation
RestApiConfig / endpoint patterns❌ Not UsedNo REST API configuration

8. @objectstack/spec/security — Security Layer

CapabilityStatusUsage Details
PermissionSet / ObjectPermission / FieldPermissionUsedPermission sets defined in CRM package via PermissionSetSchema
SharingRule / SharingLevel❌ Not UsedNo sharing rules
RLSConfig (Row-Level Security)❌ Not UsedNo RLS policies
TerritoryModel / Territory❌ Not UsedNo territory management
Policy (session, password, network, audit)❌ Not UsedNo security policies

9. @objectstack/spec/integration — Integration Layer

CapabilityStatusUsage Details
Connector / ConnectorSchema (SaaS connectors)❌ Not UsedNo external connectors
WebhookConfig / WebhookEvent❌ Not UsedNo webhook configurations
RateLimitConfig / RetryConfig❌ Not UsedNo rate limiting
FileStorageConnector❌ Not UsedNo file storage integration
MessageQueueConnector❌ Not UsedNo message queue integration
GitHubConnector / VercelConnector❌ Not UsedNo CI/CD integration
ApiVersionConfig❌ Not UsedNo API versioning
DatabaseConnector❌ Not UsedNo external DB connectors

10. @objectstack/spec/studio — Studio Module (New in v3.0.0)

CapabilityStatusUsage Details
defineStudioPlugin()UsedStudio plugin contributions defined for HotCRM admin extensions
contributions API (sidebar, panels)❌ Not UsedStudio sidebar and panel contributions not configured
StudioTheme / StudioLayout❌ Not UsedStudio theme customization not used
StudioCommand / CommandPalette❌ Not UsedStudio command palette not extended

11. @objectstack/spec/contracts — Service Contracts

CapabilityStatusUsage Details
ServiceContract / typed interfaces❌ Not UsedService contracts not defined
ContractVersion / versioning❌ Not UsedContract versioning not used
ContractTest / contract testing❌ Not UsedContract testing not configured
ContractRegistry❌ Not UsedContract registry not used

v3.0.0 Note: The hub, auth, driver, and permission modules were removed in v3.0.0. Their functionality has been consolidated into other modules (security absorbed permission, kernel absorbed auth/driver, hub functionality is deprecated).


Gap Analysis Summary

Resolved Gaps (Completed in Phase 7–8)

These gaps from the original evaluation have been addressed:

#GapModuleResolution
1UI Schema Typingui✅ All pages, views, dashboards, and forms now validate with PageSchema, ViewSchema, DashboardSchema, FormViewSchema
2Workflow Schema Validationautomation✅ Workflows validated via WorkflowRuleSchema.parse()
3Plugin Type Safetykernel✅ Most plugins use PluginSchema (some legacy any remains)
4State Machine Definitionsautomation✅ Case status and lead lifecycle use StateMachineSchema
5Advanced Field TypesdatamasterDetail, summary, select({multiple:true}), file, image, location, address adopted
7Agent Schema Adoptionai✅ AI agents use formal AgentSchema definitions
8Permission Modelsecurity✅ Permission sets defined via PermissionSetSchema
9Dashboard Definitionsui✅ Dashboards with widget types: metric, kpi, funnel, line, bar, table
14Form Layoutsui✅ Form views with sections, columns, field-level config
23Studio extensionsstudiodefineStudioPlugin() adopted

Remaining High-Impact Gaps

#GapModuleImpactEffort
6Approval Process Schema — Products approval uses custom code instead of ApprovalProcessSchemaautomationMediumMedium
10Report Definitions — No report metadata despite analytics capabilitiesuiMediumMedium
11Advanced Validation — Cross-field, conditional, async validations partially used but not all validateddataMediumMedium
12Event Bus Configuration — No event system despite hooks producing eventskernelMediumHigh
13Notification Channels — Notification config exists but channel diversity is limitedsystemMediumMedium

Lower-Priority Gaps (Future Consideration)

#GapModuleNotes
15Full API endpoint definitionsapiWebhook config adopted; REST/GraphQL remain
16Integration connectorsintegrationPlanned for 2027 (see roadmap)
17Caching/storage/search configsystemCache config adopted; storage/search remain
18Compliance configsystemEnterprise requirements
19RAG pipeline configaiWhen implementing knowledge base AI
20Feature flagskernelEdition/tenant feature gating
21NLQ (Natural Language Query)aiAI-powered data querying
22Service contractscontractsTyped service interfaces

Prompt Improvement Recommendations

Based on the gap analysis, the following improvements to the project's AI coding prompts (GitHub Copilot instructions) are recommended:

1. Enforce Schema Validation in Prompts

Current instruction: "All business objects are defined in TypeScript using the ServiceObject interface."

Proposed addition:

- All *.page.ts files MUST import and validate against PageSchema from @objectstack/spec/ui
- All *.view.ts files MUST import and validate against ViewSchema from @objectstack/spec/ui
- All *.workflow.ts files MUST validate against WorkflowRuleSchema from @objectstack/spec/automation
- Plugin definitions MUST use PluginSchema from @objectstack/spec/kernel instead of `any` type
- State machines MUST be defined using StateMachineSchema from @objectstack/spec/automation

2. Expand Field Type Guidance

Current instruction: Generic field types mentioned.

Proposed addition:

- Use Field.master_detail() for parent-child relationships where the child cannot exist without the parent (e.g., invoice_line→invoice). This enforces cascade delete and enables Field.summary() rollups on the parent. Use Field.lookup() for optional associations where records are independent.
- Use Field.summary() for rollup/aggregate fields on parent objects
- Use Field.multiselect() when multiple options can be selected
- Use Field.tags() for free-form tagging
- Use Field.location() and Field.address() for geographic data
- Use Field.file() and Field.image() for attachment fields

3. Add UI Metadata Guidance

Proposed addition to File Suffix Protocol:

- *.page.ts: Record detail layouts using PageSchema from @objectstack/spec/ui
- *.view.ts: List/grid/kanban views using ViewSchema from @objectstack/spec/ui
- *.dashboard.ts: Dashboard layouts using DashboardSchema from @objectstack/spec/ui
- *.report.ts: Report definitions using ReportSchema from @objectstack/spec/ui
- *.form.ts: Form layouts using FormViewSchema from @objectstack/spec/ui

4. Add Security Metadata Guidance

Proposed addition:

- *.permission.ts: Permission sets and field permissions using @objectstack/spec/security
- *.sharing.ts: Sharing rules and territory models using @objectstack/spec/security

5. Add Automation Best Practices

Proposed addition:

- Complex status fields SHOULD have a corresponding state machine definition (*.statemachine.ts)
- Approval flows MUST use ApprovalProcessSchema from @objectstack/spec/automation
- Scheduled automations SHOULD use TimeTriggerSchema for schedule configuration

Metrics & Methodology

How This Evaluation Was Conducted

  1. Spec Module Inventory: All 12 exported modules of @objectstack/spec v3.0.0 were cataloged from package.json exports and their .d.ts type definitions.
  2. Import Analysis: All from '@objectstack/spec/*' imports across HotCRM's 6 business packages + AI package were collected and categorized.
  3. Pattern Matching: Untyped metadata patterns (plain objects for pages, views, workflows, plugins) were identified by examining file contents against corresponding spec schemas.
  4. JSON Schema Cross-Reference: The 1,256 JSON schemas in @objectstack/spec/json-schema/ were cross-referenced against HotCRM's metadata usage.

Schema Count by Domain (from json-schema/)

DomainSchema CountUsed in HotCRM
api288~5
system215~10
ai174~20
kernel160~8
data120~30
integration630
ui62~25
automation58~12
security23~5
studio12~3
shared160
qa80
Total1,199~118 (~10%)

Note: v3.0.0 removed the hub (34 schemas), identity (23 schemas) domains, reducing the total from 1,256 to 1,199.


Zod 4 Compatibility

@objectstack/spec v3.0.0 uses Zod 4.3.6 as its validation engine. The following files in HotCRM import zod directly:

PackageFileImport TypeCompatible
coresrc/zod-helper.tsimport { z } from 'zod' (runtime)✅ Yes
crmsrc/schemas/lead.schema.tsimport { z } from 'zod' (runtime)✅ Yes
crmsrc/system/api.config.tsimport type { z } from 'zod' (type-only)✅ Yes
crmsrc/system/webhook.config.tsimport type { z } from 'zod' (type-only)✅ Yes
crmsrc/system/audit.config.tsimport type { z } from 'zod' (type-only)✅ Yes
crmsrc/validations/cross_field_validations.tsimport type { z } from 'zod' (type-only)✅ Yes
crmsrc/validations/data_quality_rules.tsimport type { z } from 'zod' (type-only)✅ Yes
productssrc/system/cache.config.tsimport type { z } from 'zod' (type-only)✅ Yes
supportsrc/system/notification.config.tsimport type { z } from 'zod' (type-only)✅ Yes

Compatibility Status: All 9 files are compatible with Zod 4. Seven use import type (type-only imports that are erased at compile time). The two runtime imports (core/zod-helper.ts and crm/lead.schema.ts) use standard Zod patterns (z.string(), z.object(), z.enum()) that are fully backward-compatible in Zod 4. No migration action is required.


Conclusion

HotCRM has built a solid foundation using @objectstack/spec's metadata system. With Phase 7–8 work, adoption has grown from ~13% to ~25% of available spec capabilities. Key achievements:

  1. UI metadata fully typed — All page layouts, list views, dashboards, and forms validate against spec schemas using satisfies and .parse()
  2. Expanded field types — 22 of 44 field types adopted, including masterDetail, summary, select({multiple:true}), file, image, location, address
  3. Formal automation schemas — Workflows and state machines validated against spec schemas
  4. Studio module adopteddefineStudioPlugin() used for admin extensions
  5. System-level configs — Cache, notification, audit, webhook, and API configurations formally defined
  6. Security metadata — Permission sets defined via PermissionSetSchema
  7. Zod 4 compatible — All direct Zod imports confirmed compatible with Zod 4.3.6

The remaining gaps are primarily in integration connectors, report definitions, event bus configuration, and advanced API features. These represent future opportunities as the platform matures.

On this page