Public: anyone can read this; the crew can change it.
/forges lists the sent forges that need the owner first: not reporting, apps down, or unclaimed after 3 days #5947
Check · Review · Land · Live done — Landed and live in production.
`/forges` and the MCP `forges` tool now list the sent forges that need the owner first, and each of those rows carries one attention badge saying why. The new order test, `client-list`, `tui-forges` and `forges-timing` pass; the design lint is clean. I couldn't run the type check because the `bun` types weren't installed, so it didn't get past the missing type definition. The sandbox also blocked…
shipped production is serving it deploy da65c36
/forges and the MCP forges tool now list the sent forges that need the owner first, and each of those rows carries one attention badge saying why. The new order test, client-list, tui-forges and forges-timing pass; the design lint is clean. I couldn't run the type check because the bun types weren't installed, so it didn't get past the missing type definition. The sandbox also blocked the test's calls to maria--forge.test and lou--forge.test, which are the test's own fake child addresses.
The order is: "Not reporting" (no word in 24 h), "App down", "Unclaimed" (three days after it was sent), then the rest by last activity, newest first. A row gets only the first reason that applies. The order is made once in src/spawn/clients.ts, in orderRows and attentionOf, which clientRows calls. That is why src/http/mcp.ts is untouched. Rows now carry an attention field, so the MCP output gains it.
A few choices to check:
- Not reporting: a child that didn't answer counts as not reporting, as does one whose last activity is over 24 h old. A child that answers with no activity time is not flagged. I judged that to mean the parent's secret wasn't accepted, not silence.
- Being made: a forge still being made is never flagged.
- Badge: the badge uses the existing
attntone and adata-attentionattribute on its span. I added no new component class.
Tests: test/forges-attention.test.ts seeds four children in the wrong order and checks each comes back in the right place with the right reason. It also covers the unanswered, new and still-being-made cases, and the by-activity tie order. test/client-list.test.ts now checks that the unreachable child lou leads the page with its "Not reporting" badge and that maria has none. I added attention: null to the row helper in test/tui-forges.test.ts so it still type-checks.
Not done: the terminal (TUI) forges screen shows the new order but no attention badge.
To try it, open /forges as an admin with a child that is down or silent; it should lead the list with its badge.
🤖 Generated with Claude Code
The ordering is well placed (one orderRows/attentionOf in spawn/clients.ts, so the page, MCP and terminal all get the order) and the tests cover it. One miss against the list: the two doors differ. The /forges page shows the 'Not reporting / App down / Unclaimed' badge, but the terminal forges screen (src/tui/screens/forges.ts, forgeLines) shows only the new order with no reason, and the pull says so. A person in the terminal sees a reordered list and cannot tell why a forge leads. Fix first: in forgeLines, prefix or append ATTENTION_WORDS[r.attention] when r.attention is not null, and add a case to test/tui-forges.test.ts that fails without it. Also add one line to the README's /forges section saying the list leads with forges that need the owner and why. The preview's /forges answered 404 to an unauthenticated curl, so I could not see the badge there; the page code uses the existing attn badge tone and no new component class, which fits docs/DESIGN.md.
The terminal forges screen now says why a forge leads. The tui-forges and forges-attention tests pass, and I pushed to the same branch. I didn't run the type check or the page and MCP tests again after this change.
- Terminal reason:
forgeLinesinsrc/tui/screens/forges.tsputsATTENTION_WORDS[r.attention]at the front of the row's detail, for exampleApp down · Claimed. Rows that need nothing show no reason. - Terminal test: a new case in
test/tui-forges.test.tschecks the reason appears whenattentionis set and is absent when it isn't. It fails without the change. - README: one sentence added to the
/forgessection says the list leads with forges that need the owner and why, in the page, the terminal and the MCPforges. - Preview 404: the preview's
/forgesanswers 404 to an unauthenticated request because the page is admin-only. The badge only shows when signed in as an admin.
The earlier line "Not done: the terminal forges screen shows the new order but no attention badge" no longer applies.
🤖 Generated with Claude Code
Approved. The order and reasons are made once in spawn/clients.ts, so the page, the terminal and the MCP agree. The badge reuses the existing attn tone, with no new component class. The tests cover each reason, the not-flagged cases and the tie order. The preview's /forges answers 404 to me because it is admin-only, so I read the markup and tests rather than seeing the badge. Two things to do next: (1) drop the cast in orderRows (r as ClientRow) by letting attentionOf take Omit<ClientRow,'attention'>; (2) re-wrap the long README sentence at the same width as its neighbours and add one MCP forges assertion on the attention field.
I merged main into this branch, resolved the five conflicts, and pushed. I couldn't run the type check here: bun x tsc --noEmit failed with "Cannot find type definition file for 'bun'", so it is untried. test/client-list.test.ts, test/tui-forges.test.ts and the test/mcp tests pass locally. I did not run the full suite or test/forges-attention.test.ts.
Both sides' changes are kept:
- Rows: each row carries both the attention badge (why a forge leads the list) and
nextStep, the first step its person hasn't taken, read from the child's heartbeat. Rows are still ordered by attention first, then by last activity. - Terminal forges screen: a line reads like "App down · Claimed · has not reported yet", with the attention word first and the next step last.
- README: it has main's sentence about the next step, followed by this pull's ordering paragraph.
- Tests:
test/client-list.test.tsandtest/tui-forges.test.tsassert both behaviours. One expected string in the terminal test needed the new "· has not reported yet" suffix, because the merged output now includes it.
I merged main into this branch, resolved the four conflicts keeping both sides, and pushed. The type check is clean and the attention and TUI forges tests pass (8 tests). The full bun test did not finish in my sandbox, so the forge's check on this push is the first full run.
src/spawn/clients.ts:ClientRownow has the attention reason plus the crew's spend today and its cap, and both are set when the rows are built.src/tui/screens/forges.tsandsrc/web/pages/forges.ts: each row shows the attention word first, then the existing parts and the spend words. Both import the attention words and the spend words.test/tui-forges.test.ts: the test row has both sets of fields.test/forges-attention.test.ts: this wasn't in the conflict list. Its row helper needed the new spend fields andnextStepto type-check, so I added them. My first push before that fix had the type error; the later pushes fixed it.
Approved. The order and the reasons are made once in spawn/clients.ts, so the page, the terminal and the MCP forges tool agree. Each has a test that fails without the change. It uses the existing attn badge, adds no new component class and no dependency, and works with JavaScript off. It touches none of the files the direction freezes. The page is admin-only, so the preview answers 404 unauthenticated and I could not see the badge there. I could not open the screenshots from this sandbox either, so the phone layout is unverified.
Two things I would do next:
- Add an MCP test that the forges tool returns attention for a silent child. The README promises it, but the only proof is the spread of ClientRow in src/http/mcp.ts.
- Look at a row at 360px that carries the attention badge, the claim badge, the next-step badge and Send a fresh link together, and let the trail wrap if it overflows.
/forgesand the MCPforgestool now list the sent forges that need the owner first, and each of those rows carries one attention badge saying why. The new order test,client-list,tui-forgesandforges-timingpass; the design lint is clean. I couldn't run the type check because thebuntypes weren't installed, so it didn't get past the missing type definition. The sandbox also blocked the test's calls tomaria--forge.testandlou--forge.test, which are the test's own fake child addresses.The order is: "Not reporting" (no word in 24 h), "App down", "Unclaimed" (three days after it was sent), then the rest by last activity, newest first. A row gets only the first reason that applies. The order is made once in
src/spawn/clients.ts, inorderRowsandattentionOf, whichclientRowscalls. That is whysrc/http/mcp.tsis untouched. Rows now carry anattentionfield, so the MCP output gains it.A few choices to check:
attntone and adata-attentionattribute on its span. I added no new component class.Tests:
test/forges-attention.test.tsseeds four children in the wrong order and checks each comes back in the right place with the right reason. It also covers the unanswered, new and still-being-made cases, and the by-activity tie order.test/client-list.test.tsnow checks that the unreachable childlouleads the page with its "Not reporting" badge and thatmariahas none. I addedattention: nullto the row helper intest/tui-forges.test.tsso it still type-checks.Not done: the terminal (TUI) forges screen shows the new order but no attention badge.
To try it, open
/forgesas an admin with a child that is down or silent; it should lead the list with its badge.🤖 Generated with Claude Code
Closes #5941