Skip to content

chore: align agent guidance and alert ownership#6

Merged
thlaure merged 3 commits into
mainfrom
chore/align-agent-guidance-alert-ownership
Apr 19, 2026
Merged

chore: align agent guidance and alert ownership#6
thlaure merged 3 commits into
mainfrom
chore/align-agent-guidance-alert-ownership

Conversation

@thlaure
Copy link
Copy Markdown
Owner

@thlaure thlaure commented Apr 19, 2026

Summary

  • align \ and shared .claude workflows with the actual repository shape and quality gates
  • extract Flutter startup bootstrap into a dedicated service
  • move alert timeout reconciliation out of the screen and into coordinator/app lifecycle ownership
  • add regression coverage for lifecycle-pause timeout recovery

Architectural impact

  • shared Claude/Codex guidance now matches the cross-platform repo instead of describing only backend-oriented workflows
  • Flutter alert ownership is tighter: UI stays focused on rendering while timeout recovery is coordinator-owned and triggered from app lifecycle

Verification

  • \Analyzing flutter_app...
    No issues found! (ran in 2.2s)
  • \00:00 +0: loading /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart
    00:00 +0: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository getAll returns empty list initially
    00:00 +1: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository add persists a contact
    00:00 +2: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository add multiple contacts
    00:00 +3: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository remove deletes by id
    00:00 +4: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository remove with unknown id does nothing
    00:00 +5: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository update replaces contact with matching id
    00:00 +6: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository update with unknown id does nothing
    00:00 +7: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository save replaces all contacts
    00:00 +8: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/contacts_repository_test.dart: ContactsRepository getAll_skipsCorruptedJsonEntries
    00:00 +9: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository getAll returns empty list initially
    00:00 +10: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository getAll returns empty list initially
    00:00 +11: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository getAll returns empty list initially
    00:00 +12: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository add persists an event
    00:00 +13: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository getAll returns events sorted newest first
    00:00 +14: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository clear removes all events
    00:00 +15: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository add preserves location and contacts
    00:00 +16: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository getAll_skipsCorruptedJsonEntries
    00:00 +17: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository clear_isIdempotent
    00:00 +18: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/repositories/fall_events_repository_test.dart: FallEventsRepository getAll migrates legacy shared preferences into secure storage
    00:00 +19: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/contact_test.dart: Contact toJson / fromJson round-trip
    00:00 +20: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/contact_test.dart: Contact toJson contains all fields
    00:00 +21: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/contact_test.dart: Contact copyWith replaces given fields
    00:00 +22: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/contact_test.dart: Contact copyWith with no args returns equal values
    00:00 +23: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/fall_event_test.dart: FallEvent toJson / fromJson round-trip — alertSent with location
    00:00 +24: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/fall_event_test.dart: FallEvent toJson / fromJson round-trip — cancelled, no location
    00:00 +25: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/fall_event_test.dart: FallEvent all status values round-trip
    00:00 +26: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/fall_event_test.dart: FallEvent fromJson_missingNotifiedContacts_defaultsToEmpty
    00:00 +27: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/fall_event_test.dart: FallEvent fromJson_nullNotifiedContacts_defaultsToEmpty
    00:00 +28: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/models/fall_event_test.dart: FallEvent fromJson_invalidStatus_throwsError
    00:01 +29: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/services/backend_api_service_test.dart: ensureReady registers device once and stores credentials
    00:01 +30: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +31: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +32: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +33: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +34: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +35: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +36: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +37: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +38: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +39: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +40: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +41: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +42: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +43: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +44: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +45: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +46: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +47: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +48: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows 30-second countdown on launch
    00:01 +49: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/services/location_service_test.dart: LocationService getCurrentPosition_returnsNull_whenGetPositionThrows
    00:01 +50: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows warning icon and cancel button
    00:01 +51: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows warning icon and cancel button
    00:01 +52: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen shows warning icon and cancel button
    00:01 +53: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen countdown reflects elapsed time from fall timestamp
    00:01 +54: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen countdown reaches 0 and transitions to sending state
    00:01 +55: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen cancel during countdown prevents sendAlert from running
    00:01 +56: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen tapping cancel pops the screen
    00:01 +57: /Users/thomaslaure/Documents/projects/fall_guardian/flutter_app/test/screens/fall_alert_screen_test.dart: FallAlertScreen remote cancel does not send cancel back to watch
    00:02 +58: All tests passed!

Manual checks

  • verify startup bootstrap still behaves correctly on device/simulator
  • verify fall alert timeout still escalates correctly after app background/resume
  • verify no regressions in watch-to-phone alert flow

Known limitations

  • unrelated local changes in \ and \ were intentionally left out of this PR
  • Flutter still warns that \ and \ do not support Swift Package Manager for iOS

Thomas Laure and others added 3 commits April 19, 2026 18:38
…pp container

Explicit input: false on AcceptInviteInput, AcknowledgeAlertInput, and CreateInviteOutput prevents API Platform from attempting body deserialization on endpoints that take no request body.

Add a Docker healthcheck on the app service so Docker knows when the PHP container is actually ready.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ills

Port the Signalist .claude configuration to Fall Guardian:
- hooks/guardrails.py: PostToolUse guardrail script that warns on protected branch commits, staged instruction files, .env files, multi-layer changes, native bridge contract changes, and sensitive auth/route surfaces
- settings.json: add PostToolUse hooks wiring guardrails.py, allowedMcpServers: [], and missing make targets in permissions
- skills/hotfix: minimal-blast-radius workflow for urgent production fixes
- skills/karpathy-guidelines: execution discipline for ambiguous or refactor-heavy tasks
- commands/fall-guardian/hotfix.md: matching slash command
- AGENTS.md: reference hotfix, karpathy-guidelines, and guardrails.py in the shared assets and improvement policy sections

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- align AGENTS and .claude workflows with the actual repo shape
- fix shared workflow docs that were backend-only or used wrong quality gates
- extract Flutter startup bootstrap into a dedicated service
- move alert timeout reconciliation out of the screen and into coordinator/app lifecycle ownership
- add coordinator coverage for lifecycle-pause timeout recovery
@thlaure thlaure merged commit 711a2f5 into main Apr 19, 2026
6 checks passed
@thlaure thlaure deleted the chore/align-agent-guidance-alert-ownership branch April 19, 2026 17:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant