# Changelog

## Score

- CAI 53 → 44 (-9.7)
- Rubric changed (rubric-2026.10.1 → rubric-2026.10.5) — scores are not directly comparable.

## Lenses

- Code Health 53 → 38 (-14.9)
- Architecture 67 → 67 (+0.0)
- Maturity 51 → 51 (-0.6)
- Readiness 47 → 47 (+0.0)
- Security 90 → 41 (-48.6)
- Performance 100 → 100 (+0.0)

## Resolved (5)

- Ambiguous distinction between method and tag helpers. The presence of both `turbo_exempts_page_from_cache` and `turbo_exempts_page_from_cache_tag` suggests a pattern where one returns a boolean/status and the other renders HTML. However, the naming is verbose and inconsistent with other helpers like `turbo_refreshes_with` which handles both logic and rendering implicitly or via block. This forces developers to choose between two similarly named methods for different output types.
- Inconsistent parameter structure for equivalent operations. The module-level `Broadcasts` methods accept a generic `opts` hash, while the instance-level `Broadcastable` methods explicitly separate `target` and `rendering` arguments. This forces developers to learn two different calling conventions for the same underlying Turbo Stream action.
- Off-boarding risk: anonymized user #1
- Redundant naming for related accessors. `signed_stream_verifier_key` returns the key, while `signed_stream_verifier` likely returns the verifier object using that key. However, the naming pattern is inconsistent with standard Ruby accessor conventions (e.g., `verifier` vs `verifier_key`) and creates confusion about whether one is a factory for the other or if they are independent configurations.
- Workflow token permissions not restricted

## New (20)

- Duplicated block (9 lines × 2) (lib/install/turbo_with_bun.rb)
- Inconsistent grouping of related configuration. `turbo_refreshes_with` combines method and scroll into one call, while `turbo_refresh_method_tag` and `turbo_refresh_scroll_tag` are separate. This forces developers to choose between a combined API and granular APIs without a clear pattern for when to use which.
- Inconsistent parameter signatures for equivalent operations across related modules. `Broadcasts` module methods accept a generic `opts` hash, while `Broadcastable` module methods explicitly separate `target`, `rendering`, etc. This forces developers to learn two different calling conventions for the same underlying Turbo Stream actions depending on whether they are calling from the module or the mixin.
- Off-boarding risk: anonymized user #1
- Orphaned file (app/channels/turbo/streams/broadcasts.rb)
- Orphaned file (app/controllers/turbo/native/navigation.rb)
- Orphaned file (app/helpers/turbo/drive_helper.rb)
- Orphaned file (app/helpers/turbo/streams/action_helper.rb)
- Orphaned file (app/helpers/turbo/streams_helper.rb)
- Orphaned file (bug_report_template.rb)
- Orphaned file (lib/turbo/broadcastable/test_helper.rb)
- Orphaned file (lib/turbo/engine.rb)
- Orphaned file (lib/turbo/system_test_helper.rb)
- Orphaned file (lib/turbo/test_assertions.rb)
- Orphaned file (lib/turbo/test_assertions/integration_test_assertions.rb)
- Orphaned knowledge (app/models/concerns/turbo/broadcastable.rb)
- Redundant naming convention. The `_tag` suffix implies the method returns an HTML tag, while the non-suffixed version likely sets a meta tag or header. However, having both in the same helper class with such similar names creates confusion about which one to use for programmatic logic vs. view rendering. It is unclear if `turbo_exempts_page_from_cache` is a deprecated alias or a distinct logic setter.
- Same redundancy as above. `turbo_exempts_page_from_preview` vs `turbo_exempts_page_from_preview_tag` creates ambiguity. If one is a side-effect setter and the other is a view helper, the naming should reflect that distinction (e.g., `set_turbo_exemption_from_preview` vs `turbo_exemption_from_preview_tag`).
- Same redundancy as above. `turbo_page_requires_reload` vs `turbo_page_requires_reload_tag`.
- Workflow token permissions not restricted (.github/workflows/ci.yml)

## Architecture

- 0 containers · 1 bounded contexts · 0 dependency edges (baseline)
