A to-do app that doesn't believe you — an enforcement layer rather than a
neutral ledger.
Architecture ported from Autoreceptives/Frontend/Receptive: stacked MVVM with
the mandatory 4-file screen pattern, one ParentViewModel owning the loading /
network / error overlays and the handleError decision tree, one AppDataManager
gateway, dio comms carrying the three identity headers, secure storage with
random-suffixed keys, and a single-chokepoint Navigator. Package root and Dart
package name are both Grounded; org is nya.
The enforcement engine, one unit per formula in utils/:
- DebtEngine w(class) x severity(d) x decay(t), sublinear severity so old
misses cannot swamp the score; abandonment 2x with 30-day
decay immunity; late complete retains 30%
- StandingEngine Good -> Warned -> Grounded -> Lockdown, derived not set;
Grounded replaces home with the overdue queue
- CapacityEngine blocks over-scheduling against p50 of historically completed
minutes, with a learned per-category estimation multiplier
- IntegrityEngine session integrity, weekly volume, plyometric contact ceiling
and enforced recovery gaps
- ExcuseAnalyser on-device excuse clustering plus the confrontation copy
- GuardrailEngine distress detection and rationed amnesty
- ToneEngine all enforcement copy, so the tone cap lives in one place
CommitmentEvent is append-only and is the source of truth rather than the
status field, which is what makes honest history and excuse analysis possible.
Goals contain commitments via parentId, and a task can be run from a
full-screen runner that derives elapsed time from wall-clock so screen-off
cannot lose time. Backgrounding pauses the clock and is counted. The runner is
mirrored into an ongoing notification, with alarm-class full-screen intents
reserved for non-negotiables.
Design language, fonts, icon and native splash are in place; Mason bricks are
retargeted to this project and verified end-to-end.
flutter analyze lib/ reports no errors.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mfu2gQLSFN21YRBcU2NrTt
133 lines
4.3 KiB
YAML
133 lines
4.3 KiB
YAML
name: Grounded
|
|
description: Grounded — a to-do app that doesn't believe you.
|
|
|
|
publish_to: 'none'
|
|
|
|
version: 1.0.0+1
|
|
|
|
environment:
|
|
sdk: ^3.6.2
|
|
|
|
dependencies:
|
|
flutter:
|
|
sdk: flutter
|
|
|
|
cupertino_icons: ^1.0.2
|
|
|
|
# ── State management (MVVM) ─────────────────────────────────────────────
|
|
stacked: ^3.5.0
|
|
|
|
# ── HTTP / env ──────────────────────────────────────────────────────────
|
|
dio: ^5.7.0
|
|
flutter_dotenv: ^6.0.1
|
|
|
|
# ── Secure storage ──────────────────────────────────────────────────────
|
|
flutter_secure_storage: ^10.3.1
|
|
shared_preferences: ^2.3.2
|
|
|
|
# ── Navigation ──────────────────────────────────────────────────────────
|
|
page_transition: ^2.0.5
|
|
|
|
# ── Connectivity / device ───────────────────────────────────────────────
|
|
connectivity_plus: ^7.1.1
|
|
device_info_plus: ^12.4.0
|
|
permission_handler: ^12.0.3
|
|
path_provider: ^2.0.11
|
|
uuid: ^4.5.1
|
|
|
|
# ── Proof capture (photo / timer / location) ────────────────────────────
|
|
camera: ^0.12.0+1
|
|
file_picker: ^11.0.2
|
|
image: ^4.2.0
|
|
geolocator: ^14.0.2
|
|
|
|
# ── Report card / charts ────────────────────────────────────────────────
|
|
fl_chart: ^1.2.0
|
|
|
|
# ── Notifications ───────────────────────────────────────────────────────
|
|
flutter_local_notifications: ^21.0.0
|
|
local_notifier: ^0.1.6
|
|
|
|
# ── UI ──────────────────────────────────────────────────────────────────
|
|
flutter_spinkit: ^5.1.0
|
|
modal_bottom_sheet: ^3.0.0-pre
|
|
smooth_page_indicator: ^2.0.1
|
|
group_button: ^5.3.4
|
|
pin_code_fields: ^9.3.0
|
|
calendar_date_picker2: ^3.0.0
|
|
photo_view: ^0.15.0
|
|
flutter_animate: ^4.5.0
|
|
vibration: ^3.1.2
|
|
url_launcher: ^6.1.11
|
|
intl: ^0.20.2
|
|
|
|
dev_dependencies:
|
|
flutter_test:
|
|
sdk: flutter
|
|
|
|
flutter_lints: ^6.0.0
|
|
|
|
flutter_launcher_icons: ^0.14.4
|
|
|
|
flutter_native_splash: ^2.4.6
|
|
|
|
flutter:
|
|
|
|
uses-material-design: true
|
|
|
|
assets:
|
|
- assets/
|
|
- assets/icons/
|
|
- assets/images/
|
|
- .env
|
|
|
|
# General Sans (Fontshare, FFL) — see fonts/LICENSE-GeneralSans.txt
|
|
fonts:
|
|
|
|
- family: GroundedBold
|
|
fonts:
|
|
- asset: fonts/bold.ttf
|
|
|
|
- family: GroundedLight
|
|
fonts:
|
|
- asset: fonts/light.ttf
|
|
|
|
- family: GroundedRegular
|
|
fonts:
|
|
- asset: fonts/regular.ttf
|
|
|
|
- family: GroundedMedium
|
|
fonts:
|
|
- asset: fonts/medium.ttf
|
|
|
|
# ── Launcher icon ─────────────────────────────────────────────────────────────
|
|
flutter_launcher_icons:
|
|
image_path: "assets/icons/icon.png"
|
|
android: "ic_launcher"
|
|
adaptive_icon_background: "#141414"
|
|
adaptive_icon_foreground: "assets/icons/icon_foreground.png"
|
|
min_sdk_android: 21
|
|
ios: true
|
|
remove_alpha_ios: true
|
|
web:
|
|
generate: true
|
|
background_color: "#141414"
|
|
theme_color: "#141414"
|
|
windows:
|
|
generate: true
|
|
icon_size: 256
|
|
|
|
# ── Native splash ─────────────────────────────────────────────────────────────
|
|
# The native splash matches the Flutter splash exactly, so the handover from
|
|
# the OS screen to the app is invisible.
|
|
flutter_native_splash:
|
|
color: "#141414"
|
|
image: "assets/icons/splash.png"
|
|
android_12:
|
|
color: "#141414"
|
|
image: "assets/icons/icon_foreground.png"
|
|
icon_background_color: "#141414"
|
|
android: true
|
|
ios: true
|
|
web: true
|