Skip to content
CAI
Software that uses CAICheck a score

ronnieholm/FSharp-onion-architecture-sample

56.5

Adequate · 3 October 2026

2.2k

lines of production code

F#

primary language

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is an F\# sample application demonstrating an onion architecture with vertical slices, specifically designed to manage Scrum stories and tasks. It implements a functional web layer using Giraffe, backed by an SQLite database that utilizes event sourcing for state management. The application enforces JWT-based role security and includes infrastructure for load testing and integration validation.

Behavioural changes

Migrate Scrum web layer to Giraffe and introduce vertical slice architecture

The Scrum web application has been refactored from an ASP.NET Core MVC controller-based approach to a Giraffe-based functional pipeline. This change introduces a vertical slice architecture, moving handlers (such as story creation, task addition, and retrieval) into dedicated modules rather than a monolithic application layer. The migration includes the removal of the legacy \Application.fs\, \Domain.fs\, and \Infrastructure.fs\ files in favor of new seedwork and route handler modules. Additionally, the application now supports JWT authentication with token issuance and renewal, integrates SQLite health checks, and applies standardized error handling via ProblemDetails filters.

src/Scrum · high confidence

Project restructured and documentation updated for F\# onion architecture sample

The repository has been reorganized to reflect a shift from a generic clean architecture sample to a specific F\# onion architecture Scrum sample. The solution structure was updated, moving the test project from src/Scrum.Tests to tests/Scrum.Tests. Documentation was significantly expanded to detail the modular monolith design, vertical slice architecture, and adherence to Zalando API guidelines, including JWT role-based security and CQRS. A BSD 2-Clause license was added, and .gitignore was updated to exclude SQLite database files (scrum\_web.sqlite, scrum\_test.sqlite) generated during local development.

(repo-wide) · high confidence

Scrum module restructured into vertical slice architecture

The Scrum module has been reorganized to support a vertical slice architecture, introducing new foundational files such as \Seedwork.fs\ and \Story.fs\. \Seedwork.fs\ establishes shared domain and application-layer primitives, including validation helpers, paging structures, and identity models. \Story.fs\ defines the core Story aggregate, its associated tasks, and the specific events (such as capturing or revising story details) that drive state changes, replacing the previous flat structure with a more modular, feature-oriented layout.

Scrum · high confidence

Updated Scrum database schema with event sourcing and pagination support

The SQLite database schema for the Scrum module has been replaced with a new version that supports event sourcing and improved pagination. The new schema introduces an \events\ table to store aggregate events, replacing the previous \domain\_events\ table. It also adds unique constraints on \created\_at\ columns and specific indexes to the \stories\, \tasks\, and \events\ tables to enable efficient pagination. Foreign key cascading is now explicitly defined for task deletion when associated stories are removed.

src/Scrum/Sql · high confidence

Test coverage

Added integration and web test suites for Scrum; Added k6 load test script for API endpoints; Removed integration tests for Story and Task commands.

Dependencies

Upgrade to .NET 10 and enable Central Package Management

The application and its test suite have been upgraded from .NET 7 to .NET 10. To streamline dependency management, Central Package Management has been enabled via a new Directory.Packages.props file, which now centrally defines versions for key libraries including Giraffe 8.2.0, Microsoft.AspNetCore.Authentication.JwtBearer 10.0.0, and various OpenTelemetry exporters. Individual project files no longer specify version numbers for these packages, relying instead on the central definitions.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 55 → 56 (+1.4)
  • Rubric changed (rubric-2026.09.15 → rubric-2026.10.1) — scores are not directly comparable.

Lenses

  • Code Health 90 → 90 (+0.0)
  • Architecture 99 → 99 (+0.7)
  • Maturity 68 → 68 (+0.0)
  • Readiness 31 → 28 (-2.7)
  • Security 97 → 95 (-2.6)
  • Domain Modelling 74 → 100 (+25.6)

Resolved (2)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)

New (3)

  • Leaked secret: high-entropy-secret (k6/loadTest.js)
  • Leaked secret: jwt (k6/loadTest.js)
  • Secret: jwt (k6/loadTest.js)

Architecture

  • Unchanged — 0 containers · 1 contexts · 0 edges

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

ronnieholm/FSharp-onion-architecture-sample was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 3 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit e99f6e4c60c51d3c429d438ccdc48aebccdf71b0 — the exact code this score is about.
  • Scored under rubric-2026.10.1 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-4f4226d619ea.