# Changelog

## Score

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

## Lenses

- Code Health 76 → 62 (-14.1)
- Architecture 89 → 89 (+0.1)
- Maturity 67 → 63 (-3.8)
- Readiness 59 → 59 (+0.0)
- Security 76 → 44 (-31.3)
- Domain Modelling 100 → 100 (+0.0)

## Resolved (4)

- Ambiguous broadcast semantics: `Rage.Cable.broadcast` takes a stream name (string), while `Rage.Cable.Channel.broadcast` takes a streamable object (which resolves to a stream). `Base.broadcast` takes a channel name. This creates confusion about whether the first argument is a raw stream identifier or an object to be converted.
- Inconsistent handling of identification: `initialize` takes `identified_by` as a constructor argument, while `identified_by` is also a public method. It is unclear if `identified_by` is a setter, a getter, or a DSL method for defining identification logic. If it's a DSL, it shouldn't shadow the constructor arg name without clear distinction.
- Redundant naming for identical intent: `stream_from` and `stream_for` appear to do the same thing (subscribing to a stream), differing only in the type of the argument (string vs object). This forces users to guess which method to use based on argument type rather than intent.
- Same redundancy as `stream_from`/`stream_for`. Two methods for unsubscribing from streams based on argument type.

## New (6)

- Ambiguous broadcast API: `Rage.Cable.broadcast` and `Channel.broadcast` appear to do the same thing (broadcasting to a stream), while `Channel.broadcast_to` suggests a different intent (broadcasting to a streamable object). It is unclear if `Channel.broadcast` is a convenience wrapper for `Channel.broadcast_to` or if they serve distinct purposes (e.g., raw stream name vs. resolved streamable).
- Inconsistent argument order: `use` takes `(middleware, args, block)`, while `insert_before` and `insert_after` take `(existing, new_middleware, args, block)`. The position of `args` and `block` relative to the middleware reference changes, which is error-prone for developers.
- Inconsistent handling of connection identification: `Connection.identified_by` takes a list of identifiers (likely for setting up the connection), while `RemoteDisconnect.disconnect` takes a single `identified_by` argument (likely for targeting). The naming `identified_by` as a method on Connection is also confusing compared to standard Rails ActionCable where `identified_by` is a class-level declaration.
- Inconsistent parameter ordering in backend methods: `add_task` has `task` first, while `add_dead_task` has `task_id` first. This inconsistency makes it difficult to write generic backend wrappers or switch implementations.
- ParamsParser.prepare (cognitive 16) (lib/rage/params_parser.rb)
- ParamsParser.prepare (cyclomatic 17) (lib/rage/params_parser.rb)

## Changes since last survey

- 16 commits — 15 feature/other, 1 fixes

## By area

- lib/rage — 10 commits
- (root) — 2 commits
- spec/integration — 2 commits
- (repo) — 1 commit
- spec/cable — 1 commit

## Notable commits

- fix: Fix merge conflict
- change: Bump version
- change: Gracefully handle requests with no content type (#405)
- change: Gracefully handle requests with no content type (#405)
- change: Improve cleanup mechanism for daemons (#410)
- change: Merge branch 'release/v1.28.1' into main
- change: PubSub updates (#407)
- change: Remove websocket-client-simple from test dependencies (#408)
- change: Skip `FiberWrapper` when building application from non-root fiber (#413)
- change: Support `unsubscribe` commands (#404)
- change: Support `unsubscribe` commands (#404)
- change: Support extending routes (#414)
- change: Support multiple isolated cable apps (#406)
- change: [Cable] Remote disconnect (#409)
- change: [Cable] Support `allow_same_origin_as_host` (#412)
- change: [Deferred] Dead task listing (#403)
