# Changelog

## Score

- CAI 66 → 67 (+1.0)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 99 → 99 (-0.4)
- Architecture 90 → 86 (-4.0)
- Maturity 55 → 80 (+25.6)
- Readiness 55 → 48 (-6.9)
- Security 92 → 82 (-10.0)

## Resolved (5)

- Documentation: no installation or build instructions (README.md)
- Documentation: no licence statement (README.md)
- Documentation: no usage examples (README.md)
- Members sharing a duplicated core (11 members, 50+ identical tokens) (Sources/FeedKit/Feeds/Atom/AtomFeed.swift)
- Orphaned files with no living knowledge

## New (37)

- Duplicated block (11 lines × 2) (Sources/FeedKit/Namespaces/DublinCore/DublinCore.swift)
- Duplicated block (13 lines × 2) (Sources/FeedKit/Namespaces/Media/MediaContent.swift)
- Duplicated block (14 lines × 2) (Sources/FeedKit/Feeds/Atom/AtomFeedEntry.swift)
- Duplicated block (22 lines × 2) (Sources/FeedKit/FeedError.swift)
- Duplicated block (32 lines × 2) (Sources/FeedKit/FeedNamespace.swift)
- Duplicated block (5 lines × 2) (Sources/FeedKit/Feeds/Atom/AtomFeedSource.swift)
- Duplicated block (7 lines × 2) (Sources/FeedKit/FeedError.swift)
- Duplicated block (9–10 lines × 2) (Sources/FeedKit/Namespaces/Podcast/PodcastAlternateEnclosure.swift)
- Hotspot: Sources/FeedKit/FeedNamespace.swift (Sources/FeedKit/FeedNamespace.swift)
- Inconsistent method naming for XML serialization. 'toXmlDocument' uses camelCase 'Xml', while 'toXMLString' uses uppercase 'XML'. This is a minor casing inconsistency.
- Inconsistent parameter naming for URL sources. 'url' and 'fileURL' are distinct, but 'remoteURL' is redundant with 'url' (as URLs are generally remote) and inconsistent with the naming convention of 'fileURL'. It creates ambiguity: when should a user pass 'url' vs 'remoteURL'?
- Leaked secret: jwt (Benchmarks/corpus/json-daringfireball.json)
- Low coverage: Sources/FeedKit/FeedError.swift (Sources/FeedKit/FeedError.swift)
- Low coverage: Sources/FeedKit/FeedInitializable.swift (Sources/FeedKit/FeedInitializable.swift)
- Low coverage: Sources/FeedKit/Feeds/Atom/AtomFeedSource.swift (Sources/FeedKit/Feeds/Atom/AtomFeedSource.swift)
- Low coverage: Sources/FeedKit/Namespaces/Media/MediaCopyright.swift (Sources/FeedKit/Namespaces/Media/MediaCopyright.swift)
- Low coverage: Sources/FeedKit/Namespaces/Media/MediaRights.swift (Sources/FeedKit/Namespaces/Media/MediaRights.swift)
- Low coverage: Sources/FeedKit/Namespaces/Media/MediaTag.swift (Sources/FeedKit/Namespaces/Media/MediaTag.swift)
- Low coverage: Sources/FeedKit/Namespaces/Podcast/PodcastAlternateEnclosure.swift (Sources/FeedKit/Namespaces/Podcast/PodcastAlternateEnclosure.swift)
- Low coverage: Sources/FeedKit/Namespaces/Podcast/PodcastImage.swift (Sources/FeedKit/Namespaces/Podcast/PodcastImage.swift)
- …and 17 more

## Changes since last survey

- 24 commits — 20 feature/other, 4 fixes

## By area

- (root) — 8 commits
- Sources/FeedKit — 7 commits
- Sources/XMLKit — 4 commits
- Tests/FeedKitTests — 4 commits
- Benchmarks/corpus — 1 commit

## Notable commits

- fix: Fix JSON accessor names in README (#237)
- fix: Fix RSS parsing when a namespace prefix matches an element name (#215)
- fix: Fix XMLError.cdataDecoding error code (#244)
- fix: Fix crash when serializing a permissive date (#245)
- change: Add Atom XML serialization (#236)
- change: Add a parse benchmark and a performance tracker (#243)
- change: Add architectural review of the FeedKit and XMLKit codebase
- change: Add support for Feed Paging and Archiving (RFC 5005) (#229)
- change: Add support for RDF (RSS 1.0) (#175) (#232)
- change: Add support for the Comment API namespace (#216) (#230)
- change: Add support for the Podcast namespace (#198) (#231)
- change: Add support for the Podlove Simple Chapters (psc) namespace (#201) (#233)
- change: Escape XML text and attribute values when serializing (#234)
- change: Expose JSONFeed.version as public private(set) (#240)
- change: Inspect a longer prefix when detecting the feed type (#226)
- change: Parse feed dates with static ParseStrategy caches (#251 #239)
- change: Prefer text-bearing elements when decoding repeated children (#190) (#227)
- change: Record the 10.9.4 parse benchmark (#252)
- change: Rename FeedType.isJson to isJSON (#238)
- change: Replace placeholder example domains with reserved domains (#210) (#228)
- …and 4 more
