Files
rely/docs/IMPLEMENTATION_PLAYBOOK.md
Rijad Zuzo d80486b25e
Flutter CI / analyze_and_test (push) Has been cancelled
Add maintainer onboarding documentation
2026-07-03 12:44:15 +02:00

3.9 KiB

Implementation Playbook

This guide shows how to add features without breaking the current architecture.

General Workflow

  1. Read the slice README.
  2. Identify whether the behavior is domain, application, presentation, or repository state.
  3. Add or change the feature-owned model.
  4. Update LocalDataState only if a new persisted collection is needed.
  5. Route all writes through LocalRepository.
  6. Add focused tests.
  7. Update docs when behavior changes across slices.

Example Feature: Add A New Captured Fact Type

Suppose you want shares and manual capture to support a new fact type: communicationStyle.

Files To Change

Domain:

  • lib/features/share_intake/domain/share_models.dart
    • add enum value to CapturedFactType
  • lib/features/people/domain/person_models.dart
    • ensure any switch over CapturedFactType handles the new value

Extraction and suggestions:

  • lib/features/share_intake/domain/share_capture_draft_suggester.dart
  • lib/core/llm/llm_service.dart
  • lib/core/llm/captured_fact_draft_parser.dart

Persistence:

  • lib/app/data/relationship_repository_share.dart
    • ensure _applyFactDraftToFacts stores the new type correctly
  • lib/app/state/local_data_state.dart
    • usually no change needed because facts already store CapturedFactType

UI:

  • lib/features/share_intake/presentation/share_capture_review_sheet.dart
  • lib/features/share_intake/presentation/share_inbox_view.dart
  • lib/features/people/presentation/people_view_detail.dart

AI digest:

  • lib/features/ai_digest/application/anonymized_llm_context_builder.dart
    • update _factTypeLabel

Tests:

  • test/features/share_intake/share_capture_draft_suggester_test.dart
  • test/core/llm/captured_fact_draft_parser_test.dart
  • test/features/local/local_repository_test.dart
  • test/features/ai_digest/anonymized_llm_context_builder_test.dart

Rules

  • Add enum values at the end unless there is a strong reason to reorder.
  • Keep fromJson fallback behavior.
  • Add tests for unknown or missing values when changing parsing behavior.
  • Do not make LLM output the only way to create the new type. Provide a local fallback or review UI path.

Example Feature: Add A New Share Source Parser

Suppose you want better Telegram parsing.

Files:

  • Add lib/features/share_intake/domain/telegram_share_parser.dart.
  • Update SharePayloadParser._normalizeSourceApp.
  • Update SharePayloadParser._parseSourceMetadata.
  • Add tests in test/features/share_intake/.

Parser expectations:

  • Return message text without source prefix noise.
  • Extract display name only when the pattern is strong.
  • Extract stable source IDs only when they are provided by the source.
  • Leave unknown timestamps null.
  • Never throw on malformed input.

Repository expectations:

  • Exact identity match can auto-link only when unambiguous.
  • Near matches should route to Share Inbox.
  • Source profile links should be stable across follow-up shares.

Example Feature: Sync A New Entity

Suppose AI suggestion drafts need REST sync.

Files:

  • docs/api/openapi.yaml
  • lib/integrations/backend/models/backend_models.dart
  • generated backend model files
  • lib/integrations/backend/backend_gateway_rest.dart
  • lib/integrations/backend/backend_gateway_fake.dart
  • lib/integrations/backend/sync_envelope_validator.dart
  • lib/app/data/relationship_repository_ai_digest.dart
  • tests under test/integrations/backend and test/features/sync

Design choices to document:

  • entity type string in ChangeEnvelope
  • create/update/delete semantics
  • conflict behavior
  • whether rejected changes are user-repairable
  • privacy implications

Review Checklist Before Shipping

  • flutter analyze
  • focused tests for touched slices
  • full flutter test when practical
  • manual Settings smoke test for config/debug actions
  • manual share simulation test after share changes
  • physical-device test after native share, notification, or background changes