# Changelog

## Score

- CAI 72 → 75 (+2.8)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 87 → 87 (-0.0)
- Architecture 100 → 98 (-1.7)
- Maturity 68 → 68 (+0.0)
- Readiness 64 → 70 (+6.0)
- Security 85 → 90 (+4.6)
- Performance 100 (new)

## Resolved (3)

- Dependency hygiene PARTLY measured — npm pinning read, dependency currency not (no pnpm-resolved versions to grade)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)

## New (7)

- Dependency hygiene PARTLY measured — Cargo dependencies read, dependency currency not (crates.io unreachable)
- Inconsistent naming for options-based methods. The `with_options` suffix is used here, but in `StreamableParser`, the options are passed via a separate constructor `new_with_options`. While not a direct duplicate, the API surface mixes patterns: some methods take options as a parameter (`parse..._with_options`), while others require a separate builder/constructor step (`StreamableParser.new_with_options`). This inconsistency in how optional parameters are handled across the module is confusing.
- Low cohesion: HarmonyEncoding (LCOM4 4) (src/encoding.rs)
- Medium vulnerability: RUSTSEC-2026-0285 (Cargo.lock)
- Naming inconsistency in 'into' variants. `render_conversation_into` does not take a `next_turn_role`, while `render_conversation_for_completion_into` does. It is unclear if `render_conversation_into` is a generic version or if it defaults to a specific role. The naming suggests `render_conversation` is the generic form, but the existence of a specific `for_completion` variant with an extra parameter creates ambiguity about when to use which.
- Redundant constructors with overlapping intent. `Author` contains a `Role`. Creating a message from an `Author` is functionally equivalent to creating one from a `Role` (plus potentially a name, but `Message` has a separate `recipient` field, not `name`). This forces the user to choose between two nearly identical paths.
- Same inconsistency as above but for the non-`_into` variants. `render_conversation` vs `render_conversation_for_completion`.

## Architecture

- Unchanged — 0 containers · 1 contexts · 0 edges
