# Changelog

> **This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.**

## Score

- CAI 71 → 73 (+2.2)

## Lenses

- Code Health 88 → 88 (+0.0)
- Architecture 91 → 89 (-1.6)
- Maturity 58 → 62 (+4.6)
- Readiness 80 → 81 (+0.8)
- Security 78 → 78 (+0.0)
- Performance 100 → 100 (+0.0)

## Resolved (46)

- Inconsistent naming convention for synchronous vs asynchronous/streaming operations. Most other endpoints use a single method name with overloads or distinct suffixes like 'Stream' or 'Streaming' (e.g., 'audioTranscriptions' vs 'audioTranscriptionStream'), but here 'chats' is used for both sync and stream, relying on return type differentiation which is less explicit in the signature list.
- Low coverage: Sources/OpenAI/OpenAI.swift (Sources/OpenAI/OpenAI.swift)
- Low coverage: Sources/OpenAI/Private/CancellablesFactory.swift (Sources/OpenAI/Private/CancellablesFactory.swift)
- Low coverage: Sources/OpenAI/Private/ChatQuery+CustomStringConvertible.swift (Sources/OpenAI/Private/ChatQuery+CustomStringConvertible.swift)
- Low coverage: Sources/OpenAI/Private/Client/AsyncClient.swift (Sources/OpenAI/Private/Client/AsyncClient.swift)
- Low coverage: Sources/OpenAI/Private/DescribedError.swift (Sources/OpenAI/Private/DescribedError.swift)
- Low coverage: Sources/OpenAI/Private/Extensions for generated code/Schemas+Description.swift (Sources/OpenAI/Private/Extensions for generated code/Schemas+Description.swift)
- Low coverage: Sources/OpenAI/Private/StreamableQuery.swift (Sources/OpenAI/Private/StreamableQuery.swift)
- Low coverage: Sources/OpenAI/Private/Streaming/AudioSpeechStreamInterpreter.swift (Sources/OpenAI/Private/Streaming/AudioSpeechStreamInterpreter.swift)
- Low coverage: Sources/OpenAI/Private/Streaming/ServerSentEventsStreamingSessionFactory.swift (Sources/OpenAI/Private/Streaming/ServerSentEventsStreamingSessionFactory.swift)
- Low coverage: Sources/OpenAI/Private/Streaming/SessionInvalidator.swift (Sources/OpenAI/Private/Streaming/SessionInvalidator.swift)
- Low coverage: Sources/OpenAI/Private/URLSessionDataDelegateForwarder.swift (Sources/OpenAI/Private/URLSessionDataDelegateForwarder.swift)
- Low coverage: Sources/OpenAI/Private/URLSessionDataTaskStore.swift (Sources/OpenAI/Private/URLSessionDataTaskStore.swift)
- Low coverage: Sources/OpenAI/Private/URLSessionFactory.swift (Sources/OpenAI/Private/URLSessionFactory.swift)
- Low coverage: Sources/OpenAI/Private/URLSessionProtocol+MakeDataTask.swift (Sources/OpenAI/Private/URLSessionProtocol+MakeDataTask.swift)
- Low coverage: Sources/OpenAI/Private/URLSessionProtocol.swift (Sources/OpenAI/Private/URLSessionProtocol.swift)
- Low coverage: Sources/OpenAI/Public/Errors/GeminiAPIError.swift (Sources/OpenAI/Public/Errors/GeminiAPIError.swift)
- Low coverage: Sources/OpenAI/Public/JSONSchema/AnyJSONDocument.swift (Sources/OpenAI/Public/JSONSchema/AnyJSONDocument.swift)
- Low coverage: Sources/OpenAI/Public/JSONSchema/JSONSchemaField.swift (Sources/OpenAI/Public/JSONSchema/JSONSchemaField.swift)
- Low coverage: Sources/OpenAI/Public/JSONSchema/JSONSchemaInstanceType.swift (Sources/OpenAI/Public/JSONSchema/JSONSchemaInstanceType.swift)
- …and 26 more

## New (9)

- High: security finding (details withheld)
- Off-boarding risk: anonymized user #1
- Orphaned file (Sources/OpenAI/Public/Models/AudioSpeechQuery.swift)
- Orphaned file (Sources/OpenAI/Public/Models/EmbeddingsQuery.swift)
- Orphaned file (Sources/OpenAI/Public/Models/ImageEditsQuery.swift)
- Orphaned file (Sources/OpenAI/Public/Models/ImagesQuery.swift)
- Orphaned file (Sources/OpenAI/Public/Models/ModerationsResult.swift)
- Orphaned file (Sources/OpenAI/Public/Schemas/Edited/ResponseMCPCallArgumentsDeltaEvent.swift)
- Orphaned file (Sources/OpenAI/Public/Schemas/Edited/ResponseMCPCallArgumentsDoneEvent.swift)

## Changes since last survey

- 43 commits — 42 feature/other, 1 fixes

## By area

- Demo/DemoChat — 22 commits
- (root) — 10 commits
- (repo) — 5 commits
- .github/workflows — 4 commits
- .claude/skills — 2 commits

## Notable commits

- fix: CHANGELOG: date 0.6.0 today and list this PR's Demo fixes
- change: Ask agents to handle errors instead of discarding them with try?
- change: Ask agents to make types testable through dependency injection
- change: Ask agents to open PR descriptions with the main changes
- change: Ask agents to reply to review comments only after pushing the change
- change: Ask agents to run xcodebuild test without post-failure diagnostics
- change: CONTRIBUTING: use a placeholder for the tag in the API breakage check
- change: Cover the Demo Files screen in the release check
- change: Demo: cancel the upload when the upload sheet is dismissed
- change: Demo: clear a Files error only from the alert that showed it
- change: Demo: don't report a cancelled file list request as an error
- change: Demo: don't send an upload to a client that replaced the original
- change: Demo: don't throw when a file's request is cancelled
- change: Demo: explain why the released-pacer test exists
- change: Demo: fail sleepUntil after a timeout, at the call site
- change: Demo: hold the file read in the client-switch upload test
- change: Demo: keep the file list in sync with uploads and deletions
- change: Demo: keep the upload sheet open when an upload fails
- change: Demo: let ChatMessagesPacer handle cancellation of its own task
- change: Demo: pace chat message updates in the views to what ExyteChat can apply
- …and 23 more

## Architecture

- Unchanged — 0 containers · 1 contexts · 0 edges
