51 lines
5.1 KiB
Markdown
51 lines
5.1 KiB
Markdown
# Acceptance and verification
|
|
|
|
## Executed in the implementation environment
|
|
|
|
- Python API tests: 21 passing, including strict validation, inheritance, optimistic revisions, authorization boundaries, cookie-origin checks, session rotation, persistence, code expiry, reward caps, idempotency and concurrent submission.
|
|
- Swift PolicyCore tests: 10 passing under Swift 6.2.1 on Linux, including day/DST boundaries, bedtime, zero allowances, monotonic usage observations, cap truncation and exhaustive reachable-bonus threshold coverage.
|
|
- JavaScript syntax check; Swift source syntax parsing; YAML/plist/source-path validation.
|
|
- Swift networking source type-check against Linux Foundation with a platform import and local error stub. This is not an Apple SDK build.
|
|
- Chromium DOM + real backend smoke via an in-process ASGI bridge: login, two children, shared policy, individual override, pairing, graded credit, refreshed dashboard and logout. It does not test deployed browser cookies, TLS or a physical iPhone. Parent session/origin behavior is separately covered by API tests.
|
|
|
|
Not executed here: XcodeGen project generation, Xcode compile/link/archive/sign/install, Docker build/run, Screen Time authorization, shield appearance/action on hardware, or real DeviceActivity scheduling/counting. Do not mark these as passed based on pure Swift tests.
|
|
|
|
## First build-server pass
|
|
|
|
- [ ] `make bootstrap && make test` succeeds on the build server.
|
|
- [ ] `make ios-project` generates the four-target project.
|
|
- [ ] Xcode builds with the selected SDK; check all target bundle IDs and App Group entitlements.
|
|
- [ ] Archive/sign/install using owner-supplied profiles. Verify all extensions are embedded.
|
|
- [ ] Docker starts with a generated secret and persistent volume; restart retains profiles and awards.
|
|
- [ ] HTTPS and exact `APC_ORIGIN` work from parent browser and child phone; no plaintext fallback.
|
|
|
|
## Physical iPhone matrix
|
|
|
|
Use a dedicated test entertainment app. Start with a small base quota and the minimum five-minute reward, not essential communication apps. Record target OS version and observed callback times; the implementation intentionally does not fake sub-minute accuracy.
|
|
|
|
- [ ] Child Family Sharing account: approve `.child` authorization, then cancel and retry authorization.
|
|
- [ ] Pair once; code reuse/expired code fails. Reopening the app does not expose unrestricted selection editing.
|
|
- [ ] Parent-selected app is actually shielded outside allowed hours. Close on the shield exits correctly.
|
|
- [ ] Base cumulative usage reaches its threshold and shields the app with Family Quests backgrounded.
|
|
- [ ] Five correct answers record one credit and unlock further **usage** time. Wrong answers earn none.
|
|
- [ ] Putting the phone down does not consume a wall-clock reward; reaching the next usage threshold re-shields.
|
|
- [ ] Repeated Sync, foreground transitions, retrying submission, duplicate/late callbacks, and relaunches do not refund usage.
|
|
- [ ] Earning the last partial reward hits the exact cap. Another challenge cannot earn more that day.
|
|
- [ ] Earn a bonus before base time is exhausted; cumulative accounting remains correct.
|
|
- [ ] Bedtime shields despite unused/earned allowance. Bonus expires at the family-day boundary.
|
|
- [ ] Keep the main app closed overnight: the next allowed window restores base only, not yesterday's bonus. Repeat over two offline days.
|
|
- [ ] Force quit, reboot, lock/unlock and first unlock after reboot: no unexpected clearing or permanent accidental unlock.
|
|
- [ ] Change policy mid-day (raise/lower base, reward size, cap and allowed hours); prior usage is not incorrectly refunded and obsolete callbacks do not win.
|
|
- [ ] Change selected apps with a fresh parent code. Verify removed/new apps and cumulative historical usage; selection changes are a known accounting risk.
|
|
- [ ] Fail monitoring registration / corrupt or make shared state unavailable in a test build: error is visible, no unconditional `clearAllSettings` recovery.
|
|
- [ ] Offline backend, connection timeout, low-power mode and stale snapshots: cached limits remain; no unverified credit is minted.
|
|
- [ ] Change device timezone and clock; verify configured family timezone and check the five-minute foreground skew guard. Offline clock tampering remains a known limitation.
|
|
- [ ] Two children inherit a shared edit; only the child with an override retains its different value. Pending/error/last-reported status is truthful.
|
|
- [ ] Parent code expires and loses validity on leaving the setup session. A child cannot point an already-paired app at a replacement server to authorize selection changes.
|
|
- [ ] Revoke a device: API access stops, cached restrictions remain. Test same-server re-pairing with a new parent-issued code.
|
|
- [ ] A stricter native Apple App Limit still wins. Do not interpret that as a successful override of Apple's native limit.
|
|
|
|
## Stop conditions
|
|
|
|
Treat early/late/missing threshold callbacks, double-counted usage, unexpected unlocks, deadlocks during monitor replacement, storage races, inaccessible essential apps or a guardian recovery failure as blockers to real use. Capture diagnostic logs with test profiles rather than real family data. Do not hide these failures behind a green `applied` label.
|