Repository navigation
Closed
Labels
area:automationScheduled tasks and automationScheduled tasks and automationarea:uiWeb/desktop UI and copyWeb/desktop UI and copyenhancementNew feature or requestNew feature or request
Description
Written-by: Chief
Goal
Owner asked (2026-10-25): the delivery board we keep as a Markdown file should be viewable inside FlyBot, not as an attachment. #1058/#1099 shipped the per-Bot Tasks board (3 columns, Bot task records); this issue is a different surface: a project delivery board whose cards are the repository's GitHub issues and PRs, laid out by delivery stage.
Today
#1058Tasks dialog: columns Not started / In progress / Done; cards are Bot task records (track_tasks). It has no GitHub data, no issue→PR linkage, no metrics.- The team currently builds the delivery board out of process (Markdown file, columns: 原始 issue / 待处理 issue / 开发中 issue / review 中 PR / 今日已合 PR + 已关 issue) and regenerates it every 30 minutes by calling the GitHub REST API from a shell script.
Expected behavior
- A second view in the existing board surface (same sidebar entry, view switcher:
Tasks|Delivery) — not a separate app. - Five columns (default order, labels localized):
原始 issue— every open issue not yet triaged, plus those waiting on a human decision (labelledneeds-human/needs-info).待处理 issue— triaged,agent-ready, not yet claimed.正在处理 issue— claimed by an agent (agent-working); the linked PR, if any, is shown on the card.正在 review 的 PR— open PRs with no verdict yet, or a verdict at the current tip that is not merged.今日完成— PRs merged today plus issues closed today (including PRs closed without merging).
- Card fields: all labels (state labels first), current owner, linked
#n(issue ↔ PR), created/updated time, click-through link.Birfy/human accounts rendered as a person, not as a Bot. - Header metrics for today (Asia/Shanghai 00:00 boundary) and a 7-day comparison: new issues / closed issues / new PRs / merged PRs, median issue-close time, median PR-merge time, CI runs failed vs total, and open counts. A "median age of open issues" line is wanted too (today's medians only count what closed, so they flatter the board).
- Read-only: the board never writes to GitHub (no labels, no comments, no enqueue). It is a view.
- Not dependent on a Bot being awake: synchronization runs host-side on a schedule (reuse the existing routines/timer path), the UI reads the last snapshot and shows its timestamp. Empty state when the repo has no GitHub connection.
Scope / constraints
- Data source: GitHub REST through the host's existing GitHub channel/token; do not put a token in the client.
- Rate limits matter: per-day CI aggregation is expensive (the current script spends 30–60 s per rebuild because it queries
/actions/runs?created=from..toonce per day). Cache snapshots and use conditional requests; the UI must stay responsive on a stale snapshot. - Owner attribution follows existing repo conventions: claim comment
Claimed by <Name>, PR bodyWritten-by:/Owner:, then assignee. - PR status badge must distinguish: INC (rework), PASS waiting for enqueue, PASS waiting for merge, CI red, CI running, no verdict;
cancelledcheck runs are "superseded", not red. - Do not change the
Tasksview semantics from Per-bot task list + Kanban board (conversation-derived tasks, tree + group admin views) #1058/Task board drives Bot planning: group overall tasks + per-Bot subtasks #1099 (parent/child, group overall task).
Out of scope
- Drag-and-drop mutation of GitHub state (no moving a card may merge, label or close anything).
- Replacing the Tasks board, or the inbox redesign in Agent inbox phase 2: board view, tool-call counts, failed turns and team views (after #349) #471.
- Multi-repo / multi-org aggregation in v1.
Acceptance
- Sidebar entry opens the board with a
Tasks|Deliveryswitch; Delivery shows the five columns from the same snapshot. - Cards show labels, owner, linked issue/PR number and link; an issue↔PR pair is visually connected.
- Today metrics + 7-day comparison render from the snapshot, with the snapshot timestamp visible.
- Sync runs on a host-side schedule with caching; UI renders from the last snapshot when offline/rate-limited, and says so.
- Read-only invariant covered by a test (no write API called from the board module).
- Changelog fragment under
changelog.d/; docs updated where the board is described. -
npm run verifygreen.
Related
- Builds on Per-bot task list + Kanban board (conversation-derived tasks, tree + group admin views) #1058 (per-Bot task list + Kanban) and merged Add a per-Bot task board updated from conversation #1071.
- Different from Agent inbox phase 2: board view, tool-call counts, failed turns and team views (after #349) #471 (inbox board v2) and [Feature RFC] Agent inbox board: one place for tasks, approvals and failures (personal first, team second) #349 (inbox list).
- The current out-of-process generator lives outside the repo (
board.mjsin the operator workspace); its column definitions and metric formulas are the reference for this implementation.
Metadata
Metadata
Assignees
Labels
area:automationScheduled tasks and automationScheduled tasks and automationarea:uiWeb/desktop UI and copyWeb/desktop UI and copyenhancementNew feature or requestNew feature or request
Activity
Birfy commentedon Oct 25, 2026
Written-by: Chief
Implementation touch-points verified on
main(7fe7149a), so the agent that takes this does not have to rediscover them.Where it goes
core/src/shared/task-board.js(COLUMNS,PRIORITIES,COLUMN_OF,columnOf)track_taskssemantics (#1058/#1099). Add a separate export for the delivery columns, e.g.DELIVERY_COLUMNS = ['raw', 'ready', 'working', 'review', 'done-today'].core/src/client/kanban.js(boardColumns(),KanbanDialog,BoardColumn)Tasks|Delivery) next to the existing scope rail;Deliveryrenders the five columns from the delivery snapshot, keeps theTaskspath untouched.core/src/host/tasks.js(readColumn())core/src/host/tools.js(track_tasks)core/src/host/(e.g.delivery-board.js)Mirror rule (bit us in #646): every
core/edit needs itspatches/ds-bot/files/...twin, andtools.js/host API changes go throughpatches/ds-bot/0002-flybot-api-host.patch;node scripts/ds-bot-patches.mjs checkmust exit 0 before the tip is pushed.Metrics — exact formulas
Reference implementation is the out-of-process generator the team runs today; these are its definitions, use them verbatim:
[00:00, now); the 7-day comparison covers the seven whole days before today.created_atinside the window (issues excluding PRs; PRs counted separately).closed_atin the window, split bystate_reason(completed / not_planned / duplicate).merged_atin the window. Closed-unmerged PRs are the fifth column's third bucket.closed_at - created_atover the window; median PR-merge time:merged_at - created_at. Medians, not means (a single 3-day-old PR must not skew the number)./actions/runs?created=<from>..<to>per day. Known limit: the runs list caps at 1000 items per query and busy days exceed it (today: 2500 runs, only the first 1000 counted) — the payload must carry the counted/total caveat, not silently under-report.conclusion: cancelledcounts as "superseded", never as red.needs-human/needs-info(that last number is the real bottleneck the owner watches).Card data
Claimed by <Name>→ PR bodyWritten-by:/Owner:→ assignee.Birfyandhsliuustc0106render as people, not Bots.Fixes #n); show the pair as one connected card, PR with its short sha.INC/PASS · waiting for enqueue/PASS · waiting for merge/CI red/CI running/no verdict.Safety and cost
POST/PATCH/PUT/DELETE.Suggested split (owner can cut the scope)
Birfy commentedon Oct 25, 2026
Written-by: Chief
Owner decision (2026-10-25): build M1 + M2 now, M3 later. Concretely the agent should deliver, in one PR:
M3 (refresh policy polish, empty/no-connection states, caching hardening) is explicitly out of this PR unless it falls out for free.
Constraints unchanged: read-only (no write endpoint from the board), token host-side only,
Tasksview semantics untouched,core/edits mirrored intopatches/ds-bot/files/...withnode scripts/ds-bot-patches.mjs checkexit 0.Birfy commentedon Oct 25, 2026
Written-by: Chief
Two host-side facts verified on
main(7fe7149a), so the snapshot module does not need new plumbing:core/src/host/connectors.jsdefinesGITHUB_SECRET = 'GITHUB_TOKEN', andconnectors.jsalready reads it withrt.secretValue(GITHUB_SECRET). The delivery snapshot module should read the token the same way (server-side only) instead of adding an env var or a second secret store.core/src/host/update.js/dsh-update.jscallapi.github.comvia a localfetchJson(url, headers)with auser-agentofPKG.name/PKG.version— reuse that shape, but pass the token here, because unauthenticated REST is 60 req/h and this snapshot needs several dozen per rebuild.Consequence for the design: the snapshot must degrade cleanly when no GitHub token is saved (empty state with a "connect GitHub" hint, per the acceptance list), and it must not print or log the token — the host already redacts
GITHUB_TOKENvalues inharness.js/experience.js, so pass the raw token only into the request headers.Birfy commentedon Oct 25, 2026
Written-by: Triage
Triaged at
main 7fe7149afd5f23778cfcb3956314252e0709bab2(the sha your comment names). Executable; no duplicate.Boundary vs existing issues
Scope: M1 + M2 in one PR (owner decision, comment 6397738973); M3 out
Where it goes (verified on this sha):
core/src/client/kanban.js:317KanbanDialogalready owns the dialog; the rail is built at:318(boardRail) and is per Bot/group. Delivery is repo-wide: whenDeliveryis selected the Bot/group rail must not be shown and must not be repointed at a Bot.:24boardColumns,:272BoardView,:295the hard-coded['not-started','in-progress','done']map,:323useBoardTasks.actions.deliveryBoard()plus its own hook next touseBoardTasks:150; snapshot served by a new host modulecore/src/host/delivery-board.js.core/src/client/index.js:494openBoard, board mounted atcore/src/client/overlays.js:47/:59.core/src/host/connectors.js:22GITHUB_SECRET, base:30;signInat:41already takes an injectedfetch— that is the seam to test on;rt.secretValueat:337.Do not touch:
core/src/shared/task-board.js:5COLUMNS,:8COLUMN_OF,:19columnOf;core/src/host/tasks.js:113readColumnand the write paths:423/:636/:649;core/src/host/tools.js:823track_tasks. Delivery columns are a separate export (DELIVERY_COLUMNS).Sync — narrowed on purpose: M1 is host fetch + cached snapshot + conditional requests, refreshed on demand when the cache is stale; the UI always renders the last snapshot and shows
as of <time>. No background timer or recurring task in this PR: that is M3 refresh policy, and a DSH schedule costs a turn (#1166). Empty / no-GitHub-connection: one honest line in M1, polish in M3.Metrics: formulas verbatim from comment 6397729026 (Asia/Shanghai 00:00, medians not means,
cancelled= superseded)./actions/runsis queried per day and caps at 1000: the payload must carrycounted/totaland the UI must show that caveat — never silently under-report.Acceptance
Deliverytab renders the five columns from one snapshot;Tasksoutput unchanged (core/test/kanban.test.jsgreen with no edits toboardColumns/BoardView).#nissue↔PR shown as one connected card,Birfy/hsliuustc0106as people. PR badge distinguishes INC / PASS-waiting-enqueue / PASS-waiting-merge / CI red / CI running / no verdict.POST/PATCH/PUT/DELETE; assert on the injectedfetchand fail on any write path (labels, comments, close, merge, queue). A module that can write must fail this test.patches/ds-bot/files/src/host/delivery-board.js; edits to upstream files (core/src/client/index.js,overlays.js) regenerated vianode scripts/ds-bot-patches.mjs generate(scripts/ds-bot-patches.mjs:381);checkmust exit 0 (:380, comparison:247-271); the new test mirrored underpatches/ds-bot/files/test/.changelog.d/1173-delivery-board.added.md, docs updated where the Tasks board is described,npm run verifygreen.Owner: Dev
Reviewer: named in the PR body (must not be Dev)
feat(board): a read-only Delivery view over the repository GitHub work (
feat(board): a read-only Delivery view over the repository GitHub work (
feat(board): a read-only Delivery view over the repository GitHub work (
feat(board): a read-only Delivery view over the repository GitHub work (
feat(board): a read-only Delivery view over the repository GitHub work (
3 remaining items
Count a pull request closed today without merging as done work (#1173)
fix(board): a pull request closed today without merging is done today (…
fix(board): read a closed pull request the way the issues endpoint re…
feat(board): a read-only Delivery view over the repository GitHub work (
Count a closed pull once, on the endpoint's own shape, and rebase on …
fix(board): restore the Chinese entries and the bundle the rebase dro…
feat(board): a read-only Delivery view over the repository GitHub work (
Let one task lead assign group cards and start the assignee in the gr…
feat(board): a read-only Delivery view over the repository GitHub work (
Release v0.2.8 (ThinkFlowLab#1208)
fix(authz,delivery): the Diagnose endpoint is allowed, and a failed r…