Skip to content
CAI
Software that uses CAICheck a score

seancribbs/neotoma

42.8

Weak · 23 September 2026

1.8k

lines of production code

Erlang

primary language

5

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Neotoma is an Erlang-based PEG (Parsing Expression Grammar) parser generator that converts .peg grammar files into standalone Erlang modules. It provides a suite of parser combinators, memoization utilities, and support functions to facilitate the creation of parsers for formats like JSON, CSV, and arithmetic expressions. The system includes comprehensive unit tests and a modernized build structure for continuous integration.

Features

Add PEG grammar and parser support functions

Added the core PEG grammar file (priv/neotoma\_parse.peg) and the header file (priv/peg\_includes.hrl) which defines the parsing functions (e.g., p\_seq, p\_choose, p\_optional) and memoization utilities required for the parser to function.

priv · high confidence

Add example parsers for arithmetic, CSV, and JSON

The \extra\ directory now includes new example parsers for arithmetic expressions, CSV files, and JSON documents. Each parser is implemented in Erlang with a corresponding PEG (Parsing Expression Grammar) file, providing reference implementations for parsing these data formats.

extra · high confidence

Behavioural changes

Migrate build system to Rebar3 and modernize project structure

The project has migrated its build system from a custom Makefile to Rebar3, as evidenced by the addition of rebar.config and the removal of the old Makefile. This change introduces support for generating escripts, running tests via eunit, and performing static analysis with dialyzer and xref. Additionally, the repository now includes a .travis.yml file for continuous integration, a LICENSE file for legal clarity, and a README for documentation, while removing legacy files like the cucumber and metagrammar PEG files.

(repo-wide) · high confidence

Neotoma parser generator refactored to standalone modules

The Neotoma parser generator has been refactored from a monolithic structure into distinct, standalone modules. The previous \peg\ and \peg\_transform\ modules, which provided parser combinators and parse transforms, have been removed in favor of a new \neotoma\ module that handles the generation of parsers directly from \.peg\ files. The metagrammar has been moved to \priv\ to support clean builds, and the generated parser code now includes line and column tracking for improved debugging output. This change simplifies the API by removing the need for separate parse transforms, allowing users to generate parsers via the \neotoma:file/1,2\ functions.

src · high confidence

Removal of legacy PEG parser header and macros

The file include/peg.hrl has been removed. This file previously defined the root/1 macro and compile directives for the PEG parser, including the setup\_memo/0 function. Users relying on these macros or the associated parse\_transform will need to update their code to use the new standalone parsers and renamed combinators introduced in this change.

include · high confidence

Test coverage

Added unit tests for parser combinators, memoization, and parsing

Added comprehensive test coverage for the PEG parser and its components. This includes unit tests for parser combinators (such as optional, not, assert, sequence, choice, and repetition operators) in test\_combinators.erl, verification of the memoization setup and release mechanisms in test\_memoization.erl, and integration tests for the main parser in test\_parse.erl. The test suite is orchestrated by test\_suite.erl.

test · 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 40 → 43 (+2.5)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 79 → 89 (+10.1)
  • Architecture 100 → 100 (+0.0)
  • Maturity 13 → 21 (+7.8)
  • Readiness 41 → 46 (+5.2)
  • Security 100 → 67 (-33.3)

Resolved (6)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • No exposed public API
  • Test reliability not included
  • complexity unreadable for .erl, .hrl — churn × complexity hotspots could not be measured
  • dormant codebase — no living knowledge left to concentrate

New (20)

  • Coverage not measured — no coverage collector is wired up
  • Duplicated block (10 lines × 2) (extra/csv.erl)
  • Duplicated block (10 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (11 lines × 2) (extra/csv.erl)
  • Duplicated block (11 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (21 lines × 2) (extra/csv.erl)
  • Duplicated block (5 lines × 2) (extra/csv.erl)
  • Duplicated block (5 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (5 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (6 lines × 2) (extra/csv.erl)
  • Duplicated block (6 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (7 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (7 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (8 lines × 3) (extra/arithmetic.erl)
  • Duplicated block (9 lines × 2) (extra/csv.erl)
  • Duplicated block (9 lines × 3) (extra/arithmetic.erl)
  • FileTooLong: src/neotoma_parse.erl (src/neotoma_parse.erl)
  • No SBOM
  • No artifact signing
  • No build provenance

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

Survey your own repository

seancribbs/neotoma 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 23 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 ca56a014be0338ac0f695645aed8042e4117efe6 — 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-955b9cee9818.