Skip to content
CAI
Software that uses CAICheck a score

MoiraeSoftware/Myriad

54.2

Adequate · 24 September 2026

1.8k

lines of production code

F#

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Myriad is a .NET code generation tool designed for F\# projects that integrates directly into the build process via MSBuild and a command-line interface. It utilizes a plugin-based architecture to automatically generate helper code, such as lenses, field accessors, and discriminated union utilities, based on source attributes. The system supports both standard file output and inline generation, while providing diagnostic reporting and configuration through TOML files.

Features

Added Example sample project with generated code

A new sample project named 'Example' has been added to the samples directory, including a solution file, a configuration file (myriad.toml), and source files. The sample demonstrates the usage of the Myriad code generator by defining record types (Test1, Test2) with a specific attribute and including the corresponding generated code (Generated.fs) that provides accessor and mapping functions for these fields.

samples · high confidence

Initial experiment backlog and methodology documentation for Myriad R&D

The \experiments/\ directory now includes structured documentation for the Myriad research and development process, including a comprehensive backlog (\BACKLOG.md\) tracking hypotheses and engineering gaps, a findings digest (\FINDINGS.md\) synthesizing results from thirty experimental quartets (Q001–Q030), and a detailed README (\README.md\) outlining the experimental methodology. This entry also adds the initial hypothesis, design, and results documentation for the first quartet (Q001), which investigates in-process FCS hosting and typed code generation, providing the foundational context for subsequent experiments.

experiments · high confidence

Introduce Myriad CLI with TOML configuration and plugin support

The Myriad command-line interface is now implemented in src/Myriad/Program.fs, enabling users to configure code generation via a myriad.toml file and load external generator plugins. The CLI supports batch processing through a manifest file, allows filtering specific generators, and passes configuration keys and additional parameters to the generation pipeline. This change introduces dependencies on Argu for argument parsing, Tomlyn for TOML handling, and McMaster.NETCore.Plugins for dynamic plugin loading.

src/Myriad · high confidence

Introduce configurable code generation plugins for records, unions, and lenses

The Myriad.Plugins library now provides a structured, attribute-driven code generation system. Users can apply attributes like \[Lenses\], \[Fields\], and \[DuCases\] to types to automatically generate helper modules. The Lenses generator creates getter/setter pairs for record fields and single-case discriminated unions, with support for a custom wrapper type and a 'piped setter' configuration option. The Fields generator produces map and create functions for records, while the DUCases generator adds toString, fromString, toTag, and isCase helpers for discriminated unions. All generators support configuration via attributes or a global config key, allowing control over namespaces and qualification.

src/Myriad.Plugins · high confidence

Introduce core AST manipulation, diagnostics, and configuration capabilities

Myriad.Core now provides foundational support for parsing and generating F\# code via Fantomas.FCS, including helpers for building AST nodes (AstExtensions.fs) and extracting literal bindings from attributes (Ast.fs). The library adds a diagnostics API (Diagnostics.fs, Types.fs) allowing generators to report warnings and errors as MSBuild-compatible messages without aborting the build, and integrates .editorconfig support (EditorConfig.fs) to read formatting preferences. Additionally, it introduces an inline generation mode (Generation.fs) that appends output to input files and defines the IMyriadGenerator interface with context and project path support.

src/Myriad.Core · high confidence

Introduced Myriad.Sdk package for MSBuild integration

Added a new Myriad.Sdk package that provides MSBuild integration between Myriad and .NET SDK projects. The package targets netstandard2.1, disables implicit framework references and build output, and includes MSBuild props and targets files for multi-targeting support. It references the main Myriad package via PackageDownload to ensure version alignment and avoid NuGet conflicts.

src/Myriad.Sdk · high confidence

Architecture

Solution structure reorganized into separate projects

The solution file has been restructured to split the codebase into distinct projects: Myriad, Myriad.Core, and Myriad.Plugins. This change also updates the solution to reference existing test projects (Myriad.Plugins.Example1 and Myriad.IntegrationPluginTests) that were previously located outside the src directory, effectively moving them into the solution's build graph.

src · high confidence

Behavioural changes

Myriad 1.0.0 release with design-time build support and single-process generation

Myriad has reached version 1.0.0, marking its public API as stable. This release introduces several key behavioral improvements: generated code is no longer written if unchanged, preventing unnecessary file timestamp updates and editor noise; the tool now runs once per project via a manifest file instead of spawning a separate process for each input file, improving startup performance; and the design-time build gate has been removed, allowing generated members to appear in IDEs without a full build. Additionally, the project now multi-targets .NET 8 and .NET 9, and inline generation output no longer appends an extra blank line.

(repo-wide) · high confidence

Test coverage

Added example plugin generators to test diagnostics and inline generation; Added integration test suite for the Myriad code generator.

Dependencies

Standardized experiment artifacts to .NET 8/9 and FCS 43.9.101

The project files for the experiment artifacts (located under experiments/Q\*) have been updated to target .NET 8.0 or .NET 9.0 and reference FSharp.Compiler.Service version 43.9.101. This change aligns the experimental harnesses with the latest compiler service version and modern .NET runtimes, ensuring consistent dependency shapes across the various type-provider and code-generation spikes.

(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

This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.

Score

  • CAI 60 → 54 (-5.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 81 → 43 (-37.8)
  • Architecture 100 → 100 (+0.0)
  • Maturity 56 → 57 (+0.6)
  • Readiness 67 → 62 (-4.9)
  • Security 52 → 70 (+17.9)

Resolved (45)

  • Analyze.analyze (cognitive 19) (experiments/Q020-shared-analysis-diagnostic-channels/artifacts/SharedAnalysis/SharedAnalysis.fs)
  • Ast.extractLiteralBindings (cognitive 20) (src/Myriad.Core/Ast.fs)
  • Code Duplication not included (time budget)
  • Dependency hygiene not measured — no packages were read
  • DynamicReflection.op_Dynamic (cognitive 35) (src/Myriad.Core/Ast.fs)
  • DynamicReflection.op_Dynamic (cyclomatic 19) (src/Myriad.Core/Ast.fs)
  • EditorConfig.parseOptionsFromEditorConfig (cognitive 20) (src/Myriad.Core/EditorConfig.fs)
  • EditorConfig.parseOptionsFromEditorConfig (cyclomatic 16) (src/Myriad.Core/EditorConfig.fs)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • …and 25 more

New (152)

  • Duplicated block (10 lines × 2) (experiments/Q001-fcs-typed-codegen/artifacts/round2-incrementality-staleness/Program.fs)
  • Duplicated block (10 lines × 2) (experiments/Q007-fsi-static-parameters/artifacts/Verify/Program.fs)
  • Duplicated block (10 lines × 2) (experiments/Q012-compiler-behavior-probe/artifacts/SchemaTP.Runtime/Provenance.fs)
  • Duplicated block (10 lines × 2) (experiments/Q019-erased-self-parsing-provider/artifacts/MyriadPreview.DesignTime/MyriadPreviewProvider.fs)
  • Duplicated block (10 lines × 2) (experiments/Q023-scale-cost-reentrant-callback/artifacts/q023-spike/Program.fs)
  • Duplicated block (10 lines × 6) (experiments/Q007-fsi-static-parameters/artifacts/Harness/Program.fs)
  • Duplicated block (107 lines × 2) (experiments/Q023-scale-cost-reentrant-callback/artifacts/q023-spike/Program.fs)
  • Duplicated block (10–15 lines × 2) (experiments/Q020-shared-analysis-diagnostic-channels/artifacts/Harness/Program.fs)
  • Duplicated block (11 lines × 2) (experiments/Q012-compiler-behavior-probe/artifacts/ClientTP.Runtime/Consumes.fs)
  • Duplicated block (11 lines × 2) (experiments/Q014-fsi-staged-compilation/artifacts/spike/Program.fs)
  • Duplicated block (11 lines × 2) (experiments/Q017-satellite-function-typed-forwarding/artifacts/Harness/Program.fs)
  • Duplicated block (11 lines × 3) (experiments/Q016-satellite-dll-type-provider/artifacts/SatelliteTP.DesignTime/SatelliteProvider.fs)
  • Duplicated block (11 lines × 5) (experiments/Q007-fsi-static-parameters/artifacts/Harness/Program.fs)
  • Duplicated block (11 lines × 6) (experiments/Q007-fsi-static-parameters/artifacts/Harness/Program.fs)
  • Duplicated block (11 lines × 7) (experiments/Q012-compiler-behavior-probe/artifacts/ClientTP.DesignTime/ClientProvider.fs)
  • Duplicated block (11–14 lines × 2) (experiments/Q014-fsi-staged-compilation/artifacts/spike/Program.fs)
  • Duplicated block (12 lines × 2) (experiments/Q010-prefix-stratified-generation/artifacts/round1-reentrancy/Program.fs)
  • Duplicated block (12 lines × 2) (experiments/Q012-compiler-behavior-probe/artifacts/ProbeSimple.DesignTime/ProbeProvider.fs)
  • Duplicated block (12 lines × 4) (experiments/Q016-satellite-dll-type-provider/artifacts/Harness/Program.fs)
  • Duplicated block (12 lines × 6) (experiments/Q007-fsi-static-parameters/artifacts/Harness/Program.fs)
  • …and 132 more

Changes since last survey

  • 10 commits — 8 feature/other, 2 fixes

By area

  • (repo) — 4 commits
  • (root) — 4 commits
  • test/Myriad.IntegrationPluginTests — 2 commits

Notable commits

  • fix: Fix parseAdditionalParams to split multiple pipe-delimited MyriadParams entries
  • fix: Merge pull request #300 from MoiraeSoftware/copilot/fix-myriadparams-parsing-issue
  • change: Address review: real-generator test, trailing blank line, explicit false
  • change: Initial plan
  • change: Merge pull request #298 from Jah-yee/master
  • change: Merge pull request #301 from JohSand/inline-parameter-and-unchanged-output
  • change: Multi-target net8.0/net9.0 and release v0.9.0
  • change: Release v1.0.0
  • change: Remove dead link (7sharp9.dev is unreachable)
  • change: Tell generators about inline generation and skip writing unchanged output

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

Survey your own repository

MoiraeSoftware/Myriad 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 24 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 b17b84ac1c0c06c0a6fc431f2e24e784d70c59fa — 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-923689c465cf.