games-development-ai/tier2/config/schema/cheap_knowledge_package_version.sql
lili 21b5320f3f
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
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>
2026-07-05 21:37:50 -07:00

44 lines
4.2 KiB
SQL

-- tier2/config/schema/cheap_knowledge_package_version.sql
-- ════════════════════════════════════════════════════════════════════════════
-- 便宜档知识件外置(W-CFG-KB 切片一)· 知识包版本表。
--
-- 【这张表解决什么】
-- 便宜档生成 agent 靠 read_file 按硬编码相对路径自取知识件(设计 skill / 黄金脚手架 / few-shot 起点范例)。
-- 本表把知识件外置成【知识包】的 manifest 落库面:一批知识件打成一个版本化知识包,manifest(文件清单
-- path + 各文件 sha256 + bytes,不含 content)落这张表一行,按 (package_id, content_hash) 幂等、按
-- (package_id, version_id) 取回寻址。知识件全文(content)不进本表,落 MinIO(桶 = infra.yaml
-- minio.kb_bucket,默认 cheap-kb),manifest.addressing.sourceUrl 指向 MinIO 版本前缀。改一版知识件 →
-- 新 version_id,旧版本保留(版本寻址)。
--
-- 【与 ASSET-SRC 源工程表的关系:复用范式、不合表】
-- 存储范式(manifest-first 半落库 / 版本寻址 / 内容指纹幂等 / 缺源显式失败)复用 tier2 源工程落库
-- (tier2_source_project_version)那套已被真库坐实的模式,但【另立表 + 另立桶】:源工程是「生成产物」、
-- 知识件是「生成输入」,两件正交、生命周期不同,故不共用同一张表 / 同一个桶。
--
-- 【与代码的关系 · 同源对账门】
-- worker/kb_store.py 的 BackendKnowledgePackageStore._ensure_schema 首次 save 时执行等价的
-- CREATE TABLE IF NOT EXISTS(代码内自建,见 _DDL_KB_PACKAGE_VERSION),故部署不强制先手动跑本文件。
-- 本文件是同源的【可审阅 DDL 留档】:DBA / 后端接线 / 评审按它对账表结构。in-code DDL 与本文件双源,由
-- cheap-worker/tests/test_kb_externalize.py 规范化对账钉成机器门:改一处漏改另一处即红,不靠人肉纪律。
-- 表所在库 = infra.yaml mysql.database(默认 tier2;与 game-cloud 业务库隔离)。
-- 本表出生即带 status 列(不像 ASSET-SRC 表有历史无 status 列旧表需 ALTER 补列),故无 ALTER 迁移。
--
-- 【MinIO key 约定(与本表配套,不在本 DDL 内)】
-- object key = <package_id>/<version_id>/<工程内相对路径>,bucket = infra.yaml minio.kb_bucket(默认 cheap-kb)。
-- ════════════════════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS cheap_knowledge_package_version (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增主键',
package_id VARCHAR(128) NOT NULL COMMENT '知识包稳定标识(一套便宜档知识语料一个 id;其下挂多版本)',
version_id VARCHAR(96) NOT NULL COMMENT '版本号 vXXXX-hash12(改一版知识件生成新版本)',
content_hash CHAR(64) NOT NULL COMMENT '整包内容指纹 sha256(= 各知识件 path+content 规范化拼接;幂等键)',
manifest_json LONGTEXT NOT NULL COMMENT '知识包 manifest(文件清单 path+各文件 sha256+bytes;不含 content,content 落 MinIO)',
addressing VARCHAR(512) NULL COMMENT '落库寻址摘要(store/sourceUrl;冗余出 manifest 便于检索)',
created_at DATETIME NOT NULL COMMENT '落库时刻(now_ts 转 UTC datetime)',
status VARCHAR(16) NOT NULL DEFAULT 'committed' COMMENT 'manifest-first 落库状态:pending=已占位未提交(半落库可见残行)/committed=文件已全落可物化;fetch 只返 committed',
PRIMARY KEY (id),
UNIQUE KEY uk_pkg_content (package_id, content_hash) COMMENT '幂等键:同包同内容不重复落',
UNIQUE KEY uk_pkg_version (package_id, version_id) COMMENT '版本寻址键:同包版本号唯一',
KEY idx_pkg_created (package_id, created_at) COMMENT 'fetch 取最新 committed 版本走它'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='便宜档知识件外置知识包版本表(W-CFG-KB 切片一)';