Skip to content

Latest commit

 

History

History
468 lines (442 loc) · 31.9 KB

File metadata and controls

468 lines (442 loc) · 31.9 KB

Session Handoff — SaneHosts

Last updated: 2026-07-15

SHIPPED: 1.1.22 large-profile activation fix LIVE on Sparkle channel

  • SaneHosts 1.1.22 is live on the Sparkle channel (2026-07-15): the appcast serves SaneHosts-1.1.22.zip with the large-profile fix release note (bump 81509da, metadata sync 5dcfd0e). 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) from https://dist.sanehosts.com/updates/SaneHosts-1.1.22.zip, unpublish old files, then rerun release.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) into LargeProfileSummaryLoader / ProfileDirectoryLoader / ProfileBackupArchive / ProfileStoreError collaborator files, behavior unchanged. New lastHydrationIssue records 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). The largeProfileLoadingUsesSummariesAndImportBounds policy test now scans the new file boundaries.
  • Glenn consolidated reply (#1136/#1139/#1141) is drafted at ~/SaneApps/outputs/glenn-1139-1141-consolidated-reply.txt and awaits owner approval; the media-review gate still needs the documented exception (see caveat below).

Source history: Glenn large-profile activation failures (shipped in 1.1.22)

  • Glenn's July 14-15 support emails #1139 and #1141 showed 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 nested entries[].id instead of the top-level profile id whenever encoded key order put entries first.
  • ProfileStore now 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. Mini SaneMaster verify is green: 113 tests, receipt f607dda3fb263faaa4526ad33907689e.
  • 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, receipt 5959fa99bde4d91a616f1979b1b45ce5; clean capture at outputs/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-review cannot issue its normal semantic receipt even though the screenshots were manually downloaded and inspected. Keep #1139 and #1141 open; do not reply/resolve until the gate has a valid receipt or the owner explicitly approves the documented exception.

SHIPPED: 1.1.21 Sparkle channel LIVE

  • SaneHosts 1.1.21 is live on the Sparkle auto-update channel (sanehosts.com/appcast.xml serves SaneHosts-1.1.21.zip + the padlock release note). This is the path "Check for Updates" uses — Glenn can update now. Build signed + notarized + deployed via release.sh --full --deploy from 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 rerun release.sh --project ~/SaneApps/apps/SaneHosts --version 1.1.21 --post-release-checks-only to confirm green. (This is the standing manual per-release LS step, not a new bug.)
  • The older standalone Glenn #1136 padlock reply is superseded by the pending consolidated response covering #1136, #1139, and #1141.

Current State

  • 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 renders ProFeature.sectionIcon(isPro:) (lock.open.fill when 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.rb now parses the customer UI contract JSON from stdout only (Open3.capture3); capture2e merged 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.json on the Mini).

  • 2026-07-14 Release lane state: run preflight/release via mini-gui-run.sh on 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 KeychainService gained an opt-in accessGroup → data-protection keychain + one-time legacy→DP migration (committed/pushed, revision f8e5274; 117 tests). SaneHosts SaneUI pin bumped to f8e5274.
    • SaneHosts injects the access group via the existing LicenseService(keychain:) param (SaneHostsLicenseKeychain, group M78L6FXD48.com.mrsane.SaneHosts).
    • Added the keychain-access-groups entitlement + manual Developer ID signing in Config/Shared.xcconfig (scoped to the app; helper stays Automatic). The entitlement is restricted and needs a provisioning profile.
    • Created the com.mrsane.SaneHosts Direct Developer 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-carry M78L6FXD48.*).
    • Verified: verify passes 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 via release.sh (which already does signingStyle: manual + a provisioningProfiles map). 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.
  • 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. LicenseService UNCHANGED (injected via its existing keychain: param). New SaneHostsLicenseKeychain (service com.mrsane.SaneHosts, group M78L6FXD48.com.mrsane.SaneHosts) injected at all 3 LicenseService sites; added keychain-access-groups entitlement.
    • Proven on Mini: SANEHOSTS_USE_LOCAL_SANEUI=1 verify -> 101 tests; SaneUI swift 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); added SANEHOSTS_USE_LOCAL_SANEUI to SaneMaster forwarded_env_keys.
  • 2026-06-21 direct-download release v1.1.17 shipped and deployed:

    • Version bumped to 1.1.17 / build 1117 in Config/Shared.xcconfig.
    • Paid users are not impacted: LicenseService.hasExpiredProTrial is 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 shared LicenseGateView with 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: expiredTrialRequiresPaidUpgrade and trialCountdownCopy. Mini ./scripts/SaneMaster.rb verify --timeout 900 passed 99 tests 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.png shows “25 days left in Pro trial” with an Upgrade action while the app remains usable; outputs/visual-audit-trial-expired/direct/sanehosts-expired-trial.png shows the tactful expired-trial upgrade/license gate.
    • Mini customer_ui_sweep --json passed after the version bump and before release with receipt timestamp 2026-06-21T09:05:18Z, source fingerprint 4c0bfdbd26fd19197f133a0b8d40b8487d6bd9fe164f9e673a4df15588c12f1f, and live log outputs/live-logs/customer_ui_sanehosts_20260621T090419Z.log.
    • Release commits on main: 3d5507e simplified SaneHosts and added the Pro trial gate, 5d88ed1 bumped version metadata, 363d4f2 restored appcast compatibility after the cleanup pass, and 08bd021 synced release metadata. Tag v1.1.17 points at 363d4f2.
    • Release artifact: https://dist.sanehosts.com/updates/SaneHosts-1.1.17.zip with SHA-256 30f35dc82f7152447ebee087291a1ebb762da3196e1e9d7c16dd3b7d28dfa94b, size 4569411, notarization submission dd1a71bc-1450-46ae-8ac1-f981d3150b11, and Sparkle signature pBk16roXWXtEMxKbR6HZAgD0vDSbojgSUzn2jS8xGZeGw2M9nGH1Y31RQZuGsA8/2SWxW9H/ENc90ESQCm8PCQ==.
    • Release surfaces updated and verified: GitHub release v1.1.17, R2 download, https://sanehosts.com/appcast.xml, Cloudflare Pages website, Homebrew tap commit d2987c3, and sane-email-automation commit 8b4bde9.
    • Lemon Squeezy dashboard sync completed on the Mini: uploaded SaneHosts-1.1.17.zip, unpublished stale SaneHosts-1.1.16.zip, and verified ./scripts/SaneMaster.rb hosted_file_actions --json reports SaneHosts status: In sync with one published file.
    • Post-sync ./scripts/SaneMaster.rb release_preflight passed on the Mini-routed workspace with 99 tests. Remaining warnings only: App Store product marker absent, UserDefaults/migration changed, 6 pending customer emails, and evening release timing.
  • 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-through DirectDistributionSupport.swift mover wrapper, deleted stale generated docs and then restored docs/appcast.xml as 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 from 11726 to 10949. Verification after each code stage: Mini ./scripts/SaneMaster.rb verify --timeout 900 passed 97 tests after Stage 1, Stage 2, Stage 3, and Stage 4. Final Mini runtime proof: customer_ui_sweep --json passed 11 actions with receipt timestamp 2026-06-21T05:31:11Z, live log outputs/live-logs/customer_ui_sanehosts_20260621T052946Z.log, and visual smoke receipt outputs/visual_smoke/visual_smoke_20260621-013043_38239. Final release-mode resource soak from /Applications/SaneHosts.app passed 240s / 33 samples with avg_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 .sane receipt and outputs/customer-ui/*** proof artifacts. Fresh Mini customer_ui_sweep --json passed with receipt 2026-06-21T07:42:44Z, then routed release_preflight passed with 0 issues 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.swift owner into focused SwiftUI files under SaneHostsPackage/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, and MergeProfilesSheet.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 SaneHostsPackage and ./scripts/SaneMaster.rb verify --timeout 900 both passed; SaneMaster reported 97 tests passed. After the 1.1.16 / build 1116 release bump, Mini ./scripts/SaneMaster.rb verify --timeout 900 passed again with 97 tests.
    • Customer UI contract was refreshed after the source split and after the release metadata bump. Latest Mini ./scripts/SaneMaster.rb customer_ui_sweep --json passed with 11 actions and receipt timestamp 2026-06-04T02:32:42Z.
    • Release preflight for 1.1.16 passed with warnings only. Expected pre-publish warnings: uncommitted release-candidate files, UserDefaults migration notice, live appcast/Homebrew still at 1.1.15, one open GitHub issue, pending email queue, and evening timing.
    • Mini runtime proof passed through ./scripts/SaneMaster.rb test_mode --no-logs and ./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 failed screen.png in visual_smoke_20260603-222650_7365 is contaminated by a Codex window/notification and should not be used as visual proof.
    • Direct-download release v1.1.16 shipped and deployed: https://dist.sanehosts.com/updates/SaneHosts-1.1.16.zip. Release tag v1.1.16 points at 2f89e60; release metadata commit d87becc is on main.
    • Release evidence: SaneMaster routed release from the MacBook Air to the Mini, passed 97 tests, archived/exported Developer ID signed app, notarized and stapled Apple submission 2c4a958d-620a-4304-b927-70972cb85f88, uploaded R2 ZIP SHA-256 3aae3614d295e5df3989fd68f89fbf32cf3f96d25a0823dad3dce3ee63a391a5, updated appcast/website/Homebrew/GitHub release, and verified the download.
    • Post-release preflight passed at 2026-06-03T23:08:34-04:00 with 0 issues and 4 warnings in outputs/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 report 1.1.16 / build 1116.
    • Release tooling fix: Air-off-LAN releases were initially blocked because release.sh trusted SaneMaster's routed workspace context for cleanliness but still fell through to the old Mini-to-Air .local SSH reconcile query. SaneProcess branch fix/hook-staleness-gates commit cb934c4 now 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-automation commit 7cff266; bundle purchase mapping was also updated and tested in c930f98, then deployed to Cloudflare Worker version f9b292a8-fde5-4b39-b7a6-025ecf1336dc.
  • 2026-06-01 v1.1.15 direct-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: 91a992b enabled the direct 30-day Pro trial, 3b871cb bumped version, and 802468d synced release metadata. Tag v1.1.15 was published.
    • Canonical Mini preflight passed with warnings only; release script reran ./scripts/SaneMaster.rb verify and passed 97 tests.
    • 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.
  • 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 / build 1115 and consolidated the duplicate 1.1.14 changelog 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_at plus the sanehosts.pro_trial_started event.
    • Verification: Mini ./scripts/SaneMaster.rb verify --timeout 1200 passed 97 tests. Mini visual smoke passed at /Users/stephansmac/SaneApps/apps/SaneHosts/outputs/visual_smoke/visual_smoke_20260525-220458_32163. Mini customer_ui_sweep --json passed with receipt generated 2026-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.14 shipped and deployed:

    • Release commits on main: b234f1a fixed overlay/readability, large-profile runtime, import cancellation, DNS/activation error handling, and regression coverage; 4ff87eb bumped version to 1.1.14; fa0b819 synced 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 to 1.1.14; website/email webhook updated to the same ZIP.
    • Verification before ship: Mini ./scripts/SaneMaster.rb verify --timeout 900 passed 96 tests; release script reran the same test suite; Mini sane_test.rb SaneHosts --no-logs built/launched the app; Mini customer_ui_sweep --json and strict customer_ui_contract --strict-visual --json passed with 11 covered customer actions.
    • Visual evidence inspected: normal completed-tutorial screenshot outputs/local-visual/sanehosts-normal-app-see-20260525-191008.png and first-run tutorial screenshot outputs/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 MB RSS, and ~83 MB physical footprint. Restricted leaks reported 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.zip to SaneHosts-1.1.14.zip; the stale file was unpublished, and ./scripts/SaneMaster.rb hosted_file_actions --json now reports current_actions: [] with SaneHosts status: In sync.
    • Customer replies posted after user approval: #4 comment 4538794202 was posted and the issue was closed as fixed in 1.1.14; #5 comment 4538794511 was posted and the issue remains open for reporter confirmation on 1.1.14.
    • Tooling note: the canonical release script invoked an nv README 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.
  • 2026-05-25 18:40 EDT SaneHosts #4 latest 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. #5 has no new reporter evidence after 1.1.13 and remains waiting for reporter confirmation.
    • Root cause for the still-dark #4 screenshot 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 900 passed 88 tests. Mini first-run visual smoke passed at outputs/visual_smoke/visual_smoke_20260525-183856_6753/ and the inspected app-see.png shows the tutorial tooltip visible in-frame. Mini completed- tutorial visual smoke passed at outputs/visual_smoke/visual_smoke_20260525-184024_15764/ and the inspected app-see.png shows the normal main window readable with no visible clipping.
  • 2026-05-25 09:33 EDT cross-product launch ops reran canonical Mini launch_readiness; it exited 1, 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 for website/videos/sanehosts-privacy-switch-30s.mp4, the Product Hunt maker comment/day-of checklist still needs exact approval, Mini release_preflight still carries 4 warnings, 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_preflight passed 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.255 wrapped in the IP column. IPAddressText is now one-line/fixed-size and the IP column is 140 points wide.
    • Regression test added: EntryRowLayoutPolicyTests.ipAddressesStayOnOneLine.
    • Strict customer UI contract then caught a manifest gap: bulk-entry-actions had fixture/state proof but no screenshot evidence. Tests/CustomerUIActions.yml now requires screenshot for that action, guarded by CustomerUIManifestPolicyTests.bulkEntryActionsRequireVisualEvidence.
    • Fresh Mini visual receipts inspected: visual_smoke_20260524-192153_63437 in Basic and visual_smoke_20260524-192341_71984 in Pro; the IP row no longer wraps.
    • Mini customer_ui_sweep --json generated receipt 2026-05-24T23:28:03Z; strict customer UI contract passed with no issues or warnings; Mini ./scripts/SaneMaster.rb verify --timeout 900 passed 85 tests.
  • 2026-05-15 launch-readiness cleanup:

    • Current direct-download release identity is 1.1.11 (build 1111), matching Config/Shared.xcconfig, README, and website/appcast.xml.
    • .saneprocess now marks the website lane as active with website_domain: sanehosts.com.
    • scripts/customer_ui_action_sweep.rb was 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.mp4 with SHA-256 7132b6758a8c1505d76a410b9f951912a57d909c5454660154df5568421c264e.
    • 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.
  • 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-exit passes with 11 required actions covered; receipt generated 2026-05-12T03:45:56Z on host mini.
    • Mini ./scripts/SaneMaster.rb verify passed 82 tests.
  • Current direct-download release is 1.1.16 (build 1116).

  • 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, and events --app SaneHosts --days 30 before 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.

Release Update - 2026-07-18

  • Direct-channel SaneHosts 1.1.23 (build 1123) is live. The public appcast contains a signed SaneHosts-1.1.23.zip enclosure 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 11 actions, behavioral migration proof, and release preflight verify evidence 115 tests 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.zip from https://dist.sanehosts.com/updates/ and post-release checks are rerun. The dashboard product is 794910, variant 1253740; current hosted file is still 1.1.22.
  • Product roadmap issue: https://github.com/sane-apps/SaneHosts/issues/6 tracks 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.

Launch Ops - 2026-06-23

  • Cross-product launch ops reran canonical Mini ./scripts/SaneMaster.rb launch_readiness --json from 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_preflight still 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.json is still NOT READY FOR RELEASE with stale SaneHosts customer-UI proof. No package/submission/scheduling/public-post action ran today.