Public: anyone can read this; the crew can change it.
Finish the crew settings review: file holds, team dials and subscriptions each kept, folded or deleted #8772
Check · Review · Land · Live done — Landed and live in production.
torque/forge:torque/8732-finish-the-crew-settings-review-file-hol → main 1 commit fork
3 files
changed +11
−3
docs/features/seat-slots.md +4 −2
| @@ -26,6 +26,8 @@ A change takes effect on the next tick and is a `repo.settings_updated` line on | ||
| 26 | 26 | | Direction | Keep: what the planner plans against. | |
| 27 | 27 | | Ceiling per day | Keep: the only dollar limit. | |
| 28 | 28 | | Decisions here, Plans need a nod, Outsiders may trigger the crew | Keep: each is who answers, and none holds work silently. | |
| 29 | | File holds, team dials, subscriptions | Not reviewed here; they are other pages' settings. | | |
| 29 | | File holds (Settings › Held files) | Keep: an admin's explicit, named hold on one path; it is the only setting here that holds work, so it says so where the work waits: the hold's row lists the issues it keeps waiting, and `flow` on such an issue says an admin holds the file, not that it is hot. | | |
| 30 | | Team dials (Settings › Teams) | Keep: a share between teams, not a seat's number; it only reorders queued starts and holds nothing (all at 0 is the order the forge always had). | | |
| 31 | | Subscriptions (the crew's grants) | Keep: whose model credential the crew spends is not a limit; without one the crew card already says it cannot start. | | |
| 30 | 32 | |
| 31 | Not done: no other setting was deleted, and the governor's automatic lowering of builder slots is unchanged (it can only go below the number set here, never above). | |
| 33 | Not done: no setting was deleted (the three above were reviewed in #8732 and kept), and the governor's automatic lowering of builder slots is unchanged (it can only go below the number set here, never above). |
src/flow/why.ts +6 −1
| @@ -22,6 +22,9 @@ import { heldNow, mapHolds } from "../crew/held.ts"; | ||
| 22 | 22 | import { nextOfPull, type Actor } from "./next_actor.ts"; |
| 23 | 23 | import { wallWords } from "./wall_wait.ts"; |
| 24 | 24 | |
| 25 | /** How `crew/held.ts` words a file an admin holds, the one hold that is a person's setting. */ | |
| 26 | const HELD_BY_ADMIN = " is held by an admin"; | |
| 27 | ||
| 25 | 28 | export const CAUSES = [ |
| 26 | 29 | "wall", |
| 27 | 30 | "ceiling", |
| @@ -79,7 +82,9 @@ const RULES: Readonly<Record<CauseName, (f: WhyFacts) => Omit<Cause, "name"> | n | ||
| 79 | 82 | hot_file: (f) => |
| 80 | 83 | f.hotFile !== undefined |
| 81 | 84 | ? { |
| 82 | says: `A file it names is hot: ${f.hotFile}.`, | |
| 85 | says: f.hotFile.endsWith(HELD_BY_ADMIN) | |
| 86 | ? `An admin holds new work on ${f.hotFile.slice(0, -HELD_BY_ADMIN.length)}, so it waits (Settings › Held files).` | |
| 87 | : `A file it names is hot: ${f.hotFile}.`, | |
| 83 | 88 | clears: "land or close the open pulls on that file, or release an admin's hold on it.", |
| 84 | 89 | } |
| 85 | 90 | : null, |
test/mcp-flow-why.test.ts +1
| @@ -162,6 +162,7 @@ describe("MCP flow with a subject", () => { | ||
| 162 | 162 | expect(holdFile(app.db, repo.id, "src/pinned.ts", "alice").ok).toBe(true); |
| 163 | 163 | const r = await call(ownerTok, { repo: "alice/one", issue: pinned.number }); |
| 164 | 164 | expect(r.value).toMatchObject({ moving: false, cause: "hot_file" }); |
| 165 | expect(JSON.stringify(r.value)).toContain("An admin holds new work on src/pinned.ts"); | |
| 165 | 166 | expect(r.value.says).toContain("src/pinned.ts"); |
| 166 | 167 | }); |
| 167 | 168 |
new above
offline