# Changelog

## Score

- CAI 68 → 70 (+1.7)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 99 → 99 (+0.0)
- Architecture 70 → 93 (+22.7)
- Maturity 55 → 55 (+0.0)
- Readiness 77 → 71 (-5.9)
- Security 92 → 92 (+0.0)

## Resolved (4)

- Dependency hygiene PARTLY measured — SwiftPM pinning read, dependency currency NOT established
- Documentation: no contributor guidance (README.md)
- Documentation: no usage examples (README.md)
- Hotspot: Sources/Queuer/AsyncConcurrentOperation.swift (Sources/Queuer/AsyncConcurrentOperation.swift)

## New (4)

- Duplicate intent across sibling types. Both Async and Concurrent operations expose an identical 'retry()' method. While the underlying implementation differs (async vs sync), the public API surface is identical, which is acceptable, BUT combined with 'manualRetry' property, it creates confusion: should the user call 'retry()' or set 'manualRetry = true' and let the system handle it? The API doesn't clearly distinguish between automatic retry logic and manual intervention.
- Inconsistent abstraction levels. The API allows adding raw closures directly to the queue alongside explicit Operation objects. This bypasses the 'AsyncConcurrentOperation' or 'ConcurrentOperation' wrappers, leading to inconsistent handling of lifecycle events (pause, resume, cancel, retry) for closure-based tasks versus object-based tasks.
- Naming and signature inconsistency. 'addChainedOperations' has two overloads (array vs single) which is acceptable, but 'addChainedAsyncOperations' is a separate method name for async completion. This forces users to choose between method names based on the completion handler's signature rather than the operation type. It also implies that 'addChainedOperations' only supports synchronous completion, which is a confusing constraint.
- Redundant lifecycle methods. In standard Operation patterns, 'start' initiates execution. Having both 'start' and 'execute' suggests ambiguity about which method triggers the actual work or if they are interchangeable aliases.
