<feed xmlns='http://www.w3.org/2005/Atom'>
<title>domain-dig.git/DomainDig.xcodeproj/xcshareddata/xcschemes, 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-25T03:52:53+00:00</updated>
<entry>
<title>test: establish unit-test net for the deterministic core (v5 step 1)</title>
<updated>2026-07-25T03:52:53+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-25T00:27:24+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=a7d154e1db9fd9904b2255db889144ad15aac2f2'/>
<id>urn:sha1:a7d154e1db9fd9904b2255db889144ad15aac2f2</id>
<content type='text'>
Stands up the DomainDigTests unit-test target the v5.0.0 roadmap flags as the
mandatory first move before decomposing the god-files and locking external
contracts. The project had no XCTest unit target — only the DomainDigUITests
accessibility suite.

- New DomainDigTests target (unit_test_bundle), hosted by the app so
  @testable import DomainDig links. Mirrors the UITests build settings
  (SWIFT_VERSION 5.0 + MainActor default isolation) to avoid the XCTest
  override-isolation issue recorded for the Swift 6 targets. Wired into the
  shared DomainDig scheme's Test action, so it runs in CI and the pre-push
  audit hook automatically (both invoke the whole scheme).

- SnapshotFixture builds the deep LookupSnapshot/DomainReport models through
  their real initializer and the DomainReportBuilder, exposing only the fields
  the tests vary.

- 36 characterization tests across the four deterministic units the roadmap
  names:
  - DiffService: change classification, case/whitespace normalization, DNS
    record reorder-vs-change, summary phrasing, resolver context note,
    certificate-warning thresholds.
  - DomainReportBuilder: snapshot -&gt; report field mapping, primary-IP and
    DNSSEC derivation, TLS status, partial-snapshot/validation passthrough.
  - DomainReportExporter: format dispatch, JSON round-trip (the machine
    contract), CSV/markdown/text/PDF structural invariants, timeline.
  - DomainDataPortabilityService: CSV round-trip and the merge/dedup semantics
    (case-insensitive collapse, OR-merged pin state, min-created/max-updated,
    recency sort) via an ephemeral UserDefaults suite.

- build.yml comment updated to reflect the second test target.
</content>
</entry>
<entry>
<title>feat(a11y): add accessibility audit harness (#21 phase 0)</title>
<updated>2026-07-20T22:55:24+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T22:21:03+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=38723030eb0db58a9d62a45c7725861901309a05'/>
<id>urn:sha1:38723030eb0db58a9d62a45c7725861901309a05</id>
<content type='text'>
Phase 0 of the accessibility pass: a regression guard that must exist
before any of the remedial phases, so their acceptance criteria are
enforced rather than asserted once by hand.

- Fix the project-level IPHONEOS_DEPLOYMENT_TARGET, which was 26.2 while
  all three targets are 17.6. It was shadowed everywhere today, but any
  target added later would silently inherit it and drop iOS 17.6 support
  with no error.

- Add a DomainDigUITests target running performAccessibilityAudit on the
  six primary screens, plus a sweep of every root screen at
  AccessibilityXXXL. Uses the existing DOMAIN_DIG_FORCE_PRO_PLUS debug
  argument so Pro-gated screens are reachable.

- Findings are reported, not failed. The audit surfaces violations that
  exist today, so gating on them would block unrelated PRs until the
  whole pass lands. Enforcement is a committed constant,
  AccessibilityAuditHarness.enforcedAuditTypes, widened per audit type as
  each phase clears a category.

- CI now runs xcodebuild test across two simulators. Audit coverage is
  not nested between OS versions: on Tracked Domains, iOS 18.6 reported 2
  findings and iOS 27.0 reported 6 (including contrast and
  element-detection issues 18.6 never raised), while at accessibility
  text sizes the Dashboard produced a hit-region finding on 18.6 that
  27.0 did not.

- Simulator selection is now dynamic and floor-aware. The previous
  selector took the first iPhone from any runtime, which can resolve to a
  simulator below the deployment target where the app cannot install.

Baseline on iOS 18.6: 15 findings across 7 tests — text clipping on every
screen, contrast on Inspect and Settings, and a hit-region failure on the
Dashboard at accessibility text sizes.
</content>
</entry>
<entry>
<title>chore: rename StoreKit configuration to SyncedProducts.storekit</title>
<updated>2026-07-20T20:52:38+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T20:47:24+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=d9bd61cc745b3f1d6ff481fd300abf3216d07d48'/>
<id>urn:sha1:d9bd61cc745b3f1d6ff481fd300abf3216d07d48</id>
<content type='text'>
DomainDig.storekit sat beside the DomainDig/ source folder, and Xcode
treated the two as conflicting when creating the synced configuration —
the resulting confirmation dialog offered to replace the folder. Naming
the file SyncedProducts.storekit removes the collision entirely and
matches the convention Xcode uses for synced configurations elsewhere.

Updates the project file reference and the scheme's
StoreKitConfigurationFileReference to match.
</content>
</entry>
<entry>
<title>fix: StoreKit config path and Swift 6 concurrency warnings</title>
<updated>2026-07-20T20:52:38+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T20:29:50+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=f834c8a8223c40bd17b90be8f6ab7db843d0914c'/>
<id>urn:sha1:f834c8a8223c40bd17b90be8f6ab7db843d0914c</id>
<content type='text'>
The StoreKitConfigurationFileReference added in #11 used one '../' too
many, resolving outside the repository. Xcode resolves it relative to
the .xcodeproj's xcshareddata directory, so two levels reaches the repo
root.

SweepActivityAttributes is now explicitly nonisolated. The app target
sets SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor while the widget target
does not, so a type shared by both inferred a main-actor-isolated
ActivityAttributes conformance that ActivityKit cannot use from its
concurrent contexts.

LocalAPIService's logger closures captured self strongly while their
inner Tasks declared [weak self]. The weak capture is now on the outer
closure and bound before the Task, so the concurrently-executing closure
references an immutable strong local rather than the weak capture.
</content>
</entry>
<entry>
<title>test: add StoreKit configuration for local IAP testing</title>
<updated>2026-07-20T20:07:40+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T19:08:09+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=b5d67f42b7f7e009eb60a80857a306414117969f'/>
<id>urn:sha1:b5d67f42b7f7e009eb60a80857a306414117969f</id>
<content type='text'>
Adds DomainDig.storekit mirroring the App Store Connect setup: one
subscription group with Pro+ at level 1 and Pro at level 2, using the
corrected product IDs.

Wires it into the Run action so purchases resolve locally against
StoreKit instead of the App Store, and disables the
DOMAIN_DIG_FORCE_PRO_PLUS launch argument, which bypasses StoreKit
entirely and would mask whether the purchase path works.

Prices in the configuration are local-testing placeholders and do not
need to match App Store Connect.
</content>
</entry>
<entry>
<title>DomainDig v3.8.0 — Smart Monitoring</title>
<updated>2026-04-24T20:04:54+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-24T20:04:54+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22'/>
<id>urn:sha1:3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22</id>
<content type='text'>
* Stable domain intervals
* Frequent changes decrease intervals
* Duplicate states do not trigger alerts
* Quiet hours suppress alerts
* Quiet hours across midnight work correctly
* Sensitivity levels alter behavior as expected
</content>
</entry>
</feed>
