Repository navigation
Description
Tracking issue for milestone M1 of the backend plan. Goal: a host can define types in C#, store and query entries in-process with permissions, versions, publishing, scheduling, events and jobs on all three providers. No HTTP yet.
Exit criteria: the sample Blog types round-trip through IContentService<T> in the test host; the storage spike decision is recorded as an ADR; migrations generate for all providers.
Suggested order: B-10 spike first, then B-11 and B-12 in parallel, then the storage items (B-17 to B-19), then the content, publishing and authorization items; B-34 and B-35 as soon as B-22 exists.
Design: docs/planning/backend-technical-spec.md, sections 4 and 8.
Issues
- Storage spike: property-bag EF model, JSON filtering and partial unique indexes on all providers #2681 Storage spike: property-bag EF model, JSON filtering and partial unique indexes on all providers (B-10)
- Apply the ADR 0001 storage changes to the backend specification #2721 Apply the ADR 0001 storage changes to the backend specification
- Record the rich text editor contract and fix the schema sample in the specification #2725 Record the rich text editor contract and fix the schema sample in the specification
- SDK: operation context, principal, origin and the content value types #2682 SDK: operation context, principal, origin and the content value types (B-11)
- Schema attributes and fluent builder producing the schema model #2683 Schema attributes and fluent builder producing the schema model (B-12)
- Field type registry and the core field types #2684 Field type registry and the core field types (B-13)
- Declarative validation, custom validators and serialisable conditions #2685 Declarative validation, custom validators and serialisable conditions (B-14)
- Rich text document model with HTML and Markdown renderers #2686 Rich text document model with HTML and Markdown renderers (B-15)
- Deterministic schema snapshot, hash and schema history #2687 Deterministic schema snapshot, hash and schema history (B-16)
- EF Core model builder: documents, content tables, locale rows, references and versions #2688 EF Core model builder: documents, content tables, locale rows, references and versions (B-17)
- Data provider packages for PostgreSQL, SQLite and SQL Server #2689 Data provider packages for PostgreSQL, SQLite and SQL Server (B-18)
- Migration streams and runner with startup validation and development schema sync #2690 Migration streams and runner with startup validation and development schema sync (B-19)
- Sites and locales in core: default site, resolvers, fallback chain and global scope #2691 Sites and locales in core: default site, resolvers, fallback chain and global scope (B-20)
- Content query model: filter AST, LINQ compiler, relation paths, projection and population #2692 Content query model: filter AST, LINQ compiler, relation paths, projection and population (B-21)
- IContentService and IContentService<T> with optimistic concurrency #2693 IContentService and IContentService with optimistic concurrency (B-22)
- Validation and lifecycle hook pipelines #2694 Validation and lifecycle hook pipelines (B-23)
- Publishing state machine: states, transitions, versions, diff, restore and reference integrity #2695 Publishing state machine: states, transitions, versions, diff, restore and reference integrity (B-24)
- Trash with retention and purge job #2696 Trash with retention and purge job (B-25)
- In-process event bus with after-commit dispatch and outbox #2697 In-process event bus with after-commit dispatch and outbox (B-26)
- Database-backed job runner with leases, retries, dead letter and recurring jobs #2698 Database-backed job runner with leases, retries, dead letter and recurring jobs (B-27)
- Scheduled publish and unpublish per locale #2699 Scheduled publish and unpublish per locale (B-28)
- Permission catalogue, site-scoped roles and built-in roles #2700 Permission catalogue, site-scoped roles and built-in roles (B-29)
- Authorization evaluator: effective permissions, field filtering and row rules #2701 Authorization evaluator: effective permissions, field filtering and row rules (B-30)
- Activity log: writer, event subscribers and retention #2702 Activity log: writer, event subscribers and retention (B-31)
- Bulk operations with per-item results and a filter cap #2703 Bulk operations with per-item results and a filter cap (B-32)
- Typed settings model persisted per site #2704 Typed settings model persisted per site (B-33)
- FluentCMS.Testing: in-process test host and fixtures #2705 FluentCMS.Testing: in-process test host and fixtures (B-34)
- Sample Blog content types and seed API #2706 Sample Blog content types and seed API (B-35)
- Wire the model builder to the field type registry and move its schema checks into the validator #2730 Wire the model builder to the field type registry and move its schema checks into the validator
- Record the storage nullability rules and index shapes in the specification #2731 Record the storage nullability rules and index shapes in the specification
- Reject Multiple on single-column field types and document the reserved type names #2735 Reject Multiple on single-column field types and document the reserved type names
- Remove the storage spike test project #2736 Remove the storage spike test project
- Use the partial unique index for published lookups through the query engine #2744 Use the partial unique index for published lookups through the query engine
Scope change (1 Nov 2026)
The exit criteria apply to SQLite; PostgreSQL and SQL Server validation is deferred to #2711.
Activity
pournasserian commentedon Nov 3, 2026
For the M2 HTTP issues (from #2756): publish responses carry
warnings[]fromPublishResult, andFCMS2402maps toFCMS2404as 422.pournasserian commentedon Nov 3, 2026
For the M2 Management activity endpoint (from #2759):
IActivityQuerychecks no permission. The endpoint must checkactivity.readfor the site, and an instance-level permission before it setsActivityFilter.IncludeInstance.pournasserian commentedon Nov 4, 2026
For the M2 Management content endpoints (from #2763 and #2764):
BulkAsyncreturns per-item results with a generic problem for unexpected failures; map each status, not the whole call. Schedules:FCMS2407(time not in the future),FCMS2408(skipped wall-clock time),FCMS2409(draft changed since scheduling) need status codes; roles for a scheduled job come from the claims kept at scheduling until M2 readscms_user_role, and a revoked API key is only caught once it does.