···114114### Cursor Persistence Rules
115115116116- If DB commit fails → cursor does not advance → event will be retried
117117+- After successful DB writes, ack Tap first, then persist cursor for operator-visible resume
118118+- If ack fails → cursor does not advance
119119+- If ack succeeds but cursor persistence fails → retry cursor persistence until successful or process exit
117120- If normalization fails → log error, optionally dead-letter, skip → cursor advances
118121- If embedding scheduling fails → document remains keyword-searchable → cursor advances
119122
+4-1
docs/api/specs/07-graph-backfill.md
···59596060For each discovered user:
61616262-1. **Check if already tracked**: Query Tap's `/info/:did` endpoint — if the repo is already tracked and backfilled, skip
6262+1. **Check Tap status**: Query Tap's `/info/:did` endpoint and classify by status:
6363+ - tracked + backfilled: skip
6464+ - tracked + backfilling/in-progress: skip and let current backfill finish
6565+ - untracked or tracked-without-backfill-state: submit to `/repos/add`
63662. **Register with Tap**: POST to `/repos/add` with the DID — Tap handles the actual repo export and event delivery
64673. **Tap backfill flow**: Tap fetches full repo history from PDS via `com.atproto.sync.getRepo`, then delivers historical events (`live: false`) through the normal WebSocket channel
65684. **Indexer processes normally**: The indexer's existing ingestion loop handles backfill events the same as live events — no special backfill code path needed
+2-2
docs/api/tasks/phase-1-mvp.md
···203203204204### Deliverables
205205206206-- HTTP server (chi or net/http)
206206+- HTTP server (net/http)
207207- `GET /healthz` — liveness
208208- `GET /readyz` — readiness (DB connectivity)
209209- `GET /search` — keyword search with configurable mode
···214214215215### Tasks
216216217217-- [ ] Set up HTTP server with chi router
217217+- [ ] Set up HTTP server with net/http router
218218- [ ] Implement `/healthz` (always 200) and `/readyz` (SELECT 1 against DB)
219219- [ ] Implement search repository with FTS queries:
220220
+7-7
docs/app/tasks/phase-4.md
···33## OAuth Setup
4455- [ ] Install `@atcute/oauth-browser-client`
66-- [ ] Host OAuth client metadata JSON at a public URL (or configure for local dev)
66+- [ ] Host OAuth client metadata JSON at a public URL & configure for local dev
77- [ ] Create `core/auth/oauth.ts` — call `configureOAuth()` with client metadata URL and redirect URI
88- [ ] Create `core/auth/session.ts` — session management: get, list, delete stored sessions
99- [ ] Create `core/auth/store.ts` — Pinia auth store with state machine (idle → authenticating → authenticated → error)
···6262- [ ] Add reaction button/picker to PR and issue detail views
6363- [ ] Show reaction counts grouped by type
64646565-## Personalized Feed
6666-6767-- [ ] When signed in, filter activity feed to show activity from followed users and starred repos
6868-- [ ] Add "For You" / "Global" toggle on Activity tab
6969-- [ ] If appview provides a personalized endpoint, use it; otherwise filter client-side
7070-7165## Profile Tab (Authenticated)
72667367- [ ] Wire Profile tab to show current user's profile data
7468- [ ] Show pinned repos, stats, starred repos, following list
7569- [ ] Add logout button
7670- [ ] Add account switcher UI
7171+7272+## Personalized Feed
7373+7474+- [ ] When signed in, filter activity feed to show activity from followed users and starred repos
7575+- [ ] Add "For You" / "Global" toggle on Activity tab
7676+- [ ] If appview provides a personalized endpoint, use it; otherwise filter client-side
77777878## Quality
7979