Skip to content

[Retired] Orchestrator: V1.0 PersonaBot Activity、Presence 与 Output Events #119

Closed as not planned
2 of 2 issues completed
Closed as not planned

Description

@DoodleBears

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

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

GitHub native sub-issue relationships and native blocked-by edges are authority;本 checklist 是 Human-readable map。

Current frontier

  1. 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.
  2. 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.
  3. 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.
  4. 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

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。

Activity

  1. added this to the v1.0 milestone on Sep 20, 2026
  2. pinned this issue on Sep 20, 2026
  3. changed the title [-]Orchestrator: V1.0 PersonaBot Activity、Presence 与 Human Attention[/-] [+]Orchestrator: V1.0 PersonaBot Activity、Presence 与 Output Events[/+] on Sep 20, 2026
  4. 5 remaining items

  5. added
    scope:hubParent coordination map or epic; not a standalone implementation slice
    on Sep 22, 2026
  6. DoodleBears commented on Sep 22, 2026

    @DoodleBears
    ContributorAuthor

    参考调研:OpenBot(Grokbot alternative)的 Activity / Avatar 状态设计

    一手调研报告:docs/research/2026-09-23-openbot-architecture.md。源码已浅克隆到 reference/openbot/(gitignored,commit 252df2a,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):

    failed > waiting(approval/prompt) > working > responded > idle
    

    优先级按「多久需要人」排序——反序会把 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}:

    mood state expression rings breathe
    idle idle 种子脸 false 0
    working idle attentif true 0.03
    waiting notify — false 0
    failed idle triste false 0
    responded idle heureux false 0
    connecting swirl attentif true 0
    asleep idle somnolent false 0

    关键纪律:

    • mood(表达什么)与 motion(何时动)正交:motion: "hover" | "always" | "idle" 是性能轴,与 mood 表互不纠缠(src/renderer/src/bloub-avatar.tsx:7-12)。
    • 照片/custom image 用同一套环/呼吸 CSS 承载 mood(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 时动。
    • 反面教材写进代码:activity 指示器不再随机播装饰动画,「a silhouette is identity, so it is not something to shuffle」(AgentActivity.tsx:22-28)——与我们「状态不可只靠颜色/装饰」的无障碍要求同向。

    对本 epic:#120/#122 的 thinking/working/idle/effects 呈现可整理成这样一张显式 mood/presentation 表,而不是散在组件里的条件渲染。

    3. 动态头像:bloub 过程化 SVG(更新 Avatar module 的技术参考)

    • 引擎:npm @norbert_bodziony/bloub@0.3.0(MIT,x.ai 头像的工程复刻,SolidJS peer dep),SVG 形变,非位图/骨骼/GIF。
    • 身份 = FNV 哈希 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)。
    • 性能预算写进注释:30fps 硬顶、island 对比 4.1% core、未虚拟化侧栏 83 recalc/s;prefers-reduced-motion 关 breathe。
    • 环(rings)采样 orbit pose 的 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 弱相关)。

  7. DoodleBears commented on Sep 22, 2026

    @DoodleBears
    ContributorAuthor

    术语修正:OpenBot 的 "mood" 是 state,不是情绪(附与现有设计的融合)

    接上一条调研评论的补正与落地映射。上游源码对照:reference/openbot/(commit 252df2a)。

    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 → 我们已定的设计

    层                OpenBot                        我们(ADR-0049 / CONTEXT.md / #80,已定)
    ────────────────  ─────────────────────────────  ────────────────────────────────────────────
    事实来源          runtime signal records         DSH SessionEvent + explicit Session Ownership
    派生              computeAgentAvatarMoods        Host Activity Projection(revisioned、可重建)
                      纯函数 + UI 端优先级聚合          确定性 resolution:orchestrator 优先、
                                                   tool kind 坍缩——不在 Client 再聚合一次
    共享 busy 源      isAgentWorking 被 badge/脸     snapshot 同一 state 字段喂 badge 与 Avatar
                      共用(同一函数 + 同一份测试)      module——#120 验收显式包含「badge 与脸同源」
    呈现              MOOD_PRESENTATIONS 查表         PersonaBotActivityState × Effect + Activity Frame:
                      {state, expression,            { state: idle/thinking/working/waiting/blocked,
                       rings, breathe}                effect, labelKey, animate?, frameDecor }
    动效预算          motion 轴 hover|always|idle     #128 motion preference(Follow/Reduce/Full)已有
    表面态            connecting/asleep 由表面传入     连接/断线 chrome 由 shell 传入,不从 Session 派生
    attention         approval/prompt 挤进 face       正交 indicator + Human Inbox(ADR-0049 已明确)
                      state 的优先级                  ——不采纳「attention 拌进 activity state、
                                                   UI 再排 failed>waiting>working」的聚合方式
    identity          seed → 形/色;动画禁改轮廓       personaBotId → 确定性 blobatar;state 永不动
                                                   identity(形与颜色是身份)
    

    3. 融合落点(对应我们现有代码,供 #120/#122 实现时采用)

    1. 呈现表化: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 都读同一张表。
    2. busy ⇒ 动画时钟:等价物 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)。
    3. 照片与生成图共用 frameDecor:rings/breathe 式装饰挂 Activity Frame 而非 media 本体——ADR-0049 已写此边界,OpenBot 是运行中的先例(data-avatar="image" 复用同一套环/呼吸 CSS)。
    4. shape-safe 纪律(前瞻):未来 blobatar motion/expression catalog 落地时沿用上游白名单 + 对照库目录的测试守卫:state/effect 只允许改表情与装饰,绝不改轮廓与颜色。
    5. badge 同源测试:badge 与 Avatar 消费同一 snapshot 字段,测试断言二者永不分歧(上游 sidebar-agent-states.ts:18-19 注释 + 共享测试的做法可直接照搬)。

    无需新增 ADR 或改 CONTEXT 词汇——现有边界已覆盖;以上是实现票开工时的落点清单。

  8. removed this from the v1.0 milestone on Sep 30, 2026
  9. changed the title [-]Orchestrator: V1.0 PersonaBot Activity、Presence 与 Output Events[/-] [+][Retired] Orchestrator: V1.0 PersonaBot Activity、Presence 与 Output Events[/+] on Sep 30, 2026
  10. unpinned this issue on Sep 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    V1.0Milestone v1.0; mirrors the GitHub milestonearea:docsDocumentation, research, or planning artifactfeature:activityPersonaBot activity, presence, and output signalsscope:hubParent coordination map or epic; not a standalone implementation slicewayfinder:mapWayfinder map

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions