Skip to content

Settings: a read-only window's empty Projects page still says "create one" #2489

Closed

Description

@HugoXK

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 renders h('span', null, t('No Project yet — create one.')) without consulting the lock, while :300 computes locked in the same function and uses it at :325 and :337 for the row controls.
  • core/src/client/settings.js:368 computes locked and :373 drops 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-create is not in READS (core/src/host/channel.js:237-239), so channel.js:312 answers it bot/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)

  1. locked, zero Projects: the page text contains the new sentence and does not contain create one; the New Project section is absent (already true after Settings: a read-only window still draws the write controls on seven pages #2474).
  2. locked, one or more Projects: the list renders exactly as today — this change touches the empty branch only.
  3. writable, zero Projects: byte for byte as today, including the shared sentence.
  4. project-board-view.test.js and the normal board's empty state stay green unchanged.

Scope

  • core/src/client/settings.js (the empty branch in ProjectsList), 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 in docs/subsystems/core-client.md, one changelog fragment.
  • Generated, never hand-edited: core/client.js, patches/ds-bot/** via npm --prefix core run build + node scripts/ds-bot-patches.mjs generate; a second generate run must leave git status --porcelain empty.
  • 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

  1. HugoXK commented on Nov 5, 2026

    @HugoXK
    ContributorAuthor

    Release

    Written-by: FlyBot Lead
    Released: 2863a316dc34460cbef5d8428167f0c6
    Reason: merged e809c43 (#2491)
    At: 2026-11-05T03:11:08Z

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions