Repository navigation
Closed as not planned
2 / 22 of 2 issues completedClosed as not planned
2 / 22 of 2 issues completed
Copy link
Labels
V1.0Milestone v1.0; mirrors the GitHub milestoneMilestone v1.0; mirrors the GitHub milestonearea:docsDocumentation, research, or planning artifactDocumentation, research, or planning artifactfeature:activityPersonaBot activity, presence, and output signalsPersonaBot activity, presence, and output signalsscope:hubParent coordination map or epic; not a standalone implementation sliceParent coordination map or epic; not a standalone implementation slicewayfinder:mapWayfinder mapWayfinder map
Description
Retired coordination issue — 2026-09-30
Superseded by Bot Activity & Avatar Presence Project #5. This closure retires the historical planning container; it does not mean child features are complete. Open native children have been reassigned to real feature scope; closed children remain historical evidence.
Replacement links:
Historical planning body (superseded)
Objective
交付 V1.0 milestone #1 的 PersonaBot Activity Projection、共享 Avatar Presence、产品级 Motion Preference、Channel composer island、Group Channel 多 PersonaBot 呈现,以及 PersonaBot Output Event contract。
Source spec and project
- Spec: Spec: PersonaBot Activity Projection、共享 Avatar Presence 与 Output Events #118
- Project: Bot Activity & Avatar Presence
- Milestone: v1.0(repository milestone M1: 基座验证(Lark 国际版)+ 集成地基 #1)
- UI references: Beautiful UI Prompt Bar / Loading State / Thinking State
Orchestration contract
- 本 issue 是 orchestrator coordination parent,不是实现票。
- 只领取所有 open blockers 均已关闭的 frontier ticket;一次推进一个可独立验证的 tracer bullet。
- 每个子票必须通过真实 authority、Host↔Client seam、Human 可操作 UI 与 focused tests。
- DSH SessionEvent 保持 durable execution truth;PersonaBot Activity 是 application-defined Projection;Cordis Events 只做 post-update/process-local notification。
- 完整 Tool arguments/results 不广播,只能通过授权 Capability 按引用读取。
- Motion Preference 是 Human-owned application-defined Client setting,不进入 SessionEvent、Activity Projection 或 Cordis Event。
- Channel 的 Loading/Thinking/collapsible presentation 只消费安全 Activity snapshot;不显示 raw chain-of-thought。
- 不扩展 TTS/Live2D consumer、外部 IM、Human Inbox、完整头像上传或 configurable priority。
Native sub-issues
- UI Foundation: BotHarness motion preference(System / Reduce / Full) #128 — product motion preference(merged feat(client): add motion policy and composer island #136)
- UI Tracer: Channel composer island 与 PersonaBot activity region #129 — Channel composer island + activity region(merged feat(client): add motion policy and composer island #136)
- Bot activity: shared snapshot and live DM presence #120 — Foundation:explicit Session ownership 与 DSH activity projection #80 and UI Tracer: Channel composer island 与 PersonaBot activity region #129 completed; current frontier
- Bot activity: revisioned live sync and reconnect #121 — blocked by Bot activity: shared snapshot and live DM presence #120
- Bot activity: safe tool summaries and effects #122 — blocked by Bot activity: shared snapshot and live DM presence #120
- Bot activity: Orchestrator and Assignment aggregation #123 — blocked by Bot activity: shared snapshot and live DM presence #120, Bot activity: safe tool summaries and effects #122, and Foundation:Assignment Runtime / Assignment Directory / Orchestrator tools #81
- Group activity: live facepile, safe summaries and details #124 — blocked by Bot activity: shared snapshot and live DM presence #120
- PersonaBot output: committed-output extension event #125 — blocked by Foundation:Assignment Runtime / Assignment Directory / Orchestrator tools #81
GitHub native sub-issue relationships and native blocked-by edges are authority;本 checklist 是 Human-readable map。
Current frontier
- Bot activity: shared snapshot and live DM presence #120 is unblocked: Foundation:explicit Session ownership 与 DSH activity projection #80 (merged feat(core): own Sessions explicitly and project DSH activity (#80) #169) and UI Tracer: Channel composer island 与 PersonaBot activity region #129 (merged feat(client): add motion policy and composer island #136) are closed; use the real ownership/activity Projection and the existing composer region.
- After Bot activity: shared snapshot and live DM presence #120, Bot activity: revisioned live sync and reconnect #121, Bot activity: safe tool summaries and effects #122, and Group activity: live facepile, safe summaries and details #124 can proceed in separate bounded slices.
- Bot activity: Orchestrator and Assignment aggregation #123 still waits for Bot activity: shared snapshot and live DM presence #120, Bot activity: safe tool summaries and effects #122, and Foundation:Assignment Runtime / Assignment Directory / Orchestrator tools #81; PersonaBot output: committed-output extension event #125 still waits for Foundation:Assignment Runtime / Assignment Directory / Orchestrator tools #81.
- UI Foundation: BotHarness motion preference(System / Reduce / Full) #128 and UI Tracer: Channel composer island 与 PersonaBot activity region #129 are complete. Avoid rebuilding their motion-policy or composer authorities.
UI boundary
- Prompt Bar 只参考 floating/pill shell;@ sources、slash commands、model picker、dictation 不属于 V1。
- Loading State 映射到 Bot activity: safe tool summaries and effects #122 的 bounded tool-aware effects。
- Thinking State 的 hover/focus/collapsible 只展示安全摘要;聚合选择由 Bot activity: Orchestrator and Assignment aggregation #123 决定,Group 呈现由 Group activity: live facepile, safe summaries and details #124 决定。
- glimm 不作为默认依赖;若未来引入,必须完成 registry/source、DSH compatibility、bundle external、license/notices 与 reduced-motion/fallback 审计。
Completion
- All eight native sub-issues are closed.
- Spec: PersonaBot Activity Projection、共享 Avatar Presence 与 Output Events #118 Testing Decisions are covered by at least one child issue.
- A real DSH web-dev profile passes DM presence, composer island messaging, Assignment handoff, tool-effect, Group Channel, and output-event acceptance.
- Follow system / Reduce motion / Full motion、light/dark、restart/reconnect、event privacy 与 listener lifecycle 均有 evidence。
Metadata
Metadata
Assignees
Labels
V1.0Milestone v1.0; mirrors the GitHub milestoneMilestone v1.0; mirrors the GitHub milestonearea:docsDocumentation, research, or planning artifactDocumentation, research, or planning artifactfeature:activityPersonaBot activity, presence, and output signalsPersonaBot activity, presence, and output signalsscope:hubParent coordination map or epic; not a standalone implementation sliceParent coordination map or epic; not a standalone implementation slicewayfinder:mapWayfinder mapWayfinder map
Type
Projects
- StatusShow more project fieldsDone
Activity
[-]Orchestrator: V1.0 PersonaBot Activity、Presence 与 Human Attention[/-][+]Orchestrator: V1.0 PersonaBot Activity、Presence 与 Output Events[/+]5 remaining items
DoodleBears commentedon Sep 22, 2026
参考调研:OpenBot(Grokbot alternative)的 Activity / Avatar 状态设计
一手调研报告:
docs/research/2026-09-23-openbot-architecture.md。源码已浅克隆到reference/openbot/(gitignored,commit252df2a,2026-09-22),下述路径均可直接在本地核对。OpenBot 是本地优先 Electron + SolidJS 的「持久 AI 队友」应用,与本 epic 同构的问题域:侧栏 roster、共享 activity 状态、动画头像。以下三点直接对应 #118/#120 的设计决策。
1. Badge 与脸共享同一个 busy 判定(防止语义漂移)
src/renderer/src/features/sidebar/sidebar-agent-states.ts:18-30:isAgentWorking被 sidebar badge 和 avatar 共享,注释写明「badge 与脸不能对谁在工作意见不一」(activeTurn、queue hold、starting/running delivery)。mood 派生是纯函数,优先级固定(
agent-avatar-mood.ts:33-41):优先级按「多久需要人」排序——反序会把 failure 藏在产生它的 running turn 后面。
对本 epic:Activity Projection 的 presentation resolution(#118 已定无配置优先级)可以照此落成一个纯函数 + 单一 shared busy source,Activity Frame 的徽章与 Avatar 永远消费同一 snapshot 字段,不允许各自推导。
2. Mood 表:状态 → 视觉呈现的显式映射(值得直接参考)
packages/brand/src/bloub-avatar-motion.ts:29-63,七个 mood 一张表,每个 mood 显式给出{state, expression, rings, breathe}:关键纪律:
motion: "hover" | "always" | "idle"是性能轴,与 mood 表互不纠缠(src/renderer/src/bloub-avatar.tsx:7-12)。app-shell.css:1815-1875,data-avatar="image")——正好对应 Spec: PersonaBot Activity Projection、共享 Avatar Presence 与 Output Events #118「custom image 本体静止、Activity Frame 表达状态」的既有决策,证明环/呼吸可跨生成头像与照片复用。avatarMoodIsBusy(rings 或 breathe>0)决定表面是否需要动画时钟;静止 mood 只在 pointer/focus 时动。AgentActivity.tsx:22-28)——与我们「状态不可只靠颜色/装饰」的无障碍要求同向。对本 epic:#120/#122 的 thinking/working/idle/effects 呈现可整理成这样一张显式 mood/presentation 表,而不是散在组件里的条件渲染。
3. 动态头像:bloub 过程化 SVG(更新 Avatar module 的技术参考)
@norbert_bodziony/bloub@0.3.0(MIT,x.ai 头像的工程复刻,SolidJS peer dep),SVG 形变,非位图/骨骼/GIF。seed→ 轮廓 + 表情 + 颜色(packages/brand/src/bloub-avatar.ts);同 seed 永远同形。SHAPE_SAFE_STATES = ["idle","wink","wide","notify","swirl"]白名单——「形状是身份不是动画帧」,且有测试对照库目录baseBody标志,库升级换形会红测而非悄悄变脸(bloub-avatar-motion.ts:18+bloub-avatar-motion.test.ts)。prefers-reduced-motion关 breathe。frame.arcs而不播整态——装饰不替换身体。与 blobatar 的关系(不建议直接替换):ADR-0032(已被 ADR-0049 取代)已明确拒绝复制 bloub/Grok 视觉身份——MIT 只覆盖代码不覆盖设计,且 bloub 是 SolidJS 包,与我们 react-family bundle contract 不兼容。值得搬的是纪律而非引擎:seeded 身份、shape-safe 白名单 + 测试守卫、mood/motion 两轴、带数字的动画预算。若 ADR-0049 下的 Blobatar motion 落地,可按此纪律约束 expression/effect 目录。
关联:本调研的完整引用与未验证项见
docs/research/2026-09-23-openbot-architecture.md;delta-buffer / memory-store 的投影层模式另见该文 §2/§5(流式节流与 owner 抽象,与本 epic 弱相关)。DoodleBears commentedon Sep 22, 2026
术语修正:OpenBot 的 "mood" 是 state,不是情绪(附与现有设计的融合)
接上一条调研评论的补正与落地映射。上游源码对照:
reference/openbot/(commit252df2a)。1. 为什么叫 mood 很怪——因为它本来就是 activity state
AvatarMood = idle | working | waiting | failed | responded | connecting | asleep(packages/brand/src/bloub-avatar-motion.ts:29)——七个值全是活动/生命周期状态,没有一个是情绪。注释自己也写的是 "What an agent is doing, as far as its face is concerned"。expression(attentif/triste/heureux/somnolent)——那是 media 层的脸,是 state 的一种渲染,不是领域词。CONTEXT.md早已把mood写进 Bot state 的 Avoid(status / mood / presence)——OpenBot 的命名反向验证了这条词汇纪律。后续讨论与实现不引入 "mood" 一词:领域层叫 Bot state / activity state,表情(expression)只是 Avatar media 的呈现细节。2. 分层融合:OpenBot → 我们已定的设计
3. 融合落点(对应我们现有代码,供 #120/#122 实现时采用)
packages/client/src/client/avatar.tsx目前把呈现逻辑散在三处条件分支——defaultActivityEffect(:60-66)、ActivityIndicator(:131-143)、active标志(:163)。学MOOD_PRESENTATIONS收成一张纯查表:STATE_PRESENTATION: Record<PersonaBotActivityState, { effect?, labelKey, animateMedia, frameDecor }>,badge、脸、aria-label 都读同一张表。presentation.animateMedia || presentation.frameDecor——只有 thinking/working 起 loop;waiting/blocked/idle 静态,再与 UI Foundation: BotHarness motion preference(System / Reduce / Full) #128 的 effective motion policy 叠加(组件不自读prefers-reduced-motion)。data-avatar="image"复用同一套环/呼吸 CSS)。sidebar-agent-states.ts:18-19注释 + 共享测试的做法可直接照搬)。无需新增 ADR 或改 CONTEXT 词汇——现有边界已覆盖;以上是实现票开工时的落点清单。
[-]Orchestrator: V1.0 PersonaBot Activity、Presence 与 Output Events[/-][+][Retired] Orchestrator: V1.0 PersonaBot Activity、Presence 与 Output Events[/+]