Skip to content

core: a read-only window still offers every scheduled-task write, and a refused Pause/Resume/Delete says nothing - #2235

Merged
Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/2-p451-schedules-readonly
Nov 3, 2026
Merged

Birfy merged 1 commit into
ThinkFlowLab:mainfrom
HugoXK:dev/2-p451-schedules-readonly

Conversation

@HugoXK

@HugoXK HugoXK commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #2232

Owner: Dev-1
Written-by: Dev-1
Reviewer: Birfy
Claim-Id: cf7d59a6986a47338e5efc88cb027219
Branch: dev/2-p451-schedules-readonly
Base: 9863992
Tier: T1 (path table: core/src/client/** = T1)
Tree: dc4b87e14cade7b49c4862cfe4ae428a9b0f3261
Head: 88f45d7
Single parent: 9863992
Verified commit: 03e1dc74e1da15575811ac738396716c65369a9d (tree dc4b87e14cade7b49c4862cfe4ae428a9b0f3261); the pushed head is generated from that tree by the push path

What changes

core/src/client/schedules.js never read the window lock, so Settings → Scheduled tasks drew every
write the host refuses in a read-only window, and the refusals it did hit were dropped. Three parts:

A. The lock is read once, the way the rest of the client reads it.
typeof roster.readOnly === 'string' && roster.readOnly.trim() !== '', the same test as
sidebar.js, settings.js and workflows.js. SchedulesPage reads it and passes it down; a locked
page draws no write control — no Turn on/Turn off, no Quiet hours window fields or
Save window, no New task and no create form, and no Edit, Copy, Pause/Resume,
Delete or Retry on a row. They are not rendered rather than disabled: a disabled button still
tells the reader this window can do it. The Quiet hours card keeps its state line (Off /
On, 22:00–07:00) and its hint, which are reads. The page draws no read-only sentence of its
own
: the Settings header already carries it (settings.js .bt-hint.bt-read-only, #2199), and a
second copy would announce twice. BotSchedules (a Bot's settings card) keeps its New task row —
it only calls actions.openSettings('schedules', bot.id) and writes nothing — while its inline
Edit no longer opens the form in a locked window.

B. A refused Pause, Resume, Delete or Retry says so. TaskRow had one refusal slot for Retry and
dropped every other rejection (remove and toggle only cleared busy). It now has one rowError
for all four: the host's own sentence via hostText(error?.message ?? String(error)), drawn in the
slot Retry already had, as role="alert". It is cleared at the start of the next attempt and on
success, so a row carries at most one sentence. A successful Pause still republishes the host's
answer through onView and says nothing.

C. Two visible refusals become announcements. The Quiet hours card's error line and the create
form's error line already printed the host's sentence but carried no role; both are role="alert"
now. Wording is unchanged.

This is not read-only-only: a writable window whose row went stale (another window deleted or moved
the task) hits the same remove/toggle paths, and those were silent there too.

Docs: the core/src/client/schedules.js row of docs/subsystems/core-client.md gains the locked
window and the row alert, and extends its existing "the host's named refusal appears on the form's
error line" sentence to say that line is an alert. Changelog:
changelog.d/2232-schedules-read-only.fixed.md. core/client.js and patches/ds-bot/* are
regenerated from these sources.

Red first

The five new tests are in core/test/schedules-client.test.js; the file runs 49, the 44 on the base
plus these five. They read the real schedules.js bundle with the suite's own renderer, and they can
see what a refusal tried to say because the test's useState stub now records the values handed to
a setter (the stub never re-renders, so state is read from a seeded render as the older tests do).

Before the change, with the final tests in place on 98639924 (sources at the base):

not ok 45 - #2232: a read-only window draws no scheduled-task write control
    a read-only window offers no scheduled-task write, saw Turn off,Save window,New task,Edit,Copy to another Bot or group chat,Pause,Delete task
not ok 46 - #2232: a refused Pause, Resume or Delete says the host sentence in that row, once
    Pause: the host sentence reaches the row, saw [true,false]
not ok 49 - #2232: Quiet hours and the form announce a refusal, not only print it
    one alert on the Quiet hours card
    0 !== 1
# tests 49 / # pass 46 / # fail 3

Reading each:

  • 45 lists seven controls because this mount is the strict one: Quiet hours on (so
    Turn off, Save window and the two time fields exist) and an actions set that carries
    scheduleCreate (so Copy exists). The probe's five — Turn on, New task, Edit,
    Pause, Delete task — are a subset of these seven. The same test's writable control then
    asserts all seven are drawn there, so the empty list is the lock and not a page that failed to
    render.
  • 46 is the swallowed refusal itself: on the base the rejected schedulePause reaches the row
    as [true, false] — busy on, busy off — and the host's sentence never arrives. The test runs
    the same shape for Resume and Delete (the Delete click is the confirming one) and then
    renders the row with the sentence to count exactly one role="alert" in it.
  • 49 is the missing announcement: on the base the Quiet hours refusal already reached the card's
    error state (visible text), but the tree holds 0 role="alert" nodes. The create form's error
    span is the same shape in the same source — h('span', { className: 'bt-danger bt-set-hint' }, error) with no role — and is asserted the same way after this one.

Two tests in the same file are green at the base on purpose, so the fix cannot pass by breaking the
old behaviour: 47 a successful Pause still calls onView with the host's answer and draws no
alert, and 48 a failed row keeps its Retry alert in that same slot.

After the change

Every check below ran on this tree (dc4b87e1…, single parent 98639924…).

node --test test/schedules-client.test.js in core/: 49 tests / 49 pass / 0 fail (44 at the
base; five are the addition).

npm test in core/: 2674 tests / 2674 pass / 0 fail (2669 at the base).

npm run verify — exit 0, 4554 tests / 0 fail:

suite tests fail
core 2674 0
social 563 0
tree 131 0
timeline 140 0
workflow 384 0
.github/scripts 599 0
interop 37 0
live-e2e 26 0

arch-docs: OK (8 changed file(s)); build-client --check exit 0; patches: ds-bot/ = Fei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5), 10 patches apply cleanly in order, core/ equals ds-bot/ + patches/ds-bot/, patches/ds-bot/ is what generate writes (generate is a no-op);
changelog: 9 fragment(s) in changelog.d/ are well formed.

Ran: npm run build in core/ and node scripts/build-client.mjs --check; node scripts/ds-bot-patches.mjs generate, then check and canonical (both no-op after generate);
npm run verify with TZ=UTC ARCH_DOCS_BASE=986399246ff8c26bd418978785ce1199dbd239ca (core lint
including arch-docs and lint-plugins, build-client --check, the patch check, the core suite,
all four plugin suites, .github/scripts, interop and live-e2e); the five new tests on the base
sources with the fix removed; node .github/scripts/changelog.mjs check.
Not run: no real browser or running instance was opened — the lock, the refusals and the alerts were
exercised through the repository's own renderer; no smoke bench (this change touches neither
core/index.js nor core/src/host/); CI's package job (pack check, typecheck, actionlint) is
outside npm run verify.

Policy-sign is not written: none of the changed paths is in policy/gates.json gateFiles.

Coordinates

git diff --stat 98639924...HEAD names the eight files: core/src/client/schedules.js 73/…,
core/client.js 70/…, core/test/schedules-client.test.js 140/…, docs/subsystems/core-client.md
2, changelog.d/2232-schedules-read-only.fixed.md 1, and the three regenerated patches/ds-bot/
files (0001-core-fixes.patch, 0008-client-bundle.patch,
files/test/schedules-client.test.js).

Checkpoint

{
"pr": 2235,
"claim": "Dev-1",
"issue": 2232,
"summary": "A read-only window no longer draws any scheduled-task write: not the Quiet hours toggle, window fields or Save window, not New task or the create form, and not Edit, Copy, Pause/Resume, Delete or Retry on a row. The lock is read once, the way the rest of the client reads it, and controls are hidden rather than disabled; the page draws no second read-only sentence because the Settings header owns it. A rejected Pause, Resume, Delete or Retry now puts the host's own sentence on that row's single alert, and the Quiet hours and create-form error lines gained role=alert.",
"files": ["core/src/client/schedules.js", "core/client.js", "core/test/schedules-client.test.js", "docs/subsystems/core-client.md", "changelog.d/2232-schedules-read-only.fixed.md", "patches/ds-bot/0001-core-fixes.patch", "patches/ds-bot/0008-client-bundle.patch", "patches/ds-bot/files/test/schedules-client.test.js"],
"checks": { "ran": "TZ=UTC ARCH_DOCS_BASE=986399246ff8c26bd418978785ce1199dbd239ca npm run verify", "result": "green", "at": "88f45d7784f37c97a1849ce0b5da027fd1dff967" },
"next": "draft until FlyBot Test's advisory PASS at this tip, then ready"
}

… write says so (ThinkFlowLab#2232)

The page never read the window lock, so Settings → Scheduled tasks drew every
write the host refuses in a read-only window, and the refusals it did hit were
dropped: a rejected Pause, Resume or Delete only cleared the busy flag, and two
visible lines carried no role.

The lock is now read once, the way the rest of the client reads it, and the
write controls are not rendered rather than disabled. A row keeps one refusal
slot: a rejected Pause, Resume, Delete or Retry puts the host's own sentence
there as a role=alert, cleared on the next attempt and on success; the Quiet
hours and create-form error lines gain the same role.

The ds-bot patches and the client bundle are regenerated from these sources
(generate rewrote the client-bundle patch and the whole-file test mirror).
@github-actions github-actions Bot added the risk:T1 Risk tier T1 (client, tests, generated files), set by the controller from the diff label Nov 2, 2026
@HugoXK
HugoXK marked this pull request as ready for review November 2, 2026 23:58
@Birfy

Birfy commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator

Verdict: PASS at 88f45d7
Written-by: Reviewer
Attestation: 88f45d7 role=Reviewer

Ran at this tip:

$ ln -sfn /data/esinst/node_modules p2235tip/core/node_modules
$ cd p2235tip/core && node --test test/schedules-client.test.js
# tests 49  # pass 49  # fail 0
$ cp -a p2235tip p2235red && cp p2235base/core/src/client/schedules.js p2235red/core/src/client/schedules.js
$ cd p2235red/core && node --test test/schedules-client.test.js
# tests 49  # pass 46  # fail 3

Red first, at this tip: with only core/src/client/schedules.js swapped back to its 98639924 blob (the tip's tests kept) the suite is 46/49 — not ok 45 (a read-only window drew Turn off,Save window,New task,Edit,Copy to another Bot or group chat,Pause,Delete task), not ok 46 (the refused Pause reached the row as [true,false] and the host sentence never did) and not ok 49 (the Quiet hours card held 0 role="alert"). 47 and 48 stay green on the base, so the lock and the refusal are what turn them, not the test. Back on the tip: 49/49.

Review points:

  • The lock is read once per page as typeof roster?.readOnly === 'string' && roster.readOnly.trim() !== '', the same test sidebar.js / settings.js / workflows.js use, and passed down; the writes are not rendered rather than disabled, the read half (task list, On, 22:00–07:00, the hint) stays, and the page adds no second read-only sentence of its own — the Settings header owns that one (Settings: a read-only window never says so on the panel it is showing — eight pages offer write controls with no sentence explaining the refusal #2199). BotSchedules keeps its New task row (it only calls openSettings) and drops its inline Edit.
  • One rowError slot per row for Pause, Resume, Delete and Retry, cleared at the start of the next attempt and on success, drawn in the slot Retry already had as role="alert"; a successful Pause still republishes through onView and says nothing. The Quiet hours error line and the create form's error line gained role="alert" with unchanged wording.
  • Scope is what the PR declares: compare 9863992…88f45d7 is one commit on a single parent, 8 files / +688 / −312 — core/src/client/schedules.js, the generated core/client.js, the test, docs/subsystems/core-client.md, the changelog fragment and the three regenerated patches/ds-bot/ files. Nothing outside the issue's subject.
  • Check-runs at this tip (17): all success — tests-ok, package, plugins (tree/social/workflow/timeline), ubuntu-latest · Node 24, risk tier, reviewed tip, merge-gate, enqueue-guard, judge, agent-audience. No failure.
  • Checkpoint block is compliant: 1268 chars with markers, summary 572, next 63, 8 files all in this diff, at = this tip.

Not run here: the full core suite — this box has no dev/harness deps (jsdom, @deepseek-ai/dsh-llm), so only the affected suite and its red control were executed; tests-ok is green on this very tip. No browser or running instance was opened.

Non-blocking follow-up, not a reason to hold: in a locked window opened with a target (start set, i.e. the Bot card's New task row), adding stays true while the form is not drawn, so the page falls past the "No scheduled tasks yet." branch and draws an empty list under the Quiet hours card. It offers no write, so it is not this defect — but it is a blank surface worth a later issue.

@Birfy Birfy added the agent-pr Pull request opened by an agent label Nov 3, 2026
@github-actions github-actions Bot added the pass label Nov 3, 2026
@Birfy
Birfy added this pull request to the merge queue Nov 3, 2026
Merged via the queue into ThinkFlowLab:main with commit 227b94b Nov 3, 2026
17 of 18 checks passed
@Birfy
Birfy deleted the dev/2-p451-schedules-readonly branch November 3, 2026 00:13
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Nov 3, 2026
HugoXK pushed a commit to HugoXK/FlyBot that referenced this pull request Nov 3, 2026
…d-task form

ThinkFlowLab#2235 hid every scheduled-task write a read-only window draws, but three entry points to
the create form stayed: a Bot's Scheduled tasks card kept its New task row, the details
line kept its empty state's Add one, and the composer's "+" menu kept Scheduled task. Each
asked the settings page for a Bot's id, which opens the create form, and a locked page draws
no form, so the click landed on an empty page.

A locked window now draws no New task row, no empty-state Add one, and no Scheduled task
menu row. With tasks, the details line keeps its read-only rows (they open the plain
settings list). In a writable window every one of them stays.

P-457 (bench, local only; the issue and pull request follow the core/client.js lane)
Owner: Dev-4
Written-by: Dev-4
Reviewer: Birfy
Base: 03a1253
HugoXK added a commit to HugoXK/FlyBot that referenced this pull request Nov 3, 2026
…d-task form (ThinkFlowLab#2246)

Written-by: Dev-4
Fixes ThinkFlowLab#2243

Owner: Dev4
Reviewer: Birfy
Tier: T1
Claim-Id: a41089f1cdd34475b08a8e4188440002
Branch: dev/4-p457-schedules-create-entries
Base: 5008116
Tree: 93e92c8
Verified commit: local `51040d46c2fe287320e520b860213bc6f9486f91` (the
same commit that was pushed)
Pushed head: 51040d4
Files: 12 changed, +6975/−6064 (six written, six generated)

Rebased onto `50081167e81ac5ee182e6cc5d1a25ab248329e32` (live main:
`ThinkFlowLab#2263`, then `ThinkFlowLab#2261`); every reading in this revision is from that
base. Two earlier revisions of this body quoted `5a21d5b4` and then
`03a125306` — the code and the case names are the same, the counts move
with main.

## What the rebase onto `50081167` had to resolve

`ThinkFlowLab#2261` (`ThinkFlowLab#2248`, the other team's task-board change, merged upstream)
rewrites `core/src/client/kanban.js` and its tests. This change touches
`schedules.js`, `composer.js` and `details-drawer.js`; the two change
sets meet in three generated or shared files and overlap in no source
line:

- `core/client.js` — generated bundle, both change sets in it;
regenerated by `npm run build` (not hand-merged).
- `patches/ds-bot/0008-client-bundle.patch` — generated mirror of that
bundle; the rebase conflicted here (generated text), and the committed
version is what `generate` writes.
- `docs/subsystems/core-client.md` — one table row each: `kanban.js`
(theirs) and `schedules.js` (this change); both rows stand as written.

Both behaviours are kept: `ThinkFlowLab#2261`'s read-only task board is in
`kanban.js`, tests and bundle exactly as it landed, and this change's
read-only create entries are on top of it. `build-client --check` is
silent, `node scripts/ds-bot-patches.mjs check` answers `ok core/ equals
ds-bot/ + patches/ds-bot/`, and `canonical` answers `ok patches/ds-bot/
is what generate writes (generate is a no-op)` — the mirrors are
generated output, not a resolution by hand.

## The defect

ThinkFlowLab#2235 made a read-only window draw no create form (`settings.js`:
`locked ? null : adding ? TaskForm : …`), but three entries still lead
into it, and each one lands on a page that draws nothing:

- `core/src/client/schedules.js:461` — `BotSchedules` draws its `New
task` row unconditionally (it is `TaskList`'s `extra` row), and the row
calls `actions.openSettings('schedules', bot.id)`.
- `core/src/client/schedules.js:485` — `ScheduleSummary` never read the
roster at all, so its empty state's `Add one` (`No scheduled tasks yet.
Add one`) called the same thing.
- `core/src/client/composer.js:170` — the `+` menu's `Scheduled task`
row calls `openSettings('schedules', target)`.

`settings.js` turns the `start` id into `adding`, so the settings page
really does believe a form is open and then draws no form: a click that
looked live ends on an empty page.

## Red first, on live main `50081167`

Clean tree at `50081167e81ac5ee182e6cc5d1a25ab248329e32` with only the
two test files touched.

- `core/test/schedules-client.test.js` alone → **52 tests / 50 pass / 2
fail**
- `not ok 50 - P-457: a read-only Bot card draws no New task row` — `a
read-only Bot card still offers New task, saw New task`
- `ok 51 - P-457: a locked page opened with a start id draws no create
form` — green on the base, the counter-case that must stay green
- `not ok 52 - P-457: a read-only details line offers no Add one, and a
writable one does` — `the locked details line draws no button`, `actual
[ 'No scheduled tasks yet. Add one' ]`, `expected []`
- `core/test/composer-locked.test.js` alone → **2 / 1 / 1**
- `not ok 2 - read-only window: no menu row opens the schedules page` —
`a read-only window still offers the row: ["Add files","Reference a
chat","Scheduled task"]`, `expected: true`, `actual: false`

The composer case is the one Product's earlier probe could not mount; it
is a real test now, with the three stubs the probe needed
(`createPortal: node => node`, `useState` fed `{left:0,bottom:0}` then
`null`, `useRef: current => ({current})`).

The whole `core` package on the same red tree (both files at their
package numbers): **2685 / 2682 / 3** — `not ok 277`, `not ok 1990`,
`not ok 1992`, the same three cases.

After the fix, on this tip: `schedules-client.test.js` alone **52 / 52 /
0**, `composer-locked.test.js` alone **2 / 2 / 0**; the whole `core`
package **2685 / 2685 / 0**.

## The fix

- `core/src/client/schedules.js`: `lockedWindow(roster)` (the
module-private rule that was already at `:122`) is **exported once**
instead of copied a fifth time — the same predicate still sits in
`workflows.js:570/639`, `sidebar.js:371` and `settings.js:232`, and this
change does not touch those four. `BotSchedules` draws `extra: locked ?
[] : [ … New task … ]`. `ScheduleSummary` takes `roster` and, when the
window is locked and the Bot has no tasks, returns `null`; with tasks it
still draws the read half, because those rows only open the settings
list (`openSettings('schedules')`, no Bot id) and open no form.
- `core/src/client/composer.js`: the local `schedule()` helper is gone
(`:147-151` on the base, call site `:150`); the menu row itself (`:170`)
becomes `locked ? null : …` and imports `lockedWindow` from
`./schedules.js` instead of growing a fifth copy.
- `core/src/client/details-drawer.js:350`: passes the `roster` it
already holds into `ScheduleSummary`.
- `docs/subsystems/core-client.md`: the two sentences that contradicted
each other are now one rule — a read-only window draws neither the empty
state's button nor a Bot card's `New task` row.
- New tests: 3 in `core/test/schedules-client.test.js` (read-only card,
read-only details line, plus the locked page that stays empty), and
`core/test/composer-locked.test.js` in full (read-only draws no row,
writable still posts `('schedules', 'b1')`).

Writable counter-cases live in the same tests: the writable Bot card
still has its `New task` row, the writable details line still draws `Add
one`, and the writable composer row still calls
`openSettings('schedules', <bot id>)`.

## Which six files are written and which six are generated

Written by hand — six:

- `core/src/client/schedules.js` (+10/−6)
- `core/src/client/composer.js` (+5/−5)
- `core/src/client/details-drawer.js` (+1/−1)
- `core/test/schedules-client.test.js` (+32)
- `core/test/composer-locked.test.js` (+82, new)
- `docs/subsystems/core-client.md` (1 line changed)

Generated, never hand-edited — six:

- `core/client.js` (`npm run build`; +1688/−1687)
- `patches/ds-bot/0008-client-bundle.patch` (4993/4354)
- `patches/ds-bot/0001-core-fixes.patch` (12/7)
- `patches/ds-bot/0012-room-membership.patch` (37/3)
- `patches/ds-bot/files/test/schedules-client.test.js` (+32)
- `patches/ds-bot/files/test/composer-locked.test.js` (+82)

## The generated diff is module order, not a hand edit

`core/client.js` and `patches/ds-bot/0008-client-bundle.patch` —
**+1688/−1687 and +4993/−4354** — are **esbuild module order, not a
logic rewrite**: `composer.js` now imports `./schedules.js`, so the
`schedules` block moved in front of the `composer` block in the bundle.
Generated only by `npm run build` and `node scripts/ds-bot-patches.mjs
generate`; `build-client --check` and a no-op `generate` prove it.
`composer.js` imports `./schedules.js`, so the `schedules` block moved
in front of the `composer` block in the bundle. Both files are written
only by `npm run build` and `node scripts/ds-bot-patches.mjs generate`;
neither was edited by hand, and `build-client --check` plus `generate`
being a no-op prove it. `patches/ds-bot/0001-core-fixes.patch` and
`0012-room-membership.patch` follow the same two source files. There is
no `patches/ds-bot/files/src/client/schedules.js` mirror, and none was
invented.

## What I ran at `51040d46c2fe287320e520b860213bc6f9486f91`

`TZ=UTC ARCH_DOCS_BASE=50081167e81ac5ee182e6cc5d1a25ab248329e32 npm run
verify` → **exit 0**

| suite | tests / pass / fail |
| --- | --- |
| core | 2685 / 2685 / 0 |
| plugins/social | 570 / 570 / 0 |
| plugins/tree | 132 / 132 / 0 |
| plugins/timeline | 140 / 140 / 0 |
| plugins/workflow | 411 / 411 / 0 |
| `.github/scripts` | 599 / 599 / 0 |
| interop | 37 / 37 / 0 |
| live-e2e | 26 / 26 / 0 |
| **total** | **4600 / 4600 / 0** |

- `arch-docs: OK (12 changed file(s))`; oxlint **0 errors** in every
suite (74/36/9/2/16 warnings, the same counts as live main; interop 1,
live-e2e 0).
- `ok ds-bot/ = Fei2411/DeepSeek-Bot@2b10c70 (tree 5834c00, v0.1.5)`;
`ok 10 patches apply cleanly in order`; `ok core/ equals ds-bot/ +
patches/ds-bot/`; `ok patches/ds-bot/ is what generate writes (generate
is a no-op)`; `build-client --check` silent.
- The five tests these two files add are the only difference between the
red tree's 2685 and a base tree without them; every other core test is
`ThinkFlowLab#2261`'s and the ones before it.

## Tier, by path (not by a label)

`createGate(risk-rules).judge(files)` over exactly these 12 paths
answers:

`risk-tier: T1; basis: core/client.js=T1, core/src/client/**=T1,
core/test/**=T1, patches/ds-bot/**=T1,
docs/subsystems/core-client.md=T1`

## Not run

- The smoke bench (`dev/bench.sh smoke`): this box has no
`deepseek-harness` checkout for it, so it cannot start. `core/index.js`
and `core/src/host/` are untouched by this change.
- No browser was available, so the window states are exercised through
the modules and the tests rather than by clicking.

## Checkpoint

<!-- flybot:checkpoint -->
{
  "pr": 2246,
  "claim": "Dev4",
  "issue": 2243,
"summary": "The three entries ThinkFlowLab#2235 left in a read-only window —
BotSchedules' New task row, ScheduleSummary's empty-state Add one, and
the composer's + menu Scheduled task row — now draw nothing, so no click
lands on a create form the locked page hides. lockedWindow is exported
once from schedules.js and reused by composer.js rather than copied a
fifth time, the details line passes the roster, and a Bot that has tasks
still lists them. Tests pin both read-only shapes and keep the writable
entry points and their openSettings arguments unchanged. client.js/0008
is module order, not a hand edit.",
  "files": [
    "core/src/client/schedules.js",
    "core/src/client/composer.js",
    "core/src/client/details-drawer.js",
    "core/test/schedules-client.test.js",
    "core/test/composer-locked.test.js",
    "docs/subsystems/core-client.md"
  ],
  "checks": {
"ran": "TZ=UTC ARCH_DOCS_BASE=50081167 npm run verify (4600/4600/0)",
    "result": "green",
    "at": "51040d46c2fe287320e520b860213bc6f9486f91"
  },
  "next": "T1: waiting for tests-ok at this tip; no PASS required"
}
<!-- /flybot:checkpoint -->

Co-authored-by: FlyBot Dev-4 <dev4@flybot.local>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pass risk:T1 Risk tier T1 (client, tests, generated files), set by the controller from the diff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

core: a read-only window still offers every scheduled-task write, and a refused Pause/Resume/Delete says nothing

2 participants