147 lines
4.5 KiB
Markdown
147 lines
4.5 KiB
Markdown
# Client Iteration Summary
|
|
|
|
Date: 2026-04-01
|
|
|
|
## What was implemented
|
|
|
|
This iteration focused on client-side share capture, local-first structure, and
|
|
safer person assignment.
|
|
|
|
Implemented:
|
|
|
|
- generic shared payload normalization for:
|
|
- plain text
|
|
- URL
|
|
- text + URL
|
|
- a review-first share capture sheet for:
|
|
- assign to existing person
|
|
- create person quickly
|
|
- save to inbox
|
|
- richer local person model support:
|
|
- aliases / nicknames
|
|
- last updated / last interacted timestamps
|
|
- richer local knowledge entities:
|
|
- structured captured facts
|
|
- important dates
|
|
- source/provenance metadata
|
|
- sensitive flag scaffolding
|
|
- inbox triage improvements:
|
|
- draft mapping to note / like / dislike / date / gift / place / activity / misc
|
|
- create person directly from inbox
|
|
- resolve to existing person with fact mapping
|
|
- people profile UI improvements:
|
|
- aliases visible in profile context
|
|
- captured facts section
|
|
- important dates section
|
|
- edit/delete support for facts and dates
|
|
- Android native text share entry:
|
|
- `ACTION_SEND` text intent filter added to `AndroidManifest.xml`
|
|
- trust/privacy wording:
|
|
- clearer local-first copy in settings
|
|
- tests:
|
|
- generic share payload parser tests
|
|
- repository tests for inbox-to-fact and date persistence
|
|
- updated share inbox widget test flow
|
|
|
|
## Architecture decisions
|
|
|
|
### Kept the existing repository-centered local architecture
|
|
|
|
`LocalRepository` remains the orchestrator for local persistence and ingest.
|
|
This avoided a risky refactor and let the new share pipeline build on existing
|
|
person/source-link/moment infrastructure.
|
|
|
|
### Added structured fact/date entities instead of overloading notes
|
|
|
|
This creates a cleaner bridge to future recommendation, summarization, and sync
|
|
work. Shared captures can now produce auditable, typed local knowledge instead
|
|
of only raw note blobs.
|
|
|
|
### Used a review-first share flow for safety
|
|
|
|
Rather than silently guessing in generic share cases, the app now asks for a
|
|
target person or lets the user save to inbox. This is the safer default for a
|
|
relationship product.
|
|
|
|
## Known limitations
|
|
|
|
- iOS still does not have a real share extension target configured. The Flutter
|
|
share logic exists, but native iOS share-sheet presence remains deferred.
|
|
- Android share support added here is text-focused only.
|
|
- Generic share flows do not infer advanced semantic structure automatically
|
|
beyond the existing preference extractor.
|
|
- Captured facts and important dates are local-only and not yet mapped into the
|
|
backend sync protocol.
|
|
- Inbox triage currently converts one structured draft per inbox item. It does
|
|
not yet split a single payload into multiple facts.
|
|
- Search is still strongest in People and not yet expanded across facts/dates/
|
|
inbox.
|
|
|
|
## What should happen next in a backend / LLM session
|
|
|
|
1. Define backend entity contracts for:
|
|
- person aliases
|
|
- structured facts
|
|
- important dates
|
|
- shared payload provenance
|
|
2. Add sync-envelope mappings for the new local entities.
|
|
3. Introduce optional AI-assisted extraction that proposes:
|
|
- multiple facts from one payload
|
|
- date detection
|
|
- confidence scoring
|
|
- recommendation context packaging
|
|
4. Add server-compatible merge/reconciliation rules for conflicting profile
|
|
facts and dates.
|
|
5. Implement explicit privacy controls for any future cloud or AI sharing.
|
|
|
|
## Manual walkthrough
|
|
|
|
### 1. Create person
|
|
|
|
- Open `People`.
|
|
- Tap `Add person`.
|
|
- Enter:
|
|
- `Name`
|
|
- `Relationship`
|
|
- optional `Aliases`
|
|
- optional notes/tags/location
|
|
- Save.
|
|
|
|
### 2. Share text into app
|
|
|
|
- On Android, share any text snippet into the app from another app.
|
|
- Or use `Settings` -> `Simulate Share Capture`.
|
|
- The review sheet should open showing the parsed text/URL preview.
|
|
|
|
### 3. Resolve ambiguity
|
|
|
|
- In the review sheet, choose a fact type such as `Like` or `Note`.
|
|
- Pick an existing person from recent chips or the full dropdown.
|
|
- Save to that person.
|
|
|
|
### 4. Save to inbox
|
|
|
|
- Repeat with another shared snippet.
|
|
- In the review sheet, choose `Save To Inbox`.
|
|
- Open `Share Inbox`.
|
|
|
|
### 5. Assign later
|
|
|
|
- In `Share Inbox`, open the queued item.
|
|
- Confirm or change the fact mapping.
|
|
- Choose `Review & Save` to match an existing person, or `Create Person`.
|
|
- Complete the flow.
|
|
|
|
### 6. Edit captured fact
|
|
|
|
- Open `People`.
|
|
- Select the person.
|
|
- In `Captured facts`, tap `Edit` on the new fact.
|
|
- Change the text/label/type or sensitive flag and save.
|
|
|
|
### 7. Edit captured date
|
|
|
|
- If the capture was saved as a date, open `Important dates`.
|
|
- Tap `Edit`.
|
|
- Adjust label/classification/date and save.
|