feat(cheap): W-CFG-KB 知识件外置切片一——知识包存储(复用 ASSET-SRC 范式)+ 物化 + read_file shadow(路乙 MinIO·默认关)
知识件(喂 agent 学怎么生成的设计范式:skills/黄金脚手架/few-shot/tier2 RAG)原散在 worker repo 检出、
read_file 按硬编码路径自取,改一条范式得重部署。本切片(K1 路乙 MinIO,创始人拍)外置成可热换知识包:
- kb_store.py:KnowledgePackageStore(LocalFs/Backend)存 MinIO + manifest 落 MySQL(专用表
cheap_knowledge_package_version + 专用桶 cheap-kb,与 ASSET-SRC 正交不合表);复用 store.py 纯工具
(_canonical_content_hash/derive_version_id/_is_safe_rel_path,store.py 零改动)+ manifest-first 半落库
(pending→put→committed、fetch 只返 committed、缺源标 missingContent 不静默)。
- materialize_active:按激活版取回→staging 逐文件 sha256 校验(K2 寻址断言)→原子换入知识根(旧挪 .prev);
缺文件/取不到/指纹不匹配【显式失败】(类比 ASSET-SRC 缺源),kb_root 不动=回落上一份完整包。落点
TIER2_KB_ROOT 在 git 检出之外(deploy-safe,防 reset --hard 抹)。
- cheap_run.py read_file shadow:先查知识根同相对路径(热换即生效)、回落仓根(api.d.ts 等代码不外置);
TIER2_KB_ROOT 未配时短路、read_file 字节不变(默认关);两根守只读+200KB+路径不逃逸、越界即拒。
cheap_roles.py 硬编码路径不改(shadow 在解析层处理)。
K3(yudao 治理+激活推送+admin)= 后续切片,留接缝点(resolve_active_version/materialize_active/default_kb_store)。
主控终审:store.py 零改动 + read_file 默认关字节不变 + 缺文件显式失败/原子回落读码坐实 + 独立表桶 +
亲跑 test_kb_externalize 14 + read_file 回归 18 全绿。真 MinIO 物化闭环排窗口(cheap venv 无 pymysql/minio)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>