Contacts CRM + tapback/empty-stub reliability fixes#53
Open
clickclacknvrwhack wants to merge 3 commits into
Open
Contacts CRM + tapback/empty-stub reliability fixes#53clickclacknvrwhack wants to merge 3 commits into
clickclacknvrwhack wants to merge 3 commits into
Conversation
A relationship view over everyone you've messaged.
- Store: people.go aggregates 1:1 messages by normalized person (across
platforms) with real message counts; contact_meta.go holds per-person
tags, reach-out cadence, and a cached relationship summary (contact_meta
table). story/summary.go generates a local relationship summary and
filters system/RCS-banner messages ("No communication" when empty).
- API: GET /api/people (list) and /api/people/{key} (detail), plus
POST sub-actions /tags, /reach-out, /summary. The mutating sub-actions
now require POST (405 otherwise), matching the sibling routes — previously
they mutated on any verb, including GET.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Two live-path fixes plus startup repairs: - tapback.go: iMessage tapbacks (`Loved "see you then"`) arrive from iPhones as plain SMS/RCS text. Convert them into an emoji reaction on the message they refer to instead of storing a standalone row. Guarded against false positives: a non-truncated quote must match a message in full (only iMessage's ellipsis-truncated quotes match by prefix), so a user who types `Loved "hi"` doesn't silently lose the message to a prefix match. - stub.go: detect and drop empty placeholder rows (no body/media/reactions + terminal status) that would otherwise render as "Empty message" and wrongly surface a conversation in recents. - events.go / backfill.go gate incoming messages through both; app.go runs RepairTapbacks + RepairEmptyStubMessages on startup for existing data. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A person icon in the header opens a full-screen Contacts overlay: a searchable, sortable people list (Recent / A–Z / Most messages) on the left, and a detail pane on the right showing the avatar, contact info across platforms, last-contacted, editable tags, a reach-out reminder cadence, and a generated relationship summary. "Open conversations" jumps to that person's thread. Consumes the /api/people endpoints. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The second PR from the #40 split, per review. Rebased on current
main. Companion to #52 (schedule-send).Scoped deliberately to the cleanly-novel pieces; see "Deferred" below for what was intentionally left out.
Features
Contacts CRM — a person icon in the header opens a full-screen Contacts overlay:
people.go(aggregation),contact_meta.go(tags/cadence/cached summary),story/summary.go(local summary + system-message filtering), andGET /api/people/GET /api/people/{key}/POST /api/people/{key}/{tags,reach-out,summary}.Reliability fixes
Loved "see you then"texts from iPhones become an emoji reaction on the referenced message instead of a standalone row. Guarded against false positives: a non-truncated quote must match a message in full (only iMessage's ellipsis-truncated quotes match by prefix), so a user who literally typesLoved "hi"doesn't silently lose the message.Review items addressed
/api/people/{key}/{tags,reach-out,summary}now require POST (405 otherwise), matching the sibling routes — previously they mutated on any verb including GET.mainvia Inbox tabs, reaction reactor names, and recents-ordering fix #24).Deferred (intentionally, to keep this focused)
mainalready fixes stale-unread-resurrection via Harden HTTP API; fix stale-snapshot unread clobber; contacts query pushdown #31 (ApplyConversationSnapshot). To honor the "don't ship two mechanisms" requirement, this PR does not include ourlast_read_tswatermark. Happy to send it as a separate focused PR if you'd prefer the watermark approach (which guards all callers, not just the two snapshot sites).CREATE_RCS) and the keyed-reconcile render fix: both entangle withmain's diverged composer/render; better as their own PRs.Verification
go test ./internal/... ./cmd/passes;staticcheckclean on changed packages (no dead code).🤖 Generated with Claude Code