Skip to content
CAI
Software that uses CAICheck a score

RayTale/Vertex

54.0

Adequate · 21 September 2026

10.3k

lines of production code

C#

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This is a .NET-based actor runtime framework built on top of Orleans, designed to manage stateful actors with event sourcing and snapshotting capabilities. It provides a comprehensive toolkit for building distributed systems, featuring built-in support for distributed transactions, event streaming (via RabbitMQ, Kafka, or in-memory), and flexible storage backends. The system includes utilities for high-performance concurrency, such as distributed locking and ID generation, alongside a robust testing and benchmarking infrastructure.

Features

Add Transfer.Client example with DTx support

Added a new console application example for the Transfer service that allows users to interact with both standard account operations and distributed transaction (DTx) workflows. The client connects to an Orleans silo using localhost clustering and provides an interactive menu to choose between normal account transfers or DTx-based transfers, demonstrating the usage of IAccount and IDTxAccount grains.

examples/Transfer.Client · high confidence

Add Transfer.Server example with Orleans and Vertex runtime integration

A new example application (Transfer.Server) is introduced, demonstrating an Orleans-based silo host configured for local clustering and in-memory streams. The server integrates the Vertex runtime for transaction handling and uses Linq2db with an in-memory SQLite database, providing a complete, runnable demo of the transfer functionality.

examples/Transfer.Server · high confidence

Add account and DTx transfer grain interfaces

New grain interfaces are introduced for the Transfer example: IAccount and IAccountDb/IAccountFlow for standard account operations (balance, top-up, transfer, arrival, and refund), and IDTxAccount/ITransferDtxUnit/TransferRequest for distributed transaction (DTx) support, including serialization attributes on the request model.

examples/Transfer.IGrains · medium confidence

Add account transfer and distributed transaction (DTx) grain implementations

Introduced the core domain models and actors for a banking-style transfer system. Added event classes (TopupEvent, TransferEvent, TransferArrivedEvent, TransferRefundsEvent) and an AccountSnapshot with serialization attributes. Implemented the Account grain for standard transfer/top-up logic, the AccountDb grain for database synchronization, and the AccountFlow grain for event-driven flow control. Additionally, added the DTxAccount grain and TransferDtxUnit actor to support distributed transactions with commit/rollback capabilities.

examples/Transfer.Grains · high confidence

Add utility classes for assembly loading, memory pooling, and multi-producer channels

The \src/Vertex.Utils\ library introduces several new components: an \AssemblyHelper\ to load assemblies from the dependency context; a \SharedArray\ class for efficient, pooled byte buffer management; a \TaskSourcePool\ system using \ManualResetValueTaskSource\ for high-performance async state management; and a multi-producer, single-consumer channel implementation (\BufferBlockChannel\ and \ThreadChannel\) supporting batched, delayed consumption and sequential chaining.

src/Vertex.Utils · high confidence

Added benchmarking for channel and task source performance

New benchmark files were added to the Vertex.Utils.Benchmark project, introducing performance tests for MPSC channels and TaskSource implementations. Additionally, new exception classes (EventVersionException, SnapshotException, VertexEventHandlerException) and transaction abstraction interfaces (DTxCommit, IDTxActor, ITxSnapshot, etc.) were introduced to support transactional workflows and error handling.

benchmark, src/Vertex.Runtime/Exceptions, src/Vertex.Transaction.Abstractions · high confidence

Added distributed locking and ID generation actors

Added new Orleans grain implementations for inner service operations: DIDActor for generating unique IDs, HoldLockActor for simple lock/unlock operations, LockActor for queue-based distributed locking with wait support, and WeightHoldLockActor for weight-based locking. These components provide core concurrency control and identity generation capabilities for the runtime.

src/Vertex.Runtime/InnerService · high confidence

Added stream processing attributes and handlers

Introduced new attributes (NoStreamAttribute, StreamAttribute, StreamSubAttribute) to mark classes for stream processing, along with a BytesBox wrapper for event data, extension methods for Orleans IGrainFactory to simplify grain retrieval, and the IStreamSubHandler/StreamSubHandler implementation to route and process incoming stream events by actor ID.

src/Stream/Vertex.Stream.Common · high confidence

Introduce Kafka stream integration with pooled consumers and producers

Added a new Kafka stream implementation in the Vertex.Stream.Kafka module, including the IKafkaClient interface and its KafkaClient implementation that manages pooled PooledConsumer and PooledProducer instances. The change introduces a background ConsumerManager that discovers stream subscribers via reflection, manages distributed locking for consumer runners, and handles batched message consumption and error retry logic. This provides the underlying Kafka connectivity and streaming infrastructure for the application.

src/Stream/Vertex.Stream.Kafka · high confidence

Introduce Linq2db-based storage implementation for events and snapshots

Added a new Linq2db-based storage implementation for the storage module, including entity models (EventEntity, SnapshotEntity, SubSnapshotEntity), database connection factories, and storage classes (EventStorage, SnapshotStorage, EventArchive) that handle data persistence. The change introduces attribute-based configuration for table naming and sharding, along with index generation logic for multiple database providers (PostgreSQL, MySQL, SQLite, SQL Server). This provides an alternative to the existing EF Core-based storage, supporting features like event archiving, snapshot management, and transactional event storage with configurable sharding strategies.

src/Storage · high confidence

Introduce RabbitMQ stream implementation with connection pooling and consumer management

Added a new RabbitMQ-based event stream implementation in the Vertex.Stream.RabbitMQ module. This includes a connection and model pooling system (ConnectionWrapper, ModelWrapper, PooledModelPolicy) to manage RabbitMQ client resources efficiently. The module also introduces a ConsumerManager and ConsumerRunner to handle message consumption, including batch processing, retry logic, and health checks. An EventStream and EventStreamFactory are provided to publish events to RabbitMQ exchanges. The implementation is registered via DI extensions, allowing users to configure and use RabbitMQ for streaming data.

src/Stream/Vertex.Stream.RabbitMQ · high confidence

Introduce SnapshotHandlerBase for extensible event handling

Added a new abstract base class, SnapshotHandlerBase, which provides a dynamic, high-performance mechanism for routing and invoking event handlers. This change improves the extensibility of the snapshotting system by allowing derived classes to define multiple event handling methods that are automatically discovered and optimized via IL generation.

src/Vertex.Runtime/Snapshot · high confidence

Introduce Vertex runtime service registration and constants

The Vertex runtime now provides an \AddVertex\ extension method to register core services—including snapshot handlers, serialization, event type containers, and channel implementations—via dependency injection, and exposes the \eventflowid\ constant for event flow identification.

src/Vertex.Runtime · high confidence

Introduce core abstractions for actors, events, and storage

Added a new set of interfaces and data models in the Vertex.Abstractions library to support actor-based architecture and event sourcing. This includes actor interfaces (IActor, IFlowActor, IVertexActor), event handling components (IEvent, EventUnit, EventMeta, EventNameAttribute), and storage abstractions for events and snapshots (IEventStorage, ISnapshotStorage, ISubSnapshotStorage). These changes provide the foundational contracts for managing state, serializing events, and persisting snapshots within the system.

src/Vertex.Abstractions · high confidence

Introduce default JSON serialization and event type registration

The framework now includes a default JSON serialization implementation (DefaultJsonSerializer) that uses System.Text.Json with camel-case naming and case-insensitive property matching. Additionally, an EventTypeContainer is added to automatically scan assemblies for types implementing IEvent, registering them by name (via EventNameAttribute or a name generator) to enable runtime type-to-name lookups.

src/Vertex.Runtime/Serialization · medium confidence

Introduce distributed transaction support via new actor models and event types

Added new actor classes (DTxActor, DTxUnitActor, InnerTxActor, ReentryActor, ReentryDTxActor) and associated event types (TxCommitEvent, TxCommitedEvent, TxFinishedEvent, TxRollbackEvent, UnitCommitEvent, UnitCommitedEvent, UnitFinishedEvent, UnitRollbackEvent) to support distributed transaction workflows. This includes a new EventBufferUnit for event serialization and a TxEventTaskBox for managing concurrent transaction tasks. The implementation also introduces configuration options (VertexDtxOptions, VertexTxOptions) and a custom exception hierarchy (TxException, TxSnapshotException) to handle transaction states and errors.

src/Vertex.Transaction · high confidence

Introduce in-memory stream consumer and event stream infrastructure

Added the in-memory stream implementation for the Vertex framework, including the ConsumerManager and ConsumerRunner classes to handle background processing of stream events, an EventStream and EventStreamFactory to manage stream creation and routing, and supporting types like QueueInfo, ConsumerOptions, and the StreamIdActor grain. This provides a fully functional, in-memory event streaming solution that can be registered via the AddInMemoryStream extension method.

src/Stream/Vertex.Stream.InMemory · high confidence

Introduce new Actor base classes and attributes for event-driven state management

Added new files in src/Vertex.Runtime/Actor, including ActorBase, FlowActor, ShadowActor, and VertexActor, which provide the core runtime implementation for actor state management, event handling, and snapshot recovery. The ActorBase class introduces a generic primary key mechanism and supports cancellation tokens in activation methods. New attributes (EventReentrantAttribute, FollowPolicyAttribute, VertexPolicyAttribute) are added to configure actor behavior and policy options. Extension methods in Extentions.cs handle version updates for snapshots and events, ensuring consistency during state transitions.

src/Vertex.Runtime/Actor · high confidence

Behavioural changes

New runtime options for actor snapshotting, archiving, and initialization

Added configuration classes (ActorOptions, ArchiveOptions, FlowActorOptions, ShadowActorOptions) and the FlowInitType enum to the runtime's options layer. These classes, decorated with Orleans serialization attributes, expose settings for snapshot versioning intervals, event page sizes, and cache behaviors for various actor types, alongside an enum defining how FlowActors initialize from events.

src/Vertex.Runtime/Options · high confidence

Test coverage

Added tests for account actor lifecycle and event handling; Added tests for transactional account actors; Added unit tests for protocol, utility, and channeling components.

Dependencies

Add .NET 8.0-based project structure for Orleans components and examples

The project files for the core libraries (Vertex.Abstractions, Vertex.Runtime, Vertex.Transaction, etc.), their corresponding test projects, and the Transfer example applications have been added with a .NET 8.0 target framework. These .csproj files establish the dependency graph for the Orleans-based runtime, storage, streaming, and transaction modules, while also introducing a new benchmarking project. This change updates the build system to use .NET 8.0 and includes references to key packages such as Microsoft.Orleans.Sdk, Microsoft.Orleans.Server, and various Microsoft.Extensions.\* libraries.

(dependencies) · medium confidence

Upgrade to .NET 8.0 and update all dependencies

The project has been upgraded to target the .NET 8.0 runtime, as specified in \Directory.Build.props\ and \global.json\. All dependencies have been updated to their latest versions, including Microsoft.Orleans 8.2.0, Microsoft.Extensions packages at 8.0.x, and linq2db 5.4.1. Additionally, the .editorconfig file was added to configure code analysis rules, and the solution file was updated to reflect the new project structure.

(repo-wide) · 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 48 → 54 (+5.6)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 55 → 50 (-5.0)
  • Architecture 99 → 99 (+0.2)
  • Maturity 46 → 46 (+0.1)
  • Readiness 60 → 64 (+3.6)
  • Security 39 → 63 (+24.2)
  • Event-Driven 86 → 86 (+0.0)
  • Performance 81 → 81 (+0.0)

Resolved (53)

  • Bounded contexts not declared
  • Duplicate method signature 'EventHandle' exists in different namespaces for similar functionality, potentially causing confusion or ambiguity.
  • Duplicated block (10 lines × 2) (src/Stream/Vertex.Stream.Kafka/Consumer/ConsumerManager.cs)
  • Duplicated block (10 lines × 2) (src/Vertex.Runtime/Actor/FlowActor.cs)
  • Duplicated block (10 lines × 2) (src/Vertex.Transaction/Actor/DTxActor.cs)
  • Duplicated block (10 lines × 3) (src/Stream/Vertex.Stream.RabbitMQ/Consumer/ConsumerManager.cs)
  • Duplicated block (11 lines × 2) (src/Storage/Vertex.Storage.Linq2db/Storage/SnapshotStorage.cs)
  • Duplicated block (11 lines × 2) (src/Vertex.Utils/Channels/BufferBlockChannel.cs)
  • Duplicated block (12 lines × 2) (src/Storage/Vertex.Storage.Linq2db/Storage/EventStorage.cs)
  • Duplicated block (12 lines × 2) (src/Vertex.Runtime/Actor/ShadowActor.cs)
  • Duplicated block (12 lines × 2) (src/Vertex.Runtime/Actor/ShadowActor.cs)
  • Duplicated block (12 lines × 3) (src/Vertex.Runtime/Snapshot/SnapshotHandlerBase.cs)
  • Duplicated block (13 lines × 2) (src/Storage/Vertex.Storage.Linq2db/Storage/EventStorage.cs)
  • Duplicated block (13 lines × 2) (src/Storage/Vertex.Storage.Linq2db/Storage/EventStorage.cs)
  • Duplicated block (13 lines × 2) (src/Vertex.Utils/Channels/BufferBlockChannel.cs)
  • Duplicated block (14 lines × 2) (src/Stream/Vertex.Stream.Kafka/Consumer/ConsumerManager.cs)
  • Duplicated block (14 lines × 3) (src/Stream/Vertex.Stream.RabbitMQ/Consumer/ConsumerRunner.cs)
  • Duplicated block (14 lines × 3) (src/Stream/Vertex.Stream.RabbitMQ/EventStreamFactory.cs)
  • Duplicated block (15 lines × 3) (src/Stream/Vertex.Stream.RabbitMQ/Consumer/ConsumerManager.cs)
  • Duplicated block (16 lines × 2) (src/Vertex.Utils/Channels/BufferBlockChannel.cs)
  • …and 33 more

New (103)

  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • AnalyzerSeverityNone (.editorconfig)
  • …and 83 more

Architecture

  • Unchanged — 2 containers · 0 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

RayTale/Vertex 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 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit c52f0ef274953aca9bd529f1ec2b900485cfe11a — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.