<feed xmlns='http://www.w3.org/2005/Atom'>
<title>domain-dig.git/DomainDig/HTTPHeadersService.swift, branch v5.0.1</title>
<subtitle>local-first ios domain inspection toolkit. dns, tls, rdap, audit.
</subtitle>
<id>http://git.krz.sh/krz/domain-dig.git/atom?h=v5.0.1</id>
<link rel='self' href='http://git.krz.sh/krz/domain-dig.git/atom?h=v5.0.1'/>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/'/>
<updated>2026-07-23T04:23:11+00:00</updated>
<entry>
<title>fix: adopt Swift 6 language mode; resolve all concurrency issues (#27)</title>
<updated>2026-07-23T04:23:11+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-23T02:43:42+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=872583eca8b4e7ae6ef85917604d4a5257b9d125'/>
<id>urn:sha1:872583eca8b4e7ae6ef85917604d4a5257b9d125</id>
<content type='text'>
All three product targets (app, widget, share extension) now build under
SWIFT_VERSION = 6.0 with zero errors and zero warnings. The UITests
target stays on 5.0: XCTestCase's nonisolated setUp/init overrides
conflict with the target's MainActor default isolation under 6, and test
tooling is not shipping code.

The original seven diagnostics, plus the layers Swift 6 mode surfaced
once those cleared:

- SMTPChannel is an actor. It was implicitly MainActor while running its
  receive loop on a background queue, so parsedLines/lineWaiters/
  receiveBuffer were declared main-actor-protected and mutated off it —
  concurrent mutation while resuming a CheckedContinuation can
  double-resume, which traps. The actor serialises all state; Network
  callbacks hop in via Task. The start() continuation also gains an
  OSAllocatedUnfairLock resume-once guard: the state handler can fire
  .ready and later .failed, and resuming twice was a pre-existing trap of
  the same family.
- CachedLookupResult is nonisolated (a value pair built inside actor
  LookupRuntime cannot have a MainActor-bound memberwise init) with
  conditional Sendable — opting out of MainActor isolation also opted out
  of the implicit Sendable that globally-isolated types get.
- PortScanService.printableBanner is nonisolated: a pure transformation
  called from the connection's queue.
- SweepActivityController stores the activity's Sendable id instead of
  the non-Sendable Activity, re-resolving via Activity.activities inside
  each fire-and-forget task, so nothing non-Sendable crosses isolation.
- App Intents' static title/description/openAppWhenRun become lets
  (get-only protocol requirements; static var is shared mutable global
  state), and the summary helpers are @MainActor to match the model
  properties they read and the perform() implementations that call them.
- ExternalDataService's ISO8601DateFormatter is nonisolated(unsafe),
  citing Apple's documented thread-safety, rather than risking a parser
  behaviour change by switching APIs with no test coverage.
- TaskMetricsDelegate.metrics is nonisolated(unsafe): written on the
  session's delegate queue, read only after the request completes, and
  URLSession guarantees didFinishCollecting precedes task completion.
- The share extension extracts the host via async/withCheckedContinuation
  instead of sending a non-Sendable completion into loadItem's @Sendable
  handler; Task inherits the view controller's MainActor so the manual
  DispatchQueue.main hop goes too.

Validated: clean Swift 6 build of all product targets, and the full
enforced 11-test audit suite green on the floor runtime — Swift 6's
runtime isolation checks ran the app through every screen without a
trap.
</content>
</entry>
<entry>
<title>feat(v1.8): improve result structure, history, and consistency</title>
<updated>2026-04-20T20:28:12+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-20T20:28:12+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=ee2520f2c0c2d806fd284c3d6b8a81a3822f5270'/>
<id>urn:sha1:ee2520f2c0c2d806fd284c3d6b8a81a3822f5270</id>
<content type='text'>
- normalize sections and add summary card
- fix resolver usage in reverse DNS
- include custom port scans in history/export
- standardize error handling
- decompose ContentView into smaller views
</content>
</entry>
<entry>
<title>fix(services): rename unused URLSession delegate params to _</title>
<updated>2026-04-04T00:04:08+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-04T00:04:08+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=21576b75478e2a1ff7a2b189e83bcca97403cce3'/>
<id>urn:sha1:21576b75478e2a1ff7a2b189e83bcca97403cce3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add HTTP header grading and protocol metadata</title>
<updated>2026-04-03T22:14:00+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-03T22:14:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=2c38b5edee339e5fe9060a835d9772a71606dc85'/>
<id>urn:sha1:2c38b5edee339e5fe9060a835d9772a71606dc85</id>
<content type='text'>
</content>
</entry>
<entry>
<title>realigning commits</title>
<updated>2026-03-18T16:59:38+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-03-18T16:59:38+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=376e7b55b4a0c4f54faa0c2828dea4fd17dff288'/>
<id>urn:sha1:376e7b55b4a0c4f54faa0c2828dea4fd17dff288</id>
<content type='text'>
</content>
</entry>
</feed>
