Skip to content

Known Limitations

Version: 423.0 Last Updated: 2026-05-08 Audience: Users, developers, testers MASTERPLAN: v422.61 — Documentation Accuracy v422 Closure (PLAN-1259)


v1.10 — C-C Event Sourcing / C-E Kubernetes Operator (PLAN-1739 ship gate)

  • Event-sourcing genesis seeding deferred — with Cesivi:EventSourcing:Enabled=true, the as-of (point-in-time) and replay-rebuild features cover only events appended after opt-in (start-from-now). Pre-existing state is not backfilled into the journal. Off by default; a future follow-on can add genesis backfill.
  • Operator kind e2e + helm lint/helm template — Docker/kind CI lane only. kind/helm are absent on the win32 dev box. The deterministic gate is Cesivi.Operator.Tests 85/85 + a local docker build/run of the operator image (verified uid 1654, KubeOps watchers start, listens :8080). The fresh-cluster install + B.0–B.4 smokes run on CI.
  • S3 backend multi-object delete vs current MinIO — Content-Md5 incompatibility. AwsS3Gateway.FlushDeleteAsync (the DeleteObjects batch call) fails against current MinIO with Missing required header for this request: Content-Md5. Pre-existing AWS-SDK-vs-MinIO version mismatch (S3 backend unchanged since PLAN-1694/v1.8); only surfaces when Docker is available (the conformance test auto-skips otherwise). Fix is an S3-backend follow-up. Does not affect FileSystem/Sqlite/InMemory/Azure backends.
  • Full-clean server-batch run is environment-constrained. Memory-scale classes (CsomMemoryTests, LargeDataset*, MemoryFootprint*, MemoryScale*, MemoryStress*, Plan117KenaflowScaleTests) wedge or crash under concurrent batch RAM pressure; per-class runner + class-sharding (excluding the monsters) is the standing mitigation. They pass individually.

Overview

This document catalogs all known limitations in Cesivi Server. These limitations fall into categories:

  1. External Dependencies - Issues in third-party libraries (Microsoft CSOM, PnP PowerShell) that cannot be fixed server-side
  2. CSOM Protocol Limitations - Documented behavior of CSOM client that the server cannot change
  3. By Design - Architectural decisions that limit certain features
  4. Test Infrastructure - Expected variance and test isolation issues

Table of Contents


External Dependencies

OnlyOffice In-Browser Editing — User-Facing Limitations (v356.0)

Status: By Design — inherent constraints of the OnlyOffice Community protocol PLAN: PLAN-1116 (MASTERPLAN v356.0) Admin guide: _docs/onlyoffice-admin.md

20-connection Community cap

OnlyOffice Community Edition permits a maximum of 20 simultaneous open editors. When the cap is reached, new edit attempts produce an error card inside the editor iframe instead of opening the document. The user can still download the file and edit it locally.

To raise the cap, upgrade to OnlyOffice Enterprise Edition or switch to Collabora Online. See _docs/onlyoffice-admin.md § "20-connection Community cap" for instructions.

Autosave semantics — one version per lock session

Every LOCK/Unlock cycle produces exactly one new file version in Cesivi, regardless of how many times the Document Server autosaved the document during the session. This matches SharePoint's check-out/check-in model but may surprise users who expect a new version per keystroke or per autosave. The version comment is always "Edited with OnlyOffice".

If the editor is closed unexpectedly (browser crash, network loss), WopiLockCleanupService recovers the session after the LockSweepInterval (default 5 minutes) and creates one version for the orphaned session.

Legacy formats — confirmation required before editing

Files with extensions .doc, .xls, .ppt, and .rtf cannot be edited directly. Opening them in edit mode shows a conversion card in the Cesivi WebUI. The user must confirm the conversion. Upon confirmation: - The original file is preserved unchanged. - A new file item with the converted extension (.docx, .xlsx, .pptx) is created in the same library. - The converted file is opened in the editor.

The original .doc/.xls/.ppt/.rtf file is never modified or deleted by this workflow.

Unsupported extensions — no "Edit in browser" action

Extensions not in the OnlyOffice WOPI discovery XML (e.g., .zip, .png, .exe) never receive an "Edit in browser" context menu entry. Only extensions advertised by the Document Server's /hosting/discovery endpoint are wired. The standard download action is unaffected.

Offline mode not supported

The OnlyOffice Document Server must be reachable from both: 1. The user's browser (to load the editor iframe). 2. The Cesivi server (to receive autosave callbacks).

If the Document Server is unreachable, the edit action returns an error card. There is no offline editing mode.

PDF editing — annotations and form-fill only

PDF files open in OnlyOffice's PDF editor, which supports annotations and form-fill but not full-text reflow or layout changes. Saving a PDF after annotation creates a new version with the annotation layer embedded. This is consistent with OnlyOffice's PDF editor capability (api.onlyoffice.com/editors).


OnlyOffice E2E Tests — Require Container (v355.0)

Status: By Design — Tests Skip Gracefully When Container Is Not Running PLAN: PLAN-1115 (MASTERPLAN v355.0)

Cesivi.Tests.WebUI/BrowserTests/OnlyOfficeRoundTripTests.cs contains 10 E2E tests that exercise the full WOPI round-trip: upload → LOCK → PutFile → UNLOCK → version assertion. These tests require an OnlyOffice Document Server container to be running locally.

Starting the Container

Scripts/onlyoffice.sh up

This starts OnlyOffice Document Server 8.2.2 Community with WOPI_ENABLED=true on http://localhost:8082.

Skip Behaviour

When the container is not running, all 10 OnlyOfficeRoundTripTests are SKIPPED (not FAILED). The OnlyOfficeAvailabilityFixture probes GET http://localhost:8082/hosting/discovery at class startup; every test calls Skip.IfNot(fixture.IsAvailable, …).

To use a different OnlyOffice URL, set the environment variable:

export CESIVI_ONLYOFFICE_URL=http://myserver:8082

Tests Covered

Test What It Proves
OnlyOffice_Docx_RoundTrip_ShouldSaveNewVersion .docx edit cycle → 1 new version
OnlyOffice_Xlsx_RoundTrip_ShouldSaveNewVersion .xlsx edit cycle → 1 new version
OnlyOffice_Pptx_RoundTrip_ShouldSaveNewVersion .pptx edit cycle → 1 new version
OnlyOffice_Odt_RoundTrip_ShouldSaveNewVersion .odt edit cycle → 1 new version
OnlyOffice_Ods_RoundTrip_ShouldSaveNewVersion .ods edit cycle → 1 new version
OnlyOffice_Pdf_ViewOnly_ShouldNotCreateNewVersion PDF view-only — no new version
OnlyOffice_Doc_ConversionPrompt_ShowsConvertCard .doc prompts conversion card (no iframe)
OnlyOffice_NoPermission_ShouldRefuse403 Users without EditListItems get 403
OnlyOffice_ConcurrentEditor_ShouldReturn409OnLock Second LOCK with different token → 409 + X-WOPI-Lock header
OnlyOffice_MultipleAutosaves_ShouldProduceOneVersion 3 PutFile calls in one lock session → exactly 1 version at Unlock

CI Note

Do not run OnlyOffice E2E tests in more than one worktree simultaneously — OnlyOffice Community Edition caps concurrent WOPI connections.

v1.0 ≥95% Gate Note (PLAN-1585, 2026-05-21)

The 10 OnlyOfficeRoundTripTests are excluded from the v1.0 ≥95% pass-rate gate denominator. They produce NotExecuted (skip) results, not failures, when the container is not deployed — the skip mechanism works correctly and the gate math treats them as expected skips. The ≥95% gate is calculated against the 2066 remaining test facts (total suite minus these 10 expected skips).


Modern Home Grid-Canvas (/Modern/Home) — Retired in PLAN-1103 (v1.0)

Status: Retired by design — ModernHomeCanvasTests grid-canvas tests removed in PLAN-1586.

The /Modern/Home grid-canvas page was deliberately deleted in PLAN-1103 (Modern Look Unification, commit ed29d214e). All /Modern/ navigation references were purged in the same plan (fab4260cf). The canonical home page is now / (zone-based web-part page, Index.cshtml), which is a MORE faithful SharePoint Classic equivalent (SP Classic's home is a zone web-part page, not a drag-resize grid).

The 11 grid-canvas tests (Canvas_FreshPage_RendersDefaultParts, EditToggle_AddsChrome_AndAddStripsVisible, Gallery_Opens_Searches_PicksPart, Delete_Button_RemovesPart, Resize_Handle_ChangesCols_AndPersists, Reorder_DragDrop_ChangesPartOrder, DocList_ShowsRealDocuments, Announcements_ShowsRealItems, Publish_Then_Reload_PersistedEdits, KpiWebPart_ShowsLiveTaskCount_NotHardcoded248, ActivityWebPart_ShowsRealItems_NotFakeNames) were retired in PLAN-1586 because they targeted a deleted surface. The 1 valid test (Home_LoadsAndNoConsoleErrors) — which navigates to / — is preserved in the same class.

The drag-resize grid canvas capability (webparts-canvas.js, Pages/Api/ModernWebPartOps.cshtml.cs) still exists and is used by Pages/Lists/AllItems.cshtml — only the standalone /Modern/Home grid page was retired.


Cesivi.Client vs Microsoft.SharePoint.Client — All Failures Eliminated (v256.0)

Status: RESOLVED — All 30 failures fixed in MASTERPLAN v256.0 Current: 580P/0F/7S — CSOM batch (49/49 classes) MASTERPLAN: v256.0 (PLAN-950/951/952/954)

Background

In MASTERPLAN v255.0, Cesivi.Tests.Csom was migrated from Microsoft.SharePoint2019.CSOM NuGet to Cesivi.Client project references. After migration, 30 tests explicitly failed. MASTERPLAN v256.0 fixed all 30:

Category Fixed How
Binary attachment protocol 11 WriteToXml() base64 serialization + server ConvertDictionaryToObject() Stream handling
ContentType inheritance chain 8 ClientActionObjectPath immediate resolution; ParentContentType in creation XML
Alert.DeleteAlert 1 New handler in CsomProcessor.MethodProcessing + JsonReader
YesNo boolean roundtrip 2 SPListItemJsonConverter: "true"/"false" instead of "1"/"0"
Permission edge cases 1 RecycleBin RestoreMultiple with mixed permissions via RoleAssignment fix
AppInstance (pre-existing pass) 3 Were already passing — PLAN-953 N/A
Server-side URL/CAML/RecycleBin 4 Web URL format, CAML error messages, RecycleBin delete permission

CsomResetValidationTests (7 Skipped)

Tests in CsomResetValidationTests that require Microsoft ScriptTypeMap architecture remain skipped — intentional. Cesivi.Client uses ScriptTypeAttribute registration, not a 310-entry ScriptTypeMap.


Microsoft CSOM NuGet Compatibility Baseline — All Failures Eliminated (v263.0)

Status: ✅ ALL FIXED — v263.0 (PLAN-984) Current: 580P/0F/7S — MsCsom batch (49/49 classes) MASTERPLAN: v263.0 (PLAN-984)

Background

In MASTERPLAN v260.0, Cesivi.Tests.MsCsom was created — a frozen copy of Cesivi.Tests.Csom using Microsoft.SharePoint2019.CSOM NuGet v16.0.10337.12109 instead of Cesivi.Client. This gives a compatibility baseline proving that Cesivi.Server works with the real Microsoft SharePoint client libraries.

Previously Known Failures — All Fixed in v263.0 (PLAN-984)

Test Root Cause Fix Applied
OpenBinaryStream binary content tests (2) MS CSOM expects base64 binary in specific MIME format Server now returns CsomBinaryStreamResult triggering multipart/related response; ApplyForwardSlashEscaping escapes /Binary(url)/ refs; DefaultWebRequestExecutor.ReplaceBinaryRefs handles both escaped and unescaped forms
Files.Add() object path state (1) Related to UserCollection ObjectIdentity — users created via parameterless constructor had empty ObjectIdentity PopulateUserCollection now generates ObjectIdentity for all items with empty identity

All 3 failures are now passing. MsCsom compatibility: 100% (excluding 7 intentional ScriptTypeMap skips).

Key Infrastructure (v260.0)

  • MsCsomStateReset.cs — targets MS CSOM internals (s_sequenceId, ScriptTypeMap) for state reset between test classes
  • Rate limiter whitelist: 127.0.0.1/::1 added — MS CSOM NTLM handshake uses 6 HTTP requests per ExecuteQuery (exceeds default 10/s limit)
  • Batch runner: Scripts/run-mscsom-test-batch.sh

CSOM Client Static State Corruption

Status: Mitigated (v255.0 — Cesivi.Client replaces Microsoft NuGet) Impact: Was a major issue with Microsoft.SharePoint2019.CSOM; now resolved Cannot Fix: Microsoft CSOM client is closed-source

Symptom

Tests pass individually but fail in batch execution with "position XXXXX" errors:

Microsoft.SharePoint.Client.ServerException:
The type of data at position 1216281 is different than expected.

Root Cause

Microsoft CSOM client libraries (SharePointOnline.CSOM, PnP.PowerShell.Commands.2019) maintain static state that accumulates across test executions:

  1. After processing ~1.2MB cumulative data (~24 tests)
  2. Internal buffers overflow at position 1216281
  3. Position tracking becomes invalid
  4. All subsequent tests fail with position errors

This is a bug in the Microsoft CSOM client, not in Cesivi Server.

Solution: Process Isolation

Use the isolated test runner provided with Cesivi:

# Run all tests with process isolation
.\Tools\Run-AllTestsIsolated.ps1

# Run specific test suite
.\Tools\Test-Quick.ps1 CSOM
.\Tools\Test-Quick.ps1 PnP

How It Works: - Each test class runs in a separate process - Process exit clears all static state - No cumulative data accumulation - Reliable, consistent results

Cannot Fix Server-Side

Why: - Microsoft CSOM client is closed-source - Static state is in sealed .NET assemblies - No public API to reset client state - Reflection-based fixes are unsafe/unreliable

For More Information

  • _project/areas/csom/CLIENT-STATE-ISSUES.md - Technical analysis
  • _project/areas/csom/CLIENT-STATE-MANAGEMENT.md - Test writing guidelines

PnP PowerShell Client Limitations

Status: Largely Resolved — 427P/0F/4S (v281.0: +125P total; v278.0 +112P, v281.0 +13P — from v261.0 baseline of 259P/0F/31S) Impact: 1 PnP test skipped (auto-paging design); 0 failures Module: CesiviPnP — fork of PnP.PowerShell 3.29 using Cesivi.Client (v255.0)

Current State (v281.0)

All major PnP 3.x client-side limitations have been resolved via CesiviPnP module enhancements across v262-v281: - Copy/Move URL validation — Fixed: parent-folder-existence check corrected for ONPREMISES URL patterns - Missing cmdlets — Added Set-PnPContentType, Get-PnPListPermission, Set-PnPUser and others - Missing parameters — Added -Description, -Title, -CheckinType Publish, -Includes and others - Checkout NullRef (Add-PnPFile -Checkout) — Fixed: null guard in Cesivi.PnP.Core - Group Owner Serialization — Fixed: CesiviPnP handles Group.Owner as object correctly - Remove-PnPFile PnP Core SDK incompatibility — Fixed: direct REST delegation - CSOM IsNull handling — Fixed: proper error propagation for non-existent objects - App cmdlets (v281.0) — Fixed: URL double-slash bug, OData v3 normalization, inline Add route - New Provisioning tests (v281.0) — Added 4 more PnPProvisioningTests (+5 total in PLAN-1034) - PnP cmdlet matrix reclassified (v281.0) — 17 cmdlets moved N/A; coverage now 224/224 (100%)

Current state: 427P/0F/4S — 39 classes, zero failures, 4 skips (1 auto-paging by-design, 3 Forms-folder/multi-request gaps — tracked)

1. PnP Auto-Paging Behavior (1 test SKIPPED — By Design)

Cmdlet: Get-PnPListItem -PageSize N Expected (by some users): Return only N items Actual: PnP auto-fetches ALL pages, returns ALL items This Is NOT A Bug: PnP library design for convenience


CSOM Protocol Limitations

LoadQueryWhere BaseType Enum (3 Tests SKIPPED)

Status: BLOCKED (Client-Side Limitation) Impact: 3 CSOM LoadQuery tests skipped Cannot Fix: Client-side enum not registered in CSOM DataConvert Discovered: PLAN-332 (MASTERPLAN v48.0)

Symptom

ctx.LoadQuery(web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary)) throws KeyNotFoundException before the request reaches the server.

Root Cause

The CSOM client's DataConvert.GetTypeNameOrTypeId() method does not have the BaseType enum registered in its type lookup table. When ConditionalExpressionToXmlConverter.Write() tries to serialize the LINQ Where expression containing BaseType, it calls GetTypeNameOrTypeId(typeof(BaseType)) which throws KeyNotFoundException.

This error occurs entirely on the client side — the request never reaches the server.

Affected Tests

  • LoadQuery_ListsWhereBaseTypeEquals_ShouldReturnMatchingLists
  • LoadQuery_ListsWhereBaseTypeGenericList_ShouldReturnGenericLists
  • LoadQuery_ListsWithCombinedAndConditions_ShouldFilterCorrectly

Workaround

Use CAML queries instead of LINQ Where expressions for BaseType filtering:

// Instead of:
var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary));

// Use:
ctx.Load(ctx.Web.Lists);
ctx.ExecuteQuery();
var docLibs = ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary).ToList();

Alert Collection Suite-Level Serialization

Status: Known Issue (Client-Side State Accumulation) Impact: Alert CSOM tests pass individually but hang/crash in full suite Cannot Fix: Client-side CSOM state accumulation Discovered: PLAN-330 (MASTERPLAN v48.0)

Symptom

Alert_Create_ShouldReturnAlertWithProperties passes when run individually, but all 5 CsomAlertTests hang or crash when run together with InvalidCastException: Dictionary<string,object> can't be cast to Alert.

Root Cause

The CSOM client's ReadJsonObject method requires _ObjectType_ as the first JSON property in each collection item. After processing multiple CSOM requests in the same session (state accumulation from other tests), the client's internal JSON reader position tracking becomes unreliable. Items are then deserialized as raw Dictionary<string,object> instead of typed Alert objects.

This is the same architectural issue as CsomListItemTests — client-side state accumulation causes deserialization fallback.

Workaround

Run Alert tests individually or in process-isolated batches:

dotnet test --filter "FullyQualifiedName~Alert_Create_ShouldReturnAlertWithProperties"

Folder PropertyBag ServerRelativeUrl

Status: BLOCKED (Same as ObjectPath limitation above) Impact: 2 tests fail Discovered: PLAN-204, PLAN-214

Symptom

"The property or field 'ServerRelativeUrl' has not been initialized" when using: - Set-PnPPropertyBagValue -Folder - Remove-PnPPropertyBagValue -Folder - Get-PnPPropertyBagValue -Folder

Root Cause

PnP cmdlets use GetFolderByServerRelativePath() which doesn't add ObjectIdentityQuery:

  1. GetFolderByServerRelativeUrl() adds ObjectIdentityQuery -> folder loaded from server
  2. GetFolderByServerRelativePath() does NOT add this query -> only creates client-side proxy

Workaround

Use web-level PropertyBag operations instead of folder-level:

# Works - Web-level PropertyBag
Set-PnPPropertyBagValue -Key "MyKey" -Value "MyValue"
Get-PnPPropertyBagValue -Key "MyKey"
Remove-PnPPropertyBagValue -Key "MyKey" -Force

# Fails - Folder-level PropertyBag (CSOM limitation)
Set-PnPPropertyBagValue -Key "MyKey" -Value "MyValue" -Folder "/Documents"

Affected Tests

The following test is permanently skipped due to this limitation:

  • Cesivi.Tests.PnP.PnPPropertyBagTests.RemovePnPPropertyBagValue_OnFolder_ShouldRemoveValue

Disable-PnPFeature CSOM Cache

Status: Known Limitation (Client-Side) Impact: Disable-PnPFeature may fail after Enable-PnPFeature in same session Discovered: PLAN-239

Root Cause

Enable-PnPFeature activates features via REST API, but Disable-PnPFeature checks feature-active status via CSOM before calling REST remove. Since the CSOM-cached feature collection in the same PnP session doesn't reflect REST-activated features, Disable-PnPFeature may report the feature as not active.

Workaround

Create a new PnP connection (new session) between Enable and Disable operations:

Enable-PnPFeature -Identity $featureId -Scope Web
Disconnect-PnPOnline
Connect-PnPOnline -Url $url -AccessToken $token
Disable-PnPFeature -Identity $featureId -Scope Web

Test Infrastructure

Test Variance (+-5-15 Tests)

Status: Expected Behavior (Not a Bug) Impact: Test counts vary between runs This is architectural reality, not a defect

What Causes Variance

  1. HTTP Layer Timing - Connection establishment latency
  2. Async Operation Completion - Timing of async callbacks
  3. CSOM Client State - Static state accumulation
  4. File System I/O - Storage write timing
  5. Garbage Collection - .NET GC pauses

Variance Expectations by Test Type

Test Type Expected Variance Reason
In-Process (Server) +-0-2 tests Direct instantiation, no HTTP
REST/SOAP +-3-5 tests HTTP layer variance
CSOM +-5-10 tests Protocol complexity
PnP +-5-15 tests CSOM + PowerShell overhead

Why This Is NOT a Problem

  • Tests pass consistently when run in isolation
  • Server implementation is 100% correct
  • Variance is a natural characteristic of integration tests
  • Real SharePoint exhibits similar test variance

Test Suite Stability

Status: Mitigated (Test Infrastructure) Impact: net481 test host may crash in full suite runs; batch runners resolve this Workaround: Use batch runners (run each test class in a separate process)

Symptom

Test host (testhost.net481) crashes non-deterministically during full suite runs: - Individual tests pass in isolation - Full suite crashes due to state accumulation in the .NET Framework 4.8.1 test host process - Error: "The active test run was aborted. Reason: Test host process crashed" - Affects CSOM, RestSoap, and PnP test suites (all net481) - Server.Tests (net10.0) and Storage.Tests (net10.0) are not affected

Solution: Batch Runners (Process Isolation)

Batch runner scripts run each test class in a separate process with retry logic:

# Recommended: use batch runners for reliable results
bash Scripts/run-server-test-batch.sh   # Server Tests: 5,795P/0F/1S, 348 classes
bash Scripts/run-csom-test-batch.sh     # CSOM: 580P/0F/7S, 49/49 classes (Cesivi.Client)
bash Scripts/run-restsoap-test-batch.sh # RestSoap: 580P/0F/0S, 44/44 classes
bash Scripts/run-pnp-test-batch.sh      # PnP: 427P/0F/4S, 39 classes (CesiviPnP)
bash Scripts/run-mscsom-test-batch.sh   # MsCsom: 580P/0F/7S, 49/49 classes (MS CSOM NuGet)

# Or run specific test classes
dotnet test --filter "FullyQualifiedName~SoapLists"
dotnet test --filter "FullyQualifiedName~Scenario5"

Batch runners retry failed/crashed classes up to 2 times with memory-aware cooldown (PLAN-778).


Server Test Memory Pressure (Silent Exits)

Status: Resolved (PLAN-1031, v279.0) — 0 crashes in latest baseline Impact: Previously: server test classes silently fail when system RAM is low Workaround: Resource-aware batch runner waits for free RAM (still used, crash root causes also fixed)

Symptom

Server test classes silently exit (code 1) with no error message during batch runs: - Discovering → Discovered → Starting: then silence — no test results - Non-deterministic: same classes pass or fail depending on available RAM - Under high memory pressure, 30-100+ classes can "crash" per batch run

Root Cause

Each server test class launches a WebApplicationFactory<Program> which boots the full ASP.NET Core app, requiring ~300-500MB RAM for initialization. When available system RAM drops below ~2GB, the .NET 10 runtime silently exits without error messages or crash dumps.

Mitigation (PLAN-778)

The batch runner (Scripts/run-server-test-batch.sh) now includes: 1. Pre-flight memory check before each test class (2GB minimum free RAM) 2. Wait-and-retry with up to 120s delay when memory is low 3. Memory diagnostics in batch summary (initial/final RAM, [LOW_RAM] tags) 4. Retry count of 2 per class with memory-aware cooldown

Result: Crash rate reduced from ~34% (103/300) to 0.0% (0/323 in v244 baseline).


By Design Limitations

SPO Local Backup (Variant B) — Round-Trip Write-Back Not Yet Supported

Status: By Design (v1.6+) PLAN: PLAN-1653 (Variant B foundation shipped v1.5). Write-back deferred. See also: _docs/tutorials/TUTORIAL_H_ARCHIVE_SPO_BACKUP.md

Variant B (CesiviMigrationTool.exe sync) provides one-directional sync: SPO → local folder. The reverse direction — pushing changes from the local backup back to SPO — is not implemented.

What works today (v1.5): full bulk import, incremental sync via SPO change tokens, near-real-time sync via SPO webhooks, ControlCenter SPO Sync Status page.

What's deferred to v1.6+: write-back (local → SPO), bi-directional conflict resolution.

Workaround: Make changes directly in SPO; the next sync cycle picks them up locally.


SPO Webhooks (Variant B) — Require Public HTTPS Reachability

Status: By Design — SPO platform requirement PLAN: PLAN-1653 Phase 8

SPO webhook subscriptions require the Cesivi webhook daemon (CesiviMigrationTool.exe webhook-daemon) to be reachable from Microsoft's cloud infrastructure via a public HTTPS URL. Localhost URLs cannot be used for production subscriptions.

  • Development: use ngrok or Cloudflare Tunnel to expose the daemon.
  • Production: configure a reverse proxy (IIS ARR, nginx, Caddy) forwarding https://<domain>/spo-webhook/http://localhost:9000/spo-webhook/.

The webhook subscribe command succeeds even if the URL is unreachable (SPO only validates the one-time challenge handshake). If the daemon URL is not reachable when SPO fires notifications, those notifications are silently dropped and no sync is triggered.

Workaround: Use scheduled sync (--schedule daily) as the primary mechanism. Configure webhooks only when a public HTTPS URL can be guaranteed.


LDAP / Active Directory Directory Browse — Not Yet in People Picker (v1.4+)

Status: Deferred — OIDC providers browsable today; LDAP/AD fan-out is v1.4+ Tracked: BACKLOG #32 PLAN: PLAN-1618 (OIDC people-picker browse — shipped). LDAP browse is follow-up.

The people picker can fan out search queries to OIDC identity providers (Keycloak, Entra ID, Okta, Authentik) in parallel — see _docs/PEOPLE-PICKER-IDP.md for setup.

LDAP / Active Directory directory browse is not yet implemented for the people picker. The IADStorageService infrastructure exists but the picker fan-out connector is a separate plan deferred to v1.4+.

What works today: - OIDC directory browse (4 providers: Keycloak, Entra, Okta, Authentik) — PEOPLE-PICKER-IDP.md - Local Cesivi user store is always included in picker results

What doesn't yet: - LDAP / Active Directory group/user browsing via the people picker

Workaround: Provision LDAP users into Cesivi's local user store via the migration tool or REST API (POST /_api/web/siteusers) before using them in User fields.


Playwright Synthesized Pointer Events (BUG-0554, BUG-0555)

Status: Won't fix — Playwright/test-tooling limitation Bugs: BUG-0554, BUG-0555 MASTERPLAN: v408.0, PLAN-1152

Many custom UI controls (command bar buttons, template tiles, dropdown triggers) register click handlers via addEventListener('click', ...) inside a DOMContentLoaded listener and respond only to element.click() style JavaScript invocations from Playwright automation (browser_evaluate), not to Playwright's synthesized pointer-event sequences (browser_click dispatches: pointerdown → mousedown → pointerup → mouseup → click).

Affected elements (non-exhaustive): - Home page "More options" (⋯) button — dropdown menu (Site settings / Site contents / Recycle bin) - Top-nav "All sites", "Apps", "Help" dropdown triggers - Newlist.aspx template tiles and "Create" button - Most command-bar buttons

Real users are unaffected. Standard mouse clicks and keyboard interaction work normally. The limitation only affects automated Playwright tests using synthesized pointer events.

Workaround for E2E tests: Use page.EvaluateAsync("el => el.click()", locator) or locator.EvaluateAsync("el => el.click()") instead of locator.ClickAsync() for these elements.


0a. Real-Time Updates — AllItems Only (v253)

Status: By design (initial scope) MASTERPLAN: v253.0, PLAN-917

Real-time SignalR change notifications are implemented for the AllItems list view only. Other pages do not yet auto-refresh:

Page Auto-Refresh
AllItems (list view) ✅ Full page reload on ListItemChanged / ListChanged
DispForm ❌ Not yet — planned for a future version
EditForm ❌ Not applicable (single-user form session)
Site home page ❌ Not yet

Behavior when SignalR unavailable: Graceful degradation — no error shown, no auto-refresh, normal page operation unaffected.

WebSocket requirement: SignalR prefers WebSockets but falls back to Server-Sent Events or Long Polling automatically if WebSockets are blocked.

Scope: Only item/list changes made via Cesivi.Server (REST, CSOM, WebUI) trigger notifications. Direct database modifications bypass the notification pipeline.


0. Forms Designer — Nice-to-Have Gaps

Status: Implemented (v56.0, PLAN-389 through PLAN-394; enhanced in v61.0, PLAN-405) Implemented: - ~~Syntax highlighting in event handler code editor~~ — DONE (PLAN-405, CodeMirror 6) - ~~Field palette search/filter~~ — DONE (PLAN-392) - ~~Undo/redo for design changes~~ — DONE (PLAN-405, Command pattern with 9 command types)

  • ~~Multi-select fields for bulk property editing~~ — DONE (PLAN-416, Ctrl+Click/Shift+Click, bulk properties panel)

All Forms Designer UX features are now implemented.

1. Social Data & Meeting Workspace Database Storage Gap

Status: Resolved (PLAN-418, MASTERPLAN v66.0)

~~Previously: Social ratings/tags/comments and meeting workspace operations returned empty results when using database storage providers.~~

Resolution: PLAN-418 implemented social data storage (ratings, tags, comments) and meeting workspace CRUD across all 6 database providers (LiteDB, SQLite, SqlServer-embedded, SqlServer-project, MySQL, PostgreSQL) using ConcurrentDictionary-based implementations matching InMemory/FileSystem pattern. 76 new Storage tests (436/436 total). All 8 storage providers now have full social data parity.

2. Publishing Infrastructure

Status: Implemented (PLAN-419 backend v66.0, PLAN-423 WebUI v67.0, PLAN-425 Scheduled Publication v67.0)

~~Previously: No publishing pages library, page layouts, or publishing web feature activation.~~

Resolution: - PLAN-419 (v66.0): Publishing foundation — PublishingWeb/PublishingSite feature activation creates Pages Library (BaseTemplate 850), PublishingPage/PageLayout content types, 4 default page layouts, REST endpoints (GetPublishingPages, AddPublishingPage, GetPageLayouts, IsPublishingWeb), CSOM SP.Publishing, SOAP GetPublishingPages. 17 new PublishingTests + 5 PublishingSoapTests. - PLAN-423 (v67.0): Publishing WebUI — CreatePublishingPage form with layout selection, publishing info panels on EditForm/DispForm (page layout, status badge), Site Settings publishing section, Pages Library default view with publishing columns. 10 new E2E tests. - PLAN-425 (v67.0): Scheduled Publication — PublishingTimerService auto-publishes/auto-expires pages based on PublishingStartDate/PublishingExpirationDate. REST endpoints for scheduled/expired pages. WebUI status badges and banners. 21 new tests.

Variations (PLAN-492/493, v87.0): VariationLabel CRUD, VariationSettings, peer page creation, language navigation, WebUI management pages. Note: Machine translation is stub-only (no real translation engine integration).

Content Deployment (PLAN-495/496, v88.0): ContentDeploymentPath/Job/Report/Settings models, ContentDeploymentService (CRUD + execution), 16 REST endpoints, CSOM type handlers, ContentDeploymentTimerService (scheduled execution), WebUI management page. Note: Content deployment is simulated on a single server (copies between site collections); no real .cmp export/import format.

Site Theming (PLAN-498/499, v89.0): SPThemeInfo model, ThemeService, REST endpoints (GET ThemeInfo, POST ApplyTheme, GetThemeShadeByName, GetThemeFontByName), CSOM SP.ThemeInfo type handler, Composed Looks list template (124), PowerShell cmdlets. Note: Cesivi uses CSS-variable-based theming with predefined color sets — real .spcolor/.spfont file parsing and SharePoint's compiled theme engine are not supported.

3. Document Sets

Status: Implemented (PLAN-420 backend v66.0, PLAN-424 WebUI v67.0)

~~Previously: Document Set content type (0x0120D520) existed as folder subtype but had no special behavior.~~

Resolution: - PLAN-420 (v66.0): Document Set content type (0x0120D520) with DocumentSetTemplate model (AllowedContentTypes, SharedFields, WelcomePageFields), DocumentSetService for creation and shared metadata propagation, 4 REST endpoints (GetDocumentSet, GetDocumentSetTemplate, IsChildOfDocumentSetContentType, GetContentTypeId), 5 CSOM static methods. 16 new tests. - PLAN-424 (v67.0): Document Set WebUI — DocSetHome welcome page (documents list, shared metadata, upload), Document Set creation flow (NewForm CT filter, redirect to DocSetHome), AllItems integration (distinct icon, DS badge, DocSetHome navigation), List Settings integration (DocSetSettings page for template configuration). 9 new E2E tests.

4. Retention Policies

Status: Implemented (PLAN-431, MASTERPLAN v69.0)

Resolution: - PLAN-431 (v69.0): Information Management Policy foundation — RetentionPolicy/RetentionSchedule models, RetentionPolicyService (CRUD + evaluation + expired item processing), RetentionTimerService (BackgroundService, configurable interval), 8 REST endpoints (policy CRUD, apply to list/CT, schedules), CSOM SP.InformationPolicy.ProjectPolicy extensions, WebUI InformationManagementPolicy page (policycts.aspx, Site Settings link, list-mode schedules). 25 new tests.

Note: Disposition Approval and Retention Hold Visibility are now implemented (PLAN-436, v70.0) — human review for disposal, hold-aware evaluation with UI indicators.

5. Multi-Stage Approval Chains

Status: Implemented (PLAN-432, MASTERPLAN v69.0)

Resolution: - PLAN-432 (v69.0): Sequential multi-approver routing — ApprovalChainConfiguration/ApprovalStage models, stage routing in WorkflowTaskService (stage creation, advancement, rejection handling with StopWorkflow/EscalateToNext/RestartFromBeginning), 5 REST endpoints (instance stages, current stage, definition stages CRUD), CSOM property resolution, WebUI (DispForm stage pipeline, WrkStat stage rows, Workflow.aspx stage editor). 22 new tests.

6. Workflow Initiation Forms

Status: Implemented (PLAN-433, MASTERPLAN v69.0)

Resolution: - PLAN-433 (v69.0): Dynamic initiation form collection at workflow start — WorkflowFormField/WorkflowFormDefinition models (6 field types: Text/Choice/Number/DateTime/Boolean/User), form validation (required fields, type checking), initiation data override for approver/due date/comments, 4 REST endpoints (form CRUD + data retrieval), CSOM InitiationFormFields/InitiationData properties, dynamic form rendering in Start Workflow modal, initiation data display in workflow history. 21 new tests.

Note: Association Forms are now implemented (PLAN-437, v70.0) with conditional routing support.

7. Workflow History

Status: Implemented (PLAN-435, MASTERPLAN v70.0)

Resolution: - PLAN-435 (v70.0): Dedicated workflow history list (BaseTemplate 140) with chronological event logging — WorkflowHistoryEvent model (12 event types), IWorkflowHistoryService (log/query/purge), auto-logging on workflow start/complete/task events, 4 REST endpoints, CSOM HistoryEvents property, WebUI workflow history panel on WrkStat.aspx and Site Settings link. 17 new tests.

8. Disposition Approval

Status: Implemented (PLAN-436, MASTERPLAN v70.0)

Resolution: - PLAN-436 (v70.0): Disposition approval workflow action with hold visibility reporting — SendForDispositionApproval retention action, DispositionApprovalService, disposition queue with approve/reject, hold-aware evaluation results (HoldExemptCount/RecordExemptCount), 4 REST endpoints, CSOM SP.InformationPolicy.ProjectPolicy.GetDispositionQueue(), WebUI Disposition Queue page and hold status indicators. 29 new tests.

9. Association Forms & Conditional Routing

Status: Implemented (PLAN-437, MASTERPLAN v70.0)

Resolution: - PLAN-437 (v70.0): Workflow association-time configuration forms and conditional stage routing — Association FormType, association data in SPWorkflowSubscription.PropertyDefinitions, 3 REST endpoints (association form schema/data), ApprovalStageCondition model with 5 operators (Equals/NotEquals/GreaterThan/LessThan/Contains), stage skip logic, CSOM AssociationFormFields/AssociationData/Conditions properties, WebUI association form rendering and condition editor. 40 new tests.

10. Persistent Change Log for DB Providers

Status: Implemented (PLAN-443, MASTERPLAN v72.0)

Resolution: - PLAN-443 (v72.0): All 6 DB storage providers (SQLite, SqlServer-embedded, SqlServer-project, MySQL, PostgreSQL, LiteDB) now persist change log entries to database tables instead of in-memory ConcurrentDictionary. JSON serialization for 12 polymorphic SPChange subclasses. Auto-migration via CREATE TABLE IF NOT EXISTS. 58 new storage tests.

11. Permission Inheritance Subscope Reset

Status: Implemented (PLAN-444, MASTERPLAN v72.0)

Resolution: - PLAN-444 (v72.0): "Reset Inheritance" now correctly propagates to child objects. 6 helper methods in CesiviDataService.cs (GetAllListsAsync, GetSubWebsAsync, GetFoldersForListAsync, GetItemsForListAsync, GetSubFoldersAsync, GetItemsInFolderAsync) with real storage queries. 11 new tests.

12. Site Template Restore

Status: Implemented (PLAN-445, MASTERPLAN v72.0)

Resolution: - PLAN-445 (v72.0): Complete template export→import cycle. RestoreSiteFromTemplateService with dependency-ordered restore (features→columns→CTs→lists→lookups→items→nav), REST API (POST restorefromtemplate, GET availabletemplates), CSOM SPWeb.ApplyWebTemplate, WebUI Newweb.cshtml with saved template selection. 12 integration + 4 E2E tests.

13. REST CAML Query Filtering

Status: Implemented (PLAN-446, MASTERPLAN v73.0)

Resolution: - PLAN-446 (v73.0): Wired existing CamlQueryParser into REST POST GetItems endpoint. Previously, GetItems returned all items ignoring CAML queries. Now supports Where filtering (Eq, Contains, etc.), OrderBy (ascending/descending), RowLimit, and combined queries. Both lists(guid'{id}')/GetItems and lists/getbytitle('{title}')/GetItems route variants. Empty/null ViewXml gracefully returns all items (backward compatible). Malformed CAML degrades gracefully. 10 new tests.

14. OData $expand Completion

Status: Implemented (PLAN-447, MASTERPLAN v73.0)

Resolution: - PLAN-447 (v73.0): Completed 6 missing navigation property expansions in ODataExpandService. Web: SiteUsers, SiteGroups, Fields, RoleAssignments, Folders. List: RootFolder. Fixed cycle detection bug in recursive expansion. All properties follow established GetOrLoadCachedAsync pattern with 5-minute TTL. 12 new tests.

15. WSP Solution Feature Deactivation

Status: Implemented (PLAN-448, MASTERPLAN v73.0)

Resolution: - PLAN-448 (v73.0): Integrated IFeatureActivationService into WspDeploymentService. RetractSolutionAsync now calls DeactivateFeatureAsync (force:true) for each feature instead of logging only. DeploySolutionAsync registers features via ActivateFeatureAsync after CAML provisioning. Graceful error handling (one feature failure doesn't block others). 10 new tests.

16. RSS XML Feed Rendering

Status: Implemented (PLAN-450, MASTERPLAN v74.0)

Resolution: - PLAN-450 (v74.0): RSS 2.0 XML feed generation — REST API feed endpoints (GET /_api/web/lists(guid'{id}')/feed by-title and by-GUID), WebUI listfeed.aspx page, auto-discovery link in AllItems header, RSS button on AllItems toolbar, Dublin Core dc:creator author attribution, SyndicationFeed generation from list items. 18 new tests (12 integration + 6 E2E).

17. Response Compression for REST API

Status: Implemented (PLAN-451, MASTERPLAN v74.0)

Resolution: - PLAN-451 (v74.0): Conditional response compression middleware for REST API endpoints only — RestApiCompressionMiddleware with streaming Brotli/GZip compression for /_api/* paths, skips SOAP/CSOM. Accept-Encoding content negotiation, configurable minimum body size. ResponseCachingMiddleware cache key includes Accept-Encoding (RFC 7234). 6 new tests.

18. SMTP Alert Email Notifications

Status: Implemented (PLAN-452, MASTERPLAN v74.0)

Resolution: - PLAN-452 (v74.0): Pluggable email service — IEmailService interface with SmtpEmailService (real SMTP via System.Net.Mail) and LogOnlyEmailService (default log-only). Configurable via cesivi.json Email section (Provider, SmtpHost, SmtpPort, SmtpUseSsl, FromAddress). Wired to SP.Utilities.Utility.SendEmail endpoint. 8 new tests.

19. ContentType.Parent Property

Status: Resolved (confirmed in v76.0 audit — already implemented)

Resolution: v76.0 codebase audit confirmed ContentType.Parent is FULLY IMPLEMENTED. ObjectPathResolver (lines 107-132) handles parent content type resolution. CsomContentTypeTests (line 235) validates the behavior. No work needed — the earlier v75.0 "Not in Scope" note was based on a misleading comment at line 7209 about optional post-processing optimization, not missing functionality.

25. SOAP WSDL Generation

Status: Resolved (PLAN-469, MASTERPLAN v79.0)

~~Previously: Only 1 of 26 SOAP services returned proper WSDL definitions. 25 services returned SOAP fault on ?wsdl.~~

Resolution: - PLAN-469 (v79.0): WsdlBuilder utility generates valid WSDL 1.1 for all 26 SOAP services. Every /_vti_bin/*.asmx?wsdl request now returns a proper WSDL definition with schema types, messages, port type, binding, and service elements. SOAP clients (like Visual Studio "Add Service Reference") can auto-generate proxy classes for all services.

26. Managed Navigation (Taxonomy-Based)

Status: Resolved (PLAN-470, MASTERPLAN v79.0)

~~Previously: No managed navigation support. Sites could only use structural navigation.~~

Resolution: - PLAN-470 (v79.0): TaxonomyNavigationProvider generates nav nodes from term sets. ManagedNavigationSettings model on SPWeb (CurrentSource, TermStoreId, TermSetId). REST /_api/navigation/menustate endpoint. CSOM SP.Publishing.Navigation property resolution. WebUI "Navigation Settings" page with Managed/Structural toggle and term set picker. Full integration with existing taxonomy term store.

27. Content Type Hub Syndication

Status: Resolved (PLAN-472, MASTERPLAN v80.0)

~~Previously: SPTermStore.ContentTypeHubUrl property existed but no syndication logic. Content types could not be published from a hub site to subscriber sites.~~

Resolution: - PLAN-472 (v80.0): Full content type hub syndication — ContentTypePublisher service (Publish/Unpublish/RefreshSubscriber), hub designation via SPSite.Properties, REST endpoints (IsContentTypeSharingEnabled, Publish, Unpublish, RefreshFromHub, GetPublishedContentTypes), CSOM SP.Publishing.ContentTypePublisher type resolution, WebUI Content Type Publishing page with hub designation and per-CT publish/unpublish controls. 19 new integration tests.

28. SQL Provider Bulk Operations

Status: Resolved (PLAN-473 v80.0 + PLAN-476 v81.0)

Description

~~SqlServer and SQLite storage providers threw NotSupportedException on bulk insert/update. MySQL also threw NotSupportedException. GetItemsQueryableAsync returned empty for SqlServer/SQLite/MySQL.~~

Resolution (PLAN-473, v80.0): SqlServer and SQLite now have transactional bulk insert/update/delete operations. PostgreSQL already had bulk ops via EF Core. 29 new BulkOperation tests.

Resolution (PLAN-476, v81.0): MySQL bulk insert/update/delete with transactions. GetItemsQueryableAsync for SqlServer, SQLite, MySQL now returns real data (loads items and converts to IQueryable). InMemory key separator bug fixed. 26 new queryable tests (549/549 Storage total). All 4 SQL providers now have full bulk operation and queryable parity.

29. FileSystem Storage Bulk Operations

Status: Resolved (PLAN-479, MASTERPLAN v82.0)

~~Previously: FileSystem storage threw NotSupportedException for BulkInsert/BulkUpdate/BulkDelete/GetItemsQueryable.~~

Resolution: - PLAN-479 (v82.0): FileSystem bulk operations implemented using existing _listGuidIndex (GUID→path context resolution). BulkInsert/BulkUpdate/BulkDelete delegate to individual file I/O methods. GetItemsQueryableAsync loads items and returns as IQueryable. 50 new tests (599/599 Storage total). All 8 storage providers now have full bulk operation parity.

30. Recycle Bin Web/Subsite Restoration

Status: Resolved (PLAN-478 v82.0 + PLAN-481 v83.0)

~~Previously: Web/subsite restoration from recycle bin was not implemented for any storage provider.~~

Resolution (PLAN-478, v82.0): Web recycle bin capture and restoration implemented for 7 of 8 storage providers (InMemory, FileSystem, SqlServer, Sqlite, MySql, LiteDb). DeleteWebAsync serializes web data to OriginalItemData JSON. RestoreRecycleBinItemAsync deserializes and re-inserts web entity. Option A approach (partial restoration). 12 new tests.

Resolution (PLAN-481, v83.0): PostgreSQL recycle bin web restoration parity — RestoreWebFromRecycleBinAsync() implemented with deserialize, validate parent, check URL conflict, restore web + lists. 18 new storage tests (617/617 total). All 8 storage providers now support web restoration.

Note: PLAN-484 (v84.0) achieved full recycle bin item type parity — all 8 providers now handle all 9 meaningful item types identically (25 new tests, 648/648 Storage total). PLAN-487 (v85.0) extends this further with full cascade web restoration (child lists + items captured and restored).

20. Multi-Tenant Support

Status: Not implemented Reason: Simpler to use separate Cesivi instances per tenant Workaround: Deploy multiple Cesivi instances, one per tenant

21. SharePoint Online-Only Features

Not Supported: - Modern UI components (SPFx, React) - Microsoft Graph API integration - Teams integration - Power Platform connectors - Modern search (only classic search supported)

Reason: Cesivi targets SharePoint 2013-2019 On-Premises compatibility

22. Workflow Manager

Not Supported: SharePoint 2013-style workflows Alternative: Use kenaflow workflow engine (fully supported and validated)

23. InfoPath

Not Supported: Deprecated by Microsoft Alternative: Use custom forms with REST API

24. Business Connectivity Services (BCS)

Tier 4 — Complete with Event Subscriptions — PLAN-338 (Tier 1) + PLAN-408 (Tier 2) + PLAN-410 (Tier 3) + PLAN-415 (Tier 4)

BCS is functional through Tier 3: catalog management, entity instance data, and external list integration.

What works (Tier 1-2: Catalog): - LOB system CRUD: register, get, update, delete external data source definitions - Entity catalog CRUD: register, get, update, delete BCS entities within LOB systems - LOB system instances auto-created on registration - Cascading deletes (LOB system deletion removes instances and entities) - REST API at /_api/bcs/ with full CRUD (16 endpoints) - SOAP /_vti_bin/businessdatacatalog.asmx returns real registered data - CSOM SP.BusinessData.AppBdcCatalog returns real LOB systems and entities - Storage persistence in all 8 providers (InMemory, FileSystem, SQLite, LiteDB, MySQL, SqlServer, PostgreSQL) - Cross-site isolation (BCS metadata is per-site) - WSDL available at /_vti_bin/businessdatacatalog.asmx?wsdl

What works (Tier 3: Entity Instances & External Lists): - Entity instance CRUD via REST: /_api/bcs/entities/{id}/instances - Entity instance count and pagination ($top, $skip) - External list creation (BaseTemplate=600) linked to BCS entities - External list item CRUD mapped to entity instances - External list fields auto-created from BCS entity field definitions - SOAP entity instance operations (GetEntityInstancesForEntity, GetEntityInstanceCount) - CSOM BdcEntity.FindFiltered/FindAll/GetItems returns entity instances - CSOM BdcEntityInstance property resolution from FieldValues dictionary

What doesn't work: - ~~No BCS event subscriptions~~ — DONE (PLAN-415, Tier 4: subscribe/unsubscribe, event firing on CRUD, REST + CSOM) - No real external data source connections (always mock data) - No BDC Model XML import/export

Alternative: Use REST API for external data integration


Performance Characteristics

Large-Scale Batch Operations

Observation: Server processes 1000-item batches in ~6-8 minutes (~347ms/item)

This is NOT a bug: - Server completes all operations correctly - No data corruption - No resource leaks - Functional correctness: 100%

Workaround: - Use batched operations (100-200 items per ExecuteQuery) - Allow extra time for large batches

Large List Performance (MASTERPLAN v32.0 — Query-Aware Storage)

Improved in v32.0: The server now uses query-level filtering instead of loading all items per request. Only matching items are loaded from storage when using OData $top, $skip, $filter, $orderby, or CAML queries.

Storage provider optimizations: - FileSystem: SQLite sidecar index ({SiteCollection}/.index/items.db) for field-level queries - Database providers: WHERE/ORDER BY/LIMIT/OFFSET pushed to SQL - InMemory: ConcurrentDictionary prefix scan (no List materialization)

Remaining consideration: Very large lists (50,000+ items) with complex queries still benefit from database storage providers (SQLite, LiteDB, SQL Server, PostgreSQL, MySQL) over FileSystem storage for optimal performance.


User Preferences — SqlServer and MySql In-Memory Storage

Status: By Design (v1.0 — deferred to v1.x) PLAN: PLAN-1379 (Phase α), PLAN-1382 (Phase β) See also: _docs/USER-PREFERENCES.md, _docs_dev/USER-PREFERENCES-DEV.md

All 10 storage providers support the UserPreferences entity via IStorageService. However, two SQL providers (SqlServerStorageService and MySqlStorageService) currently hold user-prefs data in an in-memory ConcurrentDictionary rather than persisting it to a database table. The remaining 8 providers (InMemory, FileSystem, Sqlite, LiteDb, PostgreSQL, SqlServer-project, SqlServer-embedded, NullStorage) persist normally.

Impact: On Cesivi restarts, user preferences (density, language, date/time format, default list view) are lost for deployments using SqlServer or MySql storage. All other preferences (list data, permissions, etc.) are unaffected.

Workaround: Use a storage provider with full persistence (FileSystem, Sqlite, PostgreSQL, LiteDb) until the SqlServer/MySql holdout is resolved in a future v1.x plan.

Resolution planned: Deferred to BACKLOG #22-sql (not yet filed). The fix is straightforward — add a UserPreferences table via CREATE TABLE IF NOT EXISTS in the SqlServer/MySql migration path.


FormLayout MySql + SqlServer integration-test coverage gap

Status: Documentation-only (code is correct; tests can't reach it) Affected providers: MySqlStorageService, SqlServerStorageService (main Cesivi.Storage project)

Real DB persistence shipped via PLAN-1484 Phase β-2a — FormLayouts table DDL + parameterized SQL UPSERT. Test fixture (StorageProviderTestBase) does not spin up MySql or SqlServer containers, so the FormLayout round-trip suite cannot verify these backends in-process.

Coverage today: - InMemory, FileSystem, Sqlite, LiteDb → verified GREEN via 12 round-trip tests each (48 total) - MySql, SqlServer-main → real-impl code shipped; verified by dotnet build (compile) and code inspection (parity with Sqlite β-1 + AppPrincipal/ChangeLog precedents); deploy-time smoke verifies at the integration boundary

Note: This is the OPPOSITE of the UserPreferences in-mem holdout entry above. UserPreferences has tests but stores in-memory; FormLayout has real DB persistence but lacks automated tests for the SQL backends.

Resolution planned: When integration-test infrastructure for MySql + SqlServer becomes available (Testcontainers, docker-compose harness), extend FormLayoutStorageTests.ImplementedProviders to include these two providers. Filed as v1.x §28-integration-tests — not v1.0-blocking.


FormLayout EF-Core separate-project backends integration-test coverage gap (PLAN-1485)

Status: Documentation-only (code is correct; tests can't reach it) Affected providers: Cesivi.Storage.PostgreSql.PostgresStorageService, Cesivi.Storage.SqlServer.SqlServerStorageService (EF-Core separate-project backends)

Real EF-Core persistence shipped via PLAN-1485 Phase β-2b — FormLayoutEntity + composite-PK DbSet<FormLayoutEntity> on CesiviPostgresDbContext and CesiviDbContext. Test fixture (StorageProviderTestBase) does not spin up PostgreSQL or SqlServer containers, so the FormLayout round-trip suite cannot verify these backends in-process.

Coverage today: - InMemory, FileSystem, Sqlite, LiteDb → verified GREEN via 12 round-trip tests each (48 total) - MySql, SqlServer-main → native-SQL real-impl code (PLAN-1484); build + code-review verified - PostgreSql (EF-Core), SqlServer-sep (EF-Core) → EF-Core real-impl code (PLAN-1485); build + code-review verified

Resolution planned: When integration-test infrastructure for PostgreSQL and SqlServer becomes available (Testcontainers), extend FormLayoutStorageTests.ImplementedProviders to include both EF-Core providers. Filed as v1.x §28-integration-tests — not v1.0-blocking.


REST API Item Creation — Author Field Uses System Account

Status: Known Limitation (v1.0.0, PLAN-1596, BUG-0050 partial)

When list items are created via the REST API (POST /_api/web/lists/.../items) using Basic authentication, the Author (Created By) and Editor (Modified By) fields are stored with the system account (SHAREPOINT\system) instead of the authenticated user. This happens because the server-side item creation context assigns the system account when Basic auth credentials are translated to a user context.

Impact: Items created programmatically (via the TestApiClient or external REST calls using Basic auth) show "SHAREPOINT\system" as the Created By user on DispForm pages, rather than the authenticated user's display name.

Workaround: Use Forms authentication (browser session) to create items, or use Windows/NTLM authentication where the user context is properly propagated.

E2E test impact: IdentityConsistencyTests.TopNav_DisplayName_MatchesCreatedByOnNewItem is skipped in v1.0.0 and will be re-enabled in v1.1 when this is fixed.


Distributed Caching (Garnet) Limitations

Status: In Progress (v102.0, PLAN-537/538/539)

Non-Serializable Caches Remain In-Memory

When Garnet distributed caching is enabled, most caches transparently use Garnet. However, two caches contain non-serializable objects and remain in-memory:

Cache Reason Impact
ReflectionCache Contains compiled expression trees and delegate references None — per-process optimization
SessionCache Contains HttpContext references and CSOM processing state None — sessions are per-server by design

Cluster Network Connectivity

Garnet cluster mode requires TCP connectivity between all Cesivi server nodes on the configured Garnet port (default: 6310). Nodes that cannot reach each other will operate as independent single-node caches.

AOF Disk Space

When AOF persistence is enabled (default), Garnet writes all cache mutations to disk. High-write workloads may consume significant disk space. The AofSizeLimit setting (default: 256MB) controls when compaction occurs. Monitor disk usage on production servers.


Cesivi Administration Constraints

Status: By Design (v106.0-v107.0, PLAN-550/551/553/554)

The Cesivi Administration area (/_admin/) has the following by-design constraints:

Admin Authorization

~~Admin endpoints use ASP.NET Core [Authorize] attribute but do not enforce admin-specific role checking. Any authenticated user can access the admin area.~~ Resolved in v114.0 (PLAN-573): All 9 admin pages now enforce [Authorize(Policy = "CentralAdmin")] requiring the FarmAdmin role claim. Demo mode login automatically grants the FarmAdmin role. Non-admin users receive a 403 Forbidden response when attempting to access /_admin/ pages.

Web Application Deletion

Web application deletion is blocked when site collections exist under the web application. All site collections must be removed before a web application can be deleted. This prevents accidental data loss.

Farm Settings Persistence

Farm settings changes (via /_api/admin/settings) are saved to a JSON file on disk. Some settings may require an application restart to take effect. Settings are not shared across multiple Cesivi server instances — each instance reads its own local configuration file.

Backup Storage

Backup operations (via /_admin/BackupRestore) store exports in the {DataRoot}/.exports/ directory. Disk space must be monitored — large site collections with many list items can produce significant export files. No automatic cleanup or retention policy is applied to exports.

Timer Jobs Status

The timer jobs page shows registered IHostedService implementations only. The "Stale" status indicator uses a 5x interval heuristic (e.g., a service with a 60-second interval is flagged as stale if the last run was >300 seconds ago). Services that run once at startup (non-recurring) show "N/A" for last run time.


Summary Matrix

Limitation Category Tests Affected Can Fix? Workaround
Social Data DB Storage Gap ~~By Design~~ Resolved N/A Resolved (PLAN-418) All 8 providers have full parity
Publishing Infrastructure ~~By Design~~ Resolved N/A Resolved (PLAN-419/423/425) Fully implemented with WebUI + scheduled publication
Document Sets ~~By Design~~ Resolved N/A Resolved (PLAN-420/424) Fully implemented with WebUI
Retention Policies ~~By Design~~ Resolved N/A Resolved (PLAN-431) Policy CRUD, timer evaluation, WebUI management
Multi-Stage Approvals ~~By Design~~ Resolved N/A Resolved (PLAN-432) Sequential approver chains with stage routing
Workflow Initiation Forms ~~By Design~~ Resolved N/A Resolved (PLAN-433) Dynamic form collection at workflow start
Workflow History ~~By Design~~ Resolved N/A Resolved (PLAN-435) Dedicated event logging with history list
Disposition Approval ~~By Design~~ Resolved N/A Resolved (PLAN-436) Human review for disposal, hold visibility
Association Forms ~~By Design~~ Resolved N/A Resolved (PLAN-437) Association-time config, conditional routing
Persistent Change Log ~~By Design~~ Resolved N/A Resolved (PLAN-443) DB-backed change history for all 6 providers
Permission Inheritance Reset ~~By Design~~ Resolved N/A Resolved (PLAN-444) Recursive subscope propagation
Site Template Restore ~~By Design~~ Resolved N/A Resolved (PLAN-445) Full export→import cycle
REST CAML Query Filtering ~~By Design~~ Resolved N/A Resolved (PLAN-446) CamlQueryParser wired to REST GetItems
OData $expand Completion ~~By Design~~ Resolved N/A Resolved (PLAN-447) All 6 navigation properties implemented
WSP Feature Deactivation ~~By Design~~ Resolved N/A Resolved (PLAN-448) Full retraction lifecycle integration
RSS XML Feed Rendering ~~By Design~~ Resolved N/A Resolved (PLAN-450) RSS 2.0 feed endpoints, WebUI listfeed.aspx
Response Compression ~~By Design~~ Resolved N/A Resolved (PLAN-451) Streaming Brotli/Gzip for REST API
SMTP Alert Email ~~By Design~~ Resolved N/A Resolved (PLAN-452) IEmailService with Log/SMTP providers
ContentType.Parent ~~By Design~~ Resolved N/A Resolved (v76.0 audit) Already implemented (ObjectPathResolver)
SOAP WSDL (26/26 services) ~~By Design~~ Resolved N/A Resolved (PLAN-469) All 26 services return valid WSDL 1.1
Managed Navigation ~~By Design~~ Resolved N/A Resolved (PLAN-470) Taxonomy-based navigation with term set picker
Content Type Hub Syndication ~~By Design~~ Resolved N/A Resolved (PLAN-472) Publish/unpublish CTs from hub to subscribers
SQL Bulk Ops (SqlServer/SQLite) ~~By Design~~ Resolved N/A Resolved (PLAN-473) Transactional bulk insert/update/delete
SQL Bulk Ops (MySQL) ~~By Design~~ Resolved N/A Resolved (PLAN-476) Transactional bulk ops with MySQL transactions
SQL GetItemsQueryableAsync ~~By Design~~ Resolved N/A Resolved (PLAN-476) Real IQueryable for SqlServer/SQLite/MySQL
FileSystem Bulk Ops ~~By Design~~ Resolved N/A Resolved (PLAN-479) All 8 providers have full bulk parity
Recycle Bin Web Restore ~~By Design~~ Resolved N/A Resolved (PLAN-478 + PLAN-481) All 8 providers support web restoration
Site Theming (.spcolor/.spfont) By Design N/A N/A CSS-variable themes; no compiled theme engine
MsCsom OpenBinaryStream (2) ~~Protocol~~ Resolved 0 failing Resolved (v263.0) Fixed: multipart/related response; ApplyForwardSlashEscaping
MsCsom Files.Add state (1) ~~Protocol~~ Resolved 0 failing Resolved (v263.0) Fixed: PopulateUserCollection generates ObjectIdentity
CSOM Static State External Batch failures No Process isolation
ObjectPath Properties Protocol 13 blocked No Explicit ctx.Load()
Folder PropertyBag Protocol 2 blocked No Web-level operations
Group Owner Serialization ~~Protocol~~ Resolved 0 failing Resolved (CesiviPnP) Fixed in CesiviPnP module
Disable-PnPFeature Cache Protocol Session-dependent No New session between Enable/Disable
PnP 3.x Checkout ~~External~~ Resolved 0 failing Resolved (CesiviPnP) Fixed in CesiviPnP module
PnP 3.x Copy/Move URL ~~External~~ Resolved 0 failing Resolved (CesiviPnP) Fixed: ONPREMISES URL pattern
PnP 3.x Missing Cmdlets ~~External~~ Resolved 0 failing Resolved (CesiviPnP) Added missing cmdlets/params
PnP 3.x Remove-PnPFile ~~External~~ Resolved 0 failing Resolved (CesiviPnP) Fixed: direct REST delegation
CSOM IsNull Handling ~~External~~ Resolved 0 failing Resolved (CesiviPnP) Fixed: proper error propagation
LoadQueryWhere BaseType Protocol 3 skipped No Client-side enum not registered
Alert Suite Serialization Protocol ~1-5 No Client-side state accumulation
Garnet: Non-serializable caches By Design N/A N/A ReflectionCache/SessionCache stay in-memory
Garnet: Cluster connectivity By Design N/A N/A TCP port must be open between all nodes
Garnet: AOF disk usage By Design N/A N/A Monitor disk; AofSizeLimit triggers compaction
Central Admin: No role-based auth ~~By Design~~ Resolved N/A Resolved (PLAN-573) CentralAdmin policy requires FarmAdmin role
Central Admin: WebApp deletion guard By Design N/A N/A Remove site collections first
Central Admin: Local settings file By Design N/A N/A Per-instance JSON config
Central Admin: Backup disk usage By Design N/A N/A Monitor {DataRoot}/.exports/
Central Admin: Timer job stale heuristic By Design N/A N/A 5x interval heuristic
Auto-Paging By Design 1 skipped N/A Expected behavior
Test Variance +-5-15 Infrastructure Normal N/A Expected behavior
Server Test Memory Pressure Infrastructure Silent exits ✅ Resolved 0 crashes in v279; root causes fixed by PLAN-1031
Cluster Architecture (Farm Phase 4) By Design (~95%) 14/14 cluster tests pass N/A Lucene leader-election, T10/T11 ✅; PLAN-1170..1190, 1202..1204; ~95% readiness
Memory Footprint (Backlog #16) Infrastructure ✅ RESOLVED (2026-05-15) ✅ Complete Phase A–E all shipped (main1 v3.x–v23.0). Root cause: cache accumulation under test mode. Fix: 30s TTL + EstimateSize floor. Closure criterion: no monotonic accumulation (ik 2026-05-15).
Cesivi.Setup (WPF GUI) Broken / By Design N/A N/A No headless mode; broken-by-design; PLAN-1225 repair-or-kill stub pending USER QUESTION
FileSystem provider — no atomic rollback By Design N/A N/A BeginTransactionAsync throws NotSupportedException; use SqlServer/Sqlite/PostgreSQL for transactional guarantees
User Preferences: SqlServer/MySql not persisted By Design (v1.0) N/A Planned (v1.x) Use FileSystem/Sqlite/PostgreSQL/LiteDb; SqlServer+MySql hold prefs in ConcurrentDictionary only
Identity Mapping: MigrationTool wire-in By Design N/A Planned (v1.x) Gated on main3 MigrationTool Wave 4+; operator doc at _docs/IDENTITY-MAPPING.md
Multi-Provider OIDC auth ~~By Design~~ Resolved N/A Resolved (PLAN-1613..1618) N providers per protocol; federated identity; login UI chooser; people-picker fan-out
People-picker: LDAP/AD directory browse By Design (v1.4+) N/A Planned (v1.4+) OIDC browse works today (PLAN-1618); LDAP fan-out connector is BACKLOG #32
SPO Backup (Variant B): write-back to SPO By Design (v1.6+) N/A Planned (v1.6+) Sync is one-directional (SPO → local); no reverse push yet
SPO Backup (Variant B): webhooks need public HTTPS By Design — SPO platform N/A N/A Use scheduled sync as fallback; webhooks need externally-reachable HTTPS URL

Current Test Baseline (2026-05-03, MASTERPLAN v422.x — POST-PLAN-1213 / POST-FARM-PHASE-4)

Test Project Passed Failed Skipped Total Pass Rate Notes
Server Tests (net10.0) 6,163 0 4 6,167 100% 383 classes; v421 Test Stabilization Pass complete ✅; 1 env crash LargeDatasetTests (RAM pressure, not code)
Storage Tests (net10.0) 692 0 0 692 100% Unchanged
WebUI E2E (net10.0) ~1,550 0 0 ~1,550 100% 174+ classes; 0F
RestSoap (net481) 580 0 0 580 100% 44/44 classes
CSOM (net481) 580 0 7 587 100% 49/49 classes (Cesivi.Client)
MsCsom (net481) 580 0 7 587 100% 49/49 classes (MS CSOM NuGet v16.0.10337.12109); all 3 prior failures FIXED in v263
PnP (net481) 427 0 4 431 100% 39 classes (CesiviPnP); zero failures; 4S = by-design auto-paging + client-side
Performance (net10.0) 19 0 2 21 100% 2S = BenchmarkDotNet Release-mode-only
Cluster (net10.0) 14 0 3 17 100% T1..T11; Farm Phase 4 complete (Lucene leader-election); PLAN-1170..1190, 1202..1204

Build Status: 0 errors, ~111 NuGet vulnerability warnings (SSCX.Xml all-versions HIGH advisory; no upstream fix; permanently accepted)

Total: ~10,500+ test methods across 10+ projects

Note on Server.Tests: 6,163P/0F/4S — 383 classes via batch runner. v421 Test Stabilization Pass (PLAN-1206..1213, 2026-04-30) closed all 10 formerly-failing facts: ChoiceFieldValidation, ContextTokenStore, FieldValidation, Goals4to8, NavigationAndSiteRest, UserContextService — all now 0F. 1 env crash (LargeDatasetTests) caused by RAM pressure at 9.4GB; not a code regression — cross-linked to Backlog #16 (Memory Footprint v1 P1). Improved from 5,795P/0F/1S (v279, 348 classes).

Note on Memory Footprint v1 (Backlog #16) — ✅ COMPLETE 2026-05-15: All phases A–E shipped (main1 v3.x–v23.0). Phase E root cause: InMemoryCacheProvider.EstimateSize = 1KB + 5min TTL under CESIVI_TESTING=1LoadWebAsync re-reading all CTs+SiteColumns from growing MockData → 9,256 MB cross-suite accumulation. Fix (PLAN-1515+1516+1520): EstimateSize 4KB floor, SetAsync double-count fix, 30s TTL under CESIVI_TESTING=1. Evidence: PnP 48 classes flat at 709 MB, zero monotonic growth. Closure criterion per ik: "no monotonic accumulation". Phase E retest with JIT warmup-exclusion deferred to main2 (not a v1.0 ship-blocker). Detailed audit in _project/areas/memory-audit/.

Note on MsCsom: All 3 prior protocol differences resolved in v263.0 (PLAN-984). OpenBinaryStream base64 and Files.Add object path state fixes fully validated. Now 100% compatibility with Microsoft.SharePoint2019.CSOM NuGet.

Note on PnP: Improved from 259P/0F/31S (v261) to 427P/0F/4S (v422). +168 tests, -27 skips. All prior PnP 3.x limitations resolved via CesiviPnP module enhancements. Cmdlet matrix reclassified in v281 — 224/224 applicable cmdlets (100%). 4 remaining skips: 1 by-design auto-paging, 3 client-side enum limitations (LoadQueryWhere BaseType).

Proxy Fidelity Baseline (2026-04-04, MASTERPLAN v239.0)

Real SharePoint comparison via proxy capture tool (50 endpoints measured):

Status Count Meaning
MATCH 39/50 Response structure identical to real SharePoint
GREEN 180 Known/intentional differences (mock extensions, array ordering)
RED 0 Structural mismatches
YELLOW 0 Unexpected field differences

Improvements in v238.0/v239.0 (PLAN-880): - rest_get_list_fields: MATCH ✓ (MaxLength suppressed at list-level) - rest_get_list_views: MATCH ✓ (ViewFields restored as deferred; ?$expand=ViewFields for WebUI) - rest_get_list_bytitle, rest_get_lists: MATCH ✓ (RSS/EnableSyndication fields classified as intentional WebUI extensions) - rest_get_site_rootweb, rest_get_web: MATCH ✓ (RequestAccessEmail classified as WebUI extension) - rest_post_create_item: MATCH ✓ (integer ID URL normalization via PLAN-832)

Note: 11 remaining non-MATCH endpoints have GREEN-only differences (known intentional mock extensions or field ordering variations). 0 RED / 0 YELLOW means no unexpected behavioral divergence from real SharePoint.

Permanently Blocked/Skipped Tests (Cannot Fix Server-Side)

Category Count Root Cause Status
PnP 3.x Group Owner ~~9~~ 0 PnP Core SDK client-side serialization mismatch ✅ RESOLVED in CesiviPnP
PnP 3.x Checkout parameter ~~6~~ 0 Client-side NullReferenceException ✅ RESOLVED in CesiviPnP
PnP 3.x Copy/Move URL validation ~~7~~ 0 Client-side URL format validation ✅ RESOLVED in CesiviPnP
PnP 3.x Missing cmdlets/parameters ~~6~~ 0 Cmdlets not available in PnP 3.x ✅ RESOLVED in CesiviPnP
PnP 3.x Remove-PnPFile ~~2~~ 0 Internal PnP Core SDK incompatibility ✅ RESOLVED in CesiviPnP
CSOM IsNull handling ~~2~~ 0 Client doesn't throw on IsNull ✅ RESOLVED in CesiviPnP
Auto-Paging design 1 PnP design (not a bug) Permanent (by design)
LoadQueryWhere BaseType enum 3 Client-side enum not registered Permanent (client-side)
Alert Suite Serialization ~1-5 Client-side state accumulation Permanent (client-side)
DiagnosticTest 1 Intentional debugging tool Permanent (intentional)
Total (active) ~5-9 External/client-side behavior (was ~37-41 before CesiviPnP fixes)

Troubleshooting Guide

Decision Tree for Common Errors

"PropertyNotInitializedException"

  1. Did you use -Fields with Get-PnPListItem? -> Use REST API instead
  2. Did you access property without ctx.Load()? -> Add explicit Load call
  3. Running tests in batch? -> Use process isolation

"Type of data at position X"

  1. Running multiple tests? -> Use process isolation
  2. CSOM batch execution? -> Break into smaller batches

"Cannot contact site"

  1. Server just started? -> Wait 5-10 seconds
  2. Check health endpoint: GET http://localhost:5000/health

When to Report Issues

DON'T Report if: - Test passes when run individually - Error is "position XXXXX" (CSOM client bug) - Variance is +-5-15 tests (expected) - Issue is documented in this file

DO Report if: - Test fails consistently (10/10 times) - Test fails even in isolated execution - Error indicates server logic bug - Variance >20 tests (possible regression)


See Also


Archive Audit Log — Cloud Backends (v1.5 — SHIPPED)

Category: Resolved — Shipped in v1.5 (PLAN-1652) Added: PLAN-1609 v1.2 — Resolved: PLAN-1652 v1.5

v1.5 ships two cloud WORM adapters in addition to the original FileSystemWormAuditLogStore:

  • S3ObjectLockWormAuditLogStore — S3 Object Lock COMPLIANCE mode (AWS, MinIO, or any S3-compatible store with Object Lock support)
  • AzureBlobImmutableWormAuditLogStore — Azure Blob time-based immutability (Locked policy on sealed blobs)

Both adapters pass the full WormAuditLogContractTests suite. Configure via Cesivi:Archive:Worm:Backend in appsettings.json.

Remaining known limitations for cloud backends:

  • S3 COMPLIANCE lock window: Once an S3 object is locked in COMPLIANCE mode, the WormSegmentReaper cannot delete it until the lock window expires. Segments that are within their retention window but past Cesivi's configured RetentionDays will be retried on each reaper pass and left in place until AWS allows the delete.
  • Azure Immutability API availability: SetImmutabilityPolicy requires a General Purpose v2 or Premium Block Blob storage account. ZRS Append blobs and legacy storage accounts are not supported.
  • Azurite emulator: Azurite 3.28 does not implement SetImmutabilityPolicyAsync. The adapter runs in lenientImmutability: true mode in development (emulator) environments — immutability enforcement is silently skipped but the rest of the WORM chain (append, hash, seal) continues to work correctly.

See ARCHIVE_AUDIT.md for the full adapter documentation.


v1.8 C-A Storage Backends — Docker-gated integration tests (deferred to CI lane)

v1.8 ships C-A pluggable storage backends (α / storage tier): a narrow IStorageBackend primitive the rich IStorageService composes over, so a customer can bring their own storage (S3 / Azure Blob / own-DB) without forking. The BYO-backend contract is proven deterministically (Docker-free) by the α-1/α-2.2 conformance wall (43/43), the α-3 S3 in-memory-gateway conformance (22/22), and the α-3.2 OOP paired-channel conformance (8/8).

Two integration tests require Docker and are deferred to a Docker-equipped CI lane (the implementer host runs without Docker — npipe dockerDesktopLinuxEngine unavailable). Neither is a ship blocker; the deterministic suites above cover the same contracts.

  • Booted-server OOP-backend e2e — a real spawned worker active at boot with Cesivi:StorageProvider=<pkg-id> resolving the out-of-process IStorageBackend over the process boundary. The marshalling + pull/push blob-streaming path is already proven by the α-3.2 paired-channel conformance (8/8, incl. 5.5-chunk large blob + worker-death fault); the boot-resolve wiring by the activator OOP-register unit test.
  • MinIO / real-endpoint S3 conformance (S3StorageBackendMinioConformanceTests) — auto-skips without a live S3 endpoint. The StorageKey↔object-key mapping + streaming + capabilities contract is proven by the 22/22 in-memory-gateway conformance.

Query pushdown does NOT compose through the narrow primitive (PLAN-274 FileSystem sidecar / PLAN-275 SQL pushdown). By design, the 4 SQL backends + FileSystem keep their legacy shipping ids (FileSystem, Sqlite, LiteDb, SqlServer, MySql) — permanent, byte-identical, zero data re-key. The composed-over-primitive ids (InMemory-Backend, FileSystem-Backend) are opt-in proof artifacts.

β (search) and γ (auth) backend tiers are NOT in v1.8 — additive future slices.


Document Version: 427.0 Last Updated: 2026-06-04 (PLAN-1696 — v1.8 C-A storage backends ship gate; Docker-gated integration tests deferred to CI lane) Author: Cesivi Server Team