- Rule name is now an inline text field at the top of the editor; the
pencil/rename button and alert are gone (it was unclear what the edit
button did). Names are sanitized on commit: trimmed, falling back to
the kind's default when emptied
- Day-of-week toggles fill the full row width with equal cells and
>= 44pt tap targets
- 'Add Rule' commit button sits on a bar-material bottom inset so form
content no longer collides with it while scrolling (found via
computer-use scan; verified clean in a follow-up scan)
- Tests: 95 passing — new specs for the inline rename flow, day-toggle
geometry, and name sanitization; three tests now scroll to reach
bottom-of-form controls, matching real user behavior
- Spec §6 updated for the editor changes
Co-Authored-By: Claude <noreply@anthropic.com>
- Add Block Adult Content toggle to all three rule editors, persisted as
BlockingRule.blockAdultContent (inline default for clean migration of
existing stores) and surfaced in the detail sheet as an
'Adult websites: Blocked/Allowed' row
- Engage Screen Time's adult-website filter
(webContent.blockedByFilter = .auto()) alongside the rule's shield and
clear it when the shield clears
- Replace the New Rule sheet's view-swap with a NavigationStack push
(navigationDestination(item:)); the editor uses native chrome there
(system back button, inline title, toolbar rename), enabling the push
animation and edge-swipe back
- Tests: 93 passing (+2 unit: draft round-trip and enforcer forwarding;
+3 UI: toggle-to-detail flow, default-allowed row, swipe-back as a
behavioral proof of native navigation)
- Spec updated accordingly (editor sections, behavior, data model,
navigation note)
Co-Authored-By: Claude <noreply@anthropic.com>
Rebuild the app around recurring screen-time blocking rules modeled on
Opal's My Apps tab:
- Onboarding with FamilyControls Screen Time authorization
- Apps home with Blocked Apps tiles and live rule cards
- New Rule sheet: Schedule/Time Limit/Open Limit types + preset gallery
- Rule editors: time windows (incl. overnight), day picker, app selection
via FamilyActivityPicker (Block/Allow Only), rename, Hold to Commit
- Hard Mode: active hard rules cannot be edited, disabled, deleted, or
unblocked until their window ends; soft rules pause until next window
- Shield enforcement through per-rule ManagedSettingsStore + RuleEnforcer
- 73 unit tests (Swift Testing) + 16 UI tests (XCUITest) with launch-arg
harness for in-memory storage, mocked authorization, seeded scenarios
- docs/RULES_FEATURE_SPEC.md: spec derived from the reference recording
Known gap: background window transitions and time/open-limit thresholds
need a DeviceActivityMonitor extension; shields currently sync while the
app is running.
Co-Authored-By: Claude <noreply@anthropic.com>