f3e9487215
- Use mediaPlayback|systemExempted FGS type with FOREGROUND_SERVICE_SYSTEM_EXEMPTED so alarms fire on Android 14+ (FOREGROUND_SERVICE_ALARM does not exist in the SDK) - Deduplicate fire notifications: the foreground service FSI notification is the single owner; receiver path removed - Notification channel v2 with alarm sound URI and USAGE_ALARM attributes, one-time guarded migration from legacy channels - Pass fallback station through the MethodChannel (NativeAlarmSpec schemaVersion 3) with a three-stage audio chain: primary -> fallback station -> bundled WAV - Native fade-in volume ramp honoring fadeInSegundos when the app is killed - Request battery-optimization exemption once, tracked with a persisted asked-once flag - Fix snooze end-to-end: native ACTION_SNOOZE now reports back to Flutter (snoozed event + cold-start sync), snooze anchor unified to occurrence+minutes on both sides, periodic recalc no longer erases an active snooze - Add snooze buttons (3/5/10/custom) to the ringing screen with shared audio teardown - Redesign ringing screen on PluriWaveScaffold with reduced-motion-aware entry animation (new PluriAnimate helper) - Alarm editor: live next-trigger preview, searchable station pickers (primary and fallback), configurable snooze duration, volume floor down to 0 - New alarm strings localized across all 13 locales - New unit/widget tests for the snooze flow, alarm bridge payloads, ringing screen and editor (77 tests green) - SDD artifacts for the app-quality-and-native-alarms change (explore, proposal, spec, design, tasks, apply progress)
68 lines
2.0 KiB
YAML
68 lines
2.0 KiB
YAML
schema: spec-driven
|
|
|
|
context: |
|
|
Tech stack: Flutter/Dart app for Android+iOS. Version 0.1.60+61. Dart SDK ^3.7.0.
|
|
Architecture: Provider/ChangeNotifier with Spanish domain folders: estado, modelos, pantallas, servicios, widgets.
|
|
Core deps: just_audio, audio_service, audio_session, provider, sqflite, shared_preferences, http,
|
|
google_fonts, flutter_animate, cached_network_image, shimmer, share_plus, file_picker, uuid,
|
|
url_launcher, geolocator, geocoding, package_info_plus, path_provider.
|
|
Testing: flutter_test via `flutter test`; Strict TDD enabled. Dev: sqflite_common_ffi for unit tests.
|
|
Style: flutter_lints via analysis_options.yaml; use flutter analyze and dart format.
|
|
Constraint: never run flutter build after changes.
|
|
|
|
strict_tdd: true
|
|
|
|
testing:
|
|
strict_tdd: true
|
|
detected: 2026-06-04
|
|
test_runner:
|
|
framework: flutter_test
|
|
command: flutter test
|
|
layers:
|
|
unit:
|
|
available: true
|
|
tool: flutter_test
|
|
integration:
|
|
available: false
|
|
tool: null
|
|
e2e:
|
|
available: false
|
|
tool: null
|
|
coverage:
|
|
available: true
|
|
command: flutter test --coverage
|
|
quality_tools:
|
|
linter:
|
|
available: true
|
|
command: flutter analyze
|
|
type_checker:
|
|
available: true
|
|
command: flutter analyze
|
|
formatter:
|
|
available: true
|
|
command: dart format .
|
|
|
|
rules:
|
|
proposal:
|
|
- Include rollback plan for risky changes
|
|
- Identify affected modules/packages
|
|
specs:
|
|
- Use Given/When/Then format for scenarios
|
|
- Use RFC 2119 keywords
|
|
design:
|
|
- Include architecture decisions with rationale
|
|
tasks:
|
|
- Group tasks by phase
|
|
- Use hierarchical numbering
|
|
- Keep tasks small enough to complete in one session
|
|
apply:
|
|
- Follow existing code patterns and conventions
|
|
- Strict TDD Mode is active
|
|
- Never run flutter build
|
|
verify:
|
|
- Run tests if possible
|
|
- Compare implementation against every spec scenario
|
|
- Never run flutter build
|
|
archive:
|
|
- Persist final state to Engram and openspec
|