# Changelog

## Score

- CAI 67 → 60 (-6.4)
- Rubric changed (rubric-2026.10.1 → rubric-2026.10.5) — scores are not directly comparable.

## Lenses

- Code Health 100 → 76 (-24.3)
- Architecture 100 → 100 (+0.0)
- Maturity 48 → 41 (-6.1)
- Readiness 67 → 67 (+0.0)
- Security 100 → 100 (+0.0)

## Resolved (4)

- Ambiguous scope for 'attributes'. One is an instance method returning the current object's attribute hash, while the other is a class method returning the list of defined attribute names. While the context (instance vs class) differs, the identical name without a clear convention (e.g., 'attribute_names' vs 'attributes') can be confusing for users expecting a uniform API surface.
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Workflow token permissions not restricted

## New (8)

- Ambiguous scope for 'attributes'. One is an instance method returning the current object's attribute hash, while the other is a class method returning the list of defined attribute names. While the context (instance vs class) distinguishes them, the naming collision is confusing for users who might expect 'attributes' to always return the same type of data structure.
- Inconsistent naming convention compared to standard Ruby/Rails patterns. While 'read_attribute' and 'write_attribute' are consistent with each other, they are often just '[]' and '[]=' in Ruby idioms. However, the bigger issue is that 'ActiveAttr.Attributes' also exposes 'attributes()' which returns the full hash. Having three ways to access data (read_attribute, write_attribute, and attributes hash) creates API surface bloat. More critically, 'read_attribute' and 'write_attribute' are typically low-level primitives, while 'attributes' is high-level. If 'attributes' is the primary interface, the individual readers/writers are redundant unless they bypass typecasting. If they bypass typecasting, they should be named 'read_raw_attribute' to be explicit.
- Orphaned file (lib/active_attr/attribute_defaults.rb)
- Orphaned file (lib/active_attr/attributes.rb)
- Orphaned file (lib/active_attr/mass_assignment.rb)
- Orphaned file (lib/active_attr/matchers/have_attribute_matcher.rb)
- Orphaned file (lib/active_attr/typecasted_attributes.rb)
- Workflow token permissions not restricted (.github/workflows/test.yaml)
