docs(resident-subagent): inputch 是最基本的输入路由单位(插件可注册多个)

按用户补充收窄定义:
- inputch 是**最基本的输入路由单位** —— 路由粒度到此为止(比「插件」细、比「通道名字符串」实)
- **由插件注册,且一个插件可注册多个**(登记接口即现有 RegisterInputChannel,
  调 N 次就是 N 个 inputch;同一插件的多个 inputch 彼此独立,可绑给不同 agent、可分别限额)
- 「划入输入通道」的单位 = **inputch**(不是插件、不是通道组)
- 通道注册层以 inputch 为键(一个插件 → N 个 inputch),每个 inputch 带
  归属/被划给的 agent · 容量 · 可接收类别 · 输出目标解析

新增测试点 S21(同一插件两个 inputch 分别划给父与子,互不串台)。
This commit is contained in:
JianFeeeee
2026-09-13 08:40:04 +08:00
parent fc41e160db
commit 3956610134

View File

@ -36,7 +36,7 @@
| **根 agent** | 进程级主 agent拥有**完整内核**(含记忆读写、全部通道) |
| **驻留子** | 父创建、长期驻留的子 agent拥有**轻量内核**与**临时记忆空间** |
| **工作式轻量子** | 现状 `spawn_child` 的一次性子任务(**不是内核实例** |
| **inputch** | 对"中断输入 / 排队输入"两者的高层抽象,是**路由与分配**的单位 |
| **inputch** | **最基本的输入路由单位**对"中断输入 / 排队输入"两者的高层抽象,是**路由与分配**的单位**由插件注册,一个插件可注册多个** |
| **outputch** | 输出通道;输出是 agent 的**主动调用**,并**可寻址到具体 agent** |
| **main 空间** | 主记忆空间:父读写、所有子只读、全部子共享 |
| **temp 空间** | 子临时记忆空间:该子读写、子之间互不可见 |
@ -71,8 +71,12 @@
`inputch` **不是**通道名标签,也**不是**与 outputch 配对的东西。它是:
1. **对"中断输入"与"排队输入"两者的高层抽象** —— 两类输入都从 inputch 进出
2. **路由与分配的单位**
1. **最基本的输入路由单位** —— 路由粒度到此为止:比"插件"细、比"通道名字符串"实
2. **由插件注册,且一个插件可注册多个** —— 同一个插件的多个 inputch 是**彼此独立**的
路由单位(可以绑给不同 agent、可以分别授权。登记接口即现有的
`RegisterInputChannel(name, def)`,调 N 次就是 N 个 inputch
3. **对"中断输入"与"排队输入"两者的高层抽象** —— 两类输入都从 inputch 进出;
4. **路由与分配的单位**
- **路由**:一条输入投给哪个 inputch就是"该由谁处理"的**既定事实**
**路由发生在进内核之前**
- **分配**inputch 是**可分配资源**(父把输入通道划给子)。
@ -102,7 +106,8 @@
### 4.4 通道分配:不对称 [已定]
- **不按对划分**。父为子:**划入若干输入通道** + 授权**一组可用输出通道**(授权集合,不是一对一)。
- **不按对划分**。父为子:**划入若干 inputch**(单位是 inputch可以来自同一个插件的不同 inputch
+ 授权**一组可用输出通道**(授权集合,不是一对一)。
- **输出通道可寻址到具体 agent**
- **子 → 主**:子直接打到主(经输出通道投进主的 inputch
- **主 → 指定某个子**:父经输出通道投进**指定子**的 inputch。
@ -113,7 +118,10 @@
`inputChannels` 只是策略表(`ChannelDef`NoMemory / Cleaner / ContextPolicy
**没有归属、没有绑定、没有容量**。要实现 §4.4 需要新增:
- **通道注册层**`inputch` 成为一等对象(归属 agent / 容量 / 可接收类别 / 输出目标解析);
- **通道注册层**`inputch` 成为一等对象。它已经是**最基本的输入路由单位**
所以注册表以 **inputch 为键**(一个插件 → N 个 inputch并给每个 inputch 带上:
**归属/被划给的 agent · 容量 · 可接收类别 · 输出目标解析**
⇒ 同一个插件的两个 inputch 可以**分别划给不同 agent**、**分别限额**
- **输出通道 → 目标 agent 的 inputch** 的解析;
- **授权过滤**`output_list_channels` 只列该 agent 被授权的通道。
@ -366,6 +374,7 @@
| S15 | 子之间 temp 隔离 | 两个子各写 temp互相查 | 查不到对方的 temp |
| S16 | 父退出清理 | 父 `Stop()`(多个子、有子在工作中) | 全部子被销毁;登记表空;**无孤儿 goroutine / 无悬空通道 / 无残留 temp** |
| S17 | L4 独占 | 子内部(子自己的输入/工具/定时器)试图产生 L4 | 被夹到 **≤L3**;只有父的消息是 L4 |
| S21 | 一个插件多个 inputch 可分别路由 | 同一插件注册 2 个 inputch分别划给父与子后各投一条输入 | 各自只到被划给的 agent互不串台 |
| S19 | 父消息必能打断子 | 子在长任务中LLM 流式段)时父发送消息 | 子按 L4 被打断;若子在不可抢占临界区,则在安全点生效 |
| S20 | 子的内核级事件上报 | 子 panic / 子 contextfull | 在**父的阶梯上以 L4带子标识**出现;子侧不自己产生 L4 |
| S18 | 内核不持有"当前通道" | 抢占/中断后被打断任务恢复并发响应 | 提示词与事件标签都**只来自输入事件**(不再有被覆盖的字段) |
@ -383,7 +392,7 @@
| **R12** | 子的内核级事件panic / contextfull上报级别 | **[默认/推论]在父的阶梯上以 L4带子标识上报** |
| **R4** | 父→子消息落地 | **[默认]挂起/恢复**(现场不丢);一处开关可改"直接丢弃" |
| **R5** | "主动写入处理表"的形态 | **[默认]子调用 `inputch_note` 类工具**;未调用则轮末自动写 |
| **R6** | 输入通道"划入"的语义与容量 | **[默认]读写授权(不转移所有权)+ 创建时给定容量** |
| **R6** | 输入通道"划入"的语义与容量 | **[默认]读写授权(不转移所有权)+ 创建时给定容量****划入单位 = inputch**(不是插件、不是通道组) |
| **R7** | 压缩由谁执行 | **[默认]子的轻量内核自己压**(它有自己的上下文与 LLM压缩后清表 |
| **R8** | 压缩前父是否"查看后决定" | **[默认]纯机械压缩**(父只在选"压缩 vs 回收"时决策) |
| **R9** | 回收时处理表 | **[默认]不必清**(子都没了);若日后要留作审计需单独策略 |