Known limitations

Current rough edges, indexed by the phase that introduced the feature. Per-version resolutions land in CHANGELOG.md; the design intent behind each trade-off lives in docs/plan.md.

Phase 5 โ€” UML class diagram

Visibility tracker only honours the bare keyword form

VisibilityMap flips its running visibility on a bare private / protected / public statement inside a class or module body. Three other Ruby forms fall through and read as public:

The bare keyword covers the common Rails-model and plain-module shapes. Anything more elaborate reads as public.

The bundled inflector is intentionally small

Rigor::ModuleGraph::Inflector ships the basic Rails-style rules (-ies โ†’ -y, -s โ†’ "") plus a small irregular-plurals table (people, men, women, children, feet, teeth, geese, mice, lice). Anything outside the table is treated as regular and acronyms are not recognised:

When the inferred name is wrong, override with class_name: โ€”it always wins over the inflector:

has_many :data_points, class_name: "Telemetry::DataPoint"

We deliberately do not pull in ActiveSupport::Inflector: the gem stays a standalone Rigor plugin, and the inflections users actually need on the wrong-by-default path are project-specific anyway.

Mermaid 10.x classDiagram and the <<module>> annotation

Module nodes carry a ยซmoduleยป suffix on the label rather than the canonical UML <<module>> annotation. Mermaid 10.xโ€™s classDiagram parser silently rejects the document when the annotation co-exists with the class Foo["Label"] form we need for namespaced constants (Billing::Invoice โ†’Billing__Invoice with a label restoring the ::). Keeping the label, which carries the actual name, was the higher-value side of that trade-off.

Mermaid 11 rewrites the classDiagram parser; the workaround becomes unnecessary once the gemโ€™s CI matrix moves to it.