Skip to content

Architecture Decision Records

This directory contains the Architecture Decision Records (ADRs) for Rigor. Each document captures a significant design decision, its context, the options considered, and the consequences.

  • ADR-0 is the foundation document — start here for the project’s core principles and architecture.
  • ADR-1 through ADR-3 define the type model, extension API, and type representation — the analyzer’s conceptual core.
  • Higher-numbered ADRs build on the foundation and can be read as needed.
  • Each ADR has a Status field: Accepted, Proposed, or Superseded. Accepted ADRs whose implementation is still in flight carry a parenthetical note (e.g. partially implemented, slice N deferred).
#TitleStatus
ADR-0Foundation and Core Architecture of RigorAccepted
ADR-1Type Model and RBS Superset StrategyAccepted
ADR-2Extension API StrategyAccepted
ADR-3Type RepresentationAccepted
ADR-4Type Inference EngineAccepted
ADR-5Robustness PrincipleAccepted
ADR-6Cache Persistence BackendAccepted
ADR-7v0.1.0 Slice DecisionsAccepted
ADR-8Steep-Inspired ImprovementsAccepted
ADR-9Cross-Plugin APIAccepted (implemented in v0.1.1)
ADR-10Dependency Source InferenceAccepted
ADR-11Sorbet Input AdapterAccepted
ADR-12dry-rb PackagingAccepted
ADR-13TypeNode Resolver PluginAccepted
ADR-14RBS Sig GenerationAccepted
ADR-15Ractor ConcurrencyAccepted (fork backend active; Ractor pool deferred)
ADR-16Macro ExpansionAccepted
ADR-17Monkey Patch Pre-EvaluationAccepted (implemented in v0.1.13)
ADR-18Substrate Per-Call-Site Return TypeAccepted (implemented in v0.1.6)
ADR-19Language Server PackagingAccepted
ADR-20Lightweight HKTAccepted (partial implementation)
ADR-21Rubydex EvaluationProposed
ADR-22Baseline and Project OnboardingAccepted
ADR-23Diagnostic Triage CommandAccepted (slices 1+2+3+4 implemented)
ADR-24Self Method Call ResolutionAccepted (slice 4 gated)
ADR-25Plugin Contributed RBSAccepted
ADR-26ActiveRecord Relation TypingAccepted
ADR-27Tool Distribution and Installation ModelAccepted (partially implemented; CI template + single binary deferred)
ADR-28Path-scoped Method-Protocol ContractsAccepted
ADR-29Browser PlaygroundAccepted (implemented in v0.1.10–0.1.11; cloud deploy + ruby.wasm deferred)
ADR-30rigor-ffi Plugin ShapeProposed (not implemented)
ADR-31Contribution and Supply-chain PolicyAccepted (in force)
ADR-32Inline-RBS Comment IngestionAccepted (implemented in v0.1.10)
ADR-33MCP Server PackagingAccepted (implemented in v0.1.10)
ADR-34Toplevel Unresolved Implicit-self Calls Warn by DefaultAccepted (implemented in v0.1.13; Playground severity wiring deferred)
ADR-35Override Signature Compatibility (Liskov signature rule)Accepted (slices 1–4 done; slice 5 deferred)
ADR-36Macro-substrate Nested-class Emission Tier (Mangrove Enum)Accepted (Slice A implemented; is_a? exhaustiveness deferred)
ADR-37Plugin Interface Segregation (narrow extension protocols)Accepted (Slices 1–3 implemented; all bundled walker plugins migrated)
ADR-38Plugin-declared Additional InitializersAccepted (def-form implemented; block-form deferred)
ADR-39Plugins may invoke their target library’s safe methods directlyAccepted (Plugin::Inflector + 3 consumers migrated; slice 3 deferred)
ADR-40config_schema declared defaults ({kind:, default:})Accepted (mechanism + 13 plugins migrated off the DEFAULT_* idiom)
ADR-41Inference budget design (wiring, on-hit policy, measurement-gated defaults)Proposed (spec table unwired; Layer 1 doc hygiene + Layer 2 measurement-gated wiring queued)
ADR-42Plugin-contributed binary-operator return types (coerce-direction)Proposed, low priority (self/left-operand case already works via dynamic_return, spec-confirmed; coerce direction is a narrow false positive — cheapest fix is the WD-D engine mitigation, precision via the ADR-20 HKT route; demand-gated)
ADR-43RBS-complete ancestor resolution (allow-list inherited-method dispatch)Accepted — fully landed (WD1–WD6; rigor check resolves a Ruby subclass’s inherited calls against an allow-listed RBS-complete ancestor (seed Plugin::Base) so contract misuse warns standalone, without Steep’s own-helper FP wall; zero net FP on the plugin lib tree; blanket resolution rejected on Rails-controller FP grounds; make check-plugins gate in verify + CI, teeth verified)

When making a significant architectural decision:

  1. Find the next available number in this directory.
  2. Copy the template from an existing ADR or create a new file following the same structure: Status, Context, Decisions, Consequences.
  3. Add an entry to the index table above.
  4. Reference the ADR from relevant code comments, other ADRs, or AGENTS.md where appropriate.
  • docs/types.md — Type specification quick guide. When ADR-1 and docs/types.md discuss the same area, docs/types.md is authoritative for what the analyzer does; ADR-1 is authoritative for why.
  • docs/type-specification/ — Normative type specification, split into topical documents.
  • docs/internal-spec/ — Analyzer-internal contracts (engine surface, type-object public API).
  • docs/handbook/ — End-user handbook, written for Ruby programmers without prior static-typing background.
  • AGENTS.md — Development contract for agents working in this repository.

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.