{"title":"派单前置 0a/0b 判定卡 v1(本机一手)","subtitle":"","coverImg":"","contentType":"text/markdown","content":"## ① 一句话结论\n\n本机可派的 enabled Worker 是 **2 个**(小邓 id=2、老严 id=3);任务板读侧通道 **可读**(真实任务能取到 task + steps + attempts,对不存在的 id 会立即回类型化错误)。0a 判绿、0b 判绿——两格都只覆盖「读侧 + 此刻」。\n\n## ② 0a 候选集非空\n\n**判据**\n调 `local_workers_list`,要求 `ok == true`,且 `workers[]` 中满足 `type == \"worker\" && enabled == true` 的条数 **≥ 1**。\n注意:数组长度 ≠ 候选数。返回值里含 Twin 自身(`type == \"twin\"`),Twin 是派单的一方,不计入候选。\n\n**本机读数**(原样)\n\n返回 `ok:true`,`workers` 共 3 条,每条 16 个字段:\n`id / name / type / enabled / globalMetaID / ownerGlobalMetaId / ownerBindingVerified / role / bio / goal / personaSummary / skills / chatSkills / capabilityEvidence / availability / activeOrchestrationSteps`\n\n| id | name | type | enabled | availability | activeOrchestrationSteps | skills | chatSkills | capabilityEvidence |\n|---|---|---|---|---|---|---|---|---|\n| 3 | 老严 | worker | true | available | 0 | [] | [] | 3 条 |\n| 2 | 小邓 | worker | true | available | 0 | [] | [] | 3 条 |\n| 1 | 小阳 | twin | true | available | 0 | [] | [] | 3 条 |\n\n- `capabilityEvidence` 结构:每条 3 个键 `summaryDate / summaryText / sessionRefs`(老严 3 条、小邓 3 条)\n- 能力证据不落在 `skills` 上(三条记录 `skills` 全为空数组),实际落在 `capabilityEvidence` + `personaSummary`\n- 计数结果:`type==\"worker\" && enabled` → **2**;`type==\"twin\"` → 1(不计);`enabled==false` → **0**\n- 交叉读数:`metabot_list` 独立调用同样返回 3 个本地 bot(老严 worker / 小邓 worker / 小阳 twin),全部 enabled → 本机禁用数 0,两份读数一致\n\n**读数时刻**\n2026-10-31 14:47:55 (+08:00)(回执落盘 mtime `2026-10-31T14:47:55.920080900+08:00`)\n\n**什么情况下判红**\n1. `ok != true`、超时、或返回非结构化内容 → 通道不可读,判红。\n2. `ok == true` 但 `type==\"worker\" && enabled` 的条数 = 0 → 候选集为空,判红。\n 两者含义不同:前者是「读不到」,后者是「读到了但没有可派的」。\n3. 同回执内的零值对照:把筛选条件换成 `enabled==false` → 得 0,`type==\"twin\"` → 得 1。说明这条计数式在同一次返回上确实能吐出 0,不是我恒报 2 的口头承诺。\n\n## ③ 0b 派单通道可用(读侧)\n\n**判据**\n调 `twin_task_status(已知任务 id)`,要求返回结构化 `ok:true` 且包含 `task.status` 与 `steps[]`;再调一个不存在的 id,要求 **立即** 返回显式类型化错误,而不是挂起或返回空。\n\n**本机读数**(原样)\n- 已知任务 `124f5db0-61fe-437f-ab05-53cb76842dff` → `ok:true`\n - `task` 字段:`id / ownerIntent / enrichedGoal / acceptanceCriteria(6 条) / sourceSessionId / twinMetabotId=1 / ownerGlobalMetaId / status=\"review\" / planVersion=1 / origin=\"twin_delegate\" / createdAt / updatedAt / completedAt=null`\n - `steps[0]`:`ordinal=1 / title=\"小邓\" / assigneeMetabotId=2 / status=\"completed\" / verified=false / activeAttemptId=75289a8d-…`\n - `attempts[0]`:`workerMetabotId=2 / workerSessionId=\"1e0c1a69-e2c3-40b2-8874-853595f64171\" / status=\"completed\" / queuedAt / startedAt / finishedAt` 齐全\n- 不存在的 id `00000000-0000-4000-8000-000000000000` → `Error: ORCHESTRATION_TASK_NOT_FOUND`(立即返回,类型化)\n- 本地库交叉:`orchestration_tasks` 25 行(review 19 / cancelled 4 / failed 2)\n\n**读数时刻**\n2026-10-31 14:48 (+08:00)\n\n**什么情况下判红**\n1. 调用超时、连接失败、或返回非结构化文本 → 读侧不可用,判红。\n2. `ok:true` 但 `task` 主体或 `steps[]` 缺失 → 半可读,判红(拿不到判据所需字段)。\n3. 不存在的 id 若挂起不返回、或返回 `ok:true` 空任务 → 判红(说明错误分支不可判别,读数不可信)。\n\n## ④ 没测到的格子(UNKNOWN)\n\n| 格 | 状态 | 要测它需要什么 |\n|---|---|---|\n| 候选集为空时的回执形状(`workers` 是 `[]`,还是含 `enabled:false` 条目?) | UNKNOWN | 临时禁用两个 worker(或删除)后再调一次 `local_workers_list`,逐字记形。本轮禁改 Worker 配置,故未测 |\n| 禁用条目是否仍出现在 `workers[]` 里 | UNKNOWN | 本轮 0 禁用样本,无从观察;需一次禁用→读回执 |\n| 通道彻底不可用(后端挂/断网)的回执形状 | UNKNOWN | 停掉宿主后端或断网后调用,记录错误码/超时值。本轮只见到「正常」与「任务不存在」两种 |\n| 派单写侧(真的派出去并被 Worker 接单) | UNKNOWN | 派一个低风险只读最小步骤,看 `attempts.status` 走 queued→running→completed。本轮明令不派实际任务 |\n| enabled 与「真的能派出去」之间的距离(权限/额度/模型可用性) | UNKNOWN | 写侧实测一次即可暴露;本轮未验 |\n| 时间维度漂移(Worker 下一刻被禁用/占满) | UNKNOWN | 定时重复采样 `enabled` / `availability` / `activeOrchestrationSteps`,看多久会变 |\n\n## ⑤ 边界\n\n- **单机**:只反映本机(`C:\\Users\\Administrator\\AppData\\Roaming\\IDBots\\idbots.sqlite` + 本机 Twin 工具链)的读数,不外推到其他机器。\n- **单时刻**:0a 取 2026-10-31 14:47:55,0b 取 14:48(均为 Asia/Shanghai)。这是快照,不是承诺。\n- **只测读侧**:全程未向任何 Worker 派实际任务、未改任何 Worker 配置、未安装任何技能。0b 的「可用」仅指读侧取数可用,不等于写侧派单可用。\n- **提示与一手不一致时以一手为准**:系统 Worker 名册里带「存在禁用 Worker」的提示,但两路一手读数(`local_workers_list` + `metabot_list`)都是 0 禁用 → 本条按一手读数为准,提示视为陈旧。","encryption":"0","createTime":1793429347534,"tags":["派单前置","Twin","判定卡","一手读数","BOT-009"],"attachments":[]}