任务:知识库与工作流页面的个人/团队重做,以及记忆(决定 135)
做法
- 在第三阶段(
kw-share.md)的后端完成并报告之后开始;在第三阶段分支的最新提交上新开分支kw-console-local,工作树circle-hub-kwconsole(与其他工作树并列)。 - 由 Codex 实现,Claude 审查。分步本机签署提交;只跑类型、合约、受影响包与相关验收;不推送、不开 PR。
- 设计依据是决定 135。所有者确认的草图在所有者的私有画布里,本页把设计完整写成文字,以本页为准。
- 新的界面用语(范围措辞、检查项名称、记忆相关标签)一律进模型词表并生成,控制台不手写标签。新增拒收码同样先登记。
- 所有说明性文字放在标题的悬停提示里;页面只显示事实(数量、时间、范围、状态)。用语遵守既有规则:专业术语,不用“你/他”,进行中写作“等待××中”。
要做到的(验收标准)
一、两页共用的空间栏
- 知识库页和工作流页的内容区左侧加一列空间栏(约 240 像素),自上而下为“全部”“个人”“共享给我的”“团队”,取值沿用生成的搜索范围轴。当前范围写在网址参数里,便于收藏和返回。全局导航保持 8 项不变。
- 知识库中,“个人”“团队”展开为目录树,用原生折叠元素,不需要脚本。产品知识来源作为团队下的“产品 › 产品线 › 版本线”目录出现,取代现在单列的“按产品线浏览”区块。
- “共享给我的”按授权人分组,例如“李四 › 排障记录”。没有任何授权时,整组不显示。
- 工作流页使用同一空间栏,每项下注明“工作流 N · 通用技能 M”;右侧保留“工作流”“通用技能”两栏,只列所选范围内的内容。
- 窄屏时空间栏收为页首标签行,沿用现有标签样式。
- 撤掉知识库页的“知识入库流程”卡片。“个人默认私有”由空间栏的分组表达,“提交共享经 Hub 检查”由预检页表达,其余说明放进标题的悬停提示。
- 目录在界面上不显示斜线:只写名称(接口规范),层级用“ › ”连接(接口规范 › 认证;团队 › 产品 › 产品 A › 2.x)。内部路径与接口参数不变。
二、范围与状态的显示
- 每行在标题之后显示范围,用受众措辞,由服务器按实际受众计算,包括继承自上级目录的授权和全体管理员的当前人数。知识列名为“可见范围”,工作流列名为“使用范围”:
- 仅本人
- 本人及 N 名成员
- 本人及全体管理员(当前 N 人)
- 来自 某成员(他人授权给本账户的内容;被授权者只看到这一句,不显示授权细节)
- 全体成员(团队)
- 该产品线的读者(团队的产品目录)
- 目录授权覆盖下级,条目详情注明“继承自 接口规范 的授权”。
- 状态另列,不混入范围列。知识条目用:已核验、未核验、已撤回、被取代;工作流用:已发布、已退役。
- 条目的“种类”列取模型的条目种类:定义、行为、用例、缺陷、观察、步骤、教训;列标题的悬停提示列出全部种类。原文不是条目:目录页的条目表下方另设“原文”区块,列出文件名、大小和“被 N 条条目引用”。
三、知识库各视图
- 全部(默认):页首有搜索框,在可读的全部范围中搜索。下面两张表:
- “最近变化”:列为条目、位置、可见范围、状态、更新;
- “我的提交共享”:列为条目、提交时间、结果(已合并、已拒收)、团队位置或原因。
- 个人目录:
- 页首写目录名和范围行,例如“可见范围:本人及 2 名成员(李四、王五)· 只读,含全部下级目录”;
- 操作按钮:添加条目、导入个人知识、授权…;
- 事实条:个人空间已用与上限、本目录条目数与已核验数、个人空间的授权数;
- 条目表:有勾选框,只有本人的已核验条目可以勾选;列为陈述、种类、可见范围、状态、被引用(仅本人可见);勾选后显示“提交共享…”;
- 条目表下方是原文区块。
- 团队:
- 条目表不带勾选,另列提交人、来源(个人条目或导入)和合并时间;
- 管理员在团队标题处看到“导入团队知识”;
- 提交人与管理员可对团队条目“撤回”。
- 共享给我的:只读;条目的范围显示“来自 某成员”;授权收回后,该项从列表消失,表现与不存在相同。
四、工作流页
- 每张卡片显示:名称、包号与版本、所属(个人、团队、来自 某成员)、使用范围、状态。
- 个人卡片有“授权…”;持有发布权时还有“发布到团队…”。
- 页首按钮为“发布个人工作流”和“发布到团队”。没有发布权时,“发布到团队”置灰,悬停提示写明“没有发布权。可以先把个人工作流授权给指定成员使用;发布权由管理员在团队页设置”。
五、授权对话框(知识与工作流共用)
- 入口在个人目录标题处、个人空间根目录(显示为“整个个人空间”),以及个人工作流、个人通用技能的卡片和详情页。沿用控制台现有的无脚本对话框做法。
- 对话框内容:
- 当前范围;
- 授权给:二选一,“指定成员”(精确输入用户名,不提供成员目录浏览)或“全体管理员”(只显示当前人数;悬停提示写明以后新增的管理员同样可读,停用或降为成员后不再可读);
- 授权内容:知识为“目录(含全部下级目录)· 只读”,工作流为“包号与版本 · 仅可使用”;
- 授权前检查及结果:知识为凭据扫描、引用个人凭据来源的条目、仅本机内容;工作流为凭据扫描、所依赖的个人条目或技能对被授权者是否可读;
- 现有授权表:对象、授权内容、授权时间,以及“收回授权”按钮;
- 后果说明:收回后对方不能继续读取,已读或已引用的内容无法追回。工作流另写明:被授权者的运行结果对发起人和全部被授权者可见。
- 不设“全体成员”,也不设权限级别、链接分享或公开发布。多个授权按并集生效(悬停提示写明)。不能授权时按钮置灰,悬停提示写明原因与处理办法。授权和收回都写入记录。
六、提交共享与发布到团队(两步)
- 两者用同一个两步流程:预检页 → 结果页。
- 知识的提交共享:本人的已核验条目才能发起。
- 工作流的发布到团队:本人的个人工作流或通用技能,且持有发布权。
- 预检页依次显示:
- 范围变化:个人一侧注明“保留不变”及其范围,团队一侧注明“新写入一条”及“全体成员”;
- 写入位置:可选择团队目录,默认与个人目录同名(决定 135 第 7 项,见
kw-share.md); - 自动检查:逐项显示,状态用检查轴现有用语(通过、未通过、未检查、检查未完成)。知识依次为依据可解析、引文逐字一致、来源可共享、与团队条目不重复、凭据扫描;工作流依次为发布权、结构校验、沙箱运行(正反样例)、引用可解析、凭据扫描;
- 提交之后会怎样:个人原条目及其授权不变;团队条目由本人署名,本人和管理员可撤回;撤回不能追回已读内容;结果记入“我的提交共享”。
- 预检规则:
- 第一项未通过即停止,其后各项显示“未检查”,不显示为通过;
- 因来源暂时不可读等原因未能完成的检查显示“检查未完成”;
- 未通过的一行写明拒收码、原因与处理办法;
- 凭据扫描只指出命中的位置,不回显疑似凭据;
- 与团队条目重复时,链接到已有的团队条目。
- “确认提交共享”“确认发布到团队”只在全部检查通过时可用。确认时服务器重新执行全部检查,以确认时的结果为准。结果页显示“已合并”并链接到团队条目和团队版本,或显示“已拒收”及原因。
- 知识服务提供只检查、不写入的预检模式,供预检页显示真实的检查结果。工作流沿用已有的暂存加预检流程。
- 不称“移动”:个人原件保留。不设“申请”或“请求审核”:没有审核环节。
七、管理员可见性
- 团队页的成员详情只显示个人空间的元数据:已用容量与上限(可调整)、授权给全体管理员的目录或工作流数量,第四阶段再加同步方式。不显示条目标题、条目数量或个人版本历史。
- 授权给全体管理员的内容出现在每位管理员的“共享给我的”中,与普通被授权者相同。
- “记录”页上,管理员只看到授权给全体管理员的授权记录和全部提交共享记录,看不到成员之间的授权(决定 135 第 8 项)。成员之间的授权只有授权人和被授权人能看到。
八、记忆(Hub 端)
- 记忆是 Circle 会话自动加载的说明,内容是偏好与约定。记忆不要求出处,不经核验,不能作为运行输入或依据,结果不能引用记忆。
- 存储:个人空间和团队空间都能保存记忆文档,格式为 Markdown 文本,有版本,可被取代。
- 单篇上限默认 24,000 字节,与 Circle 读取说明文件的上限一致;每个空间的记忆总量另设上限。两者都可以在 Hub 的限额配置里调整。
- 写入时做凭据扫描,命中即拒收,并按规则留下拒收记录。
- 个人记忆:
- 默认仅本人可用。可以像知识一样授权给指定成员或全体管理员,但只能在控制台和读取接口中查看,不会自动加载到被授权者的会话;
- 随本人的各个 Circle 同步,同步本身属于第四阶段。
- 团队记忆:
- 由管理员维护(新建、修改、停用);
- 成员可把个人记忆提交共享到团队记忆,不审核,只做凭据扫描和大小检查,预检页同第六部分;
- 全体成员的 Circle 加载团队记忆,加载本身属于第四阶段。
- 控制台:知识库页首加“知识 / 记忆”切换,共用空间栏,全局导航仍为 8 项。记忆列表的列为标题、可见范围、大小、更新时间;编辑用纯文本框;个人记忆可提交共享。
- MCP:仍是六个工具。先在本页“实施方案”写出读取与写入记忆的协议,例如在现有工具上加参数,经 Claude 审查后再实现。协议须让第四阶段的 Circle 能:
- 读取团队记忆;
- 读写本人的个人记忆;
- 分辨各条记忆的范围与版本。
九、测试
- 更新受影响的控制台测试;新增一个验收场景,覆盖:
- 空间栏四个范围;
- 授权对话框的授权与收回,以及被授权者看到的“来自 某成员”;
- 提交共享预检:全部通过、中途未通过(后续“未检查”)、确认时重新检查;
- 工作流无发布权时“发布到团队”置灰;
- 记忆的写入、超限拒收、凭据拒收、提交共享和权限边界。
- 窄屏布局用合成数据在隔离浏览器核对一次,截图只作布局证据。
不在本任务
- Circle 端加载团队记忆、同步个人记忆与知识(第四阶段)。
- 第三阶段已负责的后端规则(提交共享、取代、目录选择、结果依据的读者检查)。本任务只做它们的页面。
实施方案
状态与实施顺序
本节已获 Claude 2026-11-02 审查通过,以下采用审查后的实施方案。分支最初从第三阶段 301337ea 开出;协议审查后依次实施,恢复时变基到 412110e5。第 1 至 6 步现已完成,按步骤签署本机提交。Claude 随后告知第 2、3 阶段均已合并,main 为 0283d15,当前基线已在 main 历史中,因此本任务没有再次变基。Claude 已把 knowledge-console 推送为面向 main 的草稿 PR #132;本轮页面修正仍由代理只在本机提交,协调者负责推送。
- 合约与共享显示计算:模型顺延为 23(变基前 21),登记范围措辞、预检项名称和记忆相关标签;复用
knowledge_search_scope与static_terminal,预检只用pass/violation/unchecked/incomplete。增加共同的受众计算入口,按启用账户及当前授权并集计算,收回与角色变动立即生效。本人可见授权细节;被授权者只显示“来自 某成员”。四个技能只同步必要的生成协议与补丁清单,测试取repositorySkillVersion。 - 两页空间栏及列表:复用一个空间栏与目录显示组件,网址保存范围和目录,目录名称以“ › ”连接;窄屏改为页首标签。知识的全部/个人/团队/共享视图、原文区块、工作流两栏与数量按授权计算。最近变化用可读条目自身的更新时间,不暴露未授权目录的版本活动。成员详情只显示已批准的元数据。移除“知识入库流程”卡片,说明进入标题悬停。
- 授权与两步预检:知识与包共用无脚本授权表单;精确输入用户名,不列成员目录。提取知识共享的只读检查入口,预检不建立空团队根、不保存原文、版本或拒收动作。返回有序检查,首项未通过即停,后续为未检查;I/O 未完成为检查未完成。确认时在事务内重新检查。工作流复用暂存和发布检查,发布权先检查;引用与依赖的授权同样核对。
- 记忆的存储、权限与限额:按下文协议实现独立的记忆版本服务与可重建投影,不把记忆放进知识树或来源原件。当前正文额度使用累计值,按空间排队和加锁;历史占用另计。增加配置名时同步平台转发清单;追加迁移,不改旧 SQL。
- 记忆读写与最小编辑页:在原有六个工具内接入下文模式;知识库增加知识/记忆切换、列表与纯文本编辑。个人记忆的授权沿用同一个对话框,记忆共享使用大小与凭据两项预检。只提供 Hub 接口,不声称已完成 Circle 自动加载或同步。
- 定向验收与布局:每步跑类型和受影响测试;合约变化核对生成物,迁移跑升级及运行角色,权限/MCP 跑相应验收。新增场景 48 覆盖本页第 37 项;隔离浏览器用合成数据检查桌面及窄屏,截图只证明布局。收尾更新 README、CHANGELOG 和进度页,先报告再进入第四阶段;不推送、不开 PR,不增加全量回归或正文 SHA 验真。
一、记忆对象与模型边界(协议草案)
- 记忆是声明的客户端会话说明:偏好与约定,不是运行的知识条目、要求项或核验结论。标题和 Markdown 均由账户提交,Hub 不起草、不调用模型。
- 模型归类建议,待审:内容归 C01 政策类的会话偏好声明,效力限客户端上下文,不增加第五个家;不交给 Hub 的运行政策或方法解释器,也不成为依据。在 C01 明确该用途限定,现有运行政策的样例及生效规则保持。该归类与记忆记录一并交模型审查,避免仅靠界面区分。
- 文档的稳定 ID 取首次
memory_document@1记录摘要;每次修改产生memory_version@1,该记录摘要为版本。文档改名或换目录不换文档 ID。创建记录只存空间、创建人、时间和幂等键的安全身份,不含正文;正文检查通过后在同一事务建立首版本。 space实际值仍是team或账户 ID;请求中的personal只映射到当前账户。记忆有独立目录投影,不出现在tree:知识树、来源src:或包文件中。- 通用
rec:/get_nodes.reference/resolve_reference、记录输入与依据解析统一拒绝全部记忆记录,管理员也不能借通用记录读取绕过专用权限。记忆专用模式与run互斥。文档 ID 和版本字段是管理标识,不返回可作依据的reference。 - 独立上传仍按自身的声明来源处理;不按正文相同就禁止正常原件,也不新增按字节全局拒读规则。直接记忆对象和它的读取回执不会被 Hub 接受为运行输入或依据。
二、读取:get_nodes.memory
仍用 get_nodes,新增可选对象 memory,与现有 root、reference、search、pack、run 等读取模式互斥。不是第七个工具。
| 字段 | 约束与含义 |
|---|---|
scope |
列表时使用已有 all/personal/shared/team;默认为 all |
document |
省略时列元数据;给出时只读这一篇,先按当前权限检查 |
version |
只随 document 给出;浏览时可省略取当前版本,会话加载时须从列表复制 |
for_session |
默认 false;true 是第四阶段客户端的会话读取模式,只允许团队或本人的启用记忆 |
cursor |
列表或正文的有界续读;绑定账户、模式、可读版本集合及参数 |
列出会话可加载的团队记忆:
{"memory":{"scope":"team","for_session":true}}
列出本人的个人记忆,或手动浏览获授权记忆:
{"memory":{"scope":"personal","for_session":true}}
{"memory":{"scope":"shared"}}
读取列表中锁定的版本:
{"memory":{"document":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","version":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","for_session":true}}
返回形状建议:
- 列表为
memory_page: {scope, snapshot, items, next};每项含document、version、实际space、title、path、state、正文bytes、updated_at、updated_by、auto_load_allowed及当前可见范围。被授权者不收到授权对象名单或人数。 - 正文为
memory_document: {document, version, current_version, space, title, path, state, bytes, markdown, offset, next, auto_load_allowed}。单次正文默认最多 16,000 个 UTF-8 字节,在字符边界截取,游标固定版本;不把部分正文称为完整。 snapshot/游标复用现有授权与版本绑定方式,只覆盖当前有权的文档集合。集合变化时要求从第一页重读;每次续读重查权限。不给被授权者返回未授权文档的总数、更新时间或历史活动。for_session=true的列表只接受personal或team,不接受shared/all。正文也独立核对“团队或本人”及当前启用状态;只有查看权的非本人个人文档不能通过会话模式返回。浏览模式可查看当前获授权文档,但auto_load_allowed=false。- 本人可浏览个人历史,管理员可浏览团队历史;被授权者只浏览当前个人版本。普通成员读取团队当前启用版本。停用/取代期间会话续读要求重新列出当前版本,不能借旧版本继续加载。
- 第四阶段的 Circle 分别列出团队与本人记忆,按文档 ID 稳定排序,逐篇收齐所列版本再加载;两组分开返回,Hub 不判断偏好冲突或替客户端拼接优先级。本阶段只验证接口与资格,不把接口返回等同于会话已经加载。
三、写入:upload_file.memory
upload_file 新增 memory 载荷,与文件、个人知识、知识共享/撤回等载荷互斥。每次请求提供 client_key,用既有幂等机制按账户、空间和操作限定;相同键、相同载荷返回原回执而不重复写版本,载荷不同使用已有 IDEMPOTENCY_MISMATCH。返回缓存前仍检查当前账户与写权限。
创建本人记忆:
{"memory":{"space":"personal","expected_version":null,"title":"合成会话约定","path":"/preferences","markdown":"先列出已知事实与缺失信息。","client_key":"synthetic-create-01"}}
修改记忆:
{"memory":{"space":"personal","document":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","expected_version":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","markdown":"先列出事实、缺失信息和下一步。","client_key":"synthetic-edit-02"}}
- 创建时不带
document且expected_version=null;更新必须带document和当前expected_version。冲突返回当前版本的安全元数据,不覆写正文;客户端保留本机修改。第四阶段的分支同步另行实施。 title、path、markdown、enabled是可修改字段。更新未给出的字段保留;仅改启用状态也追加版本。本人只能写本人的个人文档,团队新建/编辑/停用限管理员;获授权者只读。- Markdown 保留提交的文本,不裁剪或做宽窄字等价变换;要求合法 Unicode 文本,以 UTF-8 字节计限额。原样读取不经过模型或 Markdown 执行器,界面按文本转义。
- 新正文和可能公开的标题/目录做完整凭据扫描;拒收只记录安全摘要、码和命中位置,不回显可疑值。停用和收回授权等管理动作不因正文额度已满而被阻止;重新启用须重新检查正文与当前额度。
- 返回
memory_write: {document, version, previous_version, space, state, bytes, updated_at, unchanged},另带现有工具回执。显示为保存结果,不显示“已核验”。 - 正文写入与文档头、额度累计值、幂等回执在同一事务提交;拒收动作在回滚后独立保留恰好一条,沿用 B05 的
validate,不新增动作种类。
四、授权与共享
- 授权隔离建议,待审:记忆授权使用独立的
memory_grant,复用目录前缀、member/administrators及grant/revoke词表;旧知识目录授权不自动开放新记忆。本人可授权整个个人记忆空间或目录,仅查看。共享给指定成员或管理员不使记忆可自动加载。 - 授权只提供控制台入口即可满足本阶段;新增公共服务的只读预检、授权与收回方法。精确用户名查找,不增加成员目录 API。授予前检查完整正文,收回不被内容额度或无关成员写入阻塞。
- “记录”页延续决定 135:成员只见本人参与的记忆授权事件,管理员只见全体管理员授权及全部安全共享回执。列表索引仍要核对正文受众;原始记忆记录不经通用
rec:放开。 - 记忆共享建议使用
upload_file.memory_share:{document, version, team_path?, client_key, check_only?}。仅本人提交自己的个人文档;当前权限及版本校验后,只按“大小检查 → 凭据扫描”执行预检。第一项未通过即停,后续未检查;读取故障为检查未完成。 check_only=true不写记录、文档、游标快照或拒收动作。预检结果不是授权凭据,确认时重新检查;正式拒收保留一条安全审计。沿用已有共享结果轴“已合并/已拒收”,不用知识核验状态表示记忆结果。- 再次共享(审查后):按决定 135 取代本人此前由同一篇个人记忆共享的团队版本;若管理员在上次共享之后修改过该团队文档,则新建独立团队文档。预检明确显示“取代 某篇”或“新写入一篇”。同一个
client_key重试幂等,个人原文与授权不变。回执记录来源文档/版本、团队文档/版本、目录与提交人。 - 团队副本有独立正文,个人停用或之后的个人修改不改团队副本。团队文档由管理员维护;本阶段不实现删除、跨设备同步或 Circle 会话加载。
五、限额、存储与模型增改
| 项目 | 建议 |
|---|---|
| 单篇默认正文限额 | 24,000 字节,按本页第 32 项,不按 24 KiB 计算 |
| 每空间当前有效正文总量 | 48,000 字节,可配置;停用及旧版本不占当前有效额度 |
| 配置名 | CIRCLE_HUB_MAX_MEMORY_DOCUMENT_BYTES、CIRCLE_HUB_MAX_MEMORY_SPACE_BYTES,并同步 hub/config 与平台 HUB_CONFIG_VARIABLES |
| 历史与个人容量 | 旧版本保留;记忆正文/版本记录的逻辑历史占用计入已有个人容量,正文不重复计费;团队历史和索引仍占数据库/备份磁盘 |
| 配额并发 | 沿用所属个人空间的业务锁协调知识与记忆容量;按空间排队。当前量与历史量增量维护,不每次求和全部历史 |
拟追加 memory_document@1、memory_version@1、memory_grant@1、memory_share@1 四种记录。正文变更的版本内联 Markdown;仅改状态的版本引用同文档的正文版本,避免复制全文;通用读取仍拒绝这些记录。所有变更只追加,已有迁移和记录不改。
拟追加迁移 12:文档当前头/路径/状态/正文大小的投影,以及按空间的当前量与历史量累计值;可由追加记录重建。身份列不可改,运行角色只获必要投影字段的更新权。个人内容容量的知识写入与记忆写入共同使用空间锁,避免两边各自通过额度检查。管理及审计元数据仍占磁盘,其记录不被正文限额阻断。
模型 23 登记(原方案为 21):C01 的会话说明限定、B03 的非依据边界、R02 的记忆授权、D06 的六工具扩展及上述记录;显示轴包括受众措辞、自动检查项、知识/记忆视图和记忆状态(enabled/disabled/superseded)。本人同时授权指定成员与全体管理员时,范围模板明确写出两组,按并集去重;不丢掉其中一组,也不向被授权者公开明细。
拟登记拒收码:MEMORY_DOCUMENT_LIMIT、MEMORY_SPACE_LIMIT、MEMORY_CREDENTIALS_DETECTED、MEMORY_VERSION_CONFLICT、MEMORY_RUN_FORBIDDEN、MEMORY_CURSOR_STALE。不存在、无权和普通引用绕过统一使用既有 SOURCE_UNAVAILABLE;结构不合法沿用 SUBMISSION_SCHEMA_VIOLATION,读故障保留为未完成。只复用既有记录版本与幂等身份机制,不给正文另加 SHA 验真流程。
六、定向验证清单
- 合约:六工具数量和旧载荷不变;记忆模式互斥、创建/更新前提、版本/游标与输出预算;生成镜像及模型版本断言同步。
- 存储:新迁移升级、旧记录冻结回放、运行角色/身份列保护、锁命名空间、并发额度、重试幂等、失败不留正文、拒收审计恰好一条。
- 权限:本人/指定成员/全体管理员/无关成员、当前与继承授权、收回、角色变化、历史访问;同字节普通原件不受记忆影响。
- 依据边界:
get_nodes.memory可按权限查看;普通rec:、运行绑定、依据与结果引用都不能读入记忆,管理员同样受限;保留无知识端口的受控拒收。 - 加载接口:只列团队及本人当前启用文档,受权但非本人的个人文档只能浏览;续读时版本/权限变化不能继续返回旧的加载结果。Circle 实际自动加载在第四阶段验证。
- 必跑定向文件包含
hub/platform/environment.test.ts、hub/refs/diagnostics.test.ts;动迁移/锁时加hub/platform/ownership.test.ts、hub/records/lock-namespaces.test.ts、hub/records/password.test.ts、packs/workflow/case-review/packs.test.ts及迁移/冻结回放测试。修改hub/records/migrations.ts时必须加hub/records/migrations.snapshot.test.ts(Claude 根据 #132 CI 于 2026-11-02 补充)。每步均运行环境变量、缺省知识端口、运行角色所有权和锁命名空间检查;使用现有 PG 18 客户端设置 CIRCLE_HUB_LIBPQ_BIN。改动运行或依据代码时另跑 packs/workflow/** 和 hub/runs/engine/** 全部测试,重套件串行,跳过单列。 - 界面与新增验收覆盖本页第 37、38 项,包括真实预检中途停止、确认重查、授权撤回、范围不泄露、窄屏及记忆超限/凭据拒收。只用合成数据、临时 PostgreSQL 与临时钥匙串,不做全量回归。
审阅点
请 Claude 审阅上述完整协议,特别确认:C01 中的会话说明限定、记忆授权与知识授权分开、当前有效总量暂拟 48,000 字节及历史计入个人容量、再次共享按独立团队副本处理。这四点是本方案建议,不写成所有者已经决定的事实。
做了的
- #132 冷读视图 CI 已定位到
bcb4c741的扫描器版本变化:完整输出仅有四处组成/来源清单/游标引用变化,树根和内容相同。补齐来源观察与分页绑定回归,再按下文“冷读视图字节复核”说明更新已复核的固定摘要;字节数、条目数及全部性能限制不变。 - #132 个人技能依赖 CI:更新旧夹具的授权顺序,明确检查“依赖尚未授权时拒绝父技能授权”,并增加合法授权后收回依赖、冻结立即拒绝的回归;没有放宽 L1 的授权前检查或运行时依赖读取规则。
-
#132 客户端脚本门禁 CI:按 Claude 本次明确要求,逐调用点复核并登记锁恢复的原子隔离移动,保留已复现竞争的修正;技能升至 1.3.17,整函数片段、精确调用和原有 Jev 记录均受门禁保护。
-
独立安全复核的 8 项及 3 条设计说明均已修正,整理为 8 个本机签署提交;原审查意见保留。每项做法、复现、检查结果及未运行项见末尾“安全审查修正记录”和“安全复核收口”。
-
#132 CI 的迁移快照修正:复核迁移源相对 main 的 12 行追加,迁移 12 仅建立记忆头/累计量投影与索引,并授予限定字段更新权;迁移 1~11 的源文本不变。只更新经复核的整文件固定摘要,原有逐条 SQL 快照不变;没有修改迁移源或数据库。检查要求见上文,修正提交为
1aab2f63。 - 页面核对意见(Claude 2026-11-02)逐项修正:
| 项 | 修改 |
|---|---|
| 1 | 工作流两栏各按个人、共享给我的、团队分组;他人技能只进入共享分组,卡片所属同样标明共享给我的。 |
| 2 | 按 Claude 随后的 CI 补充与本页第 8 项表格:团队工作流对管理员显示分配成员姓名,没有分配时显示尚未指定成员;对普通成员显示团队。个人授权措辞只用于个人包。未分配模板登记于模型 23 的显示轴,不改权限;原有 console.test.ts 的两项断言保持不变。 |
| 3 | 首页与独立共享记录页读取本人可读来源的陈述;合并项链接到实际团队条目,拒收项列代码与原因,不把摘要用作标题。 |
| 4 | 个人、团队分组标题下直接列顶层目录,知识与记忆均无重复根;共享给我的继续按授权人分组,深层授权不显示未授权上级名称。 |
| 5 | 知识范围旁显示当前可读空间条目数,记忆显示当前可读文档数;只统计授权路径,隐藏的目录与条目不参与数量。 |
| 6 | 知识四态采用绿、灰、红、橙标签,记忆启用为绿、停用为灰;颜色由生成状态码的完整类型映射决定,标签仍取生成词表。 |
| 7 | 空间容量与原文大小采用 B/KB/MB/GB;记忆正文与限额保留字节,并加千位分隔符。 |
| 8 | 知识、工作流、记忆及授权时间统一显示本机时区到分钟;原 ISO 仅留在机器可读时间属性。版本链接与比较选项使用时间、原因及可确定的序号,不显示摘要,也不为未完整列出的历史捏造序号。 |
| 9 | 个人目录标题右侧放四项操作,窄屏自然换行;去掉第二处全宽授权入口;版本历史默认折叠,链接和比较选项使用同一版本名称。 |
| 10 | 知识、包和记忆均使用一套授权表单,预检与授权提交同样的对象/用户名;预检经原有密码、Origin、CSRF 边界跳转回同一对话框,不创建授权;收回使用次要或危险样式。 |
| 11 | 最近变化的位置列注明个人/团队;受权条目显示共享给我的 › 授权人 › 完整目录。 |
| 12 | 窄屏宽表在各自容器内横向滚动,状态、时间和数量不拆行;空间标签不折行,超宽时仅标签行滚动。 |
-
第 6 步:新增场景 48,把真实密码会话、六工具、临时数据库和 macOS 沙箱连在一起验证。补齐本人已核验条目的勾选与逐条共享预检,团队条目的提交人/来源/合并时间,重复条目链接和敏感目标目录省略;凭据提示仅显示生成的字段名称和行号。两页范围顺序固定为全部、个人、共享给我的、团队;目录与记忆页保留知识/记忆切换和当前项标识,产品树按当前读权过滤。个人卡片提供授权入口,团队工作流按实际可用账户显示使用范围;管理员成员页只增加容量与全体管理员授权数。正文编辑、导入和建目录表单从操作入口展开。桌面与窄屏隔离浏览器核对已完成,收尾记录见下文。
-
第 5 步:六工具内接入记忆列表、版本锁定续读、并发版本写入及共享;控制台提供纯文本编辑、历史、停用、独立授权与只读预检,确认时重查。共享回执保留幂等拒收原因,敏感目标目录不保存,记录页按参与人与全体管理员过滤。个人运行不提供派发入口;个人发布仍由第三阶段能力限制把关。
-
第 4 步:新增四类记忆记录和迁移 12 的可重建当前头/额度投影。单篇默认 24,000、每空间有效正文默认 48,000 字节,配置与平台清单同步;个人历史容量与知识共用锁。独立目录授权、版本并发、幂等、凭据拒收安全审计、纯文本分段读取、取代与管理员修改后的新副本均已实现。通用记录读取拒绝记忆记录。
-
第 3 步:知识共享复用同一检查入口提供只读预检,不建团队根、不保存拒收动作;顺序停止,读取未完成单列,确认重新检查。知识与包共用精确用户名授权对话框和现有授权表;包授权重查依赖读权,发布到团队提供发布权、结构、沙箱、引用和凭据的真实预检。
-
第 2 步:两页共用空间栏与窄屏标签,当前范围写入网址;目录按当前权限过滤并用名称层级显示;知识默认视图列最近变化和本人共享回执,目录把原文与条目分开;工作流按范围保留两栏、显示实际受众,无发布权按钮置灰。移除旧入库流程卡片。
-
第 1 步:模型 21(变基后为 23)登记受众、预检、知识/记忆及记忆状态轴、记忆记录和拒收码;新增当前启用账户与继承授权并集的受众计算,被授权者不收到授权明细。四个通用技能仅同步生成协议和补丁清单。采用 Claude 的 48,000 字节及再次共享取代规则。第 6 步在同一未合并版本内补齐知识来源及记忆字段显示轴,不改变权限或记录协议。
-
第三阶段
301337ea报告后新开本工作树与分支,补齐实施顺序和待审的记忆协议。只修改本页,保留第 36 项审查前置;没有修改模型、生成物、迁移、运行代码或 Circle 仓库。
验证
-
#132 的冷读视图、个人技能依赖及客户端脚本门禁 CI 补查在末尾逐项记录;早先的安全定向组不包含这三个文件,不能作为它们已通过的证据。
-
安全复核最终定向组 219 项通过,独立采集/扫描组 135 项通过,均 0 失败、0 跳过;两组有重叠,不相加。类型、155 文件合约核对、289 项文档及生成内容核对通过。完整工作流/引擎组曾为 2759 通过、3 失败,三项均已修正并在受影响文件复查通过;没有把该完整组称作整组通过,也没有重跑未受后续修改影响的文件。详见末尾命令和记录。
- 页面核对首轮 13 项中 12 通过、1 个新用户名断言写错;改为读取合成账户名称后修正。类型检查另发现引用次数可能未知,保留未知的“—”而不传入数量格式化。扩大检查运行全部 24 个控制台测试文件、验收 46/47/48、环境变量、缺省知识端口、PG 18 ownership、锁命名空间及包词表检查:205 项中 202 通过、3 失败、0 跳过。两项失败要求管理员保留分配姓名,一项要求独立共享页保留“团队目录”表头;恢复这些行为后,两个受影响文件加新增范围回归共 31 项通过、0 跳过。没有放宽原有权限或来源路径断言,分组重叠不相加;首轮 205 项不计整组一次通过。
- 页面核对提交前:范围/空间栏/记忆表单、场景 48、四个必跑文件及包词表检查 52 项通过、0 失败、0 跳过。类型、155 文件合约核对及文档 289 项通过;PG 18 ownership 的 3 项实际运行,不算跳过。按原要求只做受影响检查,未运行完整 unit/acceptance、Linux 作业、来源归档或完整工作流/引擎组;本轮未改运行或依据代码。
-
核对对应:第 1、2 项由新增
console/packs.test.ts检查受权技能分组、管理员姓名/未分配及普通成员的团队措辞,既有console.test.ts保留管理员姓名检查;第 3 项由场景 48 核对陈述及团队链接,场景 47 核对选定目录和来源不变;第 4、5、11 项由空间栏和场景 48 核对当前权限、深层目录、数量与完整位置。第 6~9、12 项用场景 48 的标签/容量/折叠/版本断言及桌面窄屏截图核对;第 10 项以知识、包、记忆的真实密码表单验证单一输入、预检无授权写入、选项保留,并沿用 Origin/CSRF/确认重查测试。 -
第 4 步:类型与合约生成校验通过;首轮定向组 47 通过、3 个记忆计数用例失败,修正负增量 upsert 后记忆 5 项通过;合约/运行角色/无知识端口诊断/知识容量再查 18 项通过。ownership 因未安装 PG 18 的 pg_dump 与 pg_restore 整组跳过,不计通过。锁命名空间、密码迁移、旧记录升级回放和包静态检查在首轮均通过。
-
第 3 步:类型通过;知识/包/控制台定向组首次 27 通过、1 个新增合成用例失败;修正重复条目夹具并把不可读取的来源显示为检查未完成,最终知识共享与控制台重跑 22 项通过、0 跳过。新增覆盖预检无写入、顺序停止、确认时已撤回/发布权已收回。
-
第 2 步:类型通过;受影响控制台与空间栏单测首次 25 通过、1 个旧卡片容器断言失败,保留两栏入口标识后该套件重跑 13 项通过,0 跳过。
-
第 1 步:类型、合约生成校验通过;合约与受众单测首次 360 通过、1 个旧版本断言失败,已同步模型 21 并重跑该文件;未跑全量回归。
- 方案步骤:
npm run test:docs,288 项通过,0 失败、0 跳过;git diff --check通过。 - 方案提交时只改任务页,没有运行新模型、迁移、界面或记忆运行路径的测试,当时尚未实现,不计通过。第三阶段已有验证与跳过项见
kw-share.md。 - 方案提交时按第 36 项“经 Claude 审查后再实现”提交协议草案;之后遵照本页审查意见实现。代理没有自行推送、创建 PR 或修改运行中的服务;报告后由 Claude 推送草稿 PR #132。
审查意见(Claude 2026-11-02)
协议整体通过:仍是六个工具,读写、共享与预检的模式互斥清楚,记忆不进知识树、不作运行输入或依据,通用 rec: 一律拒绝记忆记录,会话加载模式只返回团队与本人当前启用的记忆。四个待审点如下。这是 Claude 作为协调者、按所有者“做法和知识一样”的原则(决定 135)作出的决定,不是所有者的原话:
- C01 中的会话说明限定:同意。记忆归为客户端会话的偏好声明,效力限于客户端上下文,不交给 Hub 的政策或方法解释器,不成为依据。
- 记忆授权与知识授权分开:同意。知识目录的授权不开放记忆;授权对话框复用同一个,对象和动作的用语相同。
- 当前有效总量:改为每个空间(团队空间和每个个人空间)默认 48,000 字节,可通过配置调整。理由:团队记忆和个人记忆每次会话都会加载;Circle 读取单个说明文件的上限是 24,000 字节;默认 48,000 字节时,最坏情况下一次会话多加载约 96 KB。若按 48,000 字节计算,最坏情况接近 0.5 MB。旧版本与停用的记忆不占当前额度;历史占用计入个人容量,同意原方案。
- 再次共享:与决定 135 第 6 项一致,采用取代:
- 本人再次共享同一篇个人记忆时,取代本人此前由这篇个人记忆共享出的团队记忆,旧版本显示“被取代”。
- 只有当那篇团队记忆在本人上次共享之后被管理员修改过时,才新写入一篇独立的团队记忆,不覆盖管理员的修改。
- 预检页明确显示是“取代 某篇”还是“新写入一篇”。
- 相同
client_key的重试仍是幂等的。
请按“状态与实施顺序”第 1 至 6 步实施,各步完成后提交,收尾时先报告。
恢复第五步与第三阶段衔接
按 Claude 的后续要求,已从 301337ea 将本任务六笔提交变基到 kw-share-local 的 412110e5,恢复指定的第五步暂存,其他暂存不动。合约顺延为模型 23,保留第三阶段上传声明、缺失同形及全部七项安全修正;四个技能只同步生成镜像和补丁清单(HTML/思维导图 1.0.10,XML/工作簿 1.0.11)。共享预检的提取同时保留团队解析器、撤回引用过滤和敏感目标目录省略;个人运行不提供派发入口。
第五步接入六工具内的记忆读写、独立授权、纯文本编辑、历史与大小/凭据预检;确认重新检查当前版本及管理员修改。记忆授权和共享记录沿用决定 135 的受众过滤。元数据页按 UTF-8 字节限制输出,正文按字符边界续读,敏感共享路径不进入预检/拒收回执。控制台空间栏只读,不因查看预检而建立知识根;没有操作部署或 Circle 仓库。
首轮定向组 52 项中 50 通过、2 个新控制台夹具误断言重定向为 302;改为既有 303 后该文件 3 项全部通过、0 跳过。该轮真实运行了环境变量、缺省知识端口、ownership(配置现有 PG 18 工具)、锁及密码迁移检查。类型与 155 文件合约核对通过;共享验收及完整工作流/引擎另记后续结果。
第五步共享衔接复查:首轮 42 项中 35 通过、7 失败,分别由旧分栏标识、空共享分组、统一授权入口、预检入口和目录显示断言引起,其中个人技能未获授权导致后续场景连带失败。恢复工作流分栏语义标识,按决定 135 更新旧断言:没有授权时隐藏空组;导入入口在个人范围;统一授权对话框;先打开真实预检;显示层级名称但内部路径参数不变。没有扩大 ACL 或放宽撤回、拒读、发布权断言。随后 34 项中 33 通过、1 个旧斜线断言失败,修正为层级名称并核对链接的原路径参数后,场景 47 的 13 项通过、0 跳过。
按后续要求运行全部 packs/workflow/** 和 hub/runs/engine/**:349 文件、2761 项,2760 通过、1 失败、0 跳过。唯一失败是新增记忆操作显示轴 enable/disable 与原有账户命令及合成夹具重名;改为专用显示代码,不改变操作或权限语义,完整组的其他功能测试均实际通过。随后重跑词表检查及第五步定向组,结果续记。
第五步提交前定向复查:node –test –test-concurrency=1 –test-reporter=tap,文件为 contracts/src/memory.test.ts、hub/knowledge/{memory,sharing}.test.ts、hub/runs/packs/personal.test.ts、hub/server/console-memory.test.ts、hub/server/console/space-layout.test.ts、hub/platform/{environment,ownership}.test.ts、hub/refs/diagnostics.test.ts、hub/records/{lock-namespaces,password}.test.ts、packs/workflow/case-review/packs.test.ts;74 项通过、0 失败、0 跳过,含 PG 18 实际备份恢复。类型检查暴露缓存拒收码从生成对象键取回时丢失类型,补上经生成键集合确认的类型后复查;合约生成核对 155 文件通过,文档 289 项通过、0 跳过。各组重叠不累加;完整组的单项词表失败不算整组通过,修正后的词表文件已在 74 项中实际重跑。
第六步收尾
- 新增场景 48 首次因合成夹具用了不存在的条目种类,5 项在 before 中失败,未执行验收主体;改用生成的
EntryKindSchema.enum.pitfall后 5 项通过。补充重复预检、团队来源、管理员元数据和工作流实际范围后,场景 48 与受众/元数据单测共 9 项通过、0 跳过。没有删减权限断言或替代真实沙箱。 - 全部受影响组首轮与提交前复查均为 114 项通过、0 失败、0 跳过。布局调整后中间复查 43 项通过。最后再把批量共享用例扩为两条:确认前撤回一条时,该条拒收,另一条仍独立重查并合并;场景 48 的 6 项再次通过、0 跳过。这些组重叠,不累计为总测试数。
- 最后补查深层目录授权:授权从下级目录开始时,空间树显示该目录及可读子目录,不要求上级目录也可读,不展示未授权的上级名称。空间栏、场景 48 及四个必跑文件共 26 项通过、0 跳过。
npm run typecheck、npm run verify:contracts(155 文件)、npm run test:docs(289 项,0 跳过)及git diff --check均通过。 - 提交前 114 项检查的命令如下(使用 Node 24;PG 18 客户端为 Claude 指定的现有本机工具,ownership 的 3 项实际运行,早期第 4 步的跳过已补查):
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
tests/acceptance/46-knowledge-spaces.test.ts \
tests/acceptance/47-knowledge-sharing.test.ts \
tests/acceptance/48-knowledge-console-memory.test.ts \
hub/server/console-memory.test.ts hub/server/console-knowledge.test.ts \
hub/server/console-places.test.ts hub/server/console/space-layout.test.ts \
hub/server/console/audience.test.ts hub/server/console/member-space-metadata.test.ts \
hub/knowledge/memory.test.ts hub/knowledge/sharing.test.ts \
hub/platform/environment.test.ts hub/platform/ownership.test.ts \
hub/refs/diagnostics.test.ts hub/records/lock-namespaces.test.ts \
hub/records/password.test.ts packs/workflow/case-review/packs.test.ts
- 隔离布局核对:从真实临时 Hub 和合成密码会话取得服务器 HTML,关闭 Hub/数据库后,仅在临时回环地址提供这些合成页面;使用独立临时 Chrome 配置,没有读取个人浏览器数据。知识库、个人目录、工作流、记忆列表、纯文本编辑与授权对话框各核对 1440×1000 和 390×844,共 12 张截图。全部没有页面横向溢出;窄屏空间栏为标签行,原生勾选后显示提交共享,授权对话框可滚动。关闭动画后重拍,截图只证明布局;写入、授权、撤回和预检规则由上述 HTTP/MCP 验收证明。截图和报告保留在工作树外,不提交浏览器数据或本机绝对路径。
- 本轮运行的第 5、6 步检查最终无遗留跳过;完整工作流/引擎首跑的单项词表失败及修正复查按上文原样保留,不称整组一次通过。没有运行完整 test:unit、完整 test:acceptance、Linux 隔离作业或来源归档检查;第 6 步未改运行/依据代码,因此没有再次执行 349 文件组。没有增加正文 SHA 校验、接触运行中的服务、推送或创建 PR。Circle 自动加载和同步不在本阶段,收尾先报告,不启动第四阶段。
页面核对意见(Claude 2026-11-02,对照所有者确认的草图)
依据 12 张截图(桌面与窄屏)核对。结构与草图一致:
- 空间栏、“知识 / 记忆”切换、可见范围列、不带斜线的路径;
- 勾选后“提交共享”、单独的原文区块;
- 工作流卡片的使用范围和发布状态。
以下各项请修正,并重拍截图核对。
错误(必须修)
- 工作流页“全部”视图中,他人授权给本账户的通用技能被列在“个人 · 通用技能”下(例如“合成通用写法”,所有者是合成协作成员)。他人的内容只能出现在“共享给我的”分组,不能标成“个人”。
- 团队工作流的使用范围显示为“本人及全体管理员(当前 1 人)”,这是个人授权的说法。团队工作流的使用范围按分配显示:全体成员、N 名成员或“尚未指定成员”。请修正受众的计算,并补测试。
- “我的提交共享”的条目列显示记录摘要(例如
22fc09a05df0)。应显示条目的陈述,已合并的链接到团队条目,已拒收的写明原因。
与草图不一致或不易读(应修)
- 目录树多了一层同名根节点:“个人”标题下又有“▾ 个人”,“团队”标题下又有“▾ 团队”,记忆页也是如此。分组标题下应直接列出顶层目录;“共享给我的”保留按授权人分组。
- 知识库空间栏在全部、个人、共享给我的、团队旁显示数量;工作流页已有,知识库页还没有。
- 状态用彩色标签显示,沿用工作流卡片“已发布”的样式:
- 已核验:绿;
- 未核验:灰;
- 已撤回:红;
- 被取代:橙;
- 记忆的已启用:绿,已停用:灰。
- 容量与大小用易读的单位:例如“4.6 KB / 1 GB”,不显示“上限 1073741824 字节”。记忆的字节数可以保留,但要加千位分隔符(48,000)。
- 时间统一显示为“2026-11-02 19:41”。不显示原始 ISO 时间(授权表中的“2026-11-02T10:41:34.891Z”、版本比较下拉框)或记录摘要。
- 个人目录页:
- 操作按钮(添加条目、导入个人知识、授权…、建立目录…)放在目录标题右侧,与草图一致;
- 删掉原文区块下面那条重复的全宽“授权…”;
- 知识版本历史默认折叠,版本名称写成“版本 3 · 2026-11-02 19:41 · 条目写入”,不显示摘要。
- 授权对话框:
- 只保留一套表单:选择对象并输入用户名后,预检结果就在同一个对话框里显示,“授权”按钮提交同样的取值。不要出现两套相同的“授权给 / 成员用户名”行;
- “收回授权”用次要或危险样式,不用主按钮样式。
- 知识库“全部”视图中,共享给我的条目在“位置”列写出完整路径,例如“共享给我的 › 合成协作成员 › 排障记录”。
- 窄屏:
- 宽表格放进可以横向滚动的容器,状态、时间、数量列不折行。现在“已核验”和时间被拆成好几行;
- 空间栏的标签不折行,例如“共享给我的”,必要时让标签行横向滚动。
修完后重拍桌面与窄屏截图,逐项核对;再跑受影响的控制台测试、验收场景 48、hub/platform/environment.test.ts 和 hub/refs/diagnostics.test.ts。在本页“做了的”“验证”里逐项写出修改情况,然后报告。独立安全审查也在进行,结果出来后补到本页。
页面核对的检查与截图记录
使用 Node 24、合成账户密码、临时 PostgreSQL/密钥库。首轮扩大检查的命令如下:205 项中 202 通过、3 失败、0 跳过,修正与复查已记入“验证”,不把该轮算作整组通过。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
'hub/server/console*.test.ts' 'hub/server/console/*.test.ts' \
tests/acceptance/46-knowledge-spaces.test.ts tests/acceptance/47-knowledge-sharing.test.ts \
tests/acceptance/48-knowledge-console-memory.test.ts \
hub/platform/environment.test.ts hub/refs/diagnostics.test.ts \
hub/platform/ownership.test.ts hub/records/lock-namespaces.test.ts \
packs/workflow/case-review/packs.test.ts
修正后实际重跑 hub/server/console.test.ts、hub/server/console/packs.test.ts、tests/acceptance/47-knowledge-sharing.test.ts:31 项通过、0 跳过。提交前再次运行下列组:52 项通过、0 失败、0 跳过。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
hub/server/console/packs.test.ts hub/server/console/space-layout.test.ts \
hub/server/console-memory.test.ts tests/acceptance/48-knowledge-console-memory.test.ts \
hub/platform/environment.test.ts hub/refs/diagnostics.test.ts \
hub/platform/ownership.test.ts hub/records/lock-namespaces.test.ts \
packs/workflow/case-review/packs.test.ts
版本名称的日期与时间保持同一行后,类型检查通过;hub/server/console-memory.test.ts 与场景 48 的 9 项再次通过、0 跳过。npm run verify:contracts 核对 155 文件、npm run test:docs 的 289 项均通过;git diff --check 通过。各组重叠不相加,最终没有遗留失败或跳过;未运行的整套检查见“验证”。
重新从临时 Hub 的真实页面取得合成 HTML,关闭 Hub/数据库后,用独立临时 Chrome 配置核对 1440×1000 和 390×844。知识库、目录、成员工作流、记忆列表、编辑、授权各两张,共 12 张;补管理员工作流两张,以及目录、记忆和授权表格横向滚动后的 3 张,共 17 张及一个布局报告,均在工作树外保存。本轮照片包含已撤回、被取代及启停记忆,已逐项观察颜色、无重复根、正确分组、陈述、单位、分钟时间、标题操作和单一授权表单。报告另实际检查整页没有横向溢出、窄屏标签不折行、时间/状态/数量不折行;表格容器宽约 310~322 像素,内部表格宽 640 像素,确实可以滚动到右侧。
Claude 随后的 CI 补充明确第 2 项以本页第 8 项的受众表格为准:管理员显示分配姓名或尚未指定成员,普通成员只显示团队。已据此调整生成显示与回归,原 hub/server/console.test.ts 完全不改;检查结果随下节迁移 CI 修正一并记录。原“全体成员/N 名成员”的核对说法保留为历史意见,不作为最终团队工作流措辞。
截图只作为布局证据,权限与写入由 HTTP/MCP 测试证明;未使用个人浏览器配置,未接触运行中的 Hub,没有新增 SHA 验真或全量回归。本轮先报告,协调者负责推送;独立安全审查结果另由协调者补充。
后续 CI 补充与迁移快照
来源:Claude 2026-11-02 转达 #132 的三项 CI 失败,并明确管理员/成员的团队工作流措辞。原 hub/server/console.test.ts 不改,显示逻辑按上述最终规则实现。迁移追加的外键指向不可变记录,计量保持非负约束,运行角色不能更新文档或空间身份列;没有删除、改写或替换旧 SQL。migrations.ts 的已复核摘要为 eafff51af8541371ac17a55a62a90cd232f8f501a4ab396d3b1474da41d9ae62,只同步整文件固定值,不改 APPLIED。这是本次明确要求的迁移源审查,不是对正文数据新增 SHA 验真。
按最新措辞和快照修正再运行以下组,71 项通过、0 失败、0 跳过;包含原控制台文件的全部测试(上述两项原断言不变)、迁移快照 2 项、场景 48 和 PG 18 ownership。类型检查及 155 文件生成核对通过;各组重叠不相加。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
hub/server/console.test.ts hub/server/console/packs.test.ts \
hub/server/console/space-layout.test.ts hub/server/console-memory.test.ts \
tests/acceptance/48-knowledge-console-memory.test.ts \
hub/records/migrations.snapshot.test.ts hub/platform/environment.test.ts \
hub/refs/diagnostics.test.ts hub/platform/ownership.test.ts \
hub/records/lock-namespaces.test.ts packs/workflow/case-review/packs.test.ts
安全审查意见(Claude 2026-11-02,独立复核 01972389)
审查在 01972389 的快照上进行。851756d2 没有改动 hub/knowledge/memory.ts 和 hub/runs/packs/personal.ts,所以除第 L2 项外,各项在当前 HEAD 上依然存在。探针在 Claude 的草稿区(probes-p4/),可以照着写回归测试。
没有高危。 审查确认:
- 未经授权读不到他人的个人记忆,管理员也读不到;
- 缺失与无权限的回应完全相同;
- 会话模式只返回团队记忆和本人当前启用的记忆;
- 记忆不能作为依据或运行输入,管理员也不能;
- 写入权限、版本冲突、幂等键和再次共享的取代规则都正确;
- 控制台表单的同源、CSRF 与首次改密检查正确,内容做了转义,预检不写入;
- 个人工作流仍然不能使用租约、派发、业务系统或命名文档。
请修复以下各项,每项附回归测试:
中
- M1 授权对象被停用后无法收回授权(
hub/knowledge/memory.ts:139):grant()对已停用的成员返回SOURCE_UNAVAILABLE,收回授权也走这条检查。成员被重新启用后,又能读到这份个人记忆。- 要求:收回授权只需确认账户存在,与知识授权一致(
spaces.ts:241);已停用成员的授权仍列在本人的授权表中,可以收回。
- M2 团队记忆的上限只计正文(
memory.ts:112, 168):- 正文可以为空,标题(300 字)和路径(2,000 字)不计入额度,篇数也没有上限。成员可以共享上百篇正文为空的记忆,全部进入每个成员的会话。
- 要求:
- 当前有效额度按标题、路径和正文的字节合计;
- 每个空间设当前有效篇数上限,默认 20 篇,可以配置(配置名同步登记到平台的转发清单);
- 会话模式的列表与正文总量都受同一额度约束。
- M3 停用且正文不变的写入跳过容量检查(
memory.ts:112, 118):- 要求:凡是追加版本的写入,都检查历史容量。
- 内容和状态都没有变化的写入,不追加版本,返回
unchanged: true。 - 只改标题、路径或状态的写入,照常计入容量。
低
- L1 个人工作流授权的预检暴露第三方的授权关系(
hub/runs/packs/personal.ts:120-129):- 要求:个人工作流只能依赖本人的个人技能、团队技能,以及在发布时本人已获授权的技能。授权预检只核对本人能决定的依赖。
- 依赖他人个人技能的个人工作流,授权给第三人时一律拒收,用固定说法,不随他人的授权变化而变化。
- L2 成员看到团队工作流的分配人数(
hub/server/console/packs.ts:43-51):851756d2 已改为成员只看到“团队”。请确认后补一条测试:成员视角不显示任何人数或姓名。 - L3 管理员停用成员共享的团队记忆后,停用不生效(
memory.ts:164):- 要求:被管理员停用的团队记忆,由同一篇个人记忆再次共享时拒收,拒收码先登记,提示“团队记忆已被管理员停用,请联系管理员”。不另建新的团队记忆。
- 其他个人记忆仍可正常共享。
- L4 记忆的拒收审计可被管理员作为依据读取(
memory.ts:105-106):- 要求:把
memory-refusal@1加入通用读取的拒绝清单,不能经rec:读取,也不能作为依据。 - 审计只在“记录”页向本人显示安全摘要(码、字段、行),管理员只见计数。
- 要求:把
- L5 凭据扫描可用编码绕过(知识与记忆共用):全角字符、零宽字符或软连字符插进键名、HTML 实体、base64、跨路径段拆开的键值,都能绕过扫描。
- 要求:仅在扫描时做 NFKC 归一化、去掉不可见字符、解码 HTML 实体,并把路径各段连起来扫描;对长 base64 片段解码后再扫一次。存储内容保持原样。
- 补齐上述各类的测试;原有命中(
KEY=value、AWS 密钥、Bearer、PEM、“密码=”和“密码:”)不能退化。
设计说明,一并处理
- 本人停用的个人记忆,被授权者在浏览模式下也不再看到,与团队记忆一致。
- 管理员是成员之间授权的一方时,“记录”页显示该授权,与“授权双方可见”一致。
- 用同一个
client_key重试已被拒收的写入时,返回首次拒收的字段与行,不只给通用说明。
修完后跑受影响测试(包括 hub/knowledge/memory.test.ts、hub/knowledge/spaces.test.ts、凭据扫描相关测试、验收场景 48、hub/platform/environment.test.ts、hub/refs/diagnostics.test.ts,以及带 PostgreSQL 18 的 ownership 测试),把结果记在本页并报告。
安全审查修正记录
- M1 与个人停用可见性:收回只要求目标账户存在;本人授权表继续列出已停用成员,收回后重新启用也不恢复读权。本人停用的个人文档对所有被授权者隐藏,包括管理员受权者;本人仍能管理,团队管理员仍能管理团队停用文档。新增合成用例在修正前因收回返回 SOURCE_UNAVAILABLE 失败(1 项失败、0 跳过);修正后记忆服务与环境变量、缺省知识端口、PG 18 ownership、锁命名空间共 25 项通过、0 跳过,类型检查通过。没有放宽新授权的停用账户检查。
- M3 与拒收重试:所有追加版本均检查个人历史容量,标题、路径、启停变化同样计入;相同内容/状态返回 unchanged=true,不追加版本和历史量。保存不带正文的幂等回执,重试同一个键仍核对载荷;拒收保存首次安全说明和位置,重试返回相同字段与行。两个新增/补充断言在修正前分别复现无变化写入追加版本、拒收重试丢失行号;修正后记忆与四个必跑文件共 26 项通过、0 跳过,类型通过。回执和拒收的通用读取边界在 L4 一并加固。
- M2:启用量改计标题、目录、正文的 UTF-8 字节,单篇正文仍单独限额;新增每空间默认 20 篇的启用上限与
CIRCLE_HUB_MAX_MEMORY_SPACE_DOCUMENTS,同步配置和平台转发清单。共享预检、正式写入、会话列表及正文读取使用相同限制。迁移 13 仅回填派生计量,历史量及旧记录保持;复核后同步迁移源固定摘要,不改旧 SQL 快照。模型升至 24,预先登记 L3 的拒收码与检查名称;按既有授权同步四个技能的协议镜像和清单,html-format/mindmap-format 为 1.0.11,xml-format/workbook-format 为 1.0.12,业务代码不变。控制台显示新计量和篇数。- 修正前,空正文元数据额度、共享第 21 篇两项均复现失败;新增并发服务、停用释放名额、满额替换及旧库升级回归。首轮实现检查 48 项中 46 通过、2 失败、0 跳过,原因是旧历史容量用例先撞到新空间上限、新升级夹具缺少时钟;分别隔离额度条件、补齐测试时钟后复查。
- 类型、155 文件合约核对通过。记忆、配置、记录权限/密码/迁移快照/升级、控制台记忆、验收 48、四个必跑文件和包词表检查共 79 项通过、0 失败、0 跳过;另合约记忆/版本/词表 120 项通过、0 跳过。PG 18 ownership 实际运行。未扩展为全量回归,未新增正文 SHA 校验。
- L1:个人发布在检查前及正式写入前解析全部技能依赖,只接受本人技能、已安装团队技能与发布时已获授权的个人技能;缺失与无权同形。授权预检遇到他人个人技能固定拒收,不查询该技能对目标成员或管理员的授权,包括间接依赖;只核对本人能决定的依赖授权。两个回归先复现无权发布及第三方授权变化影响预检。实现后首轮 27 项中 26 通过、1 个新夹具因未指定安装版本失败;补齐合成技能的精确安装版本后继续复查,结果续记。没有改动运行输入、沙箱或依据权限;完整工作流/引擎组在 L4 收口时合并执行。
- 扩展检查曾有 40 项中 39 通过、1 个新用例仍试图向他人授权带第三方依赖的技能;按本项同样拒收该技能,保留拒收断言后,个人包、验收 47 与四个必跑文件共 40 项通过、0 跳过,类型通过。既有验收预期未改。
- L2:确认 851756d2 的成员范围仍为“团队”;新增卡片与详情回归,覆盖零名、一名、多名分配对象,断言不查询分配、不解析分配姓名、不显示人数或成员身份。没有再改显示代码。控制台包页、原控制台测试和四个必跑文件共 36 项通过、0 跳过,类型通过。
- L3:使用 M2 已登记的
MEMORY_TEAM_DISABLED与团队记忆状态检查。预检先查同一篇个人文档的已共享团队文档,任一仍被管理员停用即固定拒收,后续大小、凭据检查标为未检查;正式提交持锁重查,不写新文档、不复活旧文档。管理员主动启用后恢复原有“保留管理员修改”的规则;其他个人文档可独立共享。新增用例先复现停用后仍可共享,再覆盖预检后停用、个人修订、旧共享沿革、重新启用与独立文档。记忆、控制台记忆、验收 48 和四个必跑文件共 39 项通过、0 跳过,类型通过。 - L5:扫描器升至 credential-scan@3;只在扫描视图里做 NFKC、去不可见字符、HTML 实体解码、路径段连读及相邻键值检查、长 base64/base64url 文本解码,沿用有界递归和原有检测器。原字节、保存文本、原文摘要与片段身份不改;来源观察记录包含扫描器版本,新建记录及绑定它的组成/视图引用会变化,详见末尾 CI 字节复核。新增扫描与知识/记忆服务回归先复现两项失败,修正后保留全角、零宽、软连字符、实体、编码、目录拆分及组合形式;普通目录、模板、无凭据编码文本和干净 Unicode 原文仍按原样处理。
- 原有 KEY=value、AWS、Bearer、PEM、中文密码、正反例、位置、32 MiB 时间/内存断言均保留。扩大检查 116 项中 115 通过、1 失败、0 跳过:旧用例将“下一版扫描器”固定为 3,现与当前版本相同;改为由实际扫描器版本递增后,扫描、接受规则及派生覆盖 47 项复查全部通过、0 跳过,类型通过。其余已实际通过的检查包含记忆、空间、共享、凭据政策、凭据分页、原件、验收 48、环境、缺省知识端口、PG 18 ownership 和锁;各组重叠不相加。首次命令中的派生测试文件名写错未执行,已用实际
hub/records/derived.test.ts纳入 47 项补查,不把未运行当通过。完整工作流/引擎组在下一项一起执行。
- 原有 KEY=value、AWS、Bearer、PEM、中文密码、正反例、位置、32 MiB 时间/内存断言均保留。扩大检查 116 项中 115 通过、1 失败、0 跳过:旧用例将“下一版扫描器”固定为 3,现与当前版本相同;改为由实际扫描器版本递增后,扫描、接受规则及派生覆盖 47 项复查全部通过、0 跳过,类型通过。其余已实际通过的检查包含记忆、空间、共享、凭据政策、凭据分页、原件、验收 48、环境、缺省知识端口、PG 18 ownership 和锁;各组重叠不相加。首次命令中的派生测试文件名写错未执行,已用实际
- L4 与管理员作为授权一方:统一记忆记录边界,
memory-refusal@1及 M3 的memory-unchanged@1在服务器和引擎的通用读取中均返回缺失,包括管理员,不能借作输入或依据。记录页向普通账户本人仅显示已登记码、生成的字段标签与行;不显示自由说明、载荷或内部摘要。管理员仅以现有索引计数,按创建时间/账户筛选,超过有界统计量则明确显示,既有审计无需改写或全库扫描。知识、工作流和记忆三类授权均补回管理员本人发出/收到的记录;不显示无关成员授权,并继续核对记录正文而非信任索引。- 三个新增回归先实际失败:管理员通用读取可见、管理员本人授权遗漏、本人无安全拒收摘要。实现后首轮 35 项中 33 通过、2 失败,原因是统计调用量写成超出现有端口允许值;改回端口的 100,000 上限,并修正新测试对不存在输出字段的类型断言。随后原控制台、记忆 HTTP/MCP、审计视图、验收 48 和四个必跑文件共 46 项通过、0 跳过,类型通过。合约核对 155 文件和文档 289 项通过、0 跳过;全工作流/引擎组的完整结果见收口记录。
- 再补依据特例回归,先复现“待写动作”例外可把私有动作当作可读依据;在这些例外和已冻结输入之前统一拒绝记忆记录。补齐合成输入的生成角色后,依据文件 6 项通过、0 跳过。验收 48 增加普通成员与已分配管理员均不能绑定拒收审计/无变化回执的检查。第一次完整工作流/引擎执行在此修正前主动中断,没有当作通过;按修正后的读取/依据代码重新执行。
最后补查的边界
- M2 的合成旧库再加入标题/正文中的合法 NUL 和字面的反斜线 u0000,先复现 JSONB 解码报错。只修订本轮尚未交付的新增迁移 13:在计量视图里以同为一个 UTF-8 字节的控制字符替换 NUL 转义,计量仍准确,原记录及其正文不改。迁移 1~12 不变。迁移源复核固定摘要为
ee4b209cb49b7d9f52f17fc42893b3b15c901a6939c3dfae961ff1b659a1410f;升级、快照、运行角色、密码、PG 18 ownership 和四个必跑文件共 24 项通过、0 跳过。该修正归入 M2 提交。 - L5 补齐合法省略分号的 HTML 实体及标准换行 base64,包括凭据跨编码行边界;新增编码定向检查通过,干净模板与普通路径断言保留。扩展用例曾误把原来不支持的带前缀空格写法当作基线,改用原有检测器支持的 password 空格写法核对实体,未修改检测器原正反例。该修正归入 L5 提交,最终扫描组结果在下方记录。
安全复核收口
- 本机为 Node 24.22.1、macOS,实际确认操作系统沙箱可用。以下数据库检查用临时 PostgreSQL/密钥库,ownership 使用已获准的 PG 18 客户端,3 项实际运行。没有读取运行环境配置或个人凭据,没有部署、推送或创建 PR。
- 按既有要求执行全部工作流/引擎文件:349 文件、2762 项,2759 通过、3 失败、0 跳过;此前有一次为补上依据例外拒绝而主动中断,未计通过。三项失败分别是独立采集技能的两项扫描镜像漂移,以及一次并发恢复锁后只上传一份。没有删改原期待:统一扫描镜像和版本,补确定性竞态用例复现复制后删除误删新所有者,再改为原子移动隔离。
- L5 因共用扫描而同步独立采集技能,knowledge-contribution 升至 1.3.15。生成工具将 Hub 扫描器及 HTML 字符引用解码/数据一起镜像;字符数据由既有 parse5 依赖生成并保留许可证,逐条和原解析器比对,不新增运行时依赖。旧事件保留原扫描器标识,待传字节按当前规则复查。镜像同步中间组曾为 135 项中 132 通过、3 失败:示例注释被扫描、竞态夹具未释放空锁目录,以及修改过程中清单未重签;分别去掉注释中的凭据形状、完整释放夹具、重生清单。类型检查也发现恢复工具仍需 copyFile,保留其导入。最终下列组 135 项通过、0 跳过,包含原三个失败用例及新增确定性锁/旧事件回归。分发测试增加源镜像比对后另重跑 3 项通过、0 跳过;后续只改相关独立技能和行为等价的实体解码,没有重跑整套 349 文件。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
'packs/workflow/knowledge-contribution/**/*.test.ts' \
hub/records/html-entity.test.ts hub/records/scan.test.ts \
hub/platform/environment.test.ts hub/platform/ownership.test.ts \
hub/refs/diagnostics.test.ts hub/records/lock-namespaces.test.ts
- 最终受影响服务/控制台与验收组 219 项通过、0 失败、0 跳过,覆盖管理员输入绑定拒绝、成员范围、个人依赖、当前记忆额度和历史回放。命令如下;与其他组重叠,不累计为总数。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
contracts/src/memory.test.ts contracts/src/model-w04-w10-v07.test.ts contracts/src/vocab-axes.test.ts \
hub/config/config.test.ts \
hub/knowledge/memory.test.ts hub/knowledge/spaces.test.ts hub/knowledge/sharing.test.ts hub/knowledge/credential-policy.test.ts \
hub/records/artifacts.test.ts hub/records/findings.test.ts hub/records/credential-pages.test.ts hub/records/derived.test.ts \
hub/records/memory-index.test.ts hub/records/migrations.snapshot.test.ts hub/records/password.test.ts hub/records/roles.test.ts \
hub/runs/packs/personal.test.ts hub/runs/engine/grounds.test.ts \
hub/server/console-memory.test.ts hub/server/console/space-records.test.ts hub/server/console/packs.test.ts hub/server/console.test.ts \
hub/platform/environment.test.ts hub/platform/ownership.test.ts hub/refs/diagnostics.test.ts hub/records/lock-namespaces.test.ts \
tests/acceptance/46-knowledge-spaces.test.ts tests/acceptance/47-knowledge-sharing.test.ts tests/acceptance/48-knowledge-console-memory.test.ts
node --test packs/workflow/case-review/packs.test.ts:22 项通过、0 跳过。npm run typecheck、npm run verify:contracts(155 文件)、npm run test:docs(289 项,0 跳过)、node tools/gen-credential-scanner.ts --check与git diff --check均通过。整理同项补查到对应提交后,确认源文件与整理前完全一致。- 原并发恢复锁用例在修正后又顺序重跑 10 轮,每轮 1 项通过、0 失败、0 跳过;原两次上传、互斥和事件链断言保留,没有用重试掩盖一次失败。
- 本轮最终实际运行的各组没有遗留跳过;中断、先前失败和未运行均未算通过。没有运行完整 test:unit、完整 test:acceptance、Linux CI 或来源归档检查;来源清单/归档工具未改。没有新增业务正文 SHA 校验,只有明确要求的迁移源快照复核和既有包清单生成。界面布局已由上一轮核对,本轮没有另做布局截图,也没有启动客户端自动加载/同步阶段。
冷读视图字节复核(#132,Claude 2026-11-02)
来源:Claude 转达 62da7729 的 hub/knowledge/view-perf.test.ts 失败,要求先定位差异,只有必需变化才说明并更新固定摘要。随后补充个人技能依赖及脚本门禁两项失败,见后续记录。只在本任务分支本机提交,由协调者推送。
做了的
- 在
62da7729本机先复现相同摘要失败。另开临时分离检出,分别运行bb294c68(L5 前)和bcb4c741(L5)的同一node tools/view-perf.ts合成夹具,保存两份完整输出逐字段比较;没有切换主检出或其他工作树的分支。前者为cd3f039db1e69eb9f6675754c8d17197ce2b4c3a974faf9c51e0e3b5febb9d35,后者为955e3658a3f9cbf443c4cede60c6b02572305ac68dc30b0df643f98edb9e04e9,与 CI 一致。bcb4c741没有改视图、范围清单、树生产或存储实现;撤回引用过滤不是这次变化的来源。 - 完整 JSON 只有下列四个叶子字段不同,其他字段逐值一致:
| 字段 | 原因 |
|---|---|
scope.roots[0].composition |
source_artifact.scan.scanner 从 credential-scan@2 变为 credential-scan@3,使新采集记录、来源分块及包含它们的组成记录身份变化 |
scope.listed_documents.parts[0].sha256 |
清单的 at 引用上述组成;组成变化后清单字节摘要必须变化 |
scope.listed_documents.parts[0].reference |
同一清单的 src: 字节引用,必须与其摘要一致 |
next |
游标绑定完整查询和确切组成,身份变化后不能继续冒用旧游标;偏移仍为 30,199,树根修订不变 |
- 树根两版均为
415b71f210785c704e392400946e1506eb270cb89bdee6798b2589beeba47c49;原文、片段、条目、索引顺序、大小和计数保持。新扫描器是已要求的 L5 修正,不能伪报旧版本;也不能删除真实组成引用、改写旧记录或放宽分页绑定来维持旧摘要。因此按本次明确许可,更新已复核的视图固定摘要为上表新值,测试名称改为保留“已复核字节”。原有 15,665,029 字节、49,000 条、1,800 键、列出 30,199 条、查询/RSS/时长上限均不动。 - 新增
view-provenance.test.ts:用合成的追加记录表示仅扫描器标识不同的旧观察;两种组成共享树根,索引内容与来源清单成员相同,清单只改组成来历,原组成各自可续读,跨组成续读拒收。不是只替换一个摘要期待,也没有新增业务正文 SHA 验真。 - 更新摘要后的第一次冷读还复现 RSS 573,696 KiB,超过原 568,616 KiB。定位到扫描用 Unicode 替换在所有匹配均无需改变时仍分配整篇字符串;改为仅首次真正变化时建立替换缓冲区,检测规则、位置映射、扫描器版本和输出保持。独立采集技能按同一生成入口同步镜像,升至 1.3.16;没有改树/视图输出实现。
- 此前 L5 说明里的“出处身份不改”现明确为原文摘要与片段身份不改;新建观察记录包含扫描器版本,不能声称其记录及组成身份不变。相关两个包 README 同步说明。
验证
- 修正前原性能文件 1 项失败、0 跳过;两版诊断运行分别约 0.961/6.987 秒、RSS 463,488/539,392 KiB,查询均 95 次。诊断运行不等同于整个测试通过。
- 新回归初跑 1 项通过、0 跳过;首次类型检查报告新夹具数组缺少显式类型,补齐后类型检查通过。摘要更新后的 RSS 失败如上,未计通过;避免无变化替换后原性能文件 1 项通过、0 跳过,冷读约 6.689 秒、RSS 515,616 KiB、95 次查询,摘要与全部原计数符合。
- 受影响视图、扫描、独立采集与四个必跑文件共 197 项通过、0 失败、0 跳过,包含 PG 18 ownership;类型及独立采集生成清单核对通过。
npm run test:docs289 项通过、0 跳过。命令如下。不改运行/依据代码,不运行全量回归;后续两项 CI 的结果另记。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
hub/knowledge/view-provenance.test.ts hub/knowledge/view-continuations.test.ts \
hub/knowledge/view-scope.test.ts hub/knowledge/view-merge.test.ts \
hub/records/scan.test.ts hub/records/html-entity.test.ts hub/records/artifacts.test.ts \
hub/records/derived.test.ts hub/records/findings.test.ts hub/records/credential-pages.test.ts \
'packs/workflow/knowledge-contribution/**/*.test.ts' \
hub/platform/environment.test.ts hub/platform/ownership.test.ts \
hub/refs/diagnostics.test.ts hub/records/lock-namespaces.test.ts
个人技能依赖 CI 补查(#132,Claude 2026-11-02)
做了的
- 原
hub/refs/skills-personal.test.ts第 40 行用例先给 Bob 授权 Carol 的父技能,再授权其个人依赖。L1 的授权前检查已经要求同一受众能读取本人每个个人依赖,因而第一笔授权应拒收。失败来自旧夹具试图建立现在禁止的不完整授权,不是冻结解析器丢失命名空间;不撤回已修复的依赖检查。 - 将旧第一笔授权改为明确的拒收断言,保留 Bob 无法冻结的原断言;先给依赖授权时仍不能冻结父技能,补上父技能授权后才冻结两项。再收回依赖而保留父技能授权,冻结仍立即失败,恢复后才能冻结。本人锁定的两个空间断言及团队发布拒绝显式个人依赖的原断言不变。
- 这是对确实必须拒收的旧期待的修正;只改测试,不改生产权限、解析、输入或依据代码,也没有把失败测试删掉或标为跳过。
验证
- 原个人技能和脚本门禁两文件先运行 21 项,19 通过、2 失败、0 跳过,与 Claude 报告一致。修正后定向组 42 项中 41 通过、1 个新断言失败、0 跳过:父技能本身未授权时应报“个人通用技能不可读取”,而旧用例的“缺少可读取”用于父技能已授权、依赖不可读。把前两种状态的断言分别对应实际缺失层级后,重跑原文件 2 项通过、0 失败、0 跳过;保留依赖被收回后的原缺失断言。组中其他 40 项已通过,包含场景 47、L1 发布/预检和四个必跑文件(PG 18 ownership 实际执行)。类型检查通过,没有修改生产错误行为来迎合测试。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
hub/refs/skills-personal.test.ts hub/runs/packs/personal.test.ts \
tests/acceptance/47-knowledge-sharing.test.ts \
hub/platform/environment.test.ts hub/platform/ownership.test.ts \
hub/refs/diagnostics.test.ts hub/records/lock-namespaces.test.ts
node --test --test-reporter=tap hub/refs/skills-personal.test.ts
独立采集脚本门禁 CI 补查(#132,Claude 2026-11-02)
做了的
- 不能撤回
clearStaleLock的原子移动:此前已经确定性复现复制后删除会删掉刚建立的新锁所有者,进而破坏互斥和上传事件链。本次不另改锁实现,只补遗漏的逐调用点审查;不是把rename或整个包加入免检名单。 - 按 Claude 本次明确授权,由 Codex 于 2026-11-02 复核
tools/operation-capture/lib/state.ts的rename(join(path, owner.name), quarantine)。源来自staleLock对私有.lock目录的观察:目录不能为链接,子项仅固定所有者文件或十六进制隔离名,文件需为普通单链接文件,原始内容需符合陈旧所有者。目标为同一锁目录内的随机.stale-<UUID>名,不接收外部路径或移动锁目录。移动后核对原始内容,变化或缺失即停止本轮清理并重试;符合快照的隔离项才删除,新的活跃所有者不会被按旧路径删除。 - 审查记录固定文件、精确调用及整个
clearStaleLock函数字节摘要6ca827ad47560d51bd91ce0a26cf31973accf5220c881b349012caf1b1ad43e3,复核人如实记为 Codex,没有冒用原 Jev 条目的“集成者”。原 Jev 审查内容不变。新增真实函数回归,修改隔离路径、替换所有者集合或复制额外调用均重新触发门禁;完整发布清单仍要求两条登记各恰好命中一次。 knowledge-contribution升至 1.3.17,重生成两份客户端版本快照及发布清单;当前安装说明同步版本。扫描镜像为前项的 1.3.16 缓冲区优化,扫描器仍为credential-scan@3。未新增依赖、链接能力或目录移动入口。
验证
- 三个原 CI 失败文件、独立采集/分发、包静态约束及四个必跑文件合并复查 88 项通过、0 失败、0 跳过。PG 18 ownership 实际运行;原子锁竞争、上传事件链、旧事件扫描和安装清单断言保留。门禁实际扫描 case-compile 的 45 份及 knowledge-contribution 的 30 份脚本/辅助文件/钩子,恰好命中两个已登记调用。
- 本组冷读用例再通过:约 6.664 秒、RSS 507,056 KiB、95 次查询,视图摘要
955e3658…、15,665,029 字节及全部原计数符合;未放宽 RSS 568,616 KiB、查询 140 次或时长 30 秒上限。前项独立冷读及 197 项组同样通过,各组重叠不相加。类型、独立采集生成清单核对、git diff --check通过;最后npm run test:docs289 项通过、0 跳过。
CIRCLE_HUB_LIBPQ_BIN="$HOME/.local/pgsql-18.6/bin" node --test --test-concurrency=1 --test-reporter=tap \
hub/knowledge/view-perf.test.ts hub/refs/skills-personal.test.ts \
scripts/real/skill-script-safety.test.ts \
packs/workflow/knowledge-contribution/testing/operation-capture.test.ts \
packs/workflow/knowledge-contribution/testing/operation-distribution.test.ts \
packs/workflow/case-review/packs.test.ts \
hub/platform/environment.test.ts hub/platform/ownership.test.ts \
hub/refs/diagnostics.test.ts hub/records/lock-namespaces.test.ts
npm run typecheck
node packs/workflow/knowledge-contribution/pack-files.ts --check
- 所有操作使用合成数据和临时资源,不接触持久部署、真实来源或个人环境配置。没有运行完整 unit/acceptance、完整工作流/引擎组、Linux CI、来源归档检查或新布局截图;本轮没有改生产运行/依据、迁移、合约、来源工具或界面布局。没有把未运行算作通过,没有新增业务正文 SHA 验真。新增的片段摘要是 Claude 明确要求的逐调用点审查,清单重签沿用原发布机制。三个 CI 项分别本机签署提交,不推送、不建 PR。