Commit 28f6ed976a

28f6ed976a3397e794371e5587c85e5207c62b63

parent: 7b880ea410

Unsigned

cmc <hello@cleberg.net> · 2026-07-20 20:54 UTC

v4.8.2: Bump version and mark shipped in roadmap

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.

Layout: unified · split

DomainDig.xcodeproj/project.pbxproj +12 −12
@@ -497,7 +497,7 @@
497 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 497 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
498 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements; 498 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements;
499 CODE_SIGN_STYLE = Automatic; 499 CODE_SIGN_STYLE = Automatic;
500 CURRENT_PROJECT_VERSION = 41; 500 CURRENT_PROJECT_VERSION = 42;
501 DEVELOPMENT_TEAM = ZCNAX3VL9D; 501 DEVELOPMENT_TEAM = ZCNAX3VL9D;
502 ENABLE_PREVIEWS = YES; 502 ENABLE_PREVIEWS = YES;
503 GENERATE_INFOPLIST_FILE = YES; 503 GENERATE_INFOPLIST_FILE = YES;
@@ -514,7 +514,7 @@
514 "$(inherited)", 514 "$(inherited)",
515 "@executable_path/Frameworks", 515 "@executable_path/Frameworks",
516 ); 516 );
517 MARKETING_VERSION = 4.8.1; 517 MARKETING_VERSION = 4.8.2;
518 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig; 518 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig;
519 PRODUCT_NAME = "$(TARGET_NAME)"; 519 PRODUCT_NAME = "$(TARGET_NAME)";
520 STRING_CATALOG_GENERATE_SYMBOLS = YES; 520 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -534,7 +534,7 @@
534 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 534 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
535 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements; 535 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements;
536 CODE_SIGN_STYLE = Automatic; 536 CODE_SIGN_STYLE = Automatic;
537 CURRENT_PROJECT_VERSION = 41; 537 CURRENT_PROJECT_VERSION = 42;
538 DEVELOPMENT_TEAM = ZCNAX3VL9D; 538 DEVELOPMENT_TEAM = ZCNAX3VL9D;
539 ENABLE_PREVIEWS = YES; 539 ENABLE_PREVIEWS = YES;
540 GENERATE_INFOPLIST_FILE = YES; 540 GENERATE_INFOPLIST_FILE = YES;
@@ -551,7 +551,7 @@
551 "$(inherited)", 551 "$(inherited)",
552 "@executable_path/Frameworks", 552 "@executable_path/Frameworks",
553 ); 553 );
554 MARKETING_VERSION = 4.8.1; 554 MARKETING_VERSION = 4.8.2;
555 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig; 555 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig;
556 PRODUCT_NAME = "$(TARGET_NAME)"; 556 PRODUCT_NAME = "$(TARGET_NAME)";
557 STRING_CATALOG_GENERATE_SYMBOLS = YES; 557 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -570,7 +570,7 @@
570 APPLICATION_EXTENSION_API_ONLY = YES; 570 APPLICATION_EXTENSION_API_ONLY = YES;
571 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements; 571 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements;
572 CODE_SIGN_STYLE = Automatic; 572 CODE_SIGN_STYLE = Automatic;
573 CURRENT_PROJECT_VERSION = 41; 573 CURRENT_PROJECT_VERSION = 42;
574 DEVELOPMENT_TEAM = ZCNAX3VL9D; 574 DEVELOPMENT_TEAM = ZCNAX3VL9D;
575 GENERATE_INFOPLIST_FILE = NO; 575 GENERATE_INFOPLIST_FILE = NO;
576 INFOPLIST_FILE = DomainDigWidget/Info.plist; 576 INFOPLIST_FILE = DomainDigWidget/Info.plist;
@@ -581,7 +581,7 @@
581 "@executable_path/Frameworks", 581 "@executable_path/Frameworks",
582 "@executable_path/../../Frameworks", 582 "@executable_path/../../Frameworks",
583 ); 583 );
584 MARKETING_VERSION = 4.8.1; 584 MARKETING_VERSION = 4.8.2;
585 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget; 585 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget;
586 PRODUCT_NAME = "$(TARGET_NAME)"; 586 PRODUCT_NAME = "$(TARGET_NAME)";
587 SKIP_INSTALL = YES; 587 SKIP_INSTALL = YES;
@@ -599,7 +599,7 @@
599 APPLICATION_EXTENSION_API_ONLY = YES; 599 APPLICATION_EXTENSION_API_ONLY = YES;
600 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements; 600 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements;
601 CODE_SIGN_STYLE = Automatic; 601 CODE_SIGN_STYLE = Automatic;
602 CURRENT_PROJECT_VERSION = 41; 602 CURRENT_PROJECT_VERSION = 42;
603 DEVELOPMENT_TEAM = ZCNAX3VL9D; 603 DEVELOPMENT_TEAM = ZCNAX3VL9D;
604 GENERATE_INFOPLIST_FILE = NO; 604 GENERATE_INFOPLIST_FILE = NO;
605 INFOPLIST_FILE = DomainDigWidget/Info.plist; 605 INFOPLIST_FILE = DomainDigWidget/Info.plist;
@@ -610,7 +610,7 @@
610 "@executable_path/Frameworks", 610 "@executable_path/Frameworks",
611 "@executable_path/../../Frameworks", 611 "@executable_path/../../Frameworks",
612 ); 612 );
613 MARKETING_VERSION = 4.8.1; 613 MARKETING_VERSION = 4.8.2;
614 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget; 614 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget;
615 PRODUCT_NAME = "$(TARGET_NAME)"; 615 PRODUCT_NAME = "$(TARGET_NAME)";
616 SKIP_INSTALL = YES; 616 SKIP_INSTALL = YES;
@@ -628,7 +628,7 @@
628 APPLICATION_EXTENSION_API_ONLY = YES; 628 APPLICATION_EXTENSION_API_ONLY = YES;
629 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements; 629 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements;
630 CODE_SIGN_STYLE = Automatic; 630 CODE_SIGN_STYLE = Automatic;
631 CURRENT_PROJECT_VERSION = 41; 631 CURRENT_PROJECT_VERSION = 42;
632 DEVELOPMENT_TEAM = ZCNAX3VL9D; 632 DEVELOPMENT_TEAM = ZCNAX3VL9D;
633 GENERATE_INFOPLIST_FILE = NO; 633 GENERATE_INFOPLIST_FILE = NO;
634 INFOPLIST_FILE = DomainDigShareExtension/Info.plist; 634 INFOPLIST_FILE = DomainDigShareExtension/Info.plist;
@@ -639,7 +639,7 @@
639 "@executable_path/Frameworks", 639 "@executable_path/Frameworks",
640 "@executable_path/../../Frameworks", 640 "@executable_path/../../Frameworks",
641 ); 641 );
642 MARKETING_VERSION = 4.8.1; 642 MARKETING_VERSION = 4.8.2;
643 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension; 643 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension;
644 PRODUCT_NAME = "$(TARGET_NAME)"; 644 PRODUCT_NAME = "$(TARGET_NAME)";
645 SKIP_INSTALL = YES; 645 SKIP_INSTALL = YES;
@@ -657,7 +657,7 @@
657 APPLICATION_EXTENSION_API_ONLY = YES; 657 APPLICATION_EXTENSION_API_ONLY = YES;
658 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements; 658 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements;
659 CODE_SIGN_STYLE = Automatic; 659 CODE_SIGN_STYLE = Automatic;
660 CURRENT_PROJECT_VERSION = 41; 660 CURRENT_PROJECT_VERSION = 42;
661 DEVELOPMENT_TEAM = ZCNAX3VL9D; 661 DEVELOPMENT_TEAM = ZCNAX3VL9D;
662 GENERATE_INFOPLIST_FILE = NO; 662 GENERATE_INFOPLIST_FILE = NO;
663 INFOPLIST_FILE = DomainDigShareExtension/Info.plist; 663 INFOPLIST_FILE = DomainDigShareExtension/Info.plist;
@@ -668,7 +668,7 @@
668 "@executable_path/Frameworks", 668 "@executable_path/Frameworks",
669 "@executable_path/../../Frameworks", 669 "@executable_path/../../Frameworks",
670 ); 670 );
671 MARKETING_VERSION = 4.8.1; 671 MARKETING_VERSION = 4.8.2;
672 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension; 672 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension;
673 PRODUCT_NAME = "$(TARGET_NAME)"; 673 PRODUCT_NAME = "$(TARGET_NAME)";
674 SKIP_INSTALL = YES; 674 SKIP_INSTALL = YES;
DomainDig/AppVersion.swift +1 −1
@@ -2,6 +2,6 @@ import Foundation
2 2
3enum AppVersion { 3enum AppVersion {
4 nonisolated static var current: String { 4 nonisolated static var current: String {
5 "4.8.1" 5 "4.8.2"
6 } 6 }
7} 7}
RELEASE_ROADMAP.md +30 −5
@@ -6,7 +6,7 @@ ports, geolocation, subdomains, availability). The next several releases invest
6in *reach and surfacing* — getting that data onto more iOS surfaces and into more 6in *reach and surfacing* — getting that data onto more iOS surfaces and into more
7workflows — rather than adding raw protocol checks. 7workflows — rather than adding raw protocol checks.
8 8
9Current version: `v4.8.1`. 9Current version: `v4.8.2`.
10 10
11## v4.4.1 Patch: Release Readiness — ✅ shipped 11## v4.4.1 Patch: Release Readiness — ✅ shipped
12 12
@@ -124,10 +124,35 @@ Goal: fix what UAT of v4.8.0 turned up.
124 action, so the purchase and entitlement paths can be exercised without the 124 action, so the purchase and entitlement paths can be exercised without the
125 `DOMAIN_DIG_FORCE_PRO_PLUS` launch argument that bypasses StoreKit entirely. 125 `DOMAIN_DIG_FORCE_PRO_PLUS` launch argument that bypasses StoreKit entirely.
126 126
127Known open follow-ups filed during UAT: integration events to a disabled target 127Follow-ups filed during UAT (#8, #9, #10) were all resolved in v4.8.2.
128vanish with no delivery-log row (#8), "Process Queue Now" does not force a 128
129backed-off retry (#9), and a monitoring snapshot fallback silently reports "No 129## v4.8.2 Patch: Delivery Visibility & Build Health — ✅ shipped
130meaningful changes" (#10). 130
131Goal: close the UAT follow-ups and make failures legible instead of silent.
132
133- **Disabled integrations no longer swallow events** (#8) — `enqueue(events:)`
134 filtered to enabled targets before writing any `DeliveryRecord`, so events
135 routed to a disabled integration vanished entirely. They now log a `.skipped`
136 entry with a reason. `sendTest` also respects `isEnabled`, which previously
137 delivered against targets that dropped every real event.
138- **"Process Queue Now" forces backed-off retries** (#9) — it only restarted the
139 processing task, never moving `nextAttemptAt`, so an item in backoff (up to an
140 hour) stayed undue and the button appeared inert. It now pulls queued items
141 forward, and reports an empty queue instead of doing nothing silently.
142- **Unreachable domains report as unreachable** (#10) — when the snapshot
143 fallback fired, the run compared old data against itself and claimed "No
144 meaningful changes" for a domain it never reached. `MonitoringDomainResult`
145 now carries `unreachableReason`, the summary says so, and a warning-severity
146 `monitoringFailure` reaches configured integrations.
147- **Swift 6 concurrency warnings cleared** — `SweepActivityAttributes` is
148 explicitly `nonisolated` (the app target sets
149 `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor` while the widget target does not),
150 and `LocalAPIService`'s logger closures capture `self` coherently. Build is
151 warning-free.
152- **StoreKit configuration corrected and synced** — the scheme's path was wrong,
153 and the hand-authored file has been replaced by `SyncedProducts.storekit`,
154 synced against App Store Connect. Registered in the project without target
155 membership so it is not bundled into shipping builds.
131 156
132## v5.0.0 Major: Contract Stabilization & Engineering Health 157## v5.0.0 Major: Contract Stabilization & Engineering Health
133 158