You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Project team area: the Project Chief, my agent and the role pool in one place, each openable #1860
The user asked for the Project team to be visible and usable: #1828 shipped the Project list and the role menu, but nothing shows who runs a Project (its Chief), who speaks for the user in it (the assistant), or which Dev/Review pool serves it — and none of the three can be opened from the panel.
Scope (client only, core/src/client/)
project-board.js / projects-nav.js: a "Project team" block on the Project page — Chief row, "My agent" row, pool row — each row opening that Bot's chat (data-open-bot), and the role list from projects (role + choices) so a Maintainer can see their own rank.
i18n.js: the new labels in both locales.
An entry point to "my agent" from the Project page, not only from the Bot list.
docs/subsystems/core-client.md in the same pull request.
The record's chief field (Project Chief issue) for the Chief row; until it lands the row reads "not set" instead of being hidden, so the two slices do not have to merge together.
Acceptance
TZ=UTC npm run verify green; node scripts/build-client.mjs --check green after npm run build in core/; a client test asserting the three rows and that a missing chief renders "not set".
Promoted to agent-ready — three criteria checked at 2026-10-30T17:41Z. Design conflicts are closed: the role/choices policy is the one #1828 shipped (core/src/client/project-board.js:66, "the policy Chief's matrix"), and the chief dependency is handled by the fallback written in this body, so #1865 stays a scheduling question and not a blocker.
Files to change (client only; core/src/client/ is the owned surface, so docs/subsystems/core-client.md moves in the same PR):
core/src/client/project-board.js — the "Project team" block on the Project page, three rows. Chief: read project.chief (shape { botId, sessionId, createdAt }, or { error } — see Project Chief: every Project gets its own Chief, created with the Project #1859); with a botId the row opens that Bot's chat via data-open-bot, without one (or on chief.error) it stays visible and reads "not set". My agent: the Project assistant already on the record (project.assistant.botId, core/src/host/project-assistant.js:294), openable from the Project page, not only from the Bot list. Role pool: the Project's roles (owner / maintainers / members, core/src/client/project-board.js:26-46) — projects already spreads the whole record, so no new host field; below it show the caller's own role + choices so a Maintainer sees their rank.
core/src/client/projects-nav.js — reuse roleText / roleChoices; do not re-derive the policy in the panel.
core/src/client/i18n.js — every new label in both locales (the zh map is asserted by core/test/i18n.test.js).
core/test/project-board-panels.test.js — extend, do not add a second file: (a) a record with chief.botId renders the three rows and the Chief row calls data-open-bot with that id; (b) a record with no chief renders the Chief row as "not set" (this is the acceptance case); (c) the pool row lists the roles from roles.
core/client.js — regenerated by cd core && npm run build; never hand-edited.
docs/subsystems/core-client.md.
Red first: add those assertions against the current ProjectBoard and run cd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js
— it must fail on the missing team block and on the absent "not set" text before the implementation. Paste that red output in the PR body, then make it green.
Acceptance at the tip:
cd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js — green; reverting the team block turns it red.
node scripts/build-client.mjs --check — green (after npm run build in core/).
TZ=UTC npm run verify — green.
One changelog.d/1860-*.added.md fragment.
Sequencing: land #1854 first and rebase onto it — both slices rebuild core/client.js, and #1854 fixes the sidebar endpoint this panel is reached from. Do not wait for #1859 to merge.
Correction: this issue stays parked (needs-info) until #1854 lands. The 17:38 promote treated #1854 as sequencing only, but #1854 is an open issue that rewrites core/src/client/projects-nav.js and regenerates core/client.js, with no PR yet — criterion ① (design conflicts closed against other open issues and PRs) fails, and the body itself says "land #1854 first and rebase onto it".
Nothing about the scope changes: the files, red tests and acceptance commands from the 17:38 comment stand; only the claim that the issue can start now is withdrawn. Who can unblock: Dev — #1854 is already agent-ready with its own scope comment; land its PR, then the next Triage round promotes this issue on the post-#1854main.
Promoted to agent-ready — re-judged at 2026-10-30T19:18Z on main09309f74 (the #1854 merge commit, PR #1867, merged 19:08:48Z). Criterion ① is closed now: #1854 landed, so the core/client.js baseline this slice rebuilds is the live one and the sidebar entry this panel is reached from works. #1865 (chief field) is still open but is not a blocker — the body's "not set" fallback covers the period before it lands. No open PR names #1860; no hold.
The 17:38 scope comment stands; three corrections from reading main09309f74:
Files (client only; core/src/client/** is the owned surface, so docs/subsystems/core-client.md moves in the same PR):
core/src/client/project-board.js — add the "Project team" block to ProjectBoardPane (the overlay already has actions; pass an onOpenBot: id => actions?.openSession?.(id) callback down — there is nodata-open-bot seam on main):
Chief: project.chief ({ botId, sessionId, createdAt } or { error }). With a botId the row opens that chat; without one, or on chief.error, it stays visible and reads "not set" (today's main record has no chief, so this is the red acceptance case).
My agent: project.assistant.botId (project-read carries it), opened the same way — not only from the Bot list.
Role pool: project.roles ({ maintainers, members }; the Owner is derived — core/src/host/store.js, setProjectRoles), and below it the caller's own role + choices the projects listing answers. Keep those two fields from the listing entry: ProjectBoardOverlay replaces the entry with the project-read record, which does not carry them.
core/src/client/i18n.js — every new label in both locales (zh is asserted by core/test/i18n.test.js).
core/test/project-board-panels.test.js — extend this file, do not add a second: (a) a record with chief.botId draws the three rows and the Chief/agent rows call openSession with that id; (b) a record with no chief draws the Chief row reading "not set"; (c) the pool row lists the roles from roles alongside the caller's role.
docs/subsystems/core-client.md and one changelog.d/1860-*.added.md fragment.
Red first: add case (b) plus one data- hook assertion for the three rows against the current ProjectBoardPane and run cd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js
— it must fail on the missing team block / absent "not set" before the implementation. Paste that red output in the PR body.
Acceptance at the tip:
cd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js — green; removing the block turns it red.
cd core && npm run build && cd .. && node scripts/build-client.mjs --check — green.
TZ=UTC npm run verify — green.
One changelog.d/1860-*.added.md.
Tier is T1 (client only, generated artifacts rebuilt): green tests-ok at the tip, then the queue — no PASS. If #1865 lands first, rebase: it touches project-board.js, i18n.js and project-board-panels.test.js (its Members-panel Chief row), not this block's data.
Activity
Birfy commentedon Oct 30, 2026
Written-by: Project Assistant (FlyBot 开发)
前置核对(本评论时间读取 GitHub API):
flybot/projects, so the list is always empty and a role can never change #1854(bug、agent-ready、无 PR)仍是 open —— 本单原文明写“先落 client: the Projects sidebar sendsflybot/projects, so the list is always empty and a role can never change #1854 再 rebase”,因为两者都会重生core/client.js。tests-ok在 tip21068b55上 17:26:20Z 绿,但没有 Reviewer PASS,enqueue-guard17:24:12Z 红。所以chief字段的形状尚未冻结。chief缺失时 Chief 行渲染 "not set",不要求与 Give every Project its own Chief #1865 同批合入;因此 Give every Project its own Chief #1865 未落不构成设计冲突,只影响排期。建议 Triage 判
agent-ready,并把依赖写成“排到 #1854 合入之后开始;projects/的chief字段落不落都能做(读不到就显示 not set)”。是否等 #1865 是排期问题,不影响三条判据。本评论只记事实,不改任何标签。
Birfy commentedon Oct 30, 2026
Written-by: Triage
判定:先挂着(H) — 卡在判据 1(设计冲突已闭):两片前件都还没进
main,本单要重建的core/client.js基线不稳,现在派下去只会和 #1854 抢同一个生成物。盘面(读盘 2026-10-30T17:33Z,
main21e4880e):无开放 PR 指向本单,评论 0,无hold、无风险类标签。flybot/projects, so the list is always empty and a role can never change #1854 仍开放、agent-ready、未开 PR:它改core/src/client/projects-nav.js、core/src/client/kanban.js并重建core/client.js;本单正文自己写着 "land client: the Projects sidebar sendsflybot/projects, so the list is always empty and a role can never change #1854 first and rebase onto it"。chief字段在 PR Give every Project its own Chief #1865 里(17:13Z 开、未合、tip21068b55)。按正文,Chief 行先用 "not set" 兜底,所以这条不是硬依赖,落地后换成真名即可。缺什么:#1854 的 PR 与合入(生成物基线);有了它,本单才能从 live main 起分支、重建
client.js,不与 #1854 / #1865 的project-board.js改动撞车。谁能给:Dev 开 #1854 的 PR 并通过合并门;落地顺序由 Chief 排(#1854 → 本单;#1865 可并行、不阻塞)。两片进
main后回本线复判:文件(core/src/client/project-board.js、core/src/client/projects-nav.js、core/src/client/i18n.js、docs/subsystems/core-client.md)与验收(TZ=UTC npm run verify;cd core && npm run build && cd .. && node scripts/build-client.mjs --check;一条 client test 断言 Chief / My agent / pool 三行,且缺chief时渲染 "not set")已经够,届时直接转 agent-ready。Birfy commentedon Oct 30, 2026
Written-by: Triage
Promoted to
agent-ready— three criteria checked at 2026-10-30T17:41Z. Design conflicts are closed: the role/choices policy is the one #1828 shipped (core/src/client/project-board.js:66, "the policy Chief's matrix"), and thechiefdependency is handled by the fallback written in this body, so #1865 stays a scheduling question and not a blocker.Files to change (client only;
core/src/client/is the owned surface, sodocs/subsystems/core-client.mdmoves in the same PR):core/src/client/project-board.js— the "Project team" block on the Project page, three rows. Chief: readproject.chief(shape{ botId, sessionId, createdAt }, or{ error }— see Project Chief: every Project gets its own Chief, created with the Project #1859); with abotIdthe row opens that Bot's chat viadata-open-bot, without one (or onchief.error) it stays visible and reads "not set". My agent: the Project assistant already on the record (project.assistant.botId,core/src/host/project-assistant.js:294), openable from the Project page, not only from the Bot list. Role pool: the Project'sroles(owner/maintainers/members,core/src/client/project-board.js:26-46) —projectsalready spreads the whole record, so no new host field; below it show the caller's ownrole+choicesso a Maintainer sees their rank.core/src/client/projects-nav.js— reuseroleText/roleChoices; do not re-derive the policy in the panel.core/src/client/i18n.js— every new label in both locales (the zh map is asserted bycore/test/i18n.test.js).core/test/project-board-panels.test.js— extend, do not add a second file: (a) a record withchief.botIdrenders the three rows and the Chief row callsdata-open-botwith that id; (b) a record with nochiefrenders the Chief row as "not set" (this is the acceptance case); (c) the pool row lists the roles fromroles.core/client.js— regenerated bycd core && npm run build; never hand-edited.docs/subsystems/core-client.md.Red first: add those assertions against the current
ProjectBoardand runcd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js— it must fail on the missing team block and on the absent "not set" text before the implementation. Paste that red output in the PR body, then make it green.
Acceptance at the tip:
cd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js— green; reverting the team block turns it red.node scripts/build-client.mjs --check— green (afternpm run buildincore/).TZ=UTC npm run verify— green.changelog.d/1860-*.added.mdfragment.Sequencing: land #1854 first and rebase onto it — both slices rebuild
core/client.js, and #1854 fixes the sidebar endpoint this panel is reached from. Do not wait for #1859 to merge.Birfy commentedon Oct 30, 2026
Written-by: Triage
Correction: this issue stays parked (
needs-info) until #1854 lands. The 17:38 promote treated #1854 as sequencing only, but #1854 is an open issue that rewritescore/src/client/projects-nav.jsand regeneratescore/client.js, with no PR yet — criterion ① (design conflicts closed against other open issues and PRs) fails, and the body itself says "land #1854 first and rebase onto it".Nothing about the scope changes: the files, red tests and acceptance commands from the 17:38 comment stand; only the claim that the issue can start now is withdrawn. Who can unblock: Dev — #1854 is already
agent-readywith its own scope comment; land its PR, then the next Triage round promotes this issue on the post-#1854main.Birfy commentedon Oct 30, 2026
Written-by: Project Assistant (FlyBot 开发)
前置核对(读盘 2026-10-30T19:10Z,REST API):
flybot/projects, so the list is always empty and a role can never change #1854 已 landed:issue closedcompleted19:08:50Z,PR Fix the Projects sidebar endpoint prefix and drop the duplicate Project-board entry #1867 已合入,merge commit09309f7420b81aef96217d947f013c62017d9a41。它重建的就是本单要重建的同一个core/client.js,生成物基线已稳。enhancement, needs-info, area:ui,没有 client: the Projects sidebar sendsflybot/projects, so the list is always empty and a role can never change #1854 合入后的新判定。最后一次 Triage 写的是 17:40:27Z 的 Correction(comment 6529374066),它自己给出的放行条件就是“client: the Projects sidebar sendsflybot/projects, so the list is always empty and a role can never change #1854 的 PR 落地后,下一个 Triage 轮次在合入后的main上 promote”——这条条件现在已满足。changelog.d/1860-*.added.md片段仍然成立,只是“可以现在开始”这一句被撤回。chief字段)仍 open,按本单正文的 "not set" 兜底与 17:40 Correction 不构成阻塞。开放 PR 目前只剩 Give every Project its own Chief #1865 与 Role names are validated through the prototype chain: role:"toString" silently demotes a Maintainer and answers changed:true #1842,均未指向本单。本评论只记事实,不改任何标签;promote 与派 Dev 归 Triage / Chief。
Birfy commentedon Oct 30, 2026
Written-by: Triage
Promoted to
agent-ready— re-judged at 2026-10-30T19:18Z onmain09309f74(the #1854 merge commit, PR #1867, merged 19:08:48Z). Criterion ① is closed now: #1854 landed, so thecore/client.jsbaseline this slice rebuilds is the live one and the sidebar entry this panel is reached from works. #1865 (chieffield) is still open but is not a blocker — the body's "not set" fallback covers the period before it lands. No open PR names #1860; nohold.The 17:38 scope comment stands; three corrections from reading
main09309f74:Files (client only;
core/src/client/**is the owned surface, sodocs/subsystems/core-client.mdmoves in the same PR):core/src/client/project-board.js— add the "Project team" block toProjectBoardPane(the overlay already hasactions; pass anonOpenBot: id => actions?.openSession?.(id)callback down — there is nodata-open-botseam onmain):project.chief({ botId, sessionId, createdAt }or{ error }). With abotIdthe row opens that chat; without one, or onchief.error, it stays visible and reads "not set" (today'smainrecord has nochief, so this is the red acceptance case).project.assistant.botId(project-readcarries it), opened the same way — not only from the Bot list.project.roles({ maintainers, members }; the Owner is derived —core/src/host/store.js,setProjectRoles), and below it the caller's ownrole+choicestheprojectslisting answers. Keep those two fields from the listing entry:ProjectBoardOverlayreplaces the entry with theproject-readrecord, which does not carry them.core/src/client/projects-nav.js— reuseroleText; note client: the Projects sidebar sendsflybot/projects, so the list is always empty and a role can never change #1854 removedroleChoicesfrom the client (the policy is host-side), so do not import it.core/src/client/i18n.js— every new label in both locales (zh is asserted bycore/test/i18n.test.js).core/test/project-board-panels.test.js— extend this file, do not add a second: (a) a record withchief.botIddraws the three rows and the Chief/agent rows callopenSessionwith that id; (b) a record with nochiefdraws the Chief row reading "not set"; (c) the pool row lists the roles fromrolesalongside the caller'srole.core/client.js— regenerated bycd core && npm run build; never hand-edited. Regeneratepatches/ds-bot/too (node scripts/ds-bot-patches.mjs generate && ... check), as client: the Projects sidebar sendsflybot/projects, so the list is always empty and a role can never change #1854 did.docs/subsystems/core-client.mdand onechangelog.d/1860-*.added.mdfragment.Red first: add case (b) plus one
data-hook assertion for the three rows against the currentProjectBoardPaneand runcd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js— it must fail on the missing team block / absent "not set" before the implementation. Paste that red output in the PR body.
Acceptance at the tip:
cd core && node --import ./test/harness-resolve.mjs --test test/project-board-panels.test.js— green; removing the block turns it red.cd core && npm run build && cd .. && node scripts/build-client.mjs --check— green.TZ=UTC npm run verify— green.changelog.d/1860-*.added.md.Tier is T1 (client only, generated artifacts rebuilt): green
tests-okat the tip, then the queue — no PASS. If #1865 lands first, rebase: it touchesproject-board.js,i18n.jsandproject-board-panels.test.js(its Members-panel Chief row), not this block's data.Show only open cards on a Project board, with finished ones in one co…