# Changelog

## Score

- CAI 61 → 57 (-4.7)
- Rubric changed (rubric-2026.10.1 → rubric-2026.10.5) — scores are not directly comparable.

## Lenses

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

## Resolved (6)

- Documentation: no installation or build instructions (README.md)
- Duplicate entry points for parsing. `Slop.parse` appears to be a convenience wrapper or legacy entry point, while `Options.parse` is the instance method on the options collection. Users can achieve the same result via `Slop.new { ... }.parse(args)` or `Slop.parse(args)`, creating confusion about which is the canonical API.
- Naming collision in intent. `value()` likely returns the current parsed value, while `default_value()` returns the configured default. However, in many contexts, 'value' is ambiguous (current vs default). More critically, `BoolOption` also exposes `value()` and `default_value()`, but `Option` has `value()` which might shadow or behave differently depending on state.
- State reset is exposed on both the individual Option and the Parser. Resetting a single option is a rare edge case, while resetting the parser is common for re-parsing. Exposing both suggests inconsistent state management granularity.
- Three different methods to retrieve a value by flag. `[]` is standard Ruby, `fetch` implies raising on missing (but signature doesn't show default), and `option` is a verbose alias. This creates ambiguity about which method to use for safe vs. unsafe access.
- Workflow token permissions not restricted

## New (9)

- Ambiguous naming for value retrieval. `value` likely returns the parsed/processed value, while `default_value` returns the static default. However, in the context of `BoolOption`, `value` is also defined. It is unclear if `Option.value` returns the current state or the default if no value was set. This creates inconsistency with how defaults are accessed across different option types.
- Duplication of state tracking methods. `Result` and `Parser` both expose `used_options` and `unused_options`. Since `Result` holds a reference to the `Parser`, these methods on `Result` are likely just delegating to the parser, exposing internal implementation details unnecessarily.
- Orphaned file (lib/slop/option.rb)
- Orphaned file (lib/slop/options.rb)
- Orphaned file (lib/slop/parser.rb)
- Orphaned file (lib/slop/result.rb)
- Orphaned file (lib/slop/types.rb)
- Redundant accessors for retrieving option values. `[]`, `fetch`, and `option` all appear to retrieve the value associated with a flag, creating confusion about which to use (e.g., `fetch` usually implies raising on missing keys in Ruby, while `[]` might return nil, but `option` is ambiguous).
- Workflow token permissions not restricted (.github/workflows/ci.yml)
