Commit 54c151e22f

54c151e22f8a5d4d7a9c290e79fc7626415f7083

parent: fbf2d9bf2c

Unsigned

cmc <hello@cleberg.net> · 2026-07-17 15:47 UTC

v4.7.0: Bump version and mark shipped in roadmap

Bump AppVersion/marketing version to 4.7.0 and build number to 39 across the
app, widget, and share extension targets. Mark v4.7.0 (comparison, reputation,
tags/saved views) shipped in RELEASE_ROADMAP.md and escalate the overdue
XCTest-target gap ahead of v5.0.0.

Layout: unified · split

DomainDig.xcodeproj/project.pbxproj +12 −12
@@ -495,7 +495,7 @@
495495 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
496496 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements;
497497 CODE_SIGN_STYLE = Automatic;
498 CURRENT_PROJECT_VERSION = 38;
498 CURRENT_PROJECT_VERSION = 39;
499499 DEVELOPMENT_TEAM = ZCNAX3VL9D;
500500 ENABLE_PREVIEWS = YES;
501501 GENERATE_INFOPLIST_FILE = YES;
@@ -512,7 +512,7 @@
512512 "$(inherited)",
513513 "@executable_path/Frameworks",
514514 );
515 MARKETING_VERSION = 4.6.0;
515 MARKETING_VERSION = 4.7.0;
516516 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig;
517517 PRODUCT_NAME = "$(TARGET_NAME)";
518518 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -532,7 +532,7 @@
532532 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
533533 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements;
534534 CODE_SIGN_STYLE = Automatic;
535 CURRENT_PROJECT_VERSION = 38;
535 CURRENT_PROJECT_VERSION = 39;
536536 DEVELOPMENT_TEAM = ZCNAX3VL9D;
537537 ENABLE_PREVIEWS = YES;
538538 GENERATE_INFOPLIST_FILE = YES;
@@ -549,7 +549,7 @@
549549 "$(inherited)",
550550 "@executable_path/Frameworks",
551551 );
552 MARKETING_VERSION = 4.6.0;
552 MARKETING_VERSION = 4.7.0;
553553 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig;
554554 PRODUCT_NAME = "$(TARGET_NAME)";
555555 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -568,7 +568,7 @@
568568 APPLICATION_EXTENSION_API_ONLY = YES;
569569 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements;
570570 CODE_SIGN_STYLE = Automatic;
571 CURRENT_PROJECT_VERSION = 38;
571 CURRENT_PROJECT_VERSION = 39;
572572 DEVELOPMENT_TEAM = ZCNAX3VL9D;
573573 GENERATE_INFOPLIST_FILE = NO;
574574 INFOPLIST_FILE = DomainDigWidget/Info.plist;
@@ -579,7 +579,7 @@
579579 "@executable_path/Frameworks",
580580 "@executable_path/../../Frameworks",
581581 );
582 MARKETING_VERSION = 4.6.0;
582 MARKETING_VERSION = 4.7.0;
583583 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget;
584584 PRODUCT_NAME = "$(TARGET_NAME)";
585585 SKIP_INSTALL = YES;
@@ -597,7 +597,7 @@
597597 APPLICATION_EXTENSION_API_ONLY = YES;
598598 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements;
599599 CODE_SIGN_STYLE = Automatic;
600 CURRENT_PROJECT_VERSION = 38;
600 CURRENT_PROJECT_VERSION = 39;
601601 DEVELOPMENT_TEAM = ZCNAX3VL9D;
602602 GENERATE_INFOPLIST_FILE = NO;
603603 INFOPLIST_FILE = DomainDigWidget/Info.plist;
@@ -608,7 +608,7 @@
608608 "@executable_path/Frameworks",
609609 "@executable_path/../../Frameworks",
610610 );
611 MARKETING_VERSION = 4.6.0;
611 MARKETING_VERSION = 4.7.0;
612612 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget;
613613 PRODUCT_NAME = "$(TARGET_NAME)";
614614 SKIP_INSTALL = YES;
@@ -626,7 +626,7 @@
626626 APPLICATION_EXTENSION_API_ONLY = YES;
627627 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements;
628628 CODE_SIGN_STYLE = Automatic;
629 CURRENT_PROJECT_VERSION = 38;
629 CURRENT_PROJECT_VERSION = 39;
630630 DEVELOPMENT_TEAM = ZCNAX3VL9D;
631631 GENERATE_INFOPLIST_FILE = NO;
632632 INFOPLIST_FILE = DomainDigShareExtension/Info.plist;
@@ -637,7 +637,7 @@
637637 "@executable_path/Frameworks",
638638 "@executable_path/../../Frameworks",
639639 );
640 MARKETING_VERSION = 4.6.0;
640 MARKETING_VERSION = 4.7.0;
641641 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension;
642642 PRODUCT_NAME = "$(TARGET_NAME)";
643643 SKIP_INSTALL = YES;
@@ -655,7 +655,7 @@
655655 APPLICATION_EXTENSION_API_ONLY = YES;
656656 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements;
657657 CODE_SIGN_STYLE = Automatic;
658 CURRENT_PROJECT_VERSION = 38;
658 CURRENT_PROJECT_VERSION = 39;
659659 DEVELOPMENT_TEAM = ZCNAX3VL9D;
660660 GENERATE_INFOPLIST_FILE = NO;
661661 INFOPLIST_FILE = DomainDigShareExtension/Info.plist;
@@ -666,7 +666,7 @@
666666 "@executable_path/Frameworks",
667667 "@executable_path/../../Frameworks",
668668 );
669 MARKETING_VERSION = 4.6.0;
669 MARKETING_VERSION = 4.7.0;
670670 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension;
671671 PRODUCT_NAME = "$(TARGET_NAME)";
672672 SKIP_INSTALL = YES;
DomainDig/AppVersion.swift +1 −1
@@ -2,6 +2,6 @@ import Foundation
22
33enum AppVersion {
44 nonisolated static var current: String {
5 "4.6.0"
5 "4.7.0"
66 }
77}
RELEASE_ROADMAP.md +21 −10
@@ -6,7 +6,7 @@ ports, geolocation, subdomains, availability). The next several releases invest
66in *reach and surfacing* — getting that data onto more iOS surfaces and into more
77workflows — rather than adding raw protocol checks.
88
9Current version: `v4.6.0`.
9Current version: `v4.7.0`.
1010
1111## v4.4.1 Patch: Release Readiness — ✅ shipped
1212
@@ -50,15 +50,23 @@ Goal: make monitoring and results feel first-class across contexts.
5050Deferred: monitoring-alert Live Activities (only the sweep activity shipped) and
5151Lock Screen accessory widget families (carried over from v4.5.0).
5252
53## v4.7.0 Minor: Intelligence & Comparison
53## v4.7.0 Minor: Intelligence & Comparison — ✅ shipped
5454
5555Goal: help users interpret and organize, not just collect.
5656
57- **Domain-vs-domain comparison** (side-by-side), extending the existing
58 time-based `DiffService` to compare two distinct domains.
59- **Reputation / blocklist signals** as a new optional data source (currently
60 absent); surfaced in the report and available to monitoring alerts.
61- **Tags / folders and saved views** for the watchlist to organize large sets.
57- **Domain-vs-domain comparison** — `DiffService.compare(domainA:domainB:)`
58 reuses the existing section-diff builders; `DomainCompareView` (Watchlist
59 toolbar → "Compare Domains") picks two tracked domains and renders the result
60 with the existing diff section UI.
61- **Reputation / blocklist signals** — a new pluggable data source
62 (`ExternalDataService.reputation(domain:)`, Pro+) mirroring the existing
63 ownership/DNS-history/pricing enrichment pattern. Ships with no bundled
64 third-party endpoint; folds a listed status into risk score/factors and
65 insights, so it rides the existing report and monitoring change-severity
66 pipeline rather than needing bespoke monitoring wiring.
67- **Tags and saved views** for the watchlist — freeform tags per tracked
68 domain, tag filter chips, and named saved filter/sort/tag presets
69 (UserDefaults-backed; not yet part of backup/restore).
6270
6371## v4.8.0 Minor: Reporting & Sharing
6472
@@ -88,6 +96,9 @@ feature releases above will accumulate.
8896## Cross-cutting note
8997
9098New feature surfaces (widgets, intents, extensions) each add a target and a
91persistence/entitlement seam. Add at least characterization tests for
92`DomainDataPortabilityService` and the report builders **before** v4.7.0, so the
93v5.0.0 contract and refactor work has a safety net rather than starting from zero.
99persistence/entitlement seam. This project still has **no XCTest target** —
100v4.5.0 through v4.7.0 all shipped without the characterization-test safety net
101originally recommended before v4.7.0. That gap is now larger (comparison,
102reputation, and tags/saved-views all touch persisted models with hand-written
103backward-compatible decoders) and should be the very first thing v5.0.0 does,
104not a later item within it.