Roadmap: sequence a core-hardening pass before v8 and test the v7 federation trust boundary #92
Labels
No labels
bug
duplicate
enhancement
future
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
rbrooks/TeaLeaves#92
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Severity: Medium (strategic) · Confidence: Medium · Category: architecture - roadmap note
Context
The spec frames Tea Leaves as "a personal research tool" for one researcher (
docs/Tea Leaves - spec.md:6-8). v7-v9 build multi-instance / multi-user / public-facing infrastructure: ActivityPub federation with signed cross-instance writes (v7, shipped), public anonymous comments + moderation (v8), and social-media monitoring with OAuth (v9).Assessment
Each is individually reasonable, but together they pull effort and attack surface toward speculative federation/social features while concrete high-impact core gaps sit unaddressed: mobile nav breakage (F-21), broken PWA install (F-20), silent capture data loss (F-22), broken restore (F-07), dead semantic-dedup (F-15). The security findings (F-01-F-03) are all on the newest perimeter - which is also the least tested (no signature-verify unit tests).
Recommendation
Insert this v7.1.0 - Core hardening & security milestone before v8, then harden and add signature-verify tests to the v7 federation boundary (F-02, F-03) before building v8's moderation layer on top of it. This is a sequencing decision, not a defect; the point is to fix daily-use and recovery paths and test the trust boundary before adding more perimeter.
Acceptance criteria
Filed from the 2026-07-15 codebase audit. Full report:
docs/.internal/report-2026-07-15.md(gitignored).Done — the v7.1.0 milestone this issue proposed is complete (13/13), landed before any v8 work started.
Acceptance criteria:
api/src/test/unit/ssrfGuard.test.tsandapi/src/test/integration/apSignature.test.ts, which covers a correctly signed request, a replayed one (stale date), a tampered body (digest mismatch), an unsigned digest header, a signature from the wrong key, and the wrong-actor binding end-to-end through the inbox route (a Like signed byaliceclaimingactor: mallory→ 401, with a matching-actor control returning 202 so the 401 is provably the binding).Shipped, in the recommended order:
returnTo.The audit's core concerns, addressed: every daily-use gap it named (mobile nav F-21, PWA install F-20, silent capture data loss F-22, broken restore F-07) is fixed, and the newest perimeter is now the tested one.
Three findings the audit under-called, worth recording:
savedEntryIdwas alwaysnullwhile the voice panel was open, so every Quick Capture voice note was discarded — which also invalidated the suggested "disable the mic pre-save" fix (it would have disabled the feature permanently). Took the auto-create-draft route instead.CMD ["npm", "start"]meant npm, not node, received SIGTERM — the shutdown handler never ran (exit 1,npm error signal SIGTERM). Only caught by actually sending a SIGTERM on the dev server. NeededCMD ["node", …]+init: true.'error'handler on the spawns, so a missingrestic/pg_dumpbinary left the promise pending forever.Deliberate deviation on #81: admin-federated (enabled) origins bypass the private-range denylist, otherwise two homelab instances federating over a private/Tailscale address would break. Mirrors the #62 outbound allowlist; unauthenticated attackers aren't in that table.
Still open (not in this milestone): F-15 dead semantic-dedup is #99 (v7.2.0). The rest of the audit's Medium/Low findings sit in v7.2.0 / v7.3.0 — v8 is now unblocked.
Verified throughout on the dev server (api 238/238, app 63/63, tsc clean, live SIGTERM/icon/open-redirect smoke tests). CI green on
4f8e0fe.