Giant threads: first unread, where in it, a timeline (#242 step 1d) #301

Merged
littlefox merged 4 commits from issue-285-giant into main 2026-10-23 00:31:59 +00:00
Owner

Closes #285

#242 step 1d: giant threads (100+ replies).

  • Chat: opens at the first unread under "N olästa"; cut above, "startade · N svar sedan dess" with "↑ Till början"; short of the newest, "↓ Till senaste"; a timeline slider over the thread's posts ("Inlägg k av N", months when it spans several) that jumps on release. These sit at the bottom with the reply field so nothing appears above the post being read after it's scrolled to.
  • List card: first post, "… N tidigare svar", the two latest posts, "Öppna vid första olästa".
  • Speed: walking up a long chain was a round trip per text and fetched every stat three times. The walks now fetch the 64 texts before it in its channel at once (fetch_ahead), and a stat already on its way is shared (stats_in_flight). 300 texts up: ~5 batches instead of 300 sequential calls; the giant e2e went from timing out to ~8 s.
  • Test infra: the e2e servers and CI's lyskomd service containers keep their data in memory (lyskomd fsyncs every text; seeding the 3 000-long Jättetråd took minutes).
  • The perf run records opening the perf chain as a chat (giantThread); budgets come with #287.

Verified: new e2e/tests/giant.spec.ts (list card, open at first unread, head, unread line, to the latest, timeline, to the start) in desktop/android/iphone; full e2e suite 368 passed; devserver integration tests 18 passed (new long_chain_walk); unit tests; lint with CI's three clippy commands; screenshots looked at.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8

Closes #285 #242 step 1d: giant threads (100+ replies). - **Chat:** opens at the first unread under "N olästa"; cut above, "startade <datum> · N svar sedan dess" with "↑ Till början"; short of the newest, "↓ Till senaste"; a timeline slider over the thread's posts ("Inlägg k av N", months when it spans several) that jumps on release. These sit at the bottom with the reply field so nothing appears above the post being read after it's scrolled to. - **List card:** first post, "… N tidigare svar", the two latest posts, "Öppna vid första olästa". - **Speed:** walking up a long chain was a round trip per text and fetched every stat three times. The walks now fetch the 64 texts before it in its channel at once (`fetch_ahead`), and a stat already on its way is shared (`stats_in_flight`). 300 texts up: ~5 batches instead of 300 sequential calls; the giant e2e went from timing out to ~8 s. - **Test infra:** the e2e servers and CI's lyskomd service containers keep their data in memory (lyskomd fsyncs every text; seeding the 3 000-long Jättetråd took minutes). - The perf run records opening the perf chain as a chat (`giantThread`); budgets come with #287. Verified: new `e2e/tests/giant.spec.ts` (list card, open at first unread, head, unread line, to the latest, timeline, to the start) in desktop/android/iphone; full e2e suite 368 passed; devserver integration tests 18 passed (new `long_chain_walk`); unit tests; lint with CI's three clippy commands; screenshots looked at. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
A thread of thousands of replies opened at its root and gave no idea
where in it you were. Now it opens at the first unread under "N olästa",
says when it started and how many replies came since, with ways to the
start and the latest, and a timeline slider over its posts. Its card in
the list shows the start, the two latest posts and "Öppna vid första
olästa".

Walking up a long chain was a round trip per text, and each stat was
fetched three times: the walks now fetch the texts before it in its
channel at once, and a stat on its way is waited on, not asked for
again. The e2e servers keep their data in memory: seeding the 3 000-long
thread wrote each text to disk.

Refs #285

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
Roadmap: #242 step 1d done
Some checks failed
ci / e2e (push) Failing after 6m24s
ci / check (push) Failing after 9m2s
ci / desktop (push) Failing after 10m5s
583257d778
Refs #285

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
e2e: show the seed logs when seeding fails
All checks were successful
ci / check (push) Successful in 7m43s
ci / desktop (push) Successful in 15m52s
ci / e2e (push) Successful in 36m24s
8ee3f9ee4b
tail -5 with several files is an error ("option used in invalid
context"), so a failed seed in CI said nothing about why. CI's lyskomd
image was also out of date (its entrypoint couldn't seed a tmpfs);
rebuilt and pushed with tools/ci-images.sh's devserver step.

Refs #285

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XJW2ocwLunyaLiUwCBHEP8
littlefox referenced this pull request from a commit 2026-10-24 13:23:56 +00:00
Sign in to join this conversation.
No description provided.