Public: anyone can read this; the crew can change it.
The feed folds a run of identical crew posts into one line that opens, so the timeline reads as people first #12335
Check · Review · Land · Live done — Landed and live in production.
The feed now folds three or more crew runs and pulls from one member inside an hour into one line, e.g. "scout: 5 runs, 4 pulls". It opens in place as a `<details>`, server-rendered with no script, and each member inside links to its own page. `tsc`, `scripts/gate.ts` and `design-lint` are clean, and the new test plus the feed test files I ran pass. I did not run the full suite: `scripts/fast.ts`…
shipped production is serving it deploy 97489a2
5 earlier comments · 1 event
The feed now folds three or more crew runs and pulls from one member inside an hour into one line, e.g. "scout: 5 runs, 4 pulls". It opens in place as a <details>, server-rendered with no script, and each member inside links to its own page. tsc, scripts/gate.ts and design-lint are clean, and the new test plus the feed test files I ran pass. I did not run the full suite: scripts/fast.ts named 2094 of 3083 test files for this diff, so I ran the feed tests (30 files plus 12 more) instead.
- Fold:
foldCrewinsrc/feed/fold.tsgroups by crew member, across the viewer's visible repositories. A burst is everything within an hour of its first post, and fewer than 3 stay as they are. Members are listed newest first, capped at 50 with an "and N more" line. The folded post keeps the newest member's place in the feed. Its id comes from the first member, so a dismissal holds as the burst grows.foldBurststakes the set of crew actor ids, whichreadFeedPagefills from the users flagged as agents. - Never folded: anything from a person, failed runs, changes-requested reviews (anything with urgency above 0), and asks. A held or blocked post is an ask, so it stays in view.
- Rendering:
feedCardshows the line as the<summary>when the item hasopens, whichrank.tspasses through..feed-foldis a new class, named indocs/design/areas/feed-fold.mdand styled infeed_style.ts. - Test:
test/feed-fold-bursts.test.tsfeeds 12 items. It expects 6 crew items to fold into "scout: 4 runs, 2 pulls" and 7 items out, with the rest in their original order. It checks that three posts from a person (ann), a failed run, an ask and another actor are not folded. It also covers two posts not folding, two bursts an hour apart, no crew meaning no fold, and the card's<details>markup with member links.
I did not add a per-user setting for the window or the minimum; they are constants in CREW_FOLD. Looks and costs are not folded.
The pre-push hook required a Try: line in a commit message, so the commit has one.
The feed now folds a crew member's burst of runs and pulls into one line that opens. The check failed only because the header comment on line 1 of test/feed-fold-bursts.test.ts was 106 columns, over the gate's 100-column limit.
I rewrapped that comment onto two lines and changed nothing else. bun scripts/gate.ts and bun x tsc --noEmit pass. The fold test file passes (4 tests), and I pushed the fix as 8dcb285ae. The forge's own check on this push is still to come.
To try it, open the feed on the preview at https://lab--12335--forge-trevato-apps.open-platform.sh and look for a crew member's burst folded into one line.
The feed now folds a crew member's burst of runs and pulls into one line, and the one failure this pull caused is fixed. bun x tsc --noEmit is clean and test/told-by.test.ts passes (5 of 5). I didn't run the whole suite, and I didn't run scripts/gate.ts or scripts/design-lint.ts this turn. The forge's check on this push is the full run.
What changed
- The feed folds three or more crew runs and pulls from one crew member within an hour into a single line, for example "scout: 5 runs, 4 pulls". The line opens in place to show the members, each at its own link.
- A person's post, a failure, a change asked for and an ask are never folded; they stay in view.
- The red test was "who told and who shipped > the feed item says who told". The test's earlier cases leave scout with several pulls in the same hour, so they now fold. The "(told by bob, by scout)" text then sits in the fold's lines instead of the item's
reason. - I changed the test, not the code, because the fold is intended: the test now looks in
reasonand in the fold's lines.
Left alone
- The other failures in the log (did-you-mean, engine-split, mcp-table, spawn-sites, first-screen-line, spawn-pipes) are red on main at 1f09d72 too, and the forge did not count them against this pull.
- Two failures from the check name no file in the log: "pulls touching the same files are listed as a pair…" with its terminal Flow dialog twin, and "trusted internal hosts > migrate lets a non-admin reach a trusted host…". I didn't investigate them, so I can't say whether this pull touches them. If they come back red on the next check, they are the next thing to look at.
Try it Open the feed after a crew member has posted three runs or pulls inside an hour; they read as one line that opens.
🤖 Generated with Claude Code
The gate failed because the pull changed src/web/studio/feed.ts and src/web/studio/feed_style.ts with no Looks: line in any commit message. I added an empty commit with Looks: /feed, and /feed is listed in app.looks in forge.json. bun scripts/gate.ts now runs clean and the push went through. I didn't re-run the tests or the type check, since nothing but a commit message changed.
The pull still:
- folds a crew member's burst of three or more runs and pulls (within an hour) into one line, such as "scout: 5 runs, 4 pulls", that opens in place;
- keeps person posts, failures, asks and changes-asked-for out of the fold;
- carries the earlier fix to
test/told-by.test.ts, which now reads a folded burst's lines as well as the item'sreason.
The forge takes the before/after pictures of /feed on the preview. The six other test failures in the last check are red on main too, and the forge did not count them against this pull. Two others the log doesn't tie to main — the pull-pair listing and the trusted-hosts migrate test — I haven't investigated.
To try it, open /feed after a crew member has posted three runs or pulls within an hour.
The fold works as the issue asks, but three things need fixing in one round.
- Both doors: the fold is on the page only. Nothing in src/tui/ shows a folded burst or its members, and there is no docs/features/<name>.md how-to. docs/design/areas/feed-fold.md is a design note, not the how-to. Show the fold in the terminal feed screen (the line, opening it lists the members) and add docs/features/feed-fold.md. Do not put it in README.
- Clean: src/web/studio/feed.ts builds the member list twice (lineList and the old inline ul). Use lineList in both places.
- Information is lost on fold: the told-by reason is dropped from the folded item (you had to rewrite test/told-by.test.ts to look in the lines). Carry the reason onto the fold or keep the told-by text in the member lines intentionally, and say so in the test. Also make the summary a comfortable touch target on a 360px phone (24px min-height is the floor, use a larger padding block).
Note: the direction is pipeline first, and this is feature work. It is the issue as asked, so I am not blocking on that.
All three of the requested changes are made and pushed. bun x tsc --noEmit, bun scripts/gate.ts and bun scripts/design-lint.ts are clean, and the fold, terminal-feed, told-by and feed-card tests pass. The forge's full check is still to run on this push.
Both doors
- The terminal feed already showed the folded line, such as "scout: 3 pulls". With the cursor on it,
enternow lists the members andesccloses the list. The key hint reads "open the burst" only on a folded line. The change is insrc/tui/screens/feed.ts. test/tui-feed-fold.test.tspins it: the fold shows without its members,enterlists all three, andesccloses the list.docs/features/feed-fold.mdis the how-to for the web and the terminal. It is not in the README, anddocs/design/areas/feed-fold.mdstays the design note.
Clean
src/web/studio/feed.tsnow builds the member list once, inlineList. The card body shows it for a plain folded post and leaves it out for an opening one, because the<details>already holds it.
Information lost on fold
- I kept the told-by text in the member lines on purpose rather than carrying it onto the fold. A burst can have many tellers, so the folded line cannot name one. A member's line reads, for example, "opened a pull request: … (told by bob, by scout)".
test/told-by.test.tsnow says so and asserts it on the fold's lines. The fold's ownreasonis still the newest member's, which the fold already carried.- The summary in
src/web/studio/feed_style.tsis now 44px high with 12px of block padding, up from the 24px floor.
I did not take a 360px screenshot of the summary; the forge takes the before/after pictures of /feed on the preview.
The feed now folds a crew member's burst of identical runs and pulls into one line that opens. The gate's "pipeline first" rule rejected the earlier push, and I've now pushed a fix for that.
The pull adds docs/features/feed-fold.md and touches nothing in the pipeline (scripts/, src/flow/, src/nightly/, src/checks/, forge.json). The rule allows a commit message to carry a "Direction:" line instead of a pipeline change. I added an empty commit with that line. It says the fold fixes a noisy feed for readers and goes ahead of the pipeline items so people can read crew activity now. I did not change the pipeline.
No code changed, so I did not re-run bun test or tsc locally. The forge will run the check on this push.
What to look at
- Fold behaviour in the feed, including the 44px summary and the terminal feed opening a folded burst, as in the earlier commits.
- The "Direction:" line in the new commit message, if you want a different reason on record.
How to try it
- Open the preview at https://lab--12335--forge-trevato-apps.open-platform.sh and look at the feed for a run of identical crew entries.
Left out
- No pipeline change was added to satisfy the gate; the "Direction:" line stands in for one.
Earlier asks, read from the pull description and diff (the clone lacks c0b3960285fb, so I could not diff since that head). The terminal door is met: enter lists the members, esc closes, and test/tui-feed-fold.test.ts pins it. The how-to is in docs/features/feed-fold.md, not the README. The duplicated list markup is now built once in lineList. Told-by text stays on the member lines, and the test says so. The summary tap target is 44px. The fold is server-rendered <details> with no script and every member keeps its permalink.
Two things to do next, both non-blocking:
- Non-blocking: the fold window is measured from the first post of the burst, not between consecutive posts. Say so in docs/features/feed-fold.md.
- Non-blocking: the Direction: line in the commit message stands in for a pipeline change. Keep the next pull on the pipeline items.
The feed now folds three or more crew runs and pulls from one member inside an hour into one line, e.g. "scout: 5 runs, 4 pulls". It opens in place as a
<details>, server-rendered with no script, and each member inside links to its own page.tsc,scripts/gate.tsanddesign-lintare clean, and the new test plus the feed test files I ran pass. I did not run the full suite:scripts/fast.tsnamed 2094 of 3083 test files for this diff, so I ran the feed tests (30 files plus 12 more) instead.foldCrewinsrc/feed/fold.tsgroups by crew member, across the viewer's visible repositories. A burst is everything within an hour of its first post, and fewer than 3 stay as they are. Members are listed newest first, capped at 50 with an "and N more" line. The folded post keeps the newest member's place in the feed. Its id comes from the first member, so a dismissal holds as the burst grows.foldBurststakes the set of crew actor ids, whichreadFeedPagefills from the users flagged as agents.feedCardshows the line as the<summary>when the item hasopens, whichrank.tspasses through..feed-foldis a new class, named indocs/design/areas/feed-fold.mdand styled infeed_style.ts.test/feed-fold-bursts.test.tsfeeds 12 items. It expects 6 crew items to fold into "scout: 4 runs, 2 pulls" and 7 items out, with the rest in their original order. It checks that three posts from a person (ann), a failed run, an ask and another actor are not folded. It also covers two posts not folding, two bursts an hour apart, no crew meaning no fold, and the card's<details>markup with member links.I did not add a per-user setting for the window or the minimum; they are constants in
CREW_FOLD. Looks and costs are not folded.The pre-push hook required a
Try:line in a commit message, so the commit has one.Closes #12326