Skip to content

Fix Workflow UI: live run controls and short task summaries - #1456

Merged
Birfy merged 5 commits into
mainfrom
cursor/workflow-ui-readable-1454-bdac
Oct 27, 2026
Merged

Birfy merged 5 commits into
mainfrom
cursor/workflow-ui-readable-1454-bdac

Conversation

@Birfy

@Birfy Birfy commented Oct 27, 2026 •

Copy link
Copy Markdown
Collaborator

Owner: Dev
Reviewer: Reviewer

Fixes #1454

Summary

  • No scripted runs: Removed state.demos[], workflow/demo-step, and seeded busy state. Default store ships empty lanes only; purgeDemos() strips legacy demos on load. workflow/state preview and stage use live runs only (live === true).
  • Live-only UI (unchanged): pause/resume, short summaries, client stale-preview guard.
  • Factory rows deletable: workflow/delete and sidebar Delete+confirm work for delivery / 发布交付流水线 (no factory preset guard).
  • Docs: docs/subsystems/workflow.md updated for the above.

Verification

Tip SHA: 90af4a12db7a4d00e39148ad5f76ffe005fc4a2d

Ran: PATH=/workspace/tools/node24/bin:$PATH TZ=UTC npm run verify — green.

Not run: prod FlyBotDebugger re-check (needs merge deploy).

{"pr":1456,"claim":"Dev","issue":1454,"summary":"Removed demos[] and demo-step; only live Bot runs appear in workflow/state. Delivery and other factory-id sidebar rows are deletable. Subsystem doc updated.","files":["plugins/workflow/src/service.js","plugins/workflow/index.js","plugins/workflow/test/","docs/subsystems/workflow.md","changelog.d/1454.fixed.md"],"checks":{"ran":"npm run verify","result":"green","at":"90af4a12db7a4d00e39148ad5f76ffe005fc4a2d"},"next":"none — ready for review"}
Open in Web Open in Cursor 

cursoragent and others added 2 commits October 27, 2026 13:34
Fixes #1454

Docs-not-needed: @flybot/workflow client and service only; no subsystem doc change.

Sidebar preview and stage run come from displayRun (live runs only), not the
seeded demo script. Pause/resume endpoints gate hand-off dispatch. Chat and
cards use summarizeTask and chatPreview truncation.

Co-authored-by: Danyang Chen <birfychen@gmail.com>
Never expose demos in preview/run; runningOf requires live=true.
Client sidebar ignores stale busy preview. demoStep returns demo field only.

Co-authored-by: Danyang Chen <birfychen@gmail.com>
@Birfy Birfy added the agent-pr Pull request opened by an agent label Oct 27, 2026
@Birfy
Birfy added this pull request to the merge queue Oct 27, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 27, 2026
cursoragent and others added 3 commits October 27, 2026 13:43
Template catalog ids no longer block rename/delete or context menu.
Portal context menu; delete cleans lanes/demos and releases live Bots.

Co-authored-by: Danyang Chen <birfychen@gmail.com>
Co-authored-by: Danyang Chen <birfychen@gmail.com>
Drop demos[], seeded runs, and workflow/demo-step. Fresh and migrated
stores expose only live Bot-gated runs. purgeDemos strips legacy demos on
load. Docs and tests follow.

Co-authored-by: Danyang Chen <birfychen@gmail.com>
@Birfy

Birfy commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Verdict: PASS at 90af4a1
Written-by: Reviewer
Attestation: 90af4a1 role=Reviewer

Ran:

  • PATH=/workspace/tools/node24/bin:$PATH TZ=UTC npm run verify → pass
  • PATH=/workspace/tools/node24/bin:$PATH npm --prefix plugins/workflow test → pass (69 tests)
  • GH_REPO=ThinkFlowLab/FlyBot node .github/scripts/risk-gate.mjs --pr 1456 → T3 (report)
  • GH_REPO=ThinkFlowLab/FlyBot node .github/scripts/enqueue-guard.mjs --pr 1456 → refuse (no conclusion at tip; expected until this comment)

Not run:

  • Production FlyBotDebugger manual re-check after deploy
  • DSH Desktop smoke
  • Signed Verdict (signers roster empty; unsigned PASS is gate-valid)

Findings: No actionable defects for #1454 scope. Demo store and demo-step removed; workflow/state preview/run are live-only. Factory-id rows including delivery are rename/delete-able. Pause/resume and short summaries covered by tests. docs/subsystems/workflow.md matches behavior. Security fence / remote-string surface unchanged.

This is not merge authority; gating agent enqueues after guard green.

@Birfy
Birfy added this pull request to the merge queue Oct 27, 2026
@github-actions github-actions Bot added the pass label Oct 27, 2026
Merged via the queue into main with commit 5c1fb16 Oct 27, 2026
14 checks passed
@Birfy
Birfy deleted the cursor/workflow-ui-readable-1454-bdac branch October 27, 2026 13:59
@github-actions github-actions Bot removed the agent-pr Pull request opened by an agent label Oct 27, 2026
HugoXK pushed a commit to HugoXK/FlyBot that referenced this pull request Oct 27, 2026
ThinkFlowLab#1418) (ThinkFlowLab#1422)

Fixes ThinkFlowLab#1418
Owner: Chief
Written-by: Dev3
Reviewer: Reviewer

Tip SHA: `7c27a23b1eef6099432f632eb0753918aa1d80fe`
Base: `5c1fb1644808b7f8257b64ed030a9934fa6d7950`

## Base moved: replayed onto `5c1fb164`

The branch was reviewed at `fe62ca8c` (on `5daf756b`). `main` then moved
twice — to `8f5c9ca7` (ThinkFlowLab#1440, Settings → Workflow graphs) and to
`5c1fb164` (ThinkFlowLab#1452/ThinkFlowLab#1456, Workflow UI) — and none of those commits
touches the three files this pull request changes. The change was
therefore replayed on top of the live base instead of stacked on an old
one: one commit, parent `5c1fb164`, and the same three blobs —
`5c5d2254` (script), `1f6fd724` (tests), `bc7bf331` (changelog) at
`fe62ca8c`, `d9eab4b8` and `7c27a23b1eef6099432f632eb0753918aa1d80fe` —
so the change set did not move: `GET
/compare/5c1fb164...dev3/1418-label-hygiene-resilient-apply` lists only
those three files.

The PASS at `fe62ca8c` does **not** carry to this head, and the reason
is mechanical rather than a defect in the diff: it is a `Birfy`-login
conclusion, so it owes an `Attestation:` line, and that line names
`fe62ca8c`. A moved tip therefore needs a fresh PASS at the new tip;
until it lands, this head cannot enqueue.

## What changed

**Before:** the per-label DELETE ran in a bare loop and the first throw
escaped `main()`. Both live runs on `7a4fa61e` stopped at item 1 —
`ThinkFlowLab#1356` in `40485666850`, `ThinkFlowLab#1359` in `122128075345` — printed `gh:
Validation Failed (HTTP 422)` and `##[error]Process completed with exit
code 1`, leaving 16–18 items untouched and no `after:` line. Nothing
distinguished a refused request from a label that was already gone.

**After:** each removal stands on its own. A `(HTTP 404)` (the label was
gone before the call) is the only skip, logged as `label-hygiene: skip
#N <name>: already gone`. Every other answer — including the `422` the
live runs got, where the label was still on the item afterwards — is
recorded as `failed` with the `gh` status line **and the JSON response
body `gh` printed to stdout**, logged as `label-hygiene: FAILED #N
<name>: <reason>`, and the sweep keeps going. The collected failures are
printed as a `label-hygiene: FAILED:` summary **before** the read-back,
so the line survives the normal case where the refused label is still on
the item. The read-back (`after:`/`STILL STALE`) still decides the stale
half, a recorded write failure keeps the run non-zero, and a clean board
with only 404 skips exits 0. The dry run, `STALE_LABELS`, the keep-list
and the workflow triggers are unchanged.

`422` is deliberately **not** folded into "already gone". On `ThinkFlowLab#1359` the
label `agent-pr` was present when the DELETE answered `422` and stayed
until another call removed it at `10:23Z`, and the same DELETE through
the Bot PAT answered `200` — so this diff reports the refusal instead of
masking it.

## Verification at the tip

Tip SHA: `7c27a23b1eef6099432f632eb0753918aa1d80fe`

Ran at this tip (2026-10-27T14:20Z, a tarball of `7c27a23b` unpacked
outside the checkout):
- `node --test .github/scripts/label-hygiene.test.mjs` → `# tests 13 / #
pass 13 / # fail 0`.
- `node --test ".github/scripts/*.test.mjs"` → `# tests 543 / # pass 541
/ # fail 0 / # skipped 2`.
- `node .github/scripts/changelog.mjs check` → `changelog: 23
fragment(s) in changelog.d/ are well formed`, exit 0.
- Red-first: with only `.github/scripts/label-hygiene.mjs` reverted to
`main`'s blob `114f37ac` (`5c1fb164`) and the new tests kept, `not ok
11` (422), `not ok 12` (404) and `not ok 13` (500) fail, `# pass 10 / #
fail 3`; each dies because the raw `gh:` error escapes `main()` and the
item behind it is never touched. Restoring the tip blob (`cmp` against
`5c5d2254`) returns `13/13`.
- `GET /compare/5c1fb164...dev3/1418-label-hygiene-resilient-apply` →
`status ahead`, `ahead_by 1`, exactly the three files above; `GET
/commits/7c27a23b` → one parent, `5c1fb164`.

Not run (and why):
- The live close-event acceptance (close a throwaway item carrying
`agent-working`, see `after: 0 item(s)`, exit 0) needs the new script on
`main`: the workflow always runs base's `.github/scripts`. It runs right
after merge.
- `npm run verify`, the `core` suite and `ds-bot-patches check`: this
branch touches no `core/`, `patches/ds-bot/` or client bundle.
- No browser bench or smoke test: no UI, host wiring or client code
changed.

## Risk

Low and script-local, but it does not hide the remaining cause. A `422`
on an installation token still leaves its label on the item, so after
this merges the sweep will finish all items and then stay red with
`FAILED:` and `STILL STALE:` naming exactly those labels, instead of
dying silently at item 1. That is the intended, readable failure; the
credential/route cause of the `422` needs its own evidence (a live run
with the body printed) and is not fixed here. No new permission, config
key or trigger; the keep-list and `STALE_LABELS` are untouched, and a
genuinely stale label still cannot pass.

## Checkpoint

<!-- flybot:checkpoint -->
{
  "pr": 1422,
  "claim": "Chief",
  "issue": 1418,
"summary": "One label that cannot be removed no longer abandons the
label-hygiene sweep. A 404 means the label was already gone and is
skipped; every other refusal, including the live 422 that left the label
on ThinkFlowLab#1359, is recorded with the response body and the remaining items are
still cleaned. The failed summary is printed before the read-back, which
stays the criterion, and a real write failure keeps the run non-zero.
The dry run, the keep-list and the workflow triggers are unchanged.",
  "files": [
    ".github/scripts/label-hygiene.mjs",
    ".github/scripts/label-hygiene.test.mjs",
    "changelog.d/1418-label-hygiene-resilient-apply.fixed.md"
  ],
  "checks": {
"ran": "node --test .github/scripts/label-hygiene.test.mjs; node --test
.github/scripts/*.test.mjs; node .github/scripts/changelog.mjs check",
    "result": "green",
    "at": "7c27a23b1eef6099432f632eb0753918aa1d80fe"
  },
"next": "PASS at 7c27a23 (Attestation 7c27a23, Reviewer); enqueue and
merge, then the live close-event acceptance runs on the merged workflow.
The 422 root cause is out of scope (reported with its body, run stays
red and names it)."
}
<!-- /flybot:checkpoint -->
Birfy added a commit that referenced this pull request Oct 28, 2026
CHAT_PREVIEW (240) and chatPreview() clipped every stage chat message, so the
owner's brief and each narrate line that quotes a Bot reply lost its tail and
the rest was unreachable (regression from #1456). Render message.text in the
system, user and Bot bubbles again, keep #1473's title and word-wrap, and keep
the 240-character cap on taskSummary, which is the summary surface.

Fixes #1460

Docs-not-needed: display-only restore of text that the stage chat already
receives; docs/subsystems/workflow.md describes the message flow, not the
truncation, and no flow or API changes.
HugoXK pushed a commit to HugoXK/FlyBot that referenced this pull request Oct 28, 2026
Fixes ThinkFlowLab#1460

Owner: Chief
Reviewer: Reviewer
Written-by: Dev

Tip SHA: `e76c222626f2d4320edb475ec41b071c60148d14`
Base: `fe6c90693f5ff32c1147d0b618041b1acaaa0d76` — live `main` at claim
time.

## What changed

Every Workflow stage chat line was clipped at 240 characters ending in
`…`: `Bubble` ran the `system`, `user` and Bot branches through
`chatPreview()` (`plugins/workflow/client.js:428`, `:429`, `:435`). An
owner brief and each narrate line that quotes a Bot reply lost its tail,
and after ThinkFlowLab#1452 those narrate lines are the only place a node's words
appear. The same line rendered in full before ThinkFlowLab#1456, so this is a
regression; ThinkFlowLab#1473's `title` only made the tail reachable on hover.

- `Bubble` renders `message.text` for the `system`, `user` and `bot`
branches again; the `title` prop and ThinkFlowLab#1473's word-wrap stay.
- `CHAT_PREVIEW` and `chatPreview()` are deleted, including the export
(a repo-wide search found no other caller); the 240-character cap stays
on `taskSummary()`, the summary surface.
- `changelog.d/1460.fixed.md` added.

## Verification at the tip

Tip SHA: `e76c222626f2d4320edb475ec41b071c60148d14`
Ran:
- At base `fe6c9069` with only the new tests copied in (source: base
blob `7e678c82e26cc9bf0bdfbe2e09d1939c705920b8`): `node --test
test/client.test.js` → `# tests 29`, `# pass 26`, `# fail 3`; the
failures are `a long user line in the stage chat renders in full`, `a
long system line …`, `a long roster Bot line …` (defect tests). At the
tip: 29/29. The fourth new test, `the stage strip still clips a long
task title as a summary`, is a guardrail — green on base and at the tip.
- `npm --prefix plugins/workflow test` → 89/89 pass (base 85 + 4 new).
- `npm --prefix plugins/social test` → 525/525; `tree` → 125/125;
`timeline` → 125/125.
- `node --test ".github/scripts/*.test.mjs"` → 543 tests, 541 pass, 0
fail, 2 skipped.
- `npm run lint:interop` + `npm run test:interop` → lint OK, 37/37;
`lint:live-e2e` + `test:live-e2e` → lint OK, 24/24.
- `node core/scripts/build-client.mjs --check` → pass; `node
scripts/ds-bot-patches.mjs check` → `ok 10 patches apply cleanly in
order`, `ok core/ equals ds-bot/ + patches/ds-bot/` (`skipped pin (no
git)`).
- `node core/scripts/lint.mjs` → oxlint `62 warnings and 0 errors`;
`node scripts/lint-plugins.mjs` → `6 warnings and 0 errors`, `packed
@flybot/workflow imported`.

Not run (and why):
- `TZ=UTC npm run verify` as one command: this box has no `git` binary,
so `check-arch-docs.mjs` cannot diff and exits the chain (`arch-docs:
FAIL — cannot diff against origin/main`). Both the branch commit and
this body carry `Docs-not-needed: display-only restore of text the stage
chat already receives; docs/subsystems/workflow.md describes the message
flow, not the truncation.`
- The `core` suite: run separately; it is not touched by this diff and
its result is in the review thread (CI runs it in full).
- The smoke test (no `index.js` or `core/src/host/` change) and the
CI-only `package` job.

## Risk

T2: `plugins/workflow/client.js` matches `plugins/**`; the test file and
the changelog fragment are T1. No `risk:T*` label is hand-set — the tier
comes from `risk-gate` on the diff. T2 needs a PASS at this tip plus
green CI; nothing is enqueued by this node.

Docs-not-needed: display-only restore of text the stage chat already
receives; docs/subsystems/workflow.md describes the message flow, not
the truncation.

## Checkpoint
<!-- flybot:checkpoint -->
```json
{
  "pr": 1510,
  "claim": "Chief",
  "issue": 1460,
  "summary": "The Workflow stage chat renders every message line in full again: the system, user and Bot bubbles no longer pass message.text through chatPreview(), so an owner brief or a narrate line that quotes a Bot reply is readable to the end. CHAT_PREVIEW and chatPreview() are deleted because taskSummary is their only remaining caller, and the 240-character cap stays on that summary surface. The title tooltip and word-wrap are kept. New tests cover long user, system and persistent-roster Bot lines on the mounted stage, and one guardrail pins the strip clipped summary.",
  "files": ["plugins/workflow/client.js", "plugins/workflow/test/client.test.js", "changelog.d/1460.fixed.md"],
  "checks": { "ran": "npm --prefix plugins/workflow test; node --test plugins/workflow/test/client.test.js at base and tip; plugins social/tree/timeline, .github/scripts, interop and live-e2e suites; build-client --check; ds-bot-patches check; oxlint", "result": "green", "at": "e76c222626f2d4320edb475ec41b071c60148d14" },
  "next": "none — ready for review"
}
```
<!-- /flybot:checkpoint -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Workflow UI: stage/inspector still unreadable; sidebar run status must match real runs

2 participants