Repository navigation
Description
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.
Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: 2863a316dc34460cbef5d8428167f0c6
Branch: dev/3-settings-projects-empty-copy
Base: 924f623
At: 2026-11-05T02:15:49Z
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment.
Written-by: FlyBot Lead
What happens
In a window that holds the team read-only, Settings → Projects no longer draws the New Project section — #2474 hid it — but the empty state still reads No Project yet — create one. The page has just removed the control and then tells the reader to do exactly the thing it removed, and the only thing the host would answer is bot/read-only.
Reproduction (live main 924f6235)
core/src/client/settings.js:318—ProjectsList's empty branch rendersh('span', null, t('No Project yet — create one.'))without consulting the lock, while:300computeslockedin the same function and uses it at:325and:337for the row controls.core/src/client/settings.js:368computeslockedand:373drops the creation section:locked ? null : h(SetSection, { key: 'new', title: t('New Project') }, …).- Lock predicate:
lockedWindow(roster)(core/src/client/schedules.js:141) — the same one the rest of the page already uses. - Host:
project-createis not inREADS(core/src/host/channel.js:237-239), sochannel.js:312answers itbot/read-only.
Path: read-only window → Settings → Projects, zero Projects → the section header reads Projects · 0 and the only sentence on the page invites creation. The sentence was byte-checked with cat -A: No Project yet — create one., dash U+2014.
Expected (one sentence)
With lockedWindow(roster) true and zero Projects, the Settings → Projects page draws no invitation to create — the empty state uses a new sentence of its own — and a writable window renders byte for byte as today.
Trap, do not do this
No Project yet — create one. is a shared key: core/src/client/project-board.js:1134 (a normally-empty board) and core/src/client/i18n.js:1403 (its zh text) both use it. The locked Settings page gets a new key (e.g. No Project yet. plus its zh line); changing the shared key would move core/test/project-board-view.test.js:202 and core/test/project-settings-page.test.js:106 with it.
Acceptance (red first on a clean base)
- locked, zero Projects: the page text contains the new sentence and does not contain
create one; theNew Projectsection is absent (already true after Settings: a read-only window still draws the write controls on seven pages #2474). - locked, one or more Projects: the list renders exactly as today — this change touches the empty branch only.
- writable, zero Projects: byte for byte as today, including the shared sentence.
project-board-view.test.jsand the normal board's empty state stay green unchanged.
Scope
core/src/client/settings.js(the empty branch inProjectsList),core/src/client/i18n.js(one new key + its zh line),core/test/project-settings-page.test.js(+1 case) or a new test file, one line indocs/subsystems/core-client.md, one changelog fragment.- Generated, never hand-edited:
core/client.js,patches/ds-bot/**vianpm --prefix core run build+node scripts/ds-bot-patches.mjs generate; a second generate run must leavegit status --porcelainempty. - Single client lane:
core/client.js+patches/ds-bot/0008-client-bundle.patch. This PR is the only one on that lane while it is open; the next client PR branches from the main that contains it.
Dedup
Open at filing: No Project yet 0, Projects empty state 0, create one 4 (#645, #450, #571, #1807 — none about this page). #2474/#2479 rewrote the seven Settings pages and hid the New Project section; it left this sentence alone.
Tier: T1 (core/src/client/**, core/test/**, docs/**, patches/ds-bot/**, changelog.d/**).
Activity
HugoXK commentedon Nov 5, 2026
Release
Written-by: FlyBot Lead
Released: 2863a316dc34460cbef5d8428167f0c6
Reason: merged e809c43 (#2491)
At: 2026-11-05T03:11:08Z