| title | Implementation Status Matrix |
|---|---|
| description | Detailed status of protocol implementations across ObjectStack packages |
This document provides a comprehensive overview of which protocols from @objectstack/spec have been implemented in the ObjectStack packages.
This matrix is generated from actual codebase analysis and represents the current implementation status.
| Symbol | Status | Description |
|---|---|---|
| ✅ | Fully Implemented | Production-ready implementation with all core features |
| Partially Implemented | Basic implementation, missing advanced features | |
| 🟡 | Partially Delivered | Shipping implementation; full protocol parity still in progress |
| 🚧 | In Progress | Currently being developed |
| 📋 | Planned | Scheduled for future implementation |
| ❌ | Not Implemented | Protocol defined but not yet implemented |
| Protocol | @objectstack/core | @objectstack/runtime | @objectstack/objectql | Status |
|---|---|---|---|---|
| Manifest | ✅ | ✅ | ✅ | ✅ Full |
| Context | ✅ | ✅ | ✅ | ✅ Full |
| Plugin | ✅ | ✅ | ❌ | ✅ Full |
| Plugin Lifecycle | ✅ | ❌ | ❌ | ✅ Full |
| Plugin Capability | ✅ | ❌ | ❌ | ✅ Full |
| Service Registry | ✅ | ❌ | ❌ | ✅ Full |
| Startup Orchestrator | ✅ | ❌ | ❌ | ✅ Full |
| Events | ✅ | ❌ | ❌ | ✅ Full |
Notes:
- Core package provides complete microkernel implementation
- Plugin system supports the
init/start/destroylifecycle, dependency resolution, and service injection — theonInstall/onEnable-style hook family was retired in v17 as never-implemented (#4212) - Event bus enables inter-plugin communication;
IPluginLifecycleEventsregisters the 14 lifecycle events that actually fire, andLifecycleEventNamesoft-typeshook/trigger(#4241) - ObjectQL serves as the example kernel — a reference implementation that will be modularized into plugins
| Protocol | @objectstack/objectql | @objectstack/runtime | @objectstack/driver-memory | Status |
|---|---|---|---|---|
| Driver | ✅ | ✅ | ✅ Interface | |
| Datasource | ✅ | ✅ | ❌ | ✅ Full |
| Data Engine | ✅ | ❌ | ❌ | ✅ Full |
| Query | ✅ | |||
| Filter | ✅ |
Notes:
- ObjectQL implements complete IDataEngine interface
- Memory driver is the reference implementation: filters, sorting, pagination, aggregations, snapshot transactions, streaming and
syncSchema()are on; joins, window functions, subqueries, full-text and vector search are off (InMemoryDriver.supports) - Advanced query features (joins, window functions, subqueries) require production drivers
- Memory driver supports aggregations (groupBy, count, sum, avg, min, max)
- Metadata API (list types, list items, get item) is fully functional
- Metadata is loaded from config files or
dist/objectstack.jsonat startup and held in memory MetadataPluginauto-provisions thesys_metadata/sys_metadata_historystorage objects (plus the ADR-0067 commit log and the metadata audit trail) by default, soPUT /api/v1/meta/{type}/{name}always has somewhere to write. Per-project (cloud) kernels opt out withregisterSystemObjects: false, because there the control plane owns those tablesMetadataPlugindoes not auto-bridge ObjectQL to aDatabaseLoader— there is no automatic runtime project-DB bridge, and nothing in the packages calls the bridge during boot. Database-backed metadata is an explicitMetadataManageropt-in (setDataEngine()/setDatabaseDriver(), or adatasource+driverpair on the manager config), and even then it is control-plane only: both methods return early whenever anenvironmentIdis supplied, so a per-project kernel never gets a database-backed metadata loader- The artifact source is
artifactSource: { mode: 'local-file', path }— a compiled artifact read from a filesystem path or fetched from anhttp(s)URL (the control plane's public/pub/v1/environments/:id/artifact[?commit=…]route serves exactly such URLs), honored by all three bootstrap modes (eager/lazy/artifact-only). A secondartifact-apimode (a Bearer-authenticated control-plane pull) this page once called "Future / reserved" was removed while resolving #4246: it had zero consumers in any repo — the cloud runtime uses its ownArtifactApiClient, and package installs into a running OSS instance go through@objectstack/cloud-connection— and a still-configuredartifact-apisource now fails loudly atstart()instead of lingering half-declared - Future: durable local artifact cache — remote artifact URLs re-fetch on every boot
| Protocol | Implementation Package | Status | Notes |
|---|---|---|---|
| Logging | @objectstack/core | ✅ | Cross-platform logger (browser + server) |
| API Registry | @objectstack/core | ✅ | Central endpoint registry |
| Metrics | @objectstack/observability | ✅ | Metrics exporters shipped (metrics-exporters.ts) |
| Tracing | @objectstack/observability | Error/exporter pipeline shipped (error-exporters.ts); full distributed tracing in progress |
|
| Audit | @objectstack/plugin-audit | ✅ | Audit writers + audit objects shipped |
| Job | @objectstack/service-job | ✅ | Job service with cron/db/interval adapters |
| Cache | @objectstack/service-cache | ✅ | ICacheService with in-memory and Redis adapters (cache-service-plugin.ts); HTTP caching ships separately in @objectstack/rest |
| Translation | @objectstack/service-i18n | ✅ | i18n/translation service with file adapter |
| Feature Flags | ❌ | 📋 | Planned |
| Encryption | @objectstack/service-settings | ICryptoProvider seam with a local AES-256-GCM provider (local-crypto-provider.ts); secret fields are encrypted at rest into sys_secret (objectql/secret-fields.ts). Managed KMS/Vault providers not shipped |
|
| Compliance | ❌ | 📋 | Planned |
| Masking | ❌ | 📋 | Planned |
| Notification | @objectstack/service-messaging | 🟡 | Framework pipeline shipped; objectui bell cut-over remains |
| Change Management | ❌ | 📋 | Planned |
| Collaboration | ❌ | 📋 | Planned |
| Protocol | @objectstack/spec | @objectstack/objectql | @objectstack/client | Status |
|---|---|---|---|---|
| Field | ✅ | ✅ | ✅ | ✅ Full |
| Object | ✅ | ✅ | ✅ | ✅ Full |
| Validation | ✅ | ❌ | ||
| Hook | ✅ | ✅ | ❌ | ✅ Full |
| Dataset | ✅ | ❌ | ✅ | ✅ @objectstack/service-analytics |
| Mapping | ✅ | ❌ | ❌ | ❌ Not Impl |
| Document | ✅ | ❌ | ❌ | ❌ Not Impl |
| External Lookup | ❌ | ❌ | ❌ | ❌ Retired — data/external-lookup.zod.ts was retired outright under ADR-0049 (route 3, D3 external-lookup-message-queue-families-retired, #8075) |
Field Type Support:
| Field Type | Implementation | Notes |
|---|---|---|
| text, textarea, email, url, phone | ✅ | Full support |
| number, currency, percent | ✅ | Full support |
| boolean, toggle | ✅ | Full support (there is no checkbox type — a checkbox group is checkboxes) |
| date, datetime, time | ✅ | Full support |
| select, multiselect | ✅ | Full support |
| lookup, master_detail | ✅ | Full support in spec, partial in memory driver |
| formula | ✅ | CEL-backed formula fields are implemented |
| summary | ✅ | Server-side rollups for count/sum/min/max/avg on child records |
| json, tags | ✅ | Full support (there is no array type — use json, tags, or the repeater embedded type) |
| file, image | ✅ | File-class fields (image/file/avatar/video/audio) hold an opaque sys_file id; ownership + release are tracked by @objectstack/service-storage |
| Protocol | @objectstack/objectql | @objectstack/client | @objectstack/driver-memory | Status |
|---|---|---|---|---|
| Query AST | ✅ | ✅ | ✅ Full | |
| Query Builder | ❌ | ✅ | ❌ | ✅ Client |
| Filter Operators | ✅ | ✅ | ||
| Aggregations | ✅ | ✅ | ✅ | ✅ Full |
| Joins | ✅ | ✅ | ❌ | |
| Sorting | ✅ | ✅ | ✅ | ✅ Full |
| Pagination | ✅ | ✅ | ✅ | ✅ Full |
| Window Functions | ✅ | ❌ | ❌ | ❌ Spec only |
| Subqueries | ✅ | ❌ | ❌ | ❌ Spec only |
Notes:
- Full query protocol is defined and implemented in ObjectQL engine
- Actual query capability depends on driver implementation
- Memory driver covers filters, sorting, pagination and aggregations; joins, window functions and subqueries are off
- Client SDK provides query builder utilities (
QueryBuilder/FilterBuilder,createQuery/createFilter)
| Protocol | @objectstack/rest | @objectstack/runtime | @objectstack/plugin-hono-server | @objectstack/client | Status |
|---|---|---|---|---|---|
| REST Server | ✅ | ✅ (re-export) | ✅ | ❌ | ✅ Full |
| HTTP Server | ❌ | ✅ | ✅ | ❌ | ✅ Full |
| Endpoint | ✅ | ❌ | ✅ | ❌ | ✅ Full |
| Router | ✅ | ✅ | ✅ | ❌ | ✅ Full |
| Discovery | ✅ | ✅ | ✅ | ✅ | ✅ Full |
| Contract | ✅ | ✅ | ❌ | ❌ | |
| Protocol | ❌ | ✅ | ❌ | ✅ | ✅ Full |
| Errors | ✅ | ✅ | ✅ | ✅ | ✅ Full |
| HTTP Cache | ✅ | ✅ | ✅ | ✅ | ✅ Full |
| Batch | ✅ | ✅ | ✅ | ✅ | ✅ Full |
The data (/api/v1/data), metadata (/api/v1/meta), discovery (/api/v1/discovery), and batch endpoints are implemented in @objectstack/rest (rest-server.ts — registerDiscoveryEndpoints); @objectstack/runtime re-exports RestServer from that package and provides the underlying HTTP server/dispatcher.
REST Endpoints Implemented:
| Endpoint Pattern | Method | Purpose | Status |
|---|---|---|---|
/api/v1 |
GET | API discovery (alias; the SDK connects via /api/v1/discovery) |
✅ |
/api/v1/meta |
GET | List metadata types | ✅ |
/api/v1/meta/{type} |
GET | List items of type | ✅ |
/api/v1/meta/{type}/{name} |
GET | Get specific metadata item | ✅ |
/api/v1/data/{object} |
GET | List records | ✅ |
/api/v1/data/{object}/{id} |
GET | Get single record | ✅ |
/api/v1/data/{object} |
POST | Create record | ✅ |
/api/v1/data/{object}/{id} |
PATCH | Update record | ✅ |
/api/v1/data/{object}/{id} |
DELETE | Delete record | ✅ |
/api/v1/data/{object}/createMany |
POST | Batch create | ✅ |
/api/v1/data/{object}/updateMany |
POST | Batch update | ✅ |
/api/v1/data/{object}/deleteMany |
POST | Batch delete | ✅ |
/api/v1/data/{object}/{id}/clone |
POST | Clone a record (gated by enable.clone) |
✅ |
/api/v1/data/{object}/batch |
POST | Atomic batch operations | ✅ |
/api/v1/batch |
POST | Cross-object atomic batch (parent + children in one transaction, $ref) |
✅ |
Every route carries the /api/v1 prefix. When project scoping is enabled each row is additionally mirrored under /api/v1/environments/{environmentId}. The full audited route list lives in packages/rest/src/rest-route-ledger.ts.
| Protocol | Implementation | Status | Notes |
|---|---|---|---|
| Analytics | ✅ | ✅ | ObjectQL aggregation plus @objectstack/service-analytics dataset execution; analytics read scope auto-bridges to security.getReadFilter for RLS-aware dashboards/reports |
| OData | ❌ | 📋 | Protocol defined, not implemented |
| Realtime | @objectstack/service-realtime | Realtime service shipped, but only the process-local 'memory' adapter (in-memory-realtime-adapter.ts); a Redis-backed HA adapter is a post-GA fast-follow |
|
| WebSocket | ❌ | 📋 | Protocol defined (spec/api/websocket.zod.ts); no WebSocket transport ships in any package — the realtime service is in-process pub/sub, not a socket transport |
| Protocol | @objectstack/spec | Implementation | Status |
|---|---|---|---|
| View | ✅ | 🟡 | 🟡 Studio/ObjectUI renders authored metadata surfaces; general-purpose renderer coverage is still incomplete |
| ListView | ✅ | 🟡 | 🟡 ObjectUI grid/list surfaces support per-view persistence, filters, row actions, density, galleries, and permission-aware affordances; full protocol parity is ongoing |
| FormView | ✅ | 🟡 | 🟡 ObjectUI forms support live field rules (visibleWhen / readonlyWhen / requiredWhen), inline-grid row rules, and server-aligned required enforcement |
| Page | ✅ | 🟡 | 🟡 Record-page authoring, page create flows, block canvas editing, slotted record pages, and selected page blocks are implemented in ObjectUI; full component catalogue remains in progress |
| App | ✅ | 🟡 | 🟡 Navigation metadata is consumed by the console/app shell; full renderer parity remains in progress |
| Dashboard | ✅ | 🟡 | 🟡 ObjectUI renders metric/chart/list/pivot/funnel/table widgets, drill-downs (group → records → record chain), type-aware cells, and dataset-bound widgets; Studio can author per-widget dataset bindings (dataset / dimensions / values) |
| Report | ✅ | 🟡 | 🟡 ObjectUI renders spec-native tabular/summary/matrix/joined reports, chart/KPI blocks, drill-downs, and dataset-bound reports |
| Action | ✅ | 🟡 | 🟡 ObjectUI supports row/global/header actions, action modal transport, parameter collection, visibility CEL, and nested action runners |
| Component | ✅ | 🟡 | 🟡 Selected page/record components render in ObjectUI (record:alert, related lists, highlights, page blocks); catalogue parity remains in progress |
| Theme | ✅ | ❌ | ❌ Spec only |
| Widget | ✅ | 🟡 | 🟡 Dashboard/report/list/form widgets render in ObjectUI; custom widget manifest/runtime parity remains in progress |
| Chart | ✅ | 🟡 | 🟡 Recharts-backed dashboard/report charts cover bar/line/pie/area/scatter/funnel/gauge/treemap/sankey with formatting and field-coverage guards |
Notes:
- All UI protocols are fully defined in spec
- Metadata API can retrieve UI definitions (views, apps, pages, dashboards, reports, actions)
- Active Studio/ObjectUI source lives in the sibling
../objectuirepo and is bundled intopackages/consolevia the objectui refresh workflow - Metadata-admin curated forms now merge server-only fields back into the save payload, so a Studio form that exposes only part of a metadata type should not strip newer protocol properties
- The 2026-05-08 → 2026-06-08 ObjectUI scan covered 910 non-merge frontend commits. The largest functional clusters were metadata-admin/Studio, master-detail forms, reports/dashboards, record detail/related lists, action transport, flow designer, developer/API pages, AI draft publishing, and i18n.
- React SDK provides data hooks; the cross-surface renderer is still being completed in ObjectUI rather than in this backend repo
**Plugin-Provided Service** — The kernel does NOT include an automation engine. Flow, workflow, and approval services are provided by plugins — the flow engine ships in `@objectstack/service-automation`, with approval nodes in `@objectstack/plugin-approvals`.
| Protocol | @objectstack/spec | Kernel | Plugin Required | Status |
|---|---|---|---|---|
| Flow | ✅ | ❌ | ✅ | ✅ @objectstack/service-automation |
| Workflow | ✅ | ❌ | ✅ | ✅ @objectstack/service-automation |
| Approval | ✅ | ❌ | ✅ | ✅ @objectstack/plugin-approvals |
| Webhook | ✅ | ❌ | ✅ | ✅ @objectstack/plugin-webhooks |
| ETL | ✅ | ❌ | ✅ | 📋 Plugin |
| Sync | ✅ | ❌ | ✅ | 📋 Plugin |
| Trigger Registry | ✅ | ❌ | ✅ | ✅ trigger-api / trigger-record-change / trigger-schedule |
Notes:
- Hook system is implemented in ObjectQL (beforeFind, afterInsert, etc.) — this is data-layer eventing, not workflow automation
- The flow/workflow engine ships in
@objectstack/service-automation(engine.ts, builtin nodes,plugin.ts); approvals, webhooks, and triggers ship as@objectstack/plugin-approvals,@objectstack/plugin-webhooks,@objectstack/trigger-api,@objectstack/trigger-record-change, and@objectstack/trigger-schedule - ETL and Sync protocols are defined but not yet implemented as plugins
- Discovery API reports automation service as
unavailableuntil a plugin is registered
**Plugin-Provided Service** — The kernel does NOT handle authentication or authorization. Security services must be provided by plugins (e.g., `@objectstack/plugin-auth`). The Discovery API reports auth as `unavailable` until a plugin is registered.
CoreServiceName names a single auth service — there is no permission entry in that enum. Authentication/identity is what @objectstack/plugin-auth registers under that name. Authorization is registered outside CoreServiceName: @objectstack/plugin-security registers security (plus security.permissions, security.rls, security.fieldMasker) and @objectstack/plugin-sharing registers sharing, sharingRules, and shareLinks.
| Protocol | Area | @objectstack/spec | Kernel | Plugin Required | Status |
|---|---|---|---|---|---|
| Identity | Authentication | ✅ | ❌ | ✅ | ✅ plugin-auth (better-auth) |
| Auth Config | Authentication | ✅ | ❌ | ✅ | ✅ plugin-auth |
| Position | Authentication | ✅ | ❌ | ✅ | ✅ plugin-auth + plugin-security |
| Organization | Authentication | ✅ | ❌ | ✅ | ✅ plugin-auth (tenancy service) |
| Policy | Authentication | ✅ | ❌ | ✅ | 📋 Plugin |
| SCIM | Authentication | ✅ | ❌ | ✅ | plugin-auth, opt-in via OS_SCIM_ENABLED |
| Permission | Authorization | ✅ | ✅ Phase-1 | ✅ | ✅ plugin-security |
| Sharing | Authorization | ✅ | ❌ | ✅ | ✅ plugin-sharing |
| RLS | Authorization | ✅ | ✅ Phase-1 (tenant + owner) | ✅ | ✅ plugin-security |
Notes:
- Security is delivered by three cooperating plugins, not one:
plugin-auth(identity,auth+tenancyservices),plugin-security(permissions, FLS, RLS, tenant wall), andplugin-sharing(OWD, sharing rules, per-record shares, share links) - Client SDK supports bearer token header — but token validation requires the auth plugin
- Auth route (
/auth/*) only appears in Discovery when the auth plugin is registered - Fine-grained authorization (RLS, sharing) lives in
plugin-security/plugin-sharing, not in the auth plugin. Territory-style access is expressed as an RLS dynamic-membership set (ExecutionContext.rlsMembership, e.g.id in current_user.territory_account_ids) rather than as a dedicated territory module - Phase-1 RBAC enforcement is live end-to-end: REST → ObjectQL → SecurityPlugin middleware now receives a populated
ExecutionContext(userId, tenantId, positions, permissions). Tenant isolation is enforced as a Layer 0 tenant wall (plugin-security/tenant-layer.ts, ADR-0095 D1) that AND-composesorganization_id == current_user.organization_idahead of and independently of business RLS — the earlier wildcardtenant_isolationRLS policy onmember_defaultwas retired (an OR-merged business policy could widen it). The defaultmember_defaultset still ships per-object overridessys_organization_self(id == current_user.organization_id) andsys_user_self(id == current_user.id) for the global tables that lack anorganization_idcolumn. The earliertenantFieldindirection (RLS expressions written against an abstracttenant_idcolumn then rewritten to the configured physical column at compile time) was removed — the placeholder, the column name, andRLSUserContext.organization_idare now the same name end-to-end. The legacyobjectql.registerTenantMiddleware(hardcodedwhere.tenant_idinjection that pre-dated SecurityPlugin) has been removed; SecurityPlugin is the sole authority for tenant isolation. Analytics now uses the same reusable read scope viasecurity.getReadFilter, so dataset-bound dashboards/reports do not bypass RLS. Verified cross-organization isolation onpnpm dev:crmacrosssys_organization,sys_member,sys_user,sys_user_permission_set,sys_position_permission_set. Anonymous traffic is always denied (ADR-0056 D2). The deployment-wide opt-out is gone:api.requireAuthwas retired in@objectstack/spec17 (#3963) and is now a tombstoned key that fails validation rather than reopening the data plane. The single decision lives in@objectstack/core(security/anonymous-deny.ts, 401UNAUTHENTICATED), and every surface that legitimately serves a session-less caller derives its own narrow authorization from a declaration instead: control-plane paths via the auth-gate allowlist, public forms viapublicFormGrant(ADR-0056 Option A), share links via a capability token validated then read as SYSTEM,book.audience: 'public'reads via the audience gate, and MCP via an OAuth token or API key. - OWD / sharing-model enforcement is live and proven end-to-end (ADR-0056):
private,public_read,public_read_write, andcontrolled_by_parentare enforced throughplugin-sharing+plugin-securityand verified by dogfood proofs over the real HTTP stack.object.sharingModelaccepts the canonical OWD vocabulary only (private/public_read/public_read_write/controlled_by_parent) — the legacyread/read_write/fullaliases were removed from the enum (ADR-0090 D4), and an unsetsharingModelon a custom object resolves toprivate(ADR-0090 D1). RLS owner policies resolvecurrent_user.emailin addition toid/organization_id/positions(#2054). Permission sets may declareisDefault: trueas the install-time suggestion to bind the set to the built-ineveryoneposition (ADR-0090 D5, superseding the ADR-0056 D7 fallback-profile mechanism). A sharing rule must state its criteria (#3896): all three write paths reject a match-all shape, a stored criteria-less rule matches nothing, and its materialised grants are revoked on the next reconcile.
The in-UI AI **runtime** below ships in **ObjectOS**, not in the open-source framework. The agent / skill / tool **schemas** stay open in `@objectstack/spec/ai`; the **open-source framework** exposes AI via [`@objectstack/mcp`](/docs/ai) (BYO-AI). The Implementation / Status columns describe that separate runtime.
| Protocol | @objectstack/spec | Implementation | Status |
|---|---|---|---|
| Agent | ✅ | ObjectOS runtime | ✅ Agent runtime |
| Model Registry | ✅ | ObjectOS runtime | ✅ Model registry |
| RAG Pipeline | @objectstack/service-knowledge | knowledge-memory / knowledge-ragflow / embedder-openai plugins; spec defines the retrieval binding (ai/knowledge-source.zod.ts, ai/knowledge-document.zod.ts), not a pipeline DSL |
|
| NLQ | ❌ | ObjectOS runtime | |
| Conversation | ✅ | ObjectOS runtime | ✅ In-memory + ObjectQL conversation services |
| Agent Action | ✅ | ObjectOS runtime | tool.zod.ts + action_<name> tools) |
| Cost | ✅ | ❌ | ❌ Spec only — usage.zod.ts accounts tokens/per-call cost; no budget enforcement |
| Predictive | ❌ | ❌ | ❌ Not defined |
| Orchestration | ❌ | ObjectOS runtime | |
| Feedback Loop | ❌ | ObjectOS runtime | |
| DevOps Agent | ❌ | ❌ | ❌ Not defined |
Notes:
- The
@objectstack/spec/aisurface is deliberately narrow — Agent, Skill, Tool, Conversation, Model Registry, Embedding, Usage, MCP, plus the knowledge-source / knowledge-document and solution-blueprint schemas. Application-level protocols (DevOps agents, predictive pipelines, AIOps, orchestration plans, NLQ services, RAG-pipeline DSLs, budget enforcement) were removed in v1 and have no schema today — see the scope note inpackages/spec/src/ai/index.ts - The ObjectOS runtime ships agents, model registry, conversation, tools, skills, and an eval harness
- RAG/embedding is provided by
@objectstack/service-knowledgeplus theknowledge-memory,knowledge-ragflow, andembedder-openaiplugins (all open) - Token/cost accounting has a schema (
ai/usage.zod.ts) but no shipping enforcement; the predictive and DevOps-agent protocols are not defined in spec at all
| Protocol | @objectstack/spec | Implementation | Status |
|---|---|---|---|
| Connector | ✅ | connector-rest, connector-openapi, connector-mcp, connector-slack | ✅ REST/OpenAPI/MCP/Slack connectors shipped |
| SaaS Connector | ✅ | connector-slack | |
| Database Connector | ✅ | @objectstack/driver-sql, driver-mongodb | ✅ Delivered via the database drivers |
| File Storage | ✅ | @objectstack/service-storage | ✅ File storage service with local + S3 adapters and storage routes |
| Message Queue | ✅ | @objectstack/service-queue | |
| GitHub Connector | ✅ | ❌ | ❌ Spec only |
| Vercel Connector | ✅ | ❌ | ❌ Spec only |
| Protocol | @objectstack/spec | @objectstack/core | @objectstack/verify | Status |
|---|---|---|---|---|
| Testing | ✅ | ✅ | ✅ | ✅ Full |
Features Implemented:
- TestSuite, TestScenario, TestStep schemas ✅
- HTTP adapter for testing ✅ (
packages/core/src/qa/http-adapter.ts) - QA runner in core ✅ (
packages/core/src/qa/runner.ts) - Conformance/dogfood harnesses in
@objectstack/verifyandpackages/qa(dogfood,downstream-contract,http-conformance) ✅
There is no MSW package in this repo — browser API mocking is a devDependency of the sibling objectui frontend, and @objectstack/driver-memory is what backs those in-browser fixtures.
- [x] Microkernel & Plugin System
- [x] Logging System
- [x] Service Registry
- [x] Event Bus
- [x] API Registry
- [x] ObjectQL Engine
- [x] Schema Registry
- [x] Protocol Implementation
- [x] Basic Query Support
- [x] CRUD Operations
- [x] Hook System
- [x] REST Server
- [x] HTTP Server (Hono)
- [x] Endpoint Generation
- [x] Discovery API
- [x] Metadata API
- [x] Batch Operations
- [x] HTTP Caching
- [x] TypeScript Client
- [x] React Hooks
- [x] Query Builder
- [x] Error Handling
- [x] CLI Tools
- [x] Config Validation
- [x] Development Server
- [x] Metadata Management
- [x] Production Database Drivers —
@objectstack/driver-sql(PostgreSQL/MySQL dialects),@objectstack/driver-mongodb, and@objectstack/driver-sqlite-wasmship; additional dialect coverage ongoing - [ ] OData Support
- [ ] Realtime Subscriptions
- [ ] WebSocket Support
- [ ] UI Renderer
- [x] Studio metadata-admin engine — generic metadata list/detail/edit surfaces, live preview, draft/publish/rollback, create-mode forms, server-side diagnostics, package scoping, and skew-safe curated inspectors
- [x] Form conditional rules — ObjectUI supports
visibleWhen,readonlyWhen,requiredWhen, row-scoped inline-grid rules, and required-on-submit enforcement - [x] Master-detail forms — inline subforms, spreadsheet-style line items, atomic batch create/edit, lookup auto-fill, line ordering, duplicate/reorder, and subtotal/tax/total stack
- [x] Record detail + related lists — derived related lists, record-page assignment, action slots, system/audit sections, and opt-in reference rail
- [x] Dashboard renderer/editor — widget layout persistence, drill-downs, pivot/funnel/table/list widgets, type-aware cells, and per-widget dataset binding authoring (
dataset,dimensions,values) - [x] Report renderer/editor — spec-native summary/matrix/joined reports, chart/KPI blocks, drill-downs, dataset-bound reports, and i18n labels
- [x] Flow/page designers — typed flow node config panels, simulator/debug runner, page block canvas, slotted record pages, and schema-driven block inspectors
- [x] Action transport — row/global/header actions, modal parameter collection, visible CEL, popup-safe open actions, and nested action runner sharing
- [x] Developer/admin console surfaces — Integrations & APIs, public forms, flow runs, approvals inbox, settings, marketplace/package management, AI draft review/publish
- [ ] List View Renderer full protocol parity
- [ ] Cross-surface UI Renderer full protocol parity
- [ ] Theme Engine
- [x] Flow Engine Plugin
- [x] Approval Node Plugin
- [x] Trigger Registry Plugins —
@objectstack/trigger-api,@objectstack/trigger-record-change,@objectstack/trigger-schedule(including the time-relative trigger) - [ ] ETL Pipeline Plugin
- [ ] Sync Plugin
- [x] Authentication Plugin (
@objectstack/plugin-auth, better-auth) - [x] Authorization Plugin —
@objectstack/plugin-securityenforces CRUD/FLS/RLS in the ObjectQL middleware chain; REST → ObjectQL now propagatesExecutionContextend-to-end (Phase-1) - [x] Row-Level Security — tenant isolation is a Layer 0 tenant wall (
plugin-security/tenant-layer.ts, ADR-0095 D1) that AND-composesorganization_id == current_user.organization_idindependently of business RLS (the earlier wildcardtenant_isolationpolicy onmember_defaultwas retired);member_defaultstill applies per-object overridessys_organization_self/sys_user_self. The earliertenantFieldrewrite indirection was removed: RLS column, placeholder, andRLSUserContext.organization_iduse the same canonical name end-to-end. Policyenabled: falseis enforced at the compiler choke point — a disabled policy no longer contributes its OR-branch grant (#3980) — and the voidrowLevelSecurity[].prioritykey was removed in@objectstack/spec17.0.0 (#3896 security audit) - [x] Analytics RLS bridge —
@objectstack/service-analyticsauto-bridges tosecurity.getReadFilter(object, context)and fails closed when read-scope resolution cannot be safely applied - [x] Multi-tenancy — verified cross-organization isolation on
pnpm dev:crm(Alice@OrgAlpha vs. Bob@OrgBeta only see their own records acrosssys_organization,sys_member,sys_user, andsys_*_permission_setlink tables) - [x] Legacy
objectql.registerTenantMiddlewareremoved — SecurityPlugin is now the sole tenant-isolation authority - [x] Organization-Wide Defaults / sharing model —
private,public_read,public_read_write, andcontrolled_by_parentenforced viaplugin-sharing+plugin-security, proven by dogfood over the real HTTP stack (ADR-0056). Canonical vocabulary only — legacy aliases removed from the enum (ADR-0090 D4); unset custom-object OWD resolves toprivate(ADR-0090 D1) - [x] Sharing Rule evaluator — criteria rules re-evaluated on
afterInsert/afterUpdate(plugin-sharing/rule-hooks.ts); every authorable recipient maps 1:1 onto an enforcedexpandRecipientbranch (plugin-sharing/sharing-rule-service.ts) —user,team,position,business_unit, andunit_and_subordinates(business-unit-subtree widening, ADR-0057 D5 / ADR-0090 D3). Under ADR-0078 enforce-or-remove,criteriais now the only rule type (owner-type rules were removed from the authoring surface because the static materialiser cannot track live membership), thegrouprecipient was renamed toteam,guestwas removed, andqueuestays reserved in the runtime contract but deliberately non-authorable - [x] Everyone-baseline suggestion — a permission set may set
isDefault: trueas the install-time suggestion to bind it to the built-ineveryoneposition; resolved per-request as an additive baseline, no fallback cliff (ADR-0090 D5) - [x] Default-deny for anonymous traffic — the global default-deny landed (ADR-0056 D2) and the
api.requireAuthopt-out was then removed in@objectstack/spec17 (#3963): the key is tombstoned and rejected at parse time, the deny decision is centralised in@objectstack/coresecurity/anonymous-deny.ts, and public forms self-authorize viapublicFormGrant(Option A) - [ ] Studio RLS visual editor
- [ ] Per-user×org permission cache
- [ ] Audit UI / denied-access logging
- [x] RAG Pipeline —
@objectstack/service-knowledgeplus theknowledge-memory,knowledge-ragflow, andembedder-openaiplugins ship in this repo - [x] MCP surface —
@objectstack/mcpexposes the platform to any BYO-AI client - [ ] Agent Framework (ObjectOS runtime; not in the open-source framework)
- [ ] NLQ Engine (ObjectOS runtime)
- [ ] Model Registry (ObjectOS runtime)
| Category | Total Protocols | Status |
|---|---|---|
| Data | 16 | Core modeling, hooks, and query engine fully implemented; document/mapping still pending; external-lookup retired outright under ADR-0049 (route 3, #8075) |
| UI | 10 | Studio/ObjectUI render most authored surfaces (🟡); full cross-surface renderer parity in progress |
| API | 14 | REST/HTTP/discovery/batch fully implemented; OData and the WebSocket transport pending; GraphQL removed from the plan |
| System | 39 | Logging, audit, job, translation, metrics, cache, notification implemented; encryption partial (local crypto provider); several governance services pending |
| Auth (plugin) | 10 | Identity/organizations live (plugin-auth), permission + RLS live (plugin-security), OWD + sharing rules live (plugin-sharing); SCIM is opt-in |
| Automation (plugin) | 7 | Flow, workflow, approval, webhook, and triggers implemented; ETL/Sync pending |
| AI | 12 | Agents, model registry, conversation, tools, RAG implemented (ObjectOS runtime + open knowledge plugins); cost accounting has a schema but no enforcement, and the predictive / DevOps-agent protocols are not defined in spec |
| Integration | 7 | REST/OpenAPI/MCP/Slack connectors, file storage, and queue implemented; GitHub/Vercel connectors pending |
| QA | 1 | Fully implemented |
Implementation spans every layer of the platform. Core infrastructure, data modeling, the REST API, client SDKs, security (Phase-1), automation, AI, and integration all have shipping implementations. Remaining gaps are concentrated in specific protocols (OData, cross-surface UI renderer parity, ETL/Sync, the mapping/document data protocols, and a handful of governance and AI-cost services) rather than entire layers; the external-lookup data protocol was retired outright rather than left pending (ADR-0049 route 3, #8075). Refer to the per-layer tables above for protocol-level status.
| Feature Area | Status | Production Ready |
|---|---|---|
| Kernel & Plugins | ✅ | Yes |
| Data Modeling | ✅ | Yes |
| Query Engine | Partial (depends on driver) | |
| REST API | ✅ | Yes |
| Client SDKs | ✅ | Yes |
| Metadata System | Partial (sys_metadata persistence via MetadataPlugin; without it the kernel's in-memory fallback fills the slot and discovery reports it degraded) |
|
| HTTP Caching | ✅ | Yes |
| Testing Tools | ✅ | Yes |
| UI Rendering | 🟡 | Partial (Studio/ObjectUI render authored surfaces; cross-surface renderer parity in progress) |
| Workflows | ✅ | Yes (plugin: service-automation) |
| Security | Partial (Phase-1 RBAC/FLS/RLS via plugin-security; OWD + sharing rules via plugin-sharing; identity via plugin-auth) |
|
| AI Features | Partial (ObjectOS runtime + open knowledge plugins) |
| Feature | spec | core | objectql | runtime | client | client-react | cli | metadata | hono | memory |
|---|---|---|---|---|---|---|---|---|---|---|
| Protocol Definitions | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Microkernel | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Plugin System | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Service Registry | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Event Bus | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Logging | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Schema Registry | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| ObjectQL Engine | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Protocol Implementation | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| REST Server | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Endpoint Generation | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| HTTP Server | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
| Client SDK | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Query Builder | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| React Hooks | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| CLI Commands | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Config Validation | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ |
| Metadata Loading | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| File Watching | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Database Driver | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
The REST server, endpoint generation, and data/meta/batch endpoints are implemented in the
@objectstack/restpackage (not shown as a column above);@objectstack/runtimere-exportsRestServerfrom it.