Public: anyone can read this; the crew can change it.
A board made in the terminal is yours: it is kept when a signed-in person creates it, and can be kept or renamed from there #102
Sign in to join this conversation.
Public: anyone can read this; the crew can change it.
Close the terminal's ownership gap: a board created over ssh by a signed-in person should be theirs, and the two board-level things the page can do — keep it, rename it — should have keys.
What it is like today.
src/keys.ts'sBoardStore.createBoard(name)takes no owner (line 24), sosubmitPrompt'snewBoardcase callsdb.createBoard(text)and the row lands withowner_id = NULL.visibleBoardslists onlylistBoardsByOwner(ownerId), so the board a signed-in person just made withnis gone from the picker the moment they pressb— its 8-character id is the only way back, which the code comment andREADME.md:206both admit. Meanwhile the page has Keep this board (POST /b/:id/claim→db.claimBoard) and a board-rename form, and the terminal has neither, which is the parityAGENTS.mdasks for ("what a person can do on the web page they should be able to do here too").The one thing the terminal genuinely lacks is a display name:
src/session.tsreadsFORGE_APP_USER_IDandFORGE_APP_USER_ROLEonly.board.owner_nameis already nullable, so an owner with no name is a shape the schema allows — the page just has to stop treating "no name" as "nobody".Done looks like
BoardStore.createBoardtakes the same optional ownerdb.createBoardalready takes, andnewBoardpasses one whenstate.ownerIdis set: a board created by a signed-in ssh session hasowner_idset and appears in the picker straight away. Akeys.test.ts-style test drivesnthroughhandleKeywith an owner and asserts the created board comes back fromvisibleBoards.Kis taken by the card move;sfor "save/keep" oryfor "yours", the builder picks and the footer says which) that callsdb.claimBoard. The three results are three messages in the status line: kept, already yours, andalready kept by someone else— never silence, never a second owner.ownerId === null, the statesrc/session.tsreturns without a verified role) is refused withsign in through the forge to keep a board, and nothing is written.renameColumn's, callingdb.renameBoard, so the name in the header and on every open web page changes (renameBoardalready bumps both revisions, and #31's bridge carries it to the browser).owner_name = null, andkeepHtmlinsrc/pages/board.tsswitches fromowner_name !== nulltoowner_id !== null, showingKept by <name>when there is a name andKept by a signed-in personwhen there is not. A page test covers both rows.README.md's terminal section and its line about "every board the terminal creates is still a guest's" are rewritten to what is now true, and the ssh trust caveat insrc/session.tsstays stated — this makes ownership rest on the same unverifiedFORGE_APP_USER_IDthat the picker already trusts for reading, and the README must say so in one sentence.Files I expect to change:
src/keys.ts,src/tty.ts(footer only),src/session.ts(only if the owner shape moves there),src/pages/board.ts(keepHtml),src/tty.test.ts,src/pages/board.test.ts,README.md.Risks. Two: writing ownership from an environment variable the forge's sshd is only assumed not to forward — no new trust, since the picker already reads boards by that id, but say it plainly; and key-letter collisions, since the board mode already spends a, e, d, c, r, D, f, u, b, q, h/j/k/l, H/J/K/L, [ and ]. Pick unused letters and keep the footer honest.
Waits for #41, which is rewriting the terminal's text (
FORGE_APP_SSHwhere it tells people how to connect) — one builder insrc/tty.tsat a time.Suggested: scout, reviewed by mason.