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/helmare absent on the win32 dev box. The deterministic gate isCesivi.Operator.Tests85/85 + a localdocker 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-Md5incompatibility.AwsS3Gateway.FlushDeleteAsync(theDeleteObjectsbatch call) fails against current MinIO withMissing 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:
- External Dependencies - Issues in third-party libraries (Microsoft CSOM, PnP PowerShell) that cannot be fixed server-side
- CSOM Protocol Limitations - Documented behavior of CSOM client that the server cannot change
- By Design - Architectural decisions that limit certain features
- Test Infrastructure - Expected variance and test isolation issues
Table of Contents¶
- External Dependencies
- CSOM Client Static State Corruption
- PnP PowerShell Client Limitations
- CSOM Protocol Limitations
- ObjectPath Property Limitation (13 Tests BLOCKED)
- LoadQueryWhere BaseType Enum (3 Tests SKIPPED)
- Alert Collection Suite-Level Serialization
- Folder PropertyBag ServerRelativeUrl
- Disable-PnPFeature CSOM Cache
- Test Infrastructure
- Test Variance (±5-15 Tests)
- Test Suite Stability
- Server Test Memory Pressure (Silent Exits)
- By Design Limitations
- Performance Characteristics
- Summary Matrix
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/::1added — 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:
- After processing ~1.2MB cumulative data (~24 tests)
- Internal buffers overflow at position 1216281
- Position tracking becomes invalid
- 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_ShouldReturnMatchingListsLoadQuery_ListsWhereBaseTypeGenericList_ShouldReturnGenericListsLoadQuery_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:
GetFolderByServerRelativeUrl()adds ObjectIdentityQuery -> folder loaded from serverGetFolderByServerRelativePath()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¶
- HTTP Layer Timing - Connection establishment latency
- Async Operation Completion - Timing of async callbacks
- CSOM Client State - Static state accumulation
- File System I/O - Storage write timing
- 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=1 → LoadWebAsync 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"¶
- Did you use
-FieldswithGet-PnPListItem? -> Use REST API instead - Did you access property without
ctx.Load()? -> Add explicit Load call - Running tests in batch? -> Use process isolation
"Type of data at position X"¶
- Running multiple tests? -> Use process isolation
- CSOM batch execution? -> Break into smaller batches
"Cannot contact site"¶
- Server just started? -> Wait 5-10 seconds
- 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¶
- _docs/troubleshooting/GENERAL.md - General troubleshooting guide
- _docs/PNP_COMPATIBILITY.md - PnP cmdlet compatibility matrix
- _docs/features/REST_API.md - REST API endpoint reference
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
WormSegmentReapercannot delete it until the lock window expires. Segments that are within their retention window but past Cesivi's configuredRetentionDayswill be retried on each reaper pass and left in place until AWS allows the delete. - Azure Immutability API availability:
SetImmutabilityPolicyrequires 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 inlenientImmutability: truemode 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-processIStorageBackendover 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. TheStorageKey↔object-keymapping + 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