# Changelog

## Score

- CAI 62 → 64 (+1.1)
- Rubric changed (rubric-2026.09.10 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 92 → 92 (-0.7)
- Architecture 100 → 99 (-1.5)
- Maturity 46 → 46 (+0.0)
- Readiness 66 → 68 (+2.6)
- Security 76 → 84 (+8.0)
- Performance 89 (new)

## Resolved (3)

- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)

## New (16)

- Documentation: no architecture or design documentation (README.md)
- Duplicated block (14 lines × 3) (granian/server/embed.py)
- Duplicated block (15 lines × 2) (granian/cli.py)
- Duplicated block (15 lines × 2) (granian/server/mp.py)
- Duplicated block (15 lines × 8) (granian/server/mp.py)
- Duplicated block (16 lines × 4) (granian/server/mp.py)
- Duplicated block (17 lines × 2) (granian/rsgi.py)
- Duplicated block (17 lines × 3) (granian/server/mp.py)
- Duplicated block (17 lines × 3) (granian/server/mt.py)
- Duplicated block (20 lines × 3) (granian/server/embed.py)
- Duplicated block (21–22 lines × 2) (granian/server/mp.py)
- Duplicated block (27 lines × 2) (granian/server/embed.py)
- Duplicated block (5 lines × 2) (src/asgi/callbacks.rs)
- Duplicated block (7 lines × 2) (granian/server/common.py)
- Low cohesion: Worker (LCOM4 5) (src/workers.rs)
- Members sharing a duplicated core (8 members, 50+ identical tokens) (granian/server/mp.py)

## Changes since last survey

- 5 commits — 4 feature/other, 1 fixes

## By area

- (root) — 2 commits
- granian/asgi.py — 1 commit
- granian/server — 1 commit
- src/asgi — 1 commit

## Notable commits

- fix: Fix query-string encoding in ASGI access log (close #920)
- change: Bump dependencies
- change: Bump version to 2.8.4
- change: Fix IPv6 formatting in server log (#919)
- change: Refactor disconnection guards (#926)

## Architecture

- Unchanged — 0 containers · 1 contexts · 0 edges
