<feed xmlns='http://www.w3.org/2005/Atom'>
<title>domain-dig.git/RELEASE_ROADMAP.md, 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-25T17:19:37+00:00</updated>
<entry>
<title>feat: owner Pro+ allowlist via CloudKit, cut v5.0.1</title>
<updated>2026-07-25T17:19:37+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-25T17:14:58+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=963ce3fb34bd6c6bd72f1aa956ce602267b90e9c'/>
<id>urn:sha1:963ce3fb34bd6c6bd72f1aa956ce602267b90e9c</id>
<content type='text'>
Grants the app owner Pro+ without a purchase, keyed to their CloudKit
user-record ID so it works on the release App Store build.

- OwnerAccess holds the owner's CloudKit user-record ID (opaque, per-Apple-ID,
  scoped to the app's container; safe to publish — CloudKit verifies identity
  server-side, so it can't be presented by anyone else).
- PurchaseService resolves the allowlist against CloudKit once per launch and,
  on a match, records a persisted owner grant so it applies instantly and
  offline thereafter. The grant only ever elevates the tier to .proPlus and
  defers to the existing #if DEBUG overrides, so real purchases and free/pro
  testing are unaffected. cachedTier / cachedEntitlement were refactored to
  fall back to the owner grant only when no debug override or stored purchase
  applies.
- Supersedes the DEBUG record-ID reveal (PR #60): its only purpose was to read
  the owner's ID, which is now hardcoded, so the reveal is not shipped.

Release cut: MARKETING_VERSION 5.0.0 -&gt; 5.0.1, CURRENT_PROJECT_VERSION 45 -&gt; 46,
AppVersion.current -&gt; 5.0.1, roadmap updated. App builds clean; unit suite 63/63.
</content>
</entry>
<entry>
<title>chore: cut v5.0.0 release (version bump)</title>
<updated>2026-07-25T16:18:41+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-25T05:31:51+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=cc1cb343b19b662ef59f9700702ed285e4591029'/>
<id>urn:sha1:cc1cb343b19b662ef59f9700702ed285e4591029</id>
<content type='text'>
Bumps the app to 5.0.0 now that all four v5.0.0 workstreams have landed:

- AppVersion.current 4.9.0 -&gt; 5.0.0
- MARKETING_VERSION 4.9.0 -&gt; 5.0.0 across all targets (app, widget, share
  extension, and both test bundles)
- CURRENT_PROJECT_VERSION 44 -&gt; 45 across all targets
- RELEASE_ROADMAP.md: v5.0.0 marked shipped, "Current version" -&gt; v5.0.0

The three version sources are kept in lockstep, matching the v4.4.1 alignment
policy. App Store archive/submit remains a manual step outside the repo.
</content>
</entry>
<entry>
<title>docs: mark v5.0.0 engineering complete in the roadmap</title>
<updated>2026-07-25T05:29:18+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-25T05:28:29+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=e818eefdeeee202784f14a01f62ef6fc7ac40935'/>
<id>urn:sha1:e818eefdeeee202784f14a01f62ef6fc7ac40935</id>
<content type='text'>
All four v5.0.0 workstreams have landed on main: the deterministic-core test net
(#43), the Local API v1 contract (#45), the versioned store-migration policy
(#46), and the god-file decomposition (#47-#53, DomainViewModel 4864-&gt;4170 and
ContentView 3881-&gt;1625). Rewrites the v5.0.0 section to record what shipped per
item with PR references, notes the inspection-core split is deferred as a design
change rather than a mechanical move, and lists cutting the release (version
bump + submission) as the only remaining step. Refreshes the now-stale
cross-cutting note (the "no XCTest target" gap was closed first).
</content>
</entry>
<entry>
<title>docs: repair roadmap references after the verification-doc cleanup</title>
<updated>2026-07-24T05:20:45+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-24T03:44:34+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=2279dfa7c479d28b2560c1baaa13e4cf17b2eef7'/>
<id>urn:sha1:2279dfa7c479d28b2560c1baaa13e4cf17b2eef7</id>
<content type='text'>
The docs cleanup removed Docs/ACCESSIBILITY_VERIFICATION.md and the
results doc, but the v4.9.0 roadmap entry still linked to the checklist
in two places — dead links, and with issue #21 now closed the roadmap is
the only durable record left.

- Both dangling links removed.
- The deferred list was stale in the other direction too: it listed the
  Liquid Glass runtime check as outstanding, but PR #38 ran it on
  simulator alongside the classic-chrome floor. It now names only what a
  Simulator genuinely cannot do — VoiceOver speech and the rotor, Voice
  Control, iPad Full Keyboard Access, Smart Invert — and notes that the
  underlying accessibility metadata is asserted in tests even though its
  spoken output is not.
- Records the Phase 6 verification work itself (#38), which landed after
  the v4.9.0 entry was written: the metadata and screenshot test suites,
  the middle-band Dynamic Type sweep, and the enforced iOS 27.0
  dynamicType finding it caught.

Verified the suppression that finding produced rather than taking it on
trust: it is scoped to .dynamicType plus an exact allowlist of the five
Settings section titles, all of which are plain `Section("…")` with no
app-applied font, so UIKit owns the scaling. Enforcement on
app-controlled text is intact.
</content>
</entry>
<entry>
<title>chore: bump to v4.9.0; record the release in the roadmap</title>
<updated>2026-07-23T05:42:28+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-23T04:26:48+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=655d11b59a273c14720952478ccebec20a9627bd'/>
<id>urn:sha1:655d11b59a273c14720952478ccebec20a9627bd</id>
<content type='text'>
MARKETING_VERSION 4.8.3 -&gt; 4.9.0 and CURRENT_PROJECT_VERSION 43 -&gt; 44
across all targets, with AppVersion.current aligned — the three-way
consistency v4.4.1 established.

The roadmap gains the v4.9.0 entry: the full accessibility pass (#21
phases 0-5 — semantic colours, light mode and the appearance setting,
Dynamic Type reflow and tap targets, VoiceOver, colour independence and
motion/transparency), the audit harness with seeded fixtures and the
engaged enforcement ratchet, the manual verification checklist, and
Swift 6 language mode adoption (#27). Deferred device passes are named
rather than implied.

The v5.0.0 "establish a test target" bullet is rewritten to match
reality: a UI test target now exists with an enforcement gate; what
remains for v5.0.0 is unit coverage of the deterministic core.
</content>
</entry>
<entry>
<title>v4.8.3: Clear SonarCloud new-code issues</title>
<updated>2026-07-20T21:27:59+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T21:22:28+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=bb18197860ffdb491f010648ec903003b6e1bb65'/>
<id>urn:sha1:bb18197860ffdb491f010648ec903003b6e1bb65</id>
<content type='text'>
Fixes the 4 reported bugs and ~97 code smells flagged in the new-code
period. No behavior changes.

Bugs (swift:S3923) — DomainInspectionService's confidenceFor* helpers each
returned `error == nil ? .low : .low`, an inert conditional. Simplified to
`return .low` and dropped the now-unused `error` parameter.

Smells:
- Merged 14 identical `.empty`/`.error` switch branches in DomainViewModel
- Consolidated duplicate implementations (clearPresentedResults/reset,
  String.nonEmpty/nilIfEmpty, ExportFormat.id/fileExtension)
- Extracted nested ternaries into TLSGrade.tone, EmailSecurityGrade.tone,
  and ChangeImpactClassification.color; removed ContentView.impactColor
  and the duplicate mapping in BatchResultsView
- Documented empty closures and singleton inits
- Marked unused protocol-conformance parameters `_`
- Renamed CloudSyncTrigger.`import` to `imported` (raw value preserved)
  and SSLSessionDelegate's _serverTrust/_tlsMetadata
- Merged nested ifs in the DER parser; flattened closure nesting in
  PortScanService and IntegrationService
- Replaced two-case switches with if/else

Left open: S107 (init parameter counts), S115 (constants mirroring DoH and
ipapi JSON keys), S1075 (false positives on https:// literals), and two
S117 hits on SwiftUI $binding shorthand. These want a Won't Fix resolution
in SonarCloud, not a code change.
</content>
</entry>
<entry>
<title>v4.8.2: Bump version and mark shipped in roadmap</title>
<updated>2026-07-20T20:54:10+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T20:54:00+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=28f6ed976a3397e794371e5587c85e5207c62b63'/>
<id>urn:sha1:28f6ed976a3397e794371e5587c85e5207c62b63</id>
<content type='text'>
Bump AppVersion/marketing version to 4.8.2 and build number to 42 across the
app, widget, and share extension targets. Mark v4.8.2 (delivery visibility for
disabled integrations, forced queue retries, unreachable-domain reporting,
Swift 6 concurrency warnings, synced StoreKit configuration) shipped in
RELEASE_ROADMAP.md and record the UAT follow-ups as resolved.
</content>
</entry>
<entry>
<title>docs: record the IAP fixes in the v4.8.1 roadmap section</title>
<updated>2026-07-20T20:12:24+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T20:10:44+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=b4147fe8f14d900c5c87f5fc4129f79884bb92b1'/>
<id>urn:sha1:b4147fe8f14d900c5c87f5fc4129f79884bb92b1</id>
<content type='text'>
PR #11 merged after the v4.8.1 version bump, so the roadmap's v4.8.1
section omitted the product ID correction and the StoreKit configuration
file. Both are in the 4.8.1 tree; document them alongside the other
fixes.
</content>
</entry>
<entry>
<title>v4.8.1: Bump version and mark shipped in roadmap</title>
<updated>2026-07-20T20:07:16+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T20:05:19+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=d69aa35d8843e45e1d13bae82259043787a661b0'/>
<id>urn:sha1:d69aa35d8843e45e1d13bae82259043787a661b0</id>
<content type='text'>
Bump AppVersion/marketing version to 4.8.1 and build number to 41 across the
app, widget, and share extension targets. Mark v4.8.1 (scheduled report tap
target, completed Pro gate, markdown underline rendering, DNS record dedup,
inspect tab keyboard behavior) shipped in RELEASE_ROADMAP.md, and note the
three follow-ups filed during UAT.
</content>
</entry>
<entry>
<title>v4.8.0: Bump version and mark shipped in roadmap</title>
<updated>2026-07-20T18:56:41+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-17T16:20:50+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=6e9dea95d015c0f2d335d9b89b8ee843b4c2b05e'/>
<id>urn:sha1:6e9dea95d015c0f2d335d9b89b8ee843b4c2b05e</id>
<content type='text'>
Bump AppVersion/marketing version to 4.8.0 and build number to 40 across the
app, widget, and share extension targets. Mark v4.8.0 (markdown/PDF export,
scheduled reports, stronger share affordances, verified local API consistency)
shipped in RELEASE_ROADMAP.md.
</content>
</entry>
</feed>
