Mark thread-query-bounds complete and refresh specifier notes

Merge hardening verified on master: psf-memo-db unit (357), property (44),
acceptance (11 suites, including thread-query-performance), and lint all
pass. Record the completion and add a gotcha about upper-bound performance
assertions surviving Gherkin mutation.

By specifier.
This commit is contained in:
Chris Troutner
2026-09-15 16:57:14 -07:00
parent c8ceb825f7
commit 0e1549406f
2 changed files with 28 additions and 36 deletions
+17 -8
View File
@@ -386,7 +386,16 @@ that a single user-facing feature may require specs in more than one component.
store and falls back to an optional externally loaded URL (e.g. from store and falls back to an optional externally loaded URL (e.g. from
memo-db). Spec rendering features against that seam (image shown with the memo-db). Spec rendering features against that seam (image shown with the
right `src`, no `<img>` when unset) rather than against the DOM. Spec: right `src`, no `<img>` when unset) rather than against the DOM. Spec:
`psf-memo-client/specs/account-avatar-display.feature`. 23. **Upper-bound performance assertions can survive Gherkin mutation.**
A step like `the postChildren store was read at most <max_entries> entries`
only fails when the measured reads exceed the bound, so mutating the example
value upward (e.g. `1 -> 3`) can never fail and survives. The
thread-query-performance soft mutation run killed 6 of 8 and left both
`max_entries` upper-bound mutations alive. Treat these as intrinsic
equivalents (documented in `docs/reviews/thread-query-bounds-summary.md`),
not implementation gaps; prefer exact counts or independently-tied fixture
data when a bound must itself be mutatable. Spec:
`psf-memo-db/specs/thread-query-performance.feature`.
--- ---
@@ -424,13 +433,13 @@ At the end of each session, update this file:
- Note the current `master` HEAD commit. - Note the current `master` HEAD commit.
- State the next feature to work on. - State the next feature to work on.
Current `master` HEAD: `5afaa64` (merged architect's account-avatar-display job — Current `master` HEAD: `c8ceb82` (merged architect's thread-query-bounds job —
the `/account` page now renders the avatar image when an avatar URL is set, `GET /posts/:txid/thread` now counts likes only for the thread's txids via
via a pure `AvatarImage` component shared by the browser build and the Node `countLikesForTxids` and prefix-scans `postChildren` per parent through a new
acceptance adapter, with `AccountPage` display helpers `PostQuery.listChildTxids` seam, so its work is proportional to the thread
`getDisplayAvatarUrl`/`hasAvatarImage`/`getAvatarImageUrl` as the testable seam. rather than the database. Spec:
Verified client unit (298) + property (43) + acceptance (all 25 suites) + `psf-memo-db/specs/thread-query-performance.feature`. Verified psf-memo-db unit
lint + build all passing). (357) + property (44) + acceptance (all 11 suites) + lint all passing).
Next action: **TBD** — current direction is front-end improvements to Next action: **TBD** — current direction is front-end improvements to
`psf-memo-client` (UI/UX polish, accessibility, performance, responsiveness, `psf-memo-client` (UI/UX polish, accessibility, performance, responsiveness,
state handling, error surfacing). See `specs/feature-backlog.md`. state handling, error surfacing). See `specs/feature-backlog.md`.
+11 -28
View File
@@ -31,6 +31,14 @@ focus is **front-end improvements** to `psf-memo-client` (the React SPA).
## Recently completed ## Recently completed
- **Thread query performance (2026-09-15):** `GET /posts/:txid/thread` now does
work proportional to the thread instead of the whole database. Like counts are
computed only for the thread's txids via `countLikesForTxids` (the global
`buildLikeCountMap` was removed), and child lookups prefix-scan `postChildren`
per parent through a new `PostQuery.listChildTxids` seam instead of walking the
whole store once per node. Spec:
`psf-memo-db/specs/thread-query-performance.feature`. Merged to `master` at
`c8ceb82`.
- **Account avatar display (2026-09-05):** the `/account` page now renders the - **Account avatar display (2026-09-05):** the `/account` page now renders the
avatar image when an avatar URL is set, instead of only showing the URL as avatar image when an avatar URL is set, instead of only showing the URL as
text. A pure `AvatarImage` component (`src/components/account/avatar-image.js`, text. A pure `AvatarImage` component (`src/components/account/avatar-image.js`,
@@ -157,35 +165,10 @@ Reference: https://memo.sv/protocol (Wayback snapshot 2025-12-15)
--- ---
## Next up: Thread query performance (psf-memo-db) ## Next up: TBD
`GET /posts/:txid/thread` is slow because `get-post-thread.js` does work Current direction is front-end improvements to `psf-memo-client` (UI/UX polish,
proportional to the whole database instead of the requested thread. Two accessibility, performance, responsiveness, state handling, error surfacing).
independent parts, one feature spec:
- **Part A — like counts scoped to the thread.** `execute()` calls
`buildLikeCountMap()`, which iterates every `postLikes` entry and loads one
post per like. Build the thread first, then count likes for the thread's
txids via the existing `countLikesForTxids`.
- **Part B — child loading uses the parent index.** `loadChildTxids()`
iterates every `postChildren` entry once per thread node. Prefix-scan
`parentTxid:childTxid` (as `countRepliesForTxids` already does) instead.
Spec: `psf-memo-db/specs/thread-query-performance.feature`. Affected
component: D (`psf-memo-db`). No client, indexer, or protocol changes.
Thread shape, reply ordering, and per-node `likeCount` remain specified by
`psf-memo-db/specs/like-counts.feature` (scenario 3). `buildLikeCountMap`
still has unit/property coverage; the coder should update it if the method is
removed.
---
## Previous: account avatar display — DONE (2026-09-05)
The `/account` page now renders the avatar image when an avatar URL is set
(pure `AvatarImage` component + `AccountPage` display helpers). Merged to
`master` at `5afaa64`.
## Notes for future cycles ## Notes for future cycles