-
Notifications
You must be signed in to change notification settings - Fork 6
Restructure ROADMAP.md to reflect minimal-first implementation strategy #722
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -1,6 +1,6 @@ | ||||||
| # ObjectStack Protocol — Road Map | ||||||
|
|
||||||
| > **Last Updated:** 2026-02-16 | ||||||
| > **Last Updated:** 2026-02-18 | ||||||
| > **Current Version:** v3.0.6 | ||||||
| > **Status:** Protocol Specification Complete · Runtime Implementation In Progress | ||||||
|
|
||||||
|
|
@@ -64,6 +64,25 @@ the ecosystem for enterprise workloads. | |||||
| 12 of 25 service contracts are specification-only (no runtime implementation). | ||||||
| These are the backbone of ObjectStack's enterprise capabilities. | ||||||
|
|
||||||
| ### Minimal Implementation Strategy | ||||||
|
|
||||||
| ObjectStack follows a **minimal-first** approach to service implementation: | ||||||
|
|
||||||
| 1. **Implement the smallest possible working version first** — Each service starts with the minimal viable implementation that unblocks real-world use cases. | ||||||
|
|
||||||
| 2. **In-memory fallbacks via dev-plugin** — All non-critical services already have working in-memory fallbacks provided by `@objectstack/plugin-dev`, allowing development and testing to proceed while production implementations are built incrementally. | ||||||
|
|
||||||
| 3. **DatabaseLoader is the single P0 blocker** — The only critical gap preventing production deployment is `DatabaseLoader` in the metadata service. This component enables: | ||||||
| - Platform-level metadata editing in Studio | ||||||
| - User overlay persistence across sessions | ||||||
| - Multi-instance metadata synchronization | ||||||
| - Production-grade metadata storage | ||||||
|
|
||||||
| 4. **Independent upgrade path** — Each service can be independently upgraded from: | ||||||
| - **Stub** (dev-plugin fallback) → **MVP** (minimal working implementation) → **Production** (full-featured with adapters) | ||||||
|
|
||||||
| This strategy ensures rapid iteration while maintaining a clear path to production readiness. | ||||||
|
|
||||||
| --- | ||||||
|
|
||||||
| ## Codebase Metrics | ||||||
|
|
@@ -197,67 +216,92 @@ The following renames are planned for packages that implement core service contr | |||||
|
|
||||||
| ## Phase 4: Service Implementations (🔴 In Progress) | ||||||
|
|
||||||
| > **Goal:** Implement the remaining 19 service contracts as production-ready packages. | ||||||
| > **Goal:** Implement the remaining service contracts following the minimal-first strategy. | ||||||
| > **Naming:** All contract implementations use `service-*` prefix (see [Package Naming Convention](#package-naming-convention)). | ||||||
|
|
||||||
| ### Priority 1 — Essential Services | ||||||
| ### Phase 4a: Metadata Persistence (P0 — Weeks 1-2) | ||||||
|
|
||||||
| **The single critical blocker preventing production deployment.** | ||||||
|
|
||||||
| **DatabaseLoader Implementation:** | ||||||
| - [ ] **Implement `DatabaseLoader`** in `packages/metadata/src/loaders/database-loader.ts` | ||||||
| - [ ] Implement `MetadataLoader` interface with protocol `datasource:` | ||||||
| - [ ] Accept `IDataDriver` instance via kernel DI | ||||||
| - [ ] Map to `sys_metadata` table CRUD operations | ||||||
| - [ ] Support `scope` filtering (system/platform/user) | ||||||
| - [ ] Auto-create `sys_metadata` table on first use | ||||||
| - [ ] Implement upsert semantics for `save()` operations | ||||||
| - [ ] Support optimistic concurrency via `version` field | ||||||
| - [ ] Implement `list()` with type filtering and pagination | ||||||
| - [ ] Declare capabilities: `{ read: true, write: true, watch: false, list: true }` | ||||||
|
|
||||||
| **Metadata Manager Integration:** | ||||||
| - [ ] Auto-configure `DatabaseLoader` when `config.datasource` is set | ||||||
| - [ ] Resolve datasource → `IDataDriver` via kernel service registry | ||||||
| - [ ] Implement fallback strategy per `config.fallback` setting | ||||||
| - [ ] Persist overlay customizations to database | ||||||
| - [ ] Support multi-tenant isolation via `tenantId` filter | ||||||
|
|
||||||
| **Tests:** | ||||||
| - [ ] Unit tests with mock `IDataDriver` | ||||||
| - [ ] Integration tests with `MemoryDriver` | ||||||
| - [ ] Fallback behavior tests (datasource unavailable → filesystem/memory) | ||||||
|
|
||||||
| **This unblocks:** | ||||||
| - Platform-level metadata editing in Studio | ||||||
| - User overlay persistence across sessions | ||||||
| - Multi-instance metadata synchronization | ||||||
| - Production-grade metadata storage | ||||||
|
|
||||||
| ### Phase 4b: Infrastructure Service Upgrades (P1 — Weeks 3-4) | ||||||
|
|
||||||
| **Upgrade existing services from in-memory fallbacks to production adapters.** | ||||||
|
|
||||||
| | Contract | Current Status | Upgrade Path | | ||||||
| |:---|:---|:---| | ||||||
| | `ICacheService` | ✅ Memory adapter + Redis skeleton | Add Redis adapter implementation | | ||||||
| | `IQueueService` | ✅ Memory adapter + BullMQ skeleton | Add BullMQ adapter implementation | | ||||||
| | `IJobService` | ✅ Interval scheduler + cron skeleton | Add cron adapter implementation | | ||||||
| | `IStorageService` | ✅ Local FS + S3 skeleton | Add S3 adapter implementation | | ||||||
|
Comment on lines
+256
to
+265
|
||||||
|
|
||||||
| | Contract | Priority | Package | Notes | | ||||||
| |:---|:---:|:---|:---| | ||||||
| | `ICacheService` | **P0** | `@objectstack/service-cache` | Memory cache + Redis adapter skeleton | | ||||||
| | `IQueueService` | **P0** | `@objectstack/service-queue` | Memory queue + BullMQ adapter skeleton | | ||||||
| | `IJobService` | **P0** | `@objectstack/service-job` | setInterval scheduler + cron adapter skeleton | | ||||||
| | `IStorageService` | **P1** | `@objectstack/service-storage` | Local filesystem + S3 adapter skeleton | | ||||||
| | `ISchemaDriver` | **P1** | — | DDL operations — needed for `objectstack migrate` CLI command | | ||||||
| - [ ] `service-cache` — Implement Redis adapter with connection pooling | ||||||
| - [ ] `service-queue` — Implement BullMQ adapter with job persistence | ||||||
| - [ ] `service-job` — Implement cron adapter with distributed coordination | ||||||
| - [ ] `service-storage` — Implement S3 adapter with multipart upload | ||||||
|
|
||||||
| - [x] `service-cache` — Implement `ICacheService` with memory adapter + Redis skeleton | ||||||
| - [x] `service-queue` — Implement `IQueueService` with memory adapter + BullMQ skeleton | ||||||
| - [x] `service-job` — Implement `IJobService` with interval scheduling + cron skeleton | ||||||
| - [x] `service-storage` — Implement `IStorageService` with local filesystem + S3 skeleton | ||||||
| - [ ] Schema driver integration into PostgreSQL/MongoDB drivers | ||||||
| ### Phase 4c: Communication & Search Services (P1 — Weeks 5-6) | ||||||
|
|
||||||
| ### Priority 2 — Communication Services | ||||||
| **Implement new service contracts with minimal viable implementations.** | ||||||
|
|
||||||
| | Contract | Priority | Package | Notes | | ||||||
| |:---|:---:|:---|:---| | ||||||
| | `IRealtimeService` | **P1** | `@objectstack/service-realtime` | WebSocket/SSE pub/sub for live data | | ||||||
| | `INotificationService` | **P2** | `@objectstack/service-notification` | Email/SMS/Push/Slack/Teams/Webhook | | ||||||
| | `IGraphQLService` | **P2** | `@objectstack/service-graphql` | Auto-generated GraphQL from object schemas | | ||||||
| | `II18nService` | **P2** | `@objectstack/service-i18n` | Runtime i18n with locale loading and translation | | ||||||
|
|
||||||
| - [ ] `service-realtime` — Implement `IRealtimeService` with WebSocket + Redis pub/sub | ||||||
| - [ ] `service-notification` — Implement `INotificationService` with channel adapters | ||||||
| - [ ] `service-graphql` — Implement `IGraphQLService` with auto-schema generation from objects | ||||||
| | `II18nService` | **P1** | `@objectstack/service-i18n` | Map-backed translation with locale resolution | | ||||||
| | `IRealtimeService` | **P1** | `@objectstack/service-realtime` | WebSocket/SSE push (replaces Studio setTimeout hack) | | ||||||
| | `ISearchService` | **P1** | `@objectstack/service-search` | In-memory search first, then Meilisearch driver | | ||||||
| | `INotificationService` | **P2** | `@objectstack/service-notification` | Email adapter (console logger in dev mode) | | ||||||
|
||||||
| | `INotificationService` | **P2** | `@objectstack/service-notification` | Email adapter (console logger in dev mode) | | |
| | `INotificationService` | **P1** | `@objectstack/service-notification` | Email adapter (console logger in dev mode) | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Phase 4a tests mention “Integration tests with
MemoryDriver”, but the in-repo driver class exported by@objectstack/driver-memoryisInMemoryDriver. Consider renaming this roadmap item toInMemoryDriver(or clarifying what “MemoryDriver” refers to) to avoid confusion when implementing the tests.