Evincia

Public Codebase Teardown · readiness profile, not a verdict

Kooboo CMS — Modernization Readiness Profile

A readiness profile produced with the Evincia diagnostic engine against a public, unmaintained codebase. It describes where modernization risk concentrates and what a modernization effort would have to absorb. Kooboo CMS is a multi-tenant, multi-site .NET content-management platform: 31 projects, eight swappable storage backends, and three template engines running side by side, read here as a modernization subject and on those terms.

What leaders should take away

  • The risk is not absence of structure; it is total platform lock-in across many projects.
  • Eight storage backends and three template engines make path selection senior-architect work.
  • WCF and COM are hard blockers that must be settled before porting.
  • Zero tests in the build make every migration path high risk.
  • Vendored /Lib dependencies are a scanner blind spot, not an absence of risk.

Check it yourself

Nothing here rests on trust alone. Clone the repository at the pinned commit and check every cited finding against the source. The engine that produced these findings is Evincia's and the run is deterministic -- pinned to the engine commit below -- so the output is fixed and the evidence is inspectable, even though re-running the engine end to end is ours to do. The 0–100 score on top of the findings is senior architect judgment, as the score section below spells out.

Repositorygithub.com/Kooboo/CMS
Pinned commite5879728 · full e5879728c817f37b275219636e7c24bf84a02830 · last commit 2023-10-10 · unmaintained (not formally archived)
LicenseBSD-3-Clause · attribution preserved: "Copyright © 2013, Kooboo team (http://www.kooboo.com). BSD 3-Clause."
Engine commitf27ae8f · Roslyn-based; nine automated categories (1–9), three senior architect review categories (10–12)
Runevincia-Kooboo.CMS-2026-06-12-194141-a4e311 · Kooboo.CMS/Kooboo.CMS.sln · Engagement mode (RequireFullCoverage) · 2026-06-12
CoverageA3 Full coverage: Yes -- 31 of 31 projects loaded via solution load, 0 syntax-only fallback, 0 skipped (confidence impact: None) -- with an important qualification; see Confidence & coverage below

Inspect the evidence: git clone https://github.com/Kooboo/CMS.git and git checkout e5879728, then open the files each finding cites and read them against the source. (Re-running the diagnostic end to end points the Evincia engine, commit f27ae8f, at Kooboo.CMS/Kooboo.CMS.sln in Engagement mode -- the engine is ours, so that step stays in-house. Install the .NET Framework 4.0 and 4.5 targeting packs first for a fully-instrumented confirming re-run; without them the host logs MSBuild reference-assembly and architecture-mismatch failures, detailed below.) The core Kooboo.CMS.sln is the analyzed scope; the off-solution Azure, Modules, and FileServer host projects are out of scope here. Findings paraphrase the source and cite file/project locations; no substantial verbatim code is reproduced.

Executive summary

Kooboo CMS is a large, .NET Framework multi-tenant content-management platform: 31 projects spanning a web front-end, core content and site-management libraries, a membership and account system, a forms engine, full-text search, pluggable caching, an extensive set of swappable storage backends, and three template engines running simultaneously. This is not a line-of-business application -- it is a platform built to be deployed in many configurations. The difficulty is not a lack of structure: the persistence layer is cleanly separated into provider projects and the DI container is isolated in its own module. It is the combination of total platform lock-in, the breadth of integrations, and an automated test suite entirely absent from the build.

The dominant risks are platform-bound and certain. Every project targets .NET Framework -- 30 on net40 and one (Kooboo.CMS.Content.Persistence.FileServerProvider) on net45 (RULE-001) -- and net40 has no incremental path to modern .NET. On top of that sits System.Web saturation across roughly 19 projects and hundreds of files (RULE-002): the web layer, all three template engines, the forms library, the caching infrastructure, the membership system, and the base utilities all depend on namespaces that do not exist in modern .NET, so this is a rewrite of the web surface, not a port.

The platform carries distinct integration risk: an internal WCF file-server service (RULE-029) and Windows COM interop in WebPageCapture_DefaultProvider.cs (RULE-031). Beneath the blockers it assumes single-process execution throughout -- 217 mutable-static-state findings across 24 projects (RULE-006) and in-memory caching and session everywhere (RULE-020) -- and its reference graph funnels through a few load-bearing projects (Kooboo.CMS.Web pulls in 9 sibling projects, Kooboo.CMS.Sites 8), so the pieces cannot be modernized in isolation.

What it can absorb today is essentially nothing without a platform decision first, and there is no safety net: zero test projects exist in the solution (RULE-012), which is maximum change-failure risk for a migration of this scale. This is a full re-platforming program, not an incremental modernization, and its largest questions are senior architect judgment the engine cannot make: which of the eight storage backends and three template engines survive, and what becomes of the WCF file server and the COM-based page-capture component.

Modernization Readiness Score

The score is the senior architect's synthesis of the engine's signals: the architect assigns the 0-to-100 number from the dimension reads, then labels it with the Red/Yellow/Green band on the canonical Evincia scale (Red 0–49 / Yellow 50–79 / Green 80–100). The engine did not compute it.

Architect judgment18 / 100 · Red

Deep Red -- the deepest of Evincia's public calibration subjects. All four dimensions read elevated to severe: the platform dimension is total lock-in across 31 projects, four separate findings reach Priority 25 (RULE-001, RULE-002, RULE-012, RULE-029), and there is no test safety net at all. Each dimension below is read on a 0–25 scale (higher = more ready); they sum to 18. The reads are senior architect judgment, not engine-computed values.

DimensionArchitect read (0–25)What drives it here
Platform ObsolescenceSevere · 3/2531 projects on .NET Framework, net40 throughout with one net45 outlier (RULE-001, Pri 25); System.Web across ~19 projects (RULE-002, Pri 25); Forms auth / ASP.NET Membership (RULE-036, Pri 16); AppDomain in 15 files (Signal 1.4). Backend and template-engine feasibility (Cat 10) is senior architect review.
Architectural CouplingSevere · 4/25Mutable static state, 217 findings across 24 projects (RULE-006, Pri 16); in-memory caching (RULE-020, Pri 16); inline SQL out of the data layer (RULE-008, Pri 20); EF6 in 4 projects (RULE-022, Pri 16); god classes incl. Token.cs at ~5,155 lines (Signal 2.6); high fan-out, Kooboo.CMS.Web 9 / Kooboo.CMS.Sites 8 (RULE-018). Cat 11 senior architect review.
Dependency RiskElevated · 7/25WCF internal file server (RULE-029, Pri 25) plus config endpoints (RULE-034, Pri 16) and external view (RULE-033, Pri 16); COM interop (RULE-031, Pri 20); file-based integration / UNC paths (RULE-030, Pri 16); synchronous HTTP without an abstraction (RULE-015, Pri 12). Category 6 itself produced no findings -- see the note below the register.
Change SafetySevere · 4/25No tests in the build (RULE-012, Pri 25); hardcoded URLs across 19 instances (RULE-014, Pri 16); no structured logging or observability (RULE-028, Pri 12); database triggers unknown (Signal 5.2). Cat 12 senior architect review.

Risk register — representative critical rows

Presented in the 12-field LMRR schema; only the representative columns are shown here, and the corrected false positives are excluded. Priority is the engine's severity score for each finding -- Probability (1–5) × Impact (1–5), so it runs 1–25 and a higher number is more severe; the rows below are all in the Critical band (Priority 20–25). Confidence and automation level are senior architect estimates; type-resolution-dependent findings carry the semantic caveat in Confidence & coverage.

IDFindingCategoryPriorityRecommended action
R-001All 31 projects target .NET Framework (net40, one net45)Platform Obsolescence25Decide the framework target first; net40 has no incremental path. The whole solution retargets together.
R-002System.Web saturation (web, template engines, forms, membership, base)Platform Obsolescence25Rewrite, not migrate, the System.Web surface; map each namespace to its ASP.NET Core equivalent. The largest single body of work.
R-003No test projects anywhere in the solution (eight exist on disk, excluded from the build)Change Failure Risk25Treat a baseline test suite as a migration prerequisite; prioritize the god classes and high-fan-out projects.
R-004WCF internal file-server serviceInternal Integration Complexity25WCF hosting needs CoreWCF in modern .NET. Confirm it is still used, then choose CoreWCF / REST / gRPC / direct call.
R-005Inline SQL in non-data-layer code (the content query translators)Data Complexity20Extract the SQL into the data layer; check for database-specific syntax across the eight backends.
R-006Windows COM interop in WebPageCapture_DefaultProvider.csInternal Integration Complexity20Identify the native component, confirm whether the feature is in use, then find a cross-platform alternative or drop it. A hard cross-platform blocker.

Consolidation and blind spots. The three WCF surfaces are one underlying file-server integration -- service contracts (RULE-029, R-004), config endpoints (RULE-034, R-011), and the external-protocol view (RULE-033, R-013) -- kept separate for scoping but resolved together. The boilerplate [ComVisible] across all 31 AssemblyInfo.cs files is an engine-acknowledged false positive, de-weighted and not scored. And Category 6 (External Dependency Risk) produced no findings, which is a blind spot, not a clean bill of health. Every third-party dependency here is a committed raw DLL under /Lib -- an old Azure StorageClient, MySQL, MongoDB, Lucene.Net, an aging OAuth library, and more -- rather than a package reference the scanner can see, so a decade-old vendored supply chain reads as “none” to the package model. It is a manual diligence item, not an absence of risk.

Modernization Risk Profile

Illustrative assessment based on observed patterns. These are qualitative risk levels, not measured client scores.

Architectural CouplingHigh
Data ComplexityHigh
Integration SurfaceHigh
Change SafetyHigh Risk
AI ReadinessLow Readiness

What will break first

  1. The build, the moment any shared project is retargeted. net40's targeting pack no longer ships with modern Visual Studio (it has to be installed separately, as the provenance note above spells out), and the reference graph converges on a few load-bearing projects: Kooboo.CMS.Web pulls in 9 sibling projects and Kooboo.CMS.Sites 8 (RULE-018), while the shared libraries they lean on are referenced almost everywhere. Retarget Kooboo.CMS.Common, Kooboo.CMS.Content, or the Kooboo base library (RULE-001) and dependents break in a cascade until the graph moves together. There is no isolated first step.
  2. The web tier and identity, on the first port off System.Web. The moment the projects leave System.Web (RULE-002), controllers, routing, session, the caching infrastructure, Forms authentication, and ASP.NET Membership (RULE-036) all lose their host. The hosting model and the identity system both have to be rebuilt on ASP.NET Core; these are not config tweaks.
  3. The file server and content capture, architecturally and at runtime. The WCF file-server service (RULE-029 / RULE-034 / RULE-033) cannot bind without CoreWCF, and the COM page-capture component (RULE-031) throws on any non-Windows host. With zero tests (RULE-012) over exactly these paths and no observability (RULE-028), these failures are also the hardest to detect.

Suggested modernization sequencing

  1. Decide the platform and the architect-only questions. Choose the target framework (R-001), and make explicit calls on which of the eight storage backends and three template engines survive, on the WCF file server (R-004), and on the COM page-capture component (R-006). Everything downstream depends on these; they are Migration-Feasibility, Embedded-Business-Logic, and Domain-Knowledge work the engine cannot do.
  2. Lay the safety net. Add a baseline test suite (R-003) and minimal structured logging and observability (RULE-028) before touching the high-risk paths -- a prerequisite, not a parallel task, especially over the god classes and the WCF/COM paths. Eight test projects exist on disk but are excluded from the build; they are the asset to resurrect first when deciding which backends survive.
  3. Clear the contained hard blockers and externalize config. Resolve or replace the WCF file-server surface (R-004 with RULE-034 / RULE-033) and the COM page-capture component (R-006); externalize the hardcoded Kooboo_CMS connection strings (RULE-023), the hardcoded URLs (RULE-014, 19 instances), and the config-defined WCF endpoints (RULE-034).
  4. Move the graph together, hub-first. Stabilize and retarget the shared hubs -- Kooboo.CMS.Common, Kooboo.CMS.Content, and the Kooboo base library -- as one coordinated unit (the RULE-018 fan-out makes piecemeal porting unsafe); rewrite the System.Web surface (RULE-002) onto ASP.NET Core, replace Forms auth and Membership (RULE-036) with a chosen identity stack, and migrate the four EF6 projects (RULE-022) to EF Core. Replace in-memory caching and session (RULE-020) with a distributed cache and triage the 217 mutable-static-state findings (RULE-006).
  5. Close the engine's blind spots with senior architect review. Run a database-trigger inventory (Signal 5.2), confirm the schema-management approach for the EF projects (Signal 4.4), classify each AppDomain usage (Signal 1.4), inventory the vendored /Lib binary supply chain that Category 6 cannot see, and decide the deployment topology (Signal 7.2). These are categories and signals the engine explicitly cannot resolve alone.

Confidence & coverage

This run reports Full coverage: Yes -- 31 of 31 projects loaded via solution load, 0 syntax-only fallback, 0 skipped, with Impact on confidence: None in A3 -- and for load fidelity that is the authoritative signal: every project received full syntax-tree analysis. It needs an honest qualification.

The workspace diagnostics in A3, and the narrative's own account, record MSBuild failures on every project: the .NET Framework 4.0 reference assemblies are not installed on the host, and there are processor-architecture mismatches (MSIL/x86 for mscorlib, MSIL/AMD64 for System.Data and System.Web). These are host-environment failures from running the engine on a .NET 10 SDK host without the legacy net40 targeting packs. Roslyn recovered syntax trees and analysis proceeded, but semantic resolution across the solution may be incomplete for the foundational projects (Kooboo.CMS.Common, Kooboo.CMS.Sites, Kooboo), so type-resolution-dependent findings should be read with caution. The platform, System.Web, WCF, COM, EF6, and no-tests blockers do not depend on that resolution and stand; the count-sensitive findings carry the caveat.

The reconciliation is straightforward: for these .NET Framework targets, A3 load fidelity is the right coverage signal. The stamped host MSBuild version (10.0.300) is not the toolset that actually loads net40 -- a separate Roslyn net472 build host does -- but the host-level diagnostics still mean some semantic resolution may be incomplete. This was an Engagement-mode run (full coverage enforced), the publication-grade configuration. A confirming re-run with the legacy net40 and net45 targeting packs installed would remove the host MSBuild diagnostics entirely and is the recommended final step before any client-grade use. The score and the four dimensions are senior architect judgment, not mechanical; categories 10–12 are senior-architect-only and were not produced by the engine.

What we corrected from the first run

This is the part most diagnostic tools never show you. Earlier engine runs produced findings a source read did not support; they were removed at the source before this profile, and the publication run is strictly cleaner for it -- the same discipline that makes the score worth trusting:

  • An inflated body of “inline SQL.” An early RULE-008 count was padded by select / <select> text in prose and markup that the detector misread as SQL. Removed at the source (engine fix C1-022) and re-anchored to the genuine query-translator SQL in TranslatedMediaContentQuery.cs and TranslatedTextContentQuery.cs -- the real inline SQL that R-005 carries.
  • A false class of “implicit schema dependencies.” RULE-010 matched Razor, JavaScript, regex, and comment text as schema-qualified database references. An adversarial scan of every flagged file found zero genuine schema references, so the count fell from 156 to 0 (engine fix C1-002). Nothing real was lost.
  • Boilerplate COM visibility, de-weighted rather than scored. The [ComVisible] attribute is Visual Studio boilerplate present in all 31 AssemblyInfo.cs files; it is an acknowledged false positive, de-weighted and not counted as COM-interop risk. The genuine COM interop is a single file -- WebPageCapture_DefaultProvider.cs (R-006).

The platform read here -- net40 throughout, System.Web saturation, the WCF file server, COM interop, EF6, and no tests -- is source-verified and stands. The senior architect read against this exact publication run is a re-confirmed AGREE (the architect concurs with the engine's read).

What is mechanical, and what is senior architect judgment

The engine emits deterministic raw signals across nine automated risk categories and scores findings on fixed rules (Probability 1–5 × Impact 1–5 = Priority 1–25). Three further categories -- Migration Feasibility, Embedded Business Logic Risk, and Domain Knowledge Risk -- are senior architect review only; the engine produces no findings for them. The 0-to-100 score and the four dimension reads are senior architect judgment, synthesized from the signals. The engine does not compute the number, and this profile does not invent one.

On this run, 22 deterministic rules fired across 1,439 findings on all 31 projects -- every project loaded with full syntax-tree analysis (0 fallback, 0 skipped), 85 findings flagged for senior architect review. Kooboo is a clean illustration of the boundary: the engine nailed the mechanical blockers -- the platform, System.Web, the WCF file server, COM interop, EF6, the coupling, the missing test suite -- at scale. The largest questions belong to the architect, and they are real here: this is a platform with eight swappable storage backends (SQL Server, SQL CE, MySQL, MongoDB, Couchbase, Azure Blob, Azure Table, file server) and three template engines (NVelocity, Razor, WebForms) running at once, so there is no single migration path. Which backends and which engines survive is a Migration-Feasibility, Embedded-Business-Logic, and Domain-Knowledge call (categories 10–12) the engine cannot make.

Modernization lesson

Modernization Lesson

Platform codebases often fail modernization through option entropy. The hard work is not just porting code; it is deciding which runtimes, backends, template engines, and integration patterns are allowed to survive.

Why This Matters

Budget accuracy depends on those survival decisions. Without them, every estimate quietly includes unresolved WCF, COM, provider, dependency, and test-safety risk.

Review all public codebase teardowns →

About this profile

Source: the Evincia diagnostic engine (commit f27ae8f), Output A (raw signals) and Output B (narrative). Findings paraphrase the codebase; see the repository at the pinned commit for the original source. Analyzes Kooboo/CMS under the BSD 3-Clause License; attribution preserved (Copyright © 2013, Kooboo team). This is an illustrative readiness profile of a public, unmaintained codebase, not an engagement and not a judgment of its maintainers. Part of the Evincia Public Codebase Teardowns program.