Last updated: 2026-07-15
- SaneHosts 1.1.22 is live on the Sparkle channel (2026-07-15): the
appcast serves
SaneHosts-1.1.22.zipwith the large-profile fix release note (bump81509da, metadata sync5dcfd0e). Pre-ship real-data proof: the actual Steven Black Unified list (76,158 entries, 10.7 MB persisted) ran parse → persist → summary reload → hydration → hosts generation, all green. Remaining owner step: the LS dashboard-hosted file still serves 1.1.19 — publish the 1.1.22 ZIP (product 794910 → variant 1253740) fromhttps://dist.sanehosts.com/updates/SaneHosts-1.1.22.zip, unpublish old files, then rerunrelease.sh --project ~/SaneApps/apps/SaneHosts --version 1.1.22 --post-release-checks-only. This supersedes the 1.1.21 LS step below. - Post-ship refactor (
9f0582f): ProfileStore.swift split 1,201 → 736 lines (Rule #10) intoLargeProfileSummaryLoader/ProfileDirectoryLoader/ProfileBackupArchive/ProfileStoreErrorcollaborator files, behavior unchanged. NewlastHydrationIssuerecords the last hydration failure (cleared on the next success) and is surfaced in the diagnostics settings summary, with a behavioral test — Glenn's feedback payloads previously carried no trace of hydration failures. Mini verify 114 tests green; customer UI sweep passed (receipt 2026-07-15T14:28:19Z). ThelargeProfileLoadingUsesSummariesAndImportBoundspolicy test now scans the new file boundaries. - Glenn consolidated reply (#1136/#1139/#1141) is drafted at
~/SaneApps/outputs/glenn-1139-1141-consolidated-reply.txtand awaits owner approval; the media-review gate still needs the documented exception (see caveat below).
- Glenn's July 14-15 support emails
#1139and#1141showed the same failure for Kitchen Sink and Steven Black Unified: activation tried to open a profile JSON file named after an entry UUID that never existed. Reproduced against a real 61 MB profile. The large-profile summary reader was finding the first nestedentries[].idinstead of the top-level profileidwhenever encoded key order putentriesfirst. ProfileStorenow treats the profile filename UUID as canonical, validates stored IDs on every load/hydration path, quarantines malformed or mismatched files, and refuses to save a 100-entry partial summary over the full profile. Reordering hydrates before writing, closing the adjacent data-loss risk.- Added
ProfileStoreLargeProfileTests: both JSON key orders, reload and full hydration, malformed/mismatched identity recovery, partial-save protection, and reorder preservation. MiniSaneMaster verifyis green: 113 tests, receiptf607dda3fb263faaa4526ad33907689e. - Easy wins shipped in source with the repair: the UI now says protection stays
active after SaneHosts closes/quits, says exactly how deactivation/profile
switching is authenticated, labels the action
Turn Off Protection…, keeps user-cancelled authentication quiet, and routes profile deletion through a confirmation. The existing Pro padlock fix remains covered. - Runtime proof on the Mini: customer action sweep 11/11 green, receipt
00735bebcfee5a95d20c2acd0eadcb42; isolated visual smoke green, receipt5959fa99bde4d91a616f1979b1b45ce5; clean capture atoutputs/visual-audit-glenn/visual_smoke_20260715-074808_98547/app-see.png. The live log has no activation/file-identity/partial-profile errors. - No release or customer email has been sent. Recommend shipping this as 1.1.22 (Sparkle requires a new version), then send one consolidated reply to Glenn and ask him to retest both lists. A separate parent-only passcode is deliberately deferred: current behavior persists through quit/restart and uses Touch ID or the Mac account password, but is not a tamper-proof parental control boundary.
- Support-media caveat: the current inbox classifier skipped Glenn's inline
screenshots as decorative, so
confirm-media-reviewcannot issue its normal semantic receipt even though the screenshots were manually downloaded and inspected. Keep#1139and#1141open; do not reply/resolve until the gate has a valid receipt or the owner explicitly approves the documented exception.
- SaneHosts 1.1.21 is live on the Sparkle auto-update channel
(
sanehosts.com/appcast.xmlservesSaneHosts-1.1.21.zip+ the padlock release note). This is the path "Check for Updates" uses — Glenn can update now. Build signed + notarized + deployed viarelease.sh --full --deployfrom the Mini GUI session; git tag/appcast/site/webhook all updated. - ONE owner step remains: the LemonSqueezy dashboard-hosted file (direct
download / new purchases) still serves 1.1.19. Replace it via the LS
dashboard: product 794910 → Files for variant 1253740 → publish the 1.1.21
ZIP from
https://dist.sanehosts.com/updates/SaneHosts-1.1.21.zip, unpublish old files. Then rerunrelease.sh --project ~/SaneApps/apps/SaneHosts --version 1.1.21 --post-release-checks-onlyto confirm green. (This is the standing manual per-release LS step, not a new bug.) - The older standalone Glenn
#1136padlock reply is superseded by the pending consolidated response covering#1136,#1139, and#1141.
-
2026-07-14 Pro padlock fix + 1.1.21 release in flight. Customer report (Glenn, work-email #1136, redeemed the THANKSGLENN comp same day): the sidebar "PRO FEATURES" header kept its closed padlock after Pro activation. Fixed in
d0bf8e1— header rendersProFeature.sectionIcon(isPro:)(lock.open.fillwhen Pro); Swift Testing regression (ProSectionIconTests); routed verify green 103 tests; runtime proof screenshot on the Mini:~/Desktop/Screenshots/sanehosts-padlock-pro-proof-20260714.png(open padlock, Pro-mode launch). Cross-app sweep: only SaneHosts affected. -
2026-07-14 Version bumped to 1.1.21 (1121) in
Config/Shared.xcconfig(18edf6c): 1.1.20 channel artifacts (appcast/site/webhook/tap) were already rolled out WITHOUT the padlock fix (LemonSqueezy hosted file still 1.1.19), and Sparkle ignores same-version updates. -
2026-07-14 Sweep tooling fix (
c40ba15):scripts/customer_ui_action_sweep.rbnow parses the customer UI contract JSON from stdout only (Open3.capture3);capture2emerged SaneMaster's stderr Ruby re-exec notice into the payload and broke the sweep under the Mini GUI-session PATH. Sweep passed after the fix (receipt at.sane/customer_ui_action_receipt.jsonon the Mini). -
2026-07-14 Release lane state: run preflight/release via
mini-gui-run.shon the Mini (plain SSH sessions see a locked keychain → "release authorization key is unavailable" / codesign errSecInternalComponent). The Mini checkout's stray working-tree deletions (incl.SaneHosts.xcworkspace/contents.xcworkspacedata) were restored — their absence made verify fall back to a project-only invocation with "no test bundles available". Preflight round 3 running; next: release.sh --full --deploy (1.1.21), live-appcast check, owner-approved reply to Glenn (#1136) asking him to update and verify. -
2026-06-27 Keychain prompt-storm fix (data-protection keychain) — staged for the next release. Background: SaneApps store the license/trial in the legacy login keychain, whose per-item ACL is bound to the build's code signature, so a Developer ID app re-prompts ("wants to use your confidential information") on every item after an update changes the signature (TN3137). Fix:
- SaneUI
KeychainServicegained an opt-inaccessGroup→ data-protection keychain + one-time legacy→DP migration (committed/pushed, revisionf8e5274; 117 tests). SaneHosts SaneUI pin bumped tof8e5274. - SaneHosts injects the access group via the existing
LicenseService(keychain:)param (SaneHostsLicenseKeychain, groupM78L6FXD48.com.mrsane.SaneHosts). - Added the
keychain-access-groupsentitlement + manual Developer ID signing inConfig/Shared.xcconfig(scoped to the app; helper stays Automatic). The entitlement is restricted and needs a provisioning profile. - Created the
com.mrsane.SaneHosts DirectDeveloper ID profile via the ASC API (fastlane sigh --developer_id), installed on the Mini. No App-ID capability toggle was needed (Developer ID profiles auto-carryM78L6FXD48.*). - Verified:
verifypasses 101 tests against the pinned remote SaneUI; the signed build reaches codesign and BUILD SUCCEEDED (the config cleared the "requires a provisioning profile" error). - NOT yet verified (needs a GUI session / the release): the actual SIGNED
build can't run over headless ssh ("User interaction is not allowed" for the
signing key without
KEYCHAIN_PASSWORD). The signed build + notarization happen at release time viarelease.sh(which already doessigningStyle: manual+ aprovisioningProfilesmap). The runtime behavior (no prompt + license migrates) should be spot-checked on a real machine after the release. The owner observed the storm on a real install. - Replication to SaneBar/SaneClick/SaneClip/SaneSync uses the same recipe
(sigh profile → entitlement + manual-signing xcconfig → inject SaneUI group).
See memory
sanehosts-keychain-dp-migration.
- SaneUI
-
2026-06-27 keychain prompt-storm pilot (UNCOMMITTED, not released):
- Problem: after an update, macOS hammers users with "wants to use your
confidential information" keychain prompts. Root cause: SaneUI stores the
license + trial timestamps in the legacy login keychain (per-item ACL bound
to the creating build's code signature); a signature change re-prompts on
every item every launch. Dev-machine artifact today; becomes fleet-wide the
day the signing cert rotates. Full analysis + cross-app impact in memory
sanehosts-keychain-dp-migration(also affects SaneBar/SaneClick/SaneClip/ SaneSync; SaneVideo/SaneSales sandboxed = safe). - Fix (opt-in, pilot on SaneHosts): SaneUI
KeychainService.init(service: accessGroup:)— when accessGroup set, use data-protection keychain +kSecAttrAccessGroup+ one-time legacy->DP migration; default nil leaves every other app unchanged.LicenseServiceUNCHANGED (injected via its existingkeychain:param). NewSaneHostsLicenseKeychain(servicecom.mrsane.SaneHosts, groupM78L6FXD48.com.mrsane.SaneHosts) injected at all 3 LicenseService sites; addedkeychain-access-groupsentitlement. - Proven on Mini:
SANEHOSTS_USE_LOCAL_SANEUI=1 verify-> 101 tests; SaneUIswift test-> 117 tests incl. new data-protection query test; signed test_mode build succeeds (entitlement wired via Shared.xcconfig). - PENDING: live runtime proof (no-prompt + migration; keychain is bypassed in tests) on Mini then the Air (real broken-ACL license), then bump SaneHosts SaneUI pin + release, then roll to the other 4 affected apps.
- Infra fixes (also uncommitted, in SaneProcess): trimmed stale GitHub/Context7
from MCP-verification gate (
sanetools_research.rb); addedSANEHOSTS_USE_LOCAL_SANEUIto SaneMasterforwarded_env_keys.
- Problem: after an update, macOS hammers users with "wants to use your
confidential information" keychain prompts. Root cause: SaneUI stores the
license + trial timestamps in the legacy login keychain (per-item ACL bound
to the creating build's code signature); a signature change re-prompts on
every item every launch. Dev-machine artifact today; becomes fleet-wide the
day the signing cert rotates. Full analysis + cross-app impact in memory
-
2026-06-21 direct-download release
v1.1.17shipped and deployed:- Version bumped to
1.1.17/ build1117inConfig/Shared.xcconfig. - Paid users are not impacted:
LicenseService.hasExpiredProTrialis false when a valid license is active. Active-trial users keep the workspace and see a left-rail countdown/Upgrade card. Expired-trial users see the sharedLicenseGateViewwith Buy Now and Enter License Key actions. - Menu bar profile activation now routes expired-trial users back to the main upgrade gate instead of activating a profile from the menu.
- New policy tests:
expiredTrialRequiresPaidUpgradeandtrialCountdownCopy. Mini./scripts/SaneMaster.rb verify --timeout 900passed99tests after the trial change, after the customer UI contract update, and after the version bump. - Visual proof inspected locally:
outputs/visual-audit-trial-active/direct/sanehosts-active-trial.pngshows “25 days left in Pro trial” with an Upgrade action while the app remains usable;outputs/visual-audit-trial-expired/direct/sanehosts-expired-trial.pngshows the tactful expired-trial upgrade/license gate. - Mini
customer_ui_sweep --jsonpassed after the version bump and before release with receipt timestamp2026-06-21T09:05:18Z, source fingerprint4c0bfdbd26fd19197f133a0b8d40b8487d6bd9fe164f9e673a4df15588c12f1f, and live logoutputs/live-logs/customer_ui_sanehosts_20260621T090419Z.log. - Release commits on
main:3d5507esimplified SaneHosts and added the Pro trial gate,5d88ed1bumped version metadata,363d4f2restored appcast compatibility after the cleanup pass, and08bd021synced release metadata. Tagv1.1.17points at363d4f2. - Release artifact:
https://dist.sanehosts.com/updates/SaneHosts-1.1.17.zipwith SHA-25630f35dc82f7152447ebee087291a1ebb762da3196e1e9d7c16dd3b7d28dfa94b, size4569411, notarization submissiondd1a71bc-1450-46ae-8ac1-f981d3150b11, and Sparkle signaturepBk16roXWXtEMxKbR6HZAgD0vDSbojgSUzn2jS8xGZeGw2M9nGH1Y31RQZuGsA8/2SWxW9H/ENc90ESQCm8PCQ==. - Release surfaces updated and verified: GitHub release
v1.1.17, R2 download,https://sanehosts.com/appcast.xml, Cloudflare Pages website, Homebrew tap commitd2987c3, and sane-email-automation commit8b4bde9. - Lemon Squeezy dashboard sync completed on the Mini: uploaded
SaneHosts-1.1.17.zip, unpublished staleSaneHosts-1.1.16.zip, and verified./scripts/SaneMaster.rb hosted_file_actions --jsonreports SaneHostsstatus: In syncwith one published file. - Post-sync
./scripts/SaneMaster.rb release_preflightpassed on the Mini-routed workspace with99tests. Remaining warnings only: App Store product marker absent, UserDefaults/migration changed, 6 pending customer emails, and evening release timing.
- Version bumped to
-
2026-06-21 Ponytail staged simplification pass completed without deleting customer proof or privileged hosts-write safety. Implemented stages: consolidated
QuickActionButton/ Pro lock UI without changing Basic vs Pro routing, removed unused local design helpers, removed the pass-throughDirectDistributionSupport.swiftmover wrapper, deleted stale generated docs and then restoreddocs/appcast.xmlas required release metadata, removed backup icon PNGs, collapsed dormant App Store-only branches for the direct-download product, and deduped ProfileStore create/import append-sort persistence helpers. Net diff:24 files changed, 239 insertions(+), 1979 deletions(-)plus removed binary icon backups; Swift LOC dropped from11726to10949. Verification after each code stage: Mini./scripts/SaneMaster.rb verify --timeout 900passed97tests after Stage 1, Stage 2, Stage 3, and Stage 4. Final Mini runtime proof:customer_ui_sweep --jsonpassed 11 actions with receipt timestamp2026-06-21T05:31:11Z, live logoutputs/live-logs/customer_ui_sanehosts_20260621T052946Z.log, and visual smoke receiptoutputs/visual_smoke/visual_smoke_20260621-013043_38239. Final release-mode resource soak from/Applications/SaneHosts.apppassed 240s / 33 samples withavg_cpu: 0.0,peak_cpu: 0.0,peak_rss_mb: 152.859,peak_physical_footprint_mb: 78.0, and no issues. Follow-up fixed the SaneProcess routed-receipt gap: routed workspaces now carry the canonical.sanereceipt andoutputs/customer-ui/***proof artifacts. Fresh Minicustomer_ui_sweep --jsonpassed with receipt2026-06-21T07:42:44Z, then routedrelease_preflightpassed with0issues and expected warnings only (App Store product marker absent, uncommitted files, pending emails, evening release timing). -
2026-06-04 MainView refactor/proof pass completed:
- Split the former 2,457-line
MainView.swiftowner into focused SwiftUI files underSaneHostsPackage/Sources/SaneHostsFeature/Views/:MainView.swift(scene state/body),MainView+Layout.swift,MainView+Actions.swift,MainViewComponents.swift,ProfileCreationSheets.swift,PresetViews.swift,FetchProgressOverlay.swift,RemoteImportSheet.swift,RemoteImportSheet+Catalog.swift,RemoteImportSheet+Import.swift, andMergeProfilesSheet.swift. All split files are under 500 lines. - Updated source-policy tests so dark-mode readability, activation/deactivation, large-profile, and remote-import safety checks scan the new file boundaries.
- Mini verification passed:
swift test --package-path SaneHostsPackageand./scripts/SaneMaster.rb verify --timeout 900both passed; SaneMaster reported97tests passed. After the1.1.16/ build1116release bump, Mini./scripts/SaneMaster.rb verify --timeout 900passed again with97tests. - Customer UI contract was refreshed after the source split and after the
release metadata bump. Latest Mini
./scripts/SaneMaster.rb customer_ui_sweep --jsonpassed with 11 actions and receipt timestamp2026-06-04T02:32:42Z. - Release preflight for
1.1.16passed with warnings only. Expected pre-publish warnings: uncommitted release-candidate files, UserDefaults migration notice, live appcast/Homebrew still at1.1.15, one open GitHub issue, pending email queue, and evening timing. - Mini runtime proof passed through
./scripts/SaneMaster.rb test_mode --no-logsand./scripts/SaneMaster.rb visual_smoke --app SaneHosts --output outputs/visual-audit-20260604 --json. - Clean visual proof copied locally:
outputs/visual-audit-20260604/visual_smoke_20260603-222831_16745/app-see.png. The isolated app capture shows the SaneHosts window rendering correctly with readable bright text, visible sidebar/detail/stats/entries, and no overlap. An earlier failedscreen.pnginvisual_smoke_20260603-222650_7365is contaminated by a Codex window/notification and should not be used as visual proof. - Direct-download release
v1.1.16shipped and deployed:https://dist.sanehosts.com/updates/SaneHosts-1.1.16.zip. Release tagv1.1.16points at2f89e60; release metadata commitd87beccis onmain. - Release evidence: SaneMaster routed release from the MacBook Air to the Mini,
passed
97tests, archived/exported Developer ID signed app, notarized and stapled Apple submission2c4a958d-620a-4304-b927-70972cb85f88, uploaded R2 ZIP SHA-2563aae3614d295e5df3989fd68f89fbf32cf3f96d25a0823dad3dce3ee63a391a5, updated appcast/website/Homebrew/GitHub release, and verified the download. - Post-release preflight passed at
2026-06-03T23:08:34-04:00with0issues and4warnings inoutputs/release_preflight_status.json: upgrade path warning, one open GitHub issue, three pending emails, and evening timing. Live appcast/Homebrew/website download/email Worker signed download all report1.1.16/ build1116. - Release tooling fix: Air-off-LAN releases were initially blocked because
release.shtrusted SaneMaster's routed workspace context for cleanliness but still fell through to the old Mini-to-Air.localSSH reconcile query.SaneProcessbranchfix/hook-staleness-gatescommitcb934c4now lets routed releases pass reconcile from.sanemaster/mini_route_context.json. - Email Worker follow-up: the primary SaneHosts download mapping was pushed in
sane-email-automationcommit7cff266; bundle purchase mapping was also updated and tested inc930f98, then deployed to Cloudflare Worker versionf9b292a8-fde5-4b39-b7a6-025ecf1336dc.
- Split the former 2,457-line
-
2026-06-01
v1.1.15direct-download release shipped and deployed:- Release URL:
https://dist.sanehosts.com/updates/SaneHosts-1.1.15.zip. - Appcast:
https://sanehosts.com/appcast.xml. - Release commits on
main:91a992benabled the direct 30-day Pro trial,3b871cbbumped version, and802468dsynced release metadata. Tagv1.1.15was published. - Canonical Mini preflight passed with warnings only; release script reran
./scripts/SaneMaster.rb verifyand passed97tests. - Release script archived/exported signed app, notarized/stapled, uploaded R2 ZIP, updated appcast/website/Homebrew/email webhook, and strict post-release checks passed.
- Expected warnings during preflight/release: migration-path notice, open GitHub/email queues, pre-publish appcast/Homebrew skew, README freshness warning, and evening timing warning. None blocked release.
- Release URL:
-
2026-05-25 22:06 EDT Basic/Pro conversion patch verified:
- SaneHosts now opts into the shared SaneUI 30-day Pro trial so new direct users see real Pro access during onboarding instead of being able to live indefinitely in a too-generous Basic path.
- 2026-06-01 release prep bumped this patch to
1.1.15/ build1115and consolidated the duplicate1.1.14changelog entries. - Runtime proof on the Mini confirmed the staged app launched with mover
prompts suppressed for test mode, keychain disabled for the fresh-user
probe, and forced license check enabled. UserDefaults showed
sanehosts.pro_trial.started_atplus thesanehosts.pro_trial_startedevent. - Verification: Mini
./scripts/SaneMaster.rb verify --timeout 1200passed97tests. Mini visual smoke passed at/Users/stephansmac/SaneApps/apps/SaneHosts/outputs/visual_smoke/visual_smoke_20260525-220458_32163. Minicustomer_ui_sweep --jsonpassed with receipt generated2026-05-26T02:06:25Z. - Product caveat: the failed "Move to Applications" dialog was reproduced as a test-launcher problem and the tooling now suppresses/detects it during verification. A real customer install-move success pass should still be run before claiming the mover itself is fixed.
-
2026-05-25 20:05 EDT direct-download patch
v1.1.14shipped and deployed:- Release commits on
main:b234f1afixed overlay/readability, large-profile runtime, import cancellation, DNS/activation error handling, and regression coverage;4ff87ebbumped version to1.1.14;fa0b819synced release metadata. - Canonical release artifact:
https://dist.sanehosts.com/updates/SaneHosts-1.1.14.zip; appcast:https://sanehosts.com/appcast.xml; GitHub release:v1.1.14; Homebrew tap updated to1.1.14; website/email webhook updated to the same ZIP. - Verification before ship: Mini
./scripts/SaneMaster.rb verify --timeout 900passed96tests; release script reran the same test suite; Minisane_test.rb SaneHosts --no-logsbuilt/launched the app; Minicustomer_ui_sweep --jsonand strictcustomer_ui_contract --strict-visual --jsonpassed with 11 covered customer actions. - Visual evidence inspected: normal completed-tutorial screenshot
outputs/local-visual/sanehosts-normal-app-see-20260525-191008.pngand first-run tutorial screenshotoutputs/local-visual/sanehosts-first-run-app-see-20260525-191125.png; both were readable with no clipping/overlap and the first-run tooltip visible in-frame. - Runtime evidence: large profile startup no longer eagerly decodes 61 MB/25 MB
JSON files. Final Mini samples stabilized around
0%CPU,~158 MBRSS, and~83 MBphysical footprint. Restrictedleaksreported only tiny AppIntents/XPC allocations, with no growing app footprint observed. - Post-status dashboard cleanup: Lemon Squeezy hosted file was updated in the
Mini Safari dashboard from
SaneHosts-1.1.13.ziptoSaneHosts-1.1.14.zip; the stale file was unpublished, and./scripts/SaneMaster.rb hosted_file_actions --jsonnow reportscurrent_actions: []with SaneHostsstatus: In sync. - Customer replies posted after user approval:
#4comment4538794202was posted and the issue was closed as fixed in1.1.14;#5comment4538794511was posted and the issue remains open for reporter confirmation on1.1.14. - Tooling note: the canonical release script invoked an
nvREADME sync despite the SaneApps no-NVIDIA/no-nv rule. It completed without changing README, but release tooling should be patched to use GPT/local tooling instead.
- Release commits on
-
2026-05-25 18:40 EDT SaneHosts
#4latest evidence root-caused and patched:- Evidence review covered
check-inbox.sh issue-review SaneHosts 4, latest GitHub screenshots, local handoff/research, and the first-run tutorial and dark-mode UI source paths.#5has no new reporter evidence after1.1.13and remains waiting for reporter confirmation. - Root cause for the still-dark
#4screenshot was a combination of real low-contrast secondary styling and the first-run tutorial spotlight overlay: the overlay dimmed the whole window while the tooltip could be positioned outside the captured visible area, making normal UI look broken. - Fix: core dark UI no longer uses
.secondary/gray semantics for the affected main/profile/detail rows; tutorial overlay now uses local overlay bounds, lighter dimming, an opaque black tooltip, white title/body text, and a regression policy test for these rules. - Verification: Mini
./scripts/SaneMaster.rb verify --timeout 900passed88tests. Mini first-run visual smoke passed atoutputs/visual_smoke/visual_smoke_20260525-183856_6753/and the inspectedapp-see.pngshows the tutorial tooltip visible in-frame. Mini completed- tutorial visual smoke passed atoutputs/visual_smoke/visual_smoke_20260525-184024_15764/and the inspectedapp-see.pngshows the normal main window readable with no visible clipping.
- Evidence review covered
-
2026-05-25 09:33 EDT cross-product launch ops reran canonical Mini
launch_readiness; it exited1, so the overdue launch-package lane stayed no-go and no scheduling, package-execution, or public posting action was executed. Human visual approval plus a public URL are still missing forwebsite/videos/sanehosts-privacy-switch-30s.mp4, the Product Hunt maker comment/day-of checklist still needs exact approval, Minirelease_preflightstill carries4warnings, and the shared validation report still flags SaneHosts customer UI proof as stale and older than 12 hours. Next checkpoint:2026-05-28. No new public URL was created in this run. -
2026-05-24 23:35 EDT validation cleanup: strict customer UI contract is green locally and Mini
release_preflightpassed with warnings only. Latest project QA gate is current again in the global readiness checklist. -
2026-05-24 Basic/Pro visual and strict UI contract pass:
- Visual verification found and fixed an Entries table layout regression:
255.255.255.255wrapped in the IP column.IPAddressTextis now one-line/fixed-size and the IP column is140points wide. - Regression test added:
EntryRowLayoutPolicyTests.ipAddressesStayOnOneLine. - Strict customer UI contract then caught a manifest gap:
bulk-entry-actionshad fixture/state proof but no screenshot evidence.Tests/CustomerUIActions.ymlnow requiresscreenshotfor that action, guarded byCustomerUIManifestPolicyTests.bulkEntryActionsRequireVisualEvidence. - Fresh Mini visual receipts inspected:
visual_smoke_20260524-192153_63437in Basic andvisual_smoke_20260524-192341_71984in Pro; the IP row no longer wraps. - Mini
customer_ui_sweep --jsongenerated receipt2026-05-24T23:28:03Z; strict customer UI contract passed with no issues or warnings; Mini./scripts/SaneMaster.rb verify --timeout 900passed85tests.
- Visual verification found and fixed an Entries table layout regression:
-
2026-05-15 launch-readiness cleanup:
- Current direct-download release identity is
1.1.11(build1111), matchingConfig/Shared.xcconfig, README, andwebsite/appcast.xml. .saneprocessnow marks the website lane as active withwebsite_domain: sanehosts.com.scripts/customer_ui_action_sweep.rbwas updated to emit the current structured customer UI receipt schema required by SaneProcess.- Mini customer UI sweep now passes with 11 covered actions, and Mini release preflight passes with warning-level cleanup only.
- The 30-second privacy-switch video was staged to
website/videos/sanehosts-privacy-switch-30s.mp4with SHA-2567132b6758a8c1505d76a410b9f951912a57d909c5454660154df5568421c264e. - Remaining launch blockers are marketing/public-action gates: human visual approval and public deploy for the video, plus final Product Hunt maker comment and day-of checklist approval.
- Current direct-download release identity is
-
2026-05-12 customer-facing action release gate is now recorded for SaneHosts:
- Added
Tests/CustomerUIActions.yml,scripts/customer_ui_action_sweep.rb, and.sane/customer_ui_action_receipt.json. ./scripts/SaneMaster.rb customer_ui_contract --no-exitpasses with 11 required actions covered; receipt generated2026-05-12T03:45:56Zon hostmini.- Mini
./scripts/SaneMaster.rb verifypassed 82 tests.
- Added
-
Current direct-download release is
1.1.16(build1116). -
SaneHosts remains direct-download only. The App Store lane is intentionally disabled for the current helper/daemon architecture.
-
Pricing rollout source of truth for current customer-facing surfaces:
Basic = free,Pro = $14.99 once,direct download only. -
Do not reintroduce App Store positioning in customer-facing copy unless the product is intentionally redesigned around an App-Store-safe architecture.
-
Track pricing impact with
ruby ~/SaneApps/infra/SaneProcess/scripts/SaneMaster.rb sales --products,downloads --app SaneHosts --days 30, andevents --app SaneHosts --days 30before and after rollout windows. -
Use
CHANGELOG.md,ARCHITECTURE.md, and git history for older release history and archived launch-ops notes. Active state above is current.
- Direct-channel SaneHosts
1.1.23(build1123) is live. The public appcast contains a signedSaneHosts-1.1.23.zipenclosure and<sparkle:criticalUpdate/>. The release updated the website, Homebrew cask, and email webhook product mapping. - The release fixes SaneApps Everything Bundle entitlement matching through the
shared SaneUI revision
103803d; SaneHosts now accepts the bundle while retaining mismatched single-app license rejection. - Mini release proof: customer UI contract
11actions, behavioral migration proof, and release preflight verify evidence115tests passed. Clean Mini visual proof:/Users/sj/Desktop/Screenshots/codex-shot-2026-07-18_06-29-08.png. - The direct-channel release is not fully complete until the Lemon Squeezy
hosted variant is manually replaced with the already-public
SaneHosts-1.1.23.zipfromhttps://dist.sanehosts.com/updates/and post-release checks are rerun. The dashboard product is794910, variant1253740; current hosted file is still1.1.22. - Product roadmap issue:
https://github.com/sane-apps/SaneHosts/issues/6tracks helper-enforced Parent Lock, update migration, and acceptance tests. - Customer feedback about large blocklist activation shipped in
1.1.22; a delivery-confirmed support response was sent, but the thread remains pending without a subsequent customer confirmation.
- Cross-product launch ops reran canonical Mini
./scripts/SaneMaster.rb launch_readiness --jsonfrom the SaneHosts repo. It stayed red. - Active launch blockers are unchanged: the 30-second privacy-switch video still needs human visual approval plus a hosted/public URL, the staged website video still is not publicly deployed, and the Product Hunt maker comment/day-of checklist still needs exact approval.
- Fresh proof state:
release_preflightstill passes but is stale at 19.43 days with 4 warnings, and the shared validation receipt/Users/sj/SaneApps/infra/SaneProcess/outputs/validation/2026-06-23.jsonis stillNOT READY FOR RELEASEwith stale SaneHosts customer-UI proof. No package/submission/scheduling/public-post action ran today.