-- ===================================================================== -- PBL Agent OS 验证原型(Phase 0/1)—— 36 表可执行 DDL -- 方言:mariadb(InnoDB + utf8mb4/utf8mb4_general_ci) -- 规则:id BIGINT NOT NULL AUTO_INCREMENT 物理主键 + xxx_code VARCHAR(32) 业务主键(唯一索引) -- tenant_id VARCHAR(32) NOT NULL 为第一业务列,所有索引以 tenant_id 打头 -- 禁止 FOREIGN KEY / 禁止 ENUM / 禁止原生 TIMESTAMP(用 DATETIME) -- append-only 表无 update_time、无物理删除(11 张,见文末清单) -- 权威来源:projects/pbls/docs/01-design/data-model.md -- 执行:apps/pbls/build.sh -> mysql --protocol=TCP -h127.0.0.1 -P3306 pbls < pbls_tables.sql -- ===================================================================== SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ===================================================================== -- 模块 pbl_governance(3 表) -- ===================================================================== -- 1. pbl_tenant 租户主表 CREATE TABLE IF NOT EXISTS pbl_tenant ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID(第一业务列)', id BIGINT NOT NULL AUTO_INCREMENT, tenant_code VARCHAR(32) NOT NULL COMMENT '租户业务主键', tenant_name VARCHAR(128) NOT NULL COMMENT '租户名称', org_code VARCHAR(32) DEFAULT NULL COMMENT '所属机构编码(rbac 侧只读引用)', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/suspended/closed(appcodes_kv: pbl_tenant_status)', quota_bp INT NOT NULL DEFAULT 100 COMMENT '蓝图配额', quota_stu INT NOT NULL DEFAULT 500 COMMENT '学生席位配额', remark VARCHAR(512) DEFAULT NULL COMMENT '备注', create_by VARCHAR(32) DEFAULT NULL COMMENT '创建人', create_time DATETIME DEFAULT NULL COMMENT '创建时间', update_by VARCHAR(32) DEFAULT NULL COMMENT '更新人', update_time DATETIME DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY uk_pbl_tenant_code (tenant_id, tenant_code), KEY idx_pbl_tenant_tid_status (tenant_id, status), KEY idx_pbl_tenant_tid_org (tenant_id, org_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 租户主表'; -- 2. pbl_role_binding 租户内角色绑定(复用 rbac,不改 rbac 基表) CREATE TABLE IF NOT EXISTS pbl_role_binding ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, binding_code VARCHAR(32) NOT NULL COMMENT '绑定业务主键', user_code VARCHAR(32) NOT NULL COMMENT '用户编码(rbac 只读引用)', role_code VARCHAR(32) NOT NULL COMMENT '角色编码:teacher/assistant/student/observer/admin(appcodes_kv: pbl_role)', scope_type VARCHAR(16) NOT NULL DEFAULT 'tenant' COMMENT '作用域类型:tenant/blueprint/class/team', scope_code VARCHAR(32) DEFAULT NULL COMMENT '作用域对象编码', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/revoked', effective_from DATETIME DEFAULT NULL COMMENT '生效起', effective_to DATETIME DEFAULT NULL COMMENT '生效止', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_role_binding_code (tenant_id, binding_code), KEY idx_pbl_role_binding_tid_user (tenant_id, user_code, status), KEY idx_pbl_role_binding_tid_scope (tenant_id, scope_type, scope_code), KEY idx_pbl_role_binding_tid_role (tenant_id, role_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 租户角色绑定'; -- 3. pbl_audit_log 审计日志(append-only) CREATE TABLE IF NOT EXISTS pbl_audit_log ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, audit_code VARCHAR(32) NOT NULL COMMENT '审计业务主键', actor_type VARCHAR(16) NOT NULL DEFAULT 'user' COMMENT '主体类型:user/agent/system', actor_code VARCHAR(32) DEFAULT NULL COMMENT '主体编码', action_code VARCHAR(64) NOT NULL COMMENT '动作编码(appcodes_kv: pbl_audit_action)', object_type VARCHAR(32) DEFAULT NULL COMMENT '对象类型', object_code VARCHAR(32) DEFAULT NULL COMMENT '对象编码', result VARCHAR(16) NOT NULL DEFAULT 'success' COMMENT '结果:success/denied/error', detail TEXT DEFAULT NULL COMMENT '详情 JSON', trace_id VARCHAR(64) DEFAULT NULL COMMENT '链路追踪ID', client_ip VARCHAR(64) DEFAULT NULL COMMENT '来源IP', create_time DATETIME DEFAULT NULL COMMENT '发生时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_audit_code (tenant_id, audit_code), KEY idx_pbl_audit_tid_time (tenant_id, create_time), KEY idx_pbl_audit_tid_obj (tenant_id, object_type, object_code), KEY idx_pbl_audit_tid_actor (tenant_id, actor_type, actor_code), KEY idx_pbl_audit_tid_trace (tenant_id, trace_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 审计日志(append-only)'; -- ===================================================================== -- 模块 pbl_blueprint(11 表,M1a) -- ===================================================================== -- 4. pbl_blueprint 蓝图聚合根 CREATE TABLE IF NOT EXISTS pbl_blueprint ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, bp_code VARCHAR(32) NOT NULL COMMENT '蓝图业务主键', bp_name VARCHAR(128) NOT NULL COMMENT '蓝图名称', subject_code VARCHAR(32) DEFAULT NULL COMMENT '学科编码(appcodes_kv: pbl_subject)', grade_code VARCHAR(32) DEFAULT NULL COMMENT '学段编码(appcodes_kv: pbl_grade)', driving_q TEXT DEFAULT NULL COMMENT '驱动性问题', summary VARCHAR(1024) DEFAULT NULL COMMENT '蓝图摘要', duration_hours INT NOT NULL DEFAULT 0 COMMENT '总课时(小时)', team_size_min INT NOT NULL DEFAULT 1 COMMENT '最小团队人数', team_size_max INT NOT NULL DEFAULT 6 COMMENT '最大团队人数', cur_version INT NOT NULL DEFAULT 1 COMMENT '当前版本号(乐观锁)', quality_level VARCHAR(16) NOT NULL DEFAULT 'L0_draft' COMMENT '质量等级 L0~L4(appcodes_kv: pbl_quality_level)', status VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT '状态:draft/validating/validated/compiling/published/archived(appcodes_kv: pbl_bp_status)', source_type VARCHAR(16) NOT NULL DEFAULT 'manual' COMMENT '来源:manual/template/fork/agent', source_code VARCHAR(32) DEFAULT NULL COMMENT '来源对象编码(模板/父蓝图)', owner_code VARCHAR(32) DEFAULT NULL COMMENT '归属教师', lock_holder VARCHAR(32) DEFAULT NULL COMMENT '当前编辑锁持有者', lock_expire DATETIME DEFAULT NULL COMMENT '编辑锁过期时间', extra TEXT DEFAULT NULL COMMENT '扩展 JSON', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_blueprint_code (tenant_id, bp_code), KEY idx_pbl_bp_tid_status (tenant_id, status), KEY idx_pbl_bp_tid_owner (tenant_id, owner_code), KEY idx_pbl_bp_tid_subject (tenant_id, subject_code, grade_code), KEY idx_pbl_bp_tid_quality (tenant_id, quality_level), KEY idx_pbl_bp_tid_source (tenant_id, source_type, source_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 蓝图聚合根'; -- 5. pbl_blueprint_version 版本快照 + change_delta(append-only) CREATE TABLE IF NOT EXISTS pbl_blueprint_version ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, version_code VARCHAR(32) NOT NULL COMMENT '版本业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', version_no INT NOT NULL COMMENT '版本号(单调递增)', snapshot LONGTEXT DEFAULT NULL COMMENT '蓝图全量快照 JSON', change_delta LONGTEXT DEFAULT NULL COMMENT '相对上一版本的差异 JSON(可回放)', checksum VARCHAR(64) DEFAULT NULL COMMENT '快照 sha256', reason VARCHAR(512) DEFAULT NULL COMMENT '变更原因', created_by VARCHAR(32) DEFAULT NULL COMMENT '提交人', create_time DATETIME DEFAULT NULL COMMENT '提交时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_bp_version_code (tenant_id, version_code), UNIQUE KEY uk_pbl_bp_version_no (tenant_id, bp_code, version_no), KEY idx_pbl_bp_version_tid_bp (tenant_id, bp_code, create_time), KEY idx_pbl_bp_version_tid_ck (tenant_id, checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 蓝图版本快照(append-only)'; -- 6. pbl_blueprint_lock 编辑锁 CREATE TABLE IF NOT EXISTS pbl_blueprint_lock ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, lock_code VARCHAR(32) NOT NULL COMMENT '锁业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', holder_code VARCHAR(32) NOT NULL COMMENT '持有者', session_id VARCHAR(64) DEFAULT NULL COMMENT '会话ID', lock_state VARCHAR(16) NOT NULL DEFAULT 'held' COMMENT '锁状态:held/released/expired/forced', acquired_at DATETIME DEFAULT NULL COMMENT '获取时间', expire_at DATETIME DEFAULT NULL COMMENT '过期时间', released_at DATETIME DEFAULT NULL COMMENT '释放时间', version_no INT NOT NULL DEFAULT 0 COMMENT '加锁时版本号', create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_bp_lock_code (tenant_id, lock_code), UNIQUE KEY uk_pbl_bp_lock_active (tenant_id, bp_code, lock_state), KEY idx_pbl_bp_lock_tid_holder (tenant_id, holder_code), KEY idx_pbl_bp_lock_tid_expire (tenant_id, expire_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 蓝图编辑锁'; -- 7. pbl_subobject 7 类子对象泛化主表 CREATE TABLE IF NOT EXISTS pbl_subobject ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, obj_code VARCHAR(32) NOT NULL COMMENT '子对象业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '所属蓝图', obj_type VARCHAR(32) NOT NULL COMMENT '子对象类型:objective/stage/task/artifact_spec/rubric_ref/resource_ref/assessment_plan(appcodes_kv: pbl_subobj_type)', parent_code VARCHAR(32) DEFAULT NULL COMMENT '父子对象编码(树形)', obj_name VARCHAR(128) NOT NULL COMMENT '名称', obj_summary VARCHAR(1024) DEFAULT NULL COMMENT '摘要', sort_no INT NOT NULL DEFAULT 0 COMMENT '同级排序', payload LONGTEXT DEFAULT NULL COMMENT '类型化载荷 JSON(泛化契约)', schema_ver VARCHAR(16) NOT NULL DEFAULT 'v1' COMMENT '载荷 schema 版本', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/disabled/deleted', version_no INT NOT NULL DEFAULT 1 COMMENT '乐观锁版本号', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_subobject_code (tenant_id, obj_code), KEY idx_pbl_subobj_tid_bp_type (tenant_id, bp_code, obj_type, sort_no), KEY idx_pbl_subobj_tid_parent (tenant_id, parent_code), KEY idx_pbl_subobj_tid_status (tenant_id, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 蓝图 7 类子对象泛化主表'; -- 8. pbl_subobject_attr 子对象泛化属性(KV) CREATE TABLE IF NOT EXISTS pbl_subobject_attr ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, attr_code VARCHAR(32) NOT NULL COMMENT '属性业务主键', obj_code VARCHAR(32) NOT NULL COMMENT '子对象编码', attr_key VARCHAR(64) NOT NULL COMMENT '属性键', attr_value TEXT DEFAULT NULL COMMENT '属性值', value_type VARCHAR(16) NOT NULL DEFAULT 'string' COMMENT '值类型:string/int/float/bool/json/date', required_flag TINYINT NOT NULL DEFAULT 0 COMMENT '是否必填 0否1是', sort_no INT NOT NULL DEFAULT 0 COMMENT '排序', create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_subobj_attr_code (tenant_id, attr_code), UNIQUE KEY uk_pbl_subobj_attr_key (tenant_id, obj_code, attr_key), KEY idx_pbl_subobj_attr_tid_obj (tenant_id, obj_code, sort_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 子对象泛化属性 KV'; -- 9. pbl_subobject_rel 子对象间关系 CREATE TABLE IF NOT EXISTS pbl_subobject_rel ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, rel_code VARCHAR(32) NOT NULL COMMENT '关系业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '所属蓝图', src_obj_code VARCHAR(32) NOT NULL COMMENT '源子对象', dst_obj_code VARCHAR(32) NOT NULL COMMENT '目标子对象', rel_type VARCHAR(32) NOT NULL COMMENT '关系类型:depends_on/produces/assesses/references/contains(appcodes_kv: pbl_rel_type)', weight DECIMAL(6,3) NOT NULL DEFAULT 1.000 COMMENT '关系权重', remark VARCHAR(512) DEFAULT NULL COMMENT '备注', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_subobj_rel_code (tenant_id, rel_code), UNIQUE KEY uk_pbl_subobj_rel_triple (tenant_id, src_obj_code, dst_obj_code, rel_type), KEY idx_pbl_subobj_rel_tid_bp (tenant_id, bp_code, rel_type), KEY idx_pbl_subobj_rel_tid_dst (tenant_id, dst_obj_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 子对象关系'; -- 10. pbl_subobject_asset 子对象资产引用(只读引用平台资产,不落资产本体) CREATE TABLE IF NOT EXISTS pbl_subobject_asset ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, asset_code VARCHAR(32) NOT NULL COMMENT '资产引用业务主键', obj_code VARCHAR(32) NOT NULL COMMENT '子对象编码', asset_kind VARCHAR(32) NOT NULL COMMENT '资产种类:image/model/audio/video/doc/url(appcodes_kv: pbl_asset_kind)', asset_uri VARCHAR(512) DEFAULT NULL COMMENT '资产 URI', asset_name VARCHAR(128) DEFAULT NULL COMMENT '资产名称', mime_type VARCHAR(64) DEFAULT NULL COMMENT 'MIME', size_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '字节数', checksum VARCHAR(64) DEFAULT NULL COMMENT 'sha256', license_code VARCHAR(32) DEFAULT NULL COMMENT '许可编码', sort_no INT NOT NULL DEFAULT 0 COMMENT '排序', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_subobj_asset_code (tenant_id, asset_code), KEY idx_pbl_subobj_asset_tid_obj (tenant_id, obj_code, sort_no), KEY idx_pbl_subobj_asset_tid_kind (tenant_id, asset_kind) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 子对象资产引用'; -- 11. pbl_subobject_ref 子对象对复用域对象的只读引用(world/scene/entity/script) CREATE TABLE IF NOT EXISTS pbl_subobject_ref ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, ref_code VARCHAR(32) NOT NULL COMMENT '引用业务主键', obj_code VARCHAR(32) NOT NULL COMMENT '子对象编码', ref_module VARCHAR(32) NOT NULL COMMENT '被引用模块:world/scene/entity/script_engine/scense/scense_game', ref_table VARCHAR(64) NOT NULL COMMENT '被引用表名', ref_id BIGINT DEFAULT NULL COMMENT '被引用行 id', ref_biz_code VARCHAR(64) DEFAULT NULL COMMENT '被引用业务编码', ref_mode VARCHAR(16) NOT NULL DEFAULT 'readonly' COMMENT '引用模式:readonly(Phase 0/1 唯一合法值)', snapshot_json TEXT DEFAULT NULL COMMENT '引用时只读快照(不改基表)', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_subobj_ref_code (tenant_id, ref_code), KEY idx_pbl_subobj_ref_tid_obj (tenant_id, obj_code), KEY idx_pbl_subobj_ref_tid_mod (tenant_id, ref_module, ref_table, ref_biz_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 子对象对复用域只读引用'; -- 12. pbl_subobject_review 子对象评审意见(append-only) CREATE TABLE IF NOT EXISTS pbl_subobject_review ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, review_code VARCHAR(32) NOT NULL COMMENT '评审业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', obj_code VARCHAR(32) DEFAULT NULL COMMENT '子对象编码(空=蓝图级)', reviewer_type VARCHAR(16) NOT NULL DEFAULT 'user' COMMENT '评审主体:user/agent_critic/agent_designer', reviewer_code VARCHAR(32) DEFAULT NULL COMMENT '评审主体编码', verdict VARCHAR(16) NOT NULL DEFAULT 'comment' COMMENT '结论:pass/comment/revise/reject', score DECIMAL(6,2) DEFAULT NULL COMMENT '评分', comment TEXT DEFAULT NULL COMMENT '意见正文', create_time DATETIME DEFAULT NULL COMMENT '评审时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_subobj_review_code (tenant_id, review_code), KEY idx_pbl_subobj_review_tid_bp (tenant_id, bp_code, create_time), KEY idx_pbl_subobj_review_tid_obj (tenant_id, obj_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 子对象评审意见(append-only)'; -- 13. pbl_blueprint_tag 蓝图标签 CREATE TABLE IF NOT EXISTS pbl_blueprint_tag ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, tag_code VARCHAR(32) NOT NULL COMMENT '标签业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', tag_key VARCHAR(64) NOT NULL COMMENT '标签键', tag_value VARCHAR(128) DEFAULT NULL COMMENT '标签值', create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_bp_tag_code (tenant_id, tag_code), UNIQUE KEY uk_pbl_bp_tag_kv (tenant_id, bp_code, tag_key), KEY idx_pbl_bp_tag_tid_key (tenant_id, tag_key, tag_value) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 蓝图标签'; -- 14. pbl_blueprint_publish 发布记录(append-only) CREATE TABLE IF NOT EXISTS pbl_blueprint_publish ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, publish_code VARCHAR(32) NOT NULL COMMENT '发布业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', version_no INT NOT NULL COMMENT '发布版本号', gd_code VARCHAR(32) DEFAULT NULL COMMENT '关联 Game Definition 编码', channel VARCHAR(32) NOT NULL DEFAULT 'class' COMMENT '发布渠道:class/school/public', target_code VARCHAR(32) DEFAULT NULL COMMENT '目标对象(班级编码)', publish_state VARCHAR(16) NOT NULL DEFAULT 'published' COMMENT '状态:published/revoked', published_by VARCHAR(32) DEFAULT NULL COMMENT '发布人', create_time DATETIME DEFAULT NULL COMMENT '发布时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_bp_publish_code (tenant_id, publish_code), KEY idx_pbl_bp_publish_tid_bp (tenant_id, bp_code, create_time), KEY idx_pbl_bp_publish_tid_target (tenant_id, channel, target_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 蓝图发布记录(append-only)'; -- ===================================================================== -- 模块 pbl_template(2 表,M1b) -- ===================================================================== -- 15. pbl_template 模板主表(含离线兜底模板) CREATE TABLE IF NOT EXISTS pbl_template ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID(__system__ 表示平台内置)', id BIGINT NOT NULL AUTO_INCREMENT, tpl_code VARCHAR(32) NOT NULL COMMENT '模板业务主键', tpl_name VARCHAR(128) NOT NULL COMMENT '模板名称', tpl_kind VARCHAR(32) NOT NULL DEFAULT 'blueprint' COMMENT '模板种类:blueprint/subobject/rubric', subject_code VARCHAR(32) DEFAULT NULL COMMENT '适用学科', grade_code VARCHAR(32) DEFAULT NULL COMMENT '适用学段', offline_flag TINYINT NOT NULL DEFAULT 0 COMMENT '是否离线兜底模板 0否1是', body LONGTEXT DEFAULT NULL COMMENT '模板正文 JSON(含子对象树)', id_prefix_rule VARCHAR(64) DEFAULT NULL COMMENT '实例化 ID 重映射前缀规则', version_no INT NOT NULL DEFAULT 1 COMMENT '模板版本', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/disabled', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_template_code (tenant_id, tpl_code), KEY idx_pbl_template_tid_kind (tenant_id, tpl_kind, status), KEY idx_pbl_template_tid_subj (tenant_id, subject_code, grade_code), KEY idx_pbl_template_tid_offline (tenant_id, offline_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 模板主表'; -- 16. pbl_template_item 模板条目(实例化 ID 重映射映射表) CREATE TABLE IF NOT EXISTS pbl_template_item ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, item_code VARCHAR(32) NOT NULL COMMENT '条目业务主键', tpl_code VARCHAR(32) NOT NULL COMMENT '模板编码', tpl_obj_key VARCHAR(64) NOT NULL COMMENT '模板内占位键(如 __OBJ_1__)', obj_type VARCHAR(32) NOT NULL COMMENT '子对象类型', parent_key VARCHAR(64) DEFAULT NULL COMMENT '父占位键', payload LONGTEXT DEFAULT NULL COMMENT '条目载荷 JSON', sort_no INT NOT NULL DEFAULT 0 COMMENT '排序', create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_template_item_code (tenant_id, item_code), UNIQUE KEY uk_pbl_template_item_key (tenant_id, tpl_code, tpl_obj_key), KEY idx_pbl_template_item_tid_tpl (tenant_id, tpl_code, sort_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 模板条目'; -- ===================================================================== -- 模块 pbl_validation(3 表,M2:14 维 + 5 级质量状态) -- ===================================================================== -- 17. pbl_validation_ruleset 校验规则集 CREATE TABLE IF NOT EXISTS pbl_validation_ruleset ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, ruleset_code VARCHAR(32) NOT NULL COMMENT '规则集业务主键', ruleset_name VARCHAR(128) NOT NULL COMMENT '规则集名称', dim_code VARCHAR(32) NOT NULL COMMENT '维度编码 D01~D14(appcodes_kv: pbl_valid_dim)', dim_name VARCHAR(64) NOT NULL COMMENT '维度名称', rule_expr TEXT DEFAULT NULL COMMENT '规则表达式 JSON(确定性可执行)', severity VARCHAR(16) NOT NULL DEFAULT 'error' COMMENT '严重度:blocker/error/warning/info', weight DECIMAL(6,3) NOT NULL DEFAULT 1.000 COMMENT '维度权重', level_effect VARCHAR(16) DEFAULT NULL COMMENT '对质量等级的影响:downgrade/gate/none', enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用 0否1是', sort_no INT NOT NULL DEFAULT 0 COMMENT '维度排序', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_valid_ruleset_code (tenant_id, ruleset_code), KEY idx_pbl_valid_ruleset_tid_dim (tenant_id, dim_code, enabled), KEY idx_pbl_valid_ruleset_tid_sort (tenant_id, sort_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 14 维校验规则集'; -- 18. pbl_validation_run 校验执行批次 CREATE TABLE IF NOT EXISTS pbl_validation_run ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, run_code VARCHAR(32) NOT NULL COMMENT '执行批次业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', version_no INT NOT NULL DEFAULT 1 COMMENT '被校验版本号', ruleset_ver VARCHAR(32) DEFAULT NULL COMMENT '规则集版本', trigger_type VARCHAR(16) NOT NULL DEFAULT 'manual' COMMENT '触发:manual/auto/agent/pre_compile', run_state VARCHAR(16) NOT NULL DEFAULT 'running' COMMENT '状态:running/passed/failed/error', dims_total INT NOT NULL DEFAULT 14 COMMENT '维度总数', dims_passed INT NOT NULL DEFAULT 0 COMMENT '通过维度数', blocker_count INT NOT NULL DEFAULT 0 COMMENT 'blocker 数', error_count INT NOT NULL DEFAULT 0 COMMENT 'error 数', warning_count INT NOT NULL DEFAULT 0 COMMENT 'warning 数', score DECIMAL(6,2) DEFAULT NULL COMMENT '加权得分', quality_level VARCHAR(16) DEFAULT NULL COMMENT '产出质量等级 L0~L4', started_at DATETIME DEFAULT NULL COMMENT '开始时间', finished_at DATETIME DEFAULT NULL COMMENT '结束时间', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_valid_run_code (tenant_id, run_code), KEY idx_pbl_valid_run_tid_bp (tenant_id, bp_code, create_time), KEY idx_pbl_valid_run_tid_state (tenant_id, run_state), KEY idx_pbl_valid_run_tid_level (tenant_id, quality_level) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 校验执行批次'; -- 19. pbl_validation_finding 校验发现明细(append-only 留痕) CREATE TABLE IF NOT EXISTS pbl_validation_finding ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, finding_code VARCHAR(32) NOT NULL COMMENT '发现业务主键', run_code VARCHAR(32) NOT NULL COMMENT '执行批次编码', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', dim_code VARCHAR(32) NOT NULL COMMENT '维度编码', obj_code VARCHAR(32) DEFAULT NULL COMMENT '命中子对象', severity VARCHAR(16) NOT NULL DEFAULT 'error' COMMENT '严重度', finding_msg VARCHAR(1024) DEFAULT NULL COMMENT '问题描述', suggestion VARCHAR(1024) DEFAULT NULL COMMENT '修复建议', evidence_json TEXT DEFAULT NULL COMMENT '证据 JSON', create_time DATETIME DEFAULT NULL COMMENT '产生时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_valid_finding_code (tenant_id, finding_code), KEY idx_pbl_valid_finding_tid_run (tenant_id, run_code, dim_code), KEY idx_pbl_valid_finding_tid_bp (tenant_id, bp_code, create_time), KEY idx_pbl_valid_finding_tid_obj (tenant_id, obj_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 校验发现明细(append-only)'; -- ===================================================================== -- 模块 pbl_compiler(4 表,M3a/M3b:确定性编译 + Game Definition) -- ===================================================================== -- 20. pbl_compile_job 编译作业 CREATE TABLE IF NOT EXISTS pbl_compile_job ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, job_code VARCHAR(32) NOT NULL COMMENT '作业业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', version_no INT NOT NULL COMMENT '被编译版本号', run_code VARCHAR(32) DEFAULT NULL COMMENT '前置校验批次(必须 passed)', compiler_ver VARCHAR(32) NOT NULL DEFAULT 'v1' COMMENT '编译器版本', job_state VARCHAR(16) NOT NULL DEFAULT 'queued' COMMENT '状态:queued/running/success/failed/cancelled', input_checksum VARCHAR(64) DEFAULT NULL COMMENT '输入快照 sha256(确定性依据)', output_checksum VARCHAR(64) DEFAULT NULL COMMENT '输出 Game Definition sha256', gd_code VARCHAR(32) DEFAULT NULL COMMENT '产出 Game Definition 编码', error_msg VARCHAR(1024) DEFAULT NULL COMMENT '错误信息', started_at DATETIME DEFAULT NULL, finished_at DATETIME DEFAULT NULL, create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_compile_job_code (tenant_id, job_code), KEY idx_pbl_compile_job_tid_bp (tenant_id, bp_code, create_time), KEY idx_pbl_compile_job_tid_state (tenant_id, job_state), KEY idx_pbl_compile_job_tid_ick (tenant_id, input_checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 编译作业'; -- 21. pbl_compile_artifact 编译中间产物 CREATE TABLE IF NOT EXISTS pbl_compile_artifact ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, artifact_code VARCHAR(32) NOT NULL COMMENT '产物业务主键', job_code VARCHAR(32) NOT NULL COMMENT '编译作业编码', stage_code VARCHAR(32) NOT NULL COMMENT '编译阶段:normalize/resolve/link/optimize/emit', artifact_kind VARCHAR(32) NOT NULL COMMENT '产物种类:node_set/edge_set/rule_set/asset_map/gd_draft', body LONGTEXT DEFAULT NULL COMMENT '产物正文 JSON', checksum VARCHAR(64) DEFAULT NULL COMMENT 'sha256', sort_no INT NOT NULL DEFAULT 0 COMMENT '阶段排序', create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_compile_artifact_code (tenant_id, artifact_code), KEY idx_pbl_compile_artifact_tid_job (tenant_id, job_code, sort_no), KEY idx_pbl_compile_artifact_tid_kind (tenant_id, artifact_kind) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 编译中间产物'; -- 22. pbl_game_definition Game Definition(编译最终产出) CREATE TABLE IF NOT EXISTS pbl_game_definition ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, gd_code VARCHAR(32) NOT NULL COMMENT 'Game Definition 业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '来源蓝图', version_no INT NOT NULL COMMENT '来源蓝图版本', gd_version INT NOT NULL DEFAULT 1 COMMENT 'GD 自身版本', schema_ver VARCHAR(16) NOT NULL DEFAULT 'gd-v1' COMMENT 'GD schema 版本', body LONGTEXT DEFAULT NULL COMMENT 'Game Definition 全文 JSON(schema 校验通过)', checksum VARCHAR(64) DEFAULT NULL COMMENT 'sha256(同输入同输出)', world_ref VARCHAR(64) DEFAULT NULL COMMENT '引用世界编码(只读)', scene_ref VARCHAR(64) DEFAULT NULL COMMENT '引用场景编码(只读)', script_ref VARCHAR(64) DEFAULT NULL COMMENT '引用脚本编码(只读)', gd_state VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT '状态:draft/validated/published/archived', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_gd_code (tenant_id, gd_code), UNIQUE KEY uk_pbl_gd_bp_ver (tenant_id, bp_code, version_no, gd_version), KEY idx_pbl_gd_tid_state (tenant_id, gd_state), KEY idx_pbl_gd_tid_ck (tenant_id, checksum), KEY idx_pbl_gd_tid_world (tenant_id, world_ref, scene_ref) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL Game Definition'; -- 23. pbl_compile_log 编译日志(append-only) CREATE TABLE IF NOT EXISTS pbl_compile_log ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, log_code VARCHAR(32) NOT NULL COMMENT '日志业务主键', job_code VARCHAR(32) NOT NULL COMMENT '编译作业编码', stage_code VARCHAR(32) DEFAULT NULL COMMENT '阶段', log_level VARCHAR(16) NOT NULL DEFAULT 'info' COMMENT '级别:debug/info/warn/error', log_msg VARCHAR(2048) DEFAULT NULL COMMENT '日志正文', context_json TEXT DEFAULT NULL COMMENT '上下文 JSON', seq_no BIGINT NOT NULL DEFAULT 0 COMMENT '作业内单调序号', create_time DATETIME DEFAULT NULL COMMENT '记录时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_compile_log_code (tenant_id, log_code), KEY idx_pbl_compile_log_tid_job (tenant_id, job_code, seq_no), KEY idx_pbl_compile_log_tid_level (tenant_id, log_level, create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 编译日志(append-only)'; -- ===================================================================== -- 模块 pbl_agent_runtime(4 表,M4a/M4b:Designer/Critic + fail-closed 裁决) -- ===================================================================== -- 24. pbl_agent_session Agent 会话 CREATE TABLE IF NOT EXISTS pbl_agent_session ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, session_code VARCHAR(32) NOT NULL COMMENT '会话业务主键', bp_code VARCHAR(32) DEFAULT NULL COMMENT '关联蓝图', agent_role VARCHAR(32) NOT NULL COMMENT 'Agent 角色:designer/critic(appcodes_kv: pbl_agent_role)', model_name VARCHAR(64) DEFAULT NULL COMMENT '使用的平台模型注册名', session_state VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/paused/closed/error', owner_code VARCHAR(32) DEFAULT NULL COMMENT '发起用户', turn_count INT NOT NULL DEFAULT 0 COMMENT '轮次数', tool_call_count INT NOT NULL DEFAULT 0 COMMENT '工具调用总数', tool_deny_count INT NOT NULL DEFAULT 0 COMMENT '被拒绝调用数', context_json LONGTEXT DEFAULT NULL COMMENT '会话上下文 JSON', started_at DATETIME DEFAULT NULL, closed_at DATETIME DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_agent_session_code (tenant_id, session_code), KEY idx_pbl_agent_session_tid_bp (tenant_id, bp_code, session_state), KEY idx_pbl_agent_session_tid_role (tenant_id, agent_role), KEY idx_pbl_agent_session_tid_owner (tenant_id, owner_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL Agent 会话'; -- 25. pbl_agent_message Agent 消息(append-only) CREATE TABLE IF NOT EXISTS pbl_agent_message ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, msg_code VARCHAR(32) NOT NULL COMMENT '消息业务主键', session_code VARCHAR(32) NOT NULL COMMENT '会话编码', turn_no INT NOT NULL DEFAULT 0 COMMENT '轮次号', role VARCHAR(16) NOT NULL COMMENT '角色:system/user/assistant/tool', content LONGTEXT DEFAULT NULL COMMENT '消息正文', token_in INT NOT NULL DEFAULT 0 COMMENT '输入 token', token_out INT NOT NULL DEFAULT 0 COMMENT '输出 token', latency_ms INT NOT NULL DEFAULT 0 COMMENT '耗时毫秒', create_time DATETIME DEFAULT NULL COMMENT '产生时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_agent_msg_code (tenant_id, msg_code), KEY idx_pbl_agent_msg_tid_sess (tenant_id, session_code, turn_no), KEY idx_pbl_agent_msg_tid_time (tenant_id, create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL Agent 消息(append-only)'; -- 26. pbl_agent_tool_call 工具调用记录(append-only) CREATE TABLE IF NOT EXISTS pbl_agent_tool_call ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, call_code VARCHAR(32) NOT NULL COMMENT '调用业务主键', session_code VARCHAR(32) NOT NULL COMMENT '会话编码', turn_no INT NOT NULL DEFAULT 0 COMMENT '轮次号', tool_name VARCHAR(64) NOT NULL COMMENT '工具名(13 启用 / 9 禁用白名单外)', tool_state VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '状态:pending/allowed/executed/denied/error', params_json LONGTEXT DEFAULT NULL COMMENT '入参 JSON', result_json LONGTEXT DEFAULT NULL COMMENT '返回 JSON', latency_ms INT NOT NULL DEFAULT 0 COMMENT '耗时毫秒', create_time DATETIME DEFAULT NULL COMMENT '调用时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_agent_call_code (tenant_id, call_code), KEY idx_pbl_agent_call_tid_sess (tenant_id, session_code, turn_no), KEY idx_pbl_agent_call_tid_tool (tenant_id, tool_name, tool_state), KEY idx_pbl_agent_call_tid_time (tenant_id, create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL Agent 工具调用(append-only)'; -- 27. pbl_agent_arbitration fail-closed 裁决记录(append-only) CREATE TABLE IF NOT EXISTS pbl_agent_arbitration ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, arb_code VARCHAR(32) NOT NULL COMMENT '裁决业务主键', session_code VARCHAR(32) DEFAULT NULL COMMENT '会话编码', call_code VARCHAR(32) DEFAULT NULL COMMENT '关联调用编码', tool_name VARCHAR(64) NOT NULL COMMENT '被裁决工具名', decision VARCHAR(16) NOT NULL DEFAULT 'deny' COMMENT '裁决:allow/deny(默认 deny,fail-closed)', deny_reason VARCHAR(32) NOT NULL DEFAULT 'not_in_whitelist' COMMENT '拒绝原因:not_in_whitelist/invalid_params/missing_tenant_context/write_protected/quota_exceeded', rule_ref VARCHAR(64) DEFAULT NULL COMMENT '命中规则引用', detail_json TEXT DEFAULT NULL COMMENT '裁决详情 JSON', arbiter VARCHAR(32) NOT NULL DEFAULT 'system' COMMENT '裁决者', create_time DATETIME DEFAULT NULL COMMENT '裁决时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_agent_arb_code (tenant_id, arb_code), KEY idx_pbl_agent_arb_tid_tool (tenant_id, tool_name, decision), KEY idx_pbl_agent_arb_tid_sess (tenant_id, session_code, create_time), KEY idx_pbl_agent_arb_tid_reason (tenant_id, deny_reason) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL Agent fail-closed 裁决记录(append-only)'; -- ===================================================================== -- 模块 pbl_evidence(4 表,M5a/M5b:产出物采集 + 证据幂等) -- ===================================================================== -- 28. pbl_artifact 学生产出物 CREATE TABLE IF NOT EXISTS pbl_artifact ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, artifact_code VARCHAR(32) NOT NULL COMMENT '产出物业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', session_code VARCHAR(32) DEFAULT NULL COMMENT '运行会话编码', team_code VARCHAR(32) DEFAULT NULL COMMENT '团队编码', obj_code VARCHAR(32) DEFAULT NULL COMMENT '对应产出物规格子对象', artifact_name VARCHAR(128) NOT NULL COMMENT '产出物名称', artifact_kind VARCHAR(32) NOT NULL COMMENT '种类:doc/image/model/audio/video/code/log/chat(appcodes_kv: pbl_artifact_kind)', storage_uri VARCHAR(512) DEFAULT NULL COMMENT '存储 URI', mime_type VARCHAR(64) DEFAULT NULL COMMENT 'MIME', size_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '字节数', checksum VARCHAR(64) DEFAULT NULL COMMENT 'sha256', content_text LONGTEXT DEFAULT NULL COMMENT '文本类正文(可索引)', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/archived/deleted', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_artifact_code (tenant_id, artifact_code), KEY idx_pbl_artifact_tid_bp (tenant_id, bp_code, artifact_kind), KEY idx_pbl_artifact_tid_team (tenant_id, team_code), KEY idx_pbl_artifact_tid_sess (tenant_id, session_code), KEY idx_pbl_artifact_tid_ck (tenant_id, checksum) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 学生产出物'; -- 29. pbl_evidence 证据主表 CREATE TABLE IF NOT EXISTS pbl_evidence ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, evidence_code VARCHAR(32) NOT NULL COMMENT '证据业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', artifact_code VARCHAR(32) DEFAULT NULL COMMENT '关联产出物', obj_code VARCHAR(32) DEFAULT NULL COMMENT '关联子对象(学习目标/任务)', team_code VARCHAR(32) DEFAULT NULL COMMENT '团队编码', student_code VARCHAR(32) DEFAULT NULL COMMENT '学生编码', evidence_type VARCHAR(32) NOT NULL COMMENT '证据类型:artifact/event/dialogue/state_snapshot/metric(appcodes_kv: pbl_evidence_type)', idem_key VARCHAR(128) NOT NULL COMMENT '幂等键(tenant+bp+type+source+hash)', payload LONGTEXT DEFAULT NULL COMMENT '证据载荷 JSON', occurred_at DATETIME DEFAULT NULL COMMENT '证据发生时间', trust_level VARCHAR(16) NOT NULL DEFAULT 'normal' COMMENT '可信度:high/normal/low', anonymized TINYINT NOT NULL DEFAULT 0 COMMENT '是否已匿名化 0否1是', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/invalidated', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_evidence_code (tenant_id, evidence_code), UNIQUE KEY uk_pbl_evidence_idem (tenant_id, idem_key), KEY idx_pbl_evidence_tid_bp (tenant_id, bp_code, evidence_type), KEY idx_pbl_evidence_tid_team (tenant_id, team_code, student_code), KEY idx_pbl_evidence_tid_obj (tenant_id, obj_code), KEY idx_pbl_evidence_tid_time (tenant_id, occurred_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 证据主表(幂等键唯一)'; -- 30. pbl_evidence_idem 证据幂等提交台账(append-only) CREATE TABLE IF NOT EXISTS pbl_evidence_idem ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, idem_code VARCHAR(32) NOT NULL COMMENT '幂等台账业务主键', idem_key VARCHAR(128) NOT NULL COMMENT '幂等键', evidence_code VARCHAR(32) DEFAULT NULL COMMENT '首次落库证据编码', submit_count INT NOT NULL DEFAULT 1 COMMENT '累计提交次数(重复提交只增此计数,不新增证据行)', last_payload_hash VARCHAR(64) DEFAULT NULL COMMENT '最近一次载荷 hash', conflict_flag TINYINT NOT NULL DEFAULT 0 COMMENT '是否载荷冲突 0否1是', source_channel VARCHAR(32) DEFAULT NULL COMMENT '来源渠道:runtime/manual/agent/import', create_time DATETIME DEFAULT NULL COMMENT '首次提交时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_evidence_idem_code (tenant_id, idem_code), UNIQUE KEY uk_pbl_evidence_idem_key (tenant_id, idem_key), KEY idx_pbl_evidence_idem_tid_time (tenant_id, create_time), KEY idx_pbl_evidence_idem_tid_conf (tenant_id, conflict_flag) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 证据幂等台账(append-only)'; -- 31. pbl_evidence_binding 证据与复用域对象绑定(零改表关联) CREATE TABLE IF NOT EXISTS pbl_evidence_binding ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, bind_code VARCHAR(32) NOT NULL COMMENT '绑定业务主键', evidence_code VARCHAR(32) NOT NULL COMMENT '证据编码', ref_module VARCHAR(32) NOT NULL COMMENT '复用域模块:world/scene/entity/script_engine/scense_runtime/scense/scense_game', ref_table VARCHAR(64) NOT NULL COMMENT '复用域表名', ref_id BIGINT DEFAULT NULL COMMENT '复用域行 id', ref_biz_code VARCHAR(64) DEFAULT NULL COMMENT '复用域业务编码', bind_role VARCHAR(32) NOT NULL DEFAULT 'source' COMMENT '绑定角色:source/target/context', create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_evidence_binding_code (tenant_id, bind_code), KEY idx_pbl_evidence_binding_tid_ev (tenant_id, evidence_code), KEY idx_pbl_evidence_binding_tid_ref (tenant_id, ref_module, ref_table, ref_biz_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 证据与复用域绑定(零改表)'; -- ===================================================================== -- 模块 pbl_assessment(3 表,M6:Rubric 加权评估与报告) -- ===================================================================== -- 32. pbl_rubric 量规主表 CREATE TABLE IF NOT EXISTS pbl_rubric ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, rubric_code VARCHAR(32) NOT NULL COMMENT '量规业务主键', bp_code VARCHAR(32) DEFAULT NULL COMMENT '关联蓝图(空=通用量规)', rubric_name VARCHAR(128) NOT NULL COMMENT '量规名称', level_count INT NOT NULL DEFAULT 5 COMMENT '等级数(默认 5 级)', total_weight DECIMAL(8,3) NOT NULL DEFAULT 100.000 COMMENT '总权重', pass_score DECIMAL(6,2) NOT NULL DEFAULT 60.00 COMMENT '及格分', grade_rule TEXT DEFAULT NULL COMMENT '等级映射规则 JSON', is_default TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认量规 0否1是', version_no INT NOT NULL DEFAULT 1 COMMENT '版本', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/disabled', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_rubric_code (tenant_id, rubric_code), KEY idx_pbl_rubric_tid_bp (tenant_id, bp_code, status), KEY idx_pbl_rubric_tid_default (tenant_id, is_default) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 量规主表'; -- 33. pbl_rubric_criterion 量规评价维度条目 CREATE TABLE IF NOT EXISTS pbl_rubric_criterion ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, crit_code VARCHAR(32) NOT NULL COMMENT '条目业务主键', rubric_code VARCHAR(32) NOT NULL COMMENT '量规编码', obj_code VARCHAR(32) DEFAULT NULL COMMENT '关联学习目标子对象', crit_name VARCHAR(128) NOT NULL COMMENT '维度名称', crit_desc VARCHAR(1024) DEFAULT NULL COMMENT '维度说明', weight DECIMAL(6,3) NOT NULL DEFAULT 1.000 COMMENT '权重', level_desc TEXT DEFAULT NULL COMMENT '各等级描述 JSON(level -> desc)', max_score DECIMAL(6,2) NOT NULL DEFAULT 5.00 COMMENT '最高分', evidence_required TINYINT NOT NULL DEFAULT 1 COMMENT '是否必须有证据支撑 0否1是', sort_no INT NOT NULL DEFAULT 0 COMMENT '排序', create_time DATETIME DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_rubric_crit_code (tenant_id, crit_code), KEY idx_pbl_rubric_crit_tid_rub (tenant_id, rubric_code, sort_no), KEY idx_pbl_rubric_crit_tid_obj (tenant_id, obj_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 量规评价维度'; -- 34. pbl_assessment_report 评估报告 CREATE TABLE IF NOT EXISTS pbl_assessment_report ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, report_code VARCHAR(32) NOT NULL COMMENT '报告业务主键', bp_code VARCHAR(32) NOT NULL COMMENT '蓝图编码', rubric_code VARCHAR(32) NOT NULL COMMENT '量规编码', team_code VARCHAR(32) DEFAULT NULL COMMENT '团队编码', student_code VARCHAR(32) DEFAULT NULL COMMENT '学生编码(团队报告时为空)', scope_type VARCHAR(16) NOT NULL DEFAULT 'team' COMMENT '范围:team/student/blueprint', score_total DECIMAL(6,2) NOT NULL DEFAULT 0.00 COMMENT '加权总分(可复算)', grade_code VARCHAR(16) DEFAULT NULL COMMENT '等级 A/B/C/D/E', detail_json LONGTEXT DEFAULT NULL COMMENT '逐维度得分明细 JSON(含证据引用)', evidence_count INT NOT NULL DEFAULT 0 COMMENT '引用证据数', missing_evidence_count INT NOT NULL DEFAULT 0 COMMENT '缺证据维度数', assessor_type VARCHAR(16) NOT NULL DEFAULT 'agent' COMMENT '评估者:agent/user/mixed', assessor_code VARCHAR(32) DEFAULT NULL COMMENT '评估者编码', report_state VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT '状态:draft/published/archived', calc_checksum VARCHAR(64) DEFAULT NULL COMMENT '复算校验 sha256', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_assess_report_code (tenant_id, report_code), KEY idx_pbl_assess_report_tid_bp (tenant_id, bp_code, scope_type), KEY idx_pbl_assess_report_tid_team (tenant_id, team_code, student_code), KEY idx_pbl_assess_report_tid_state (tenant_id, report_state), KEY idx_pbl_assess_report_tid_grade (tenant_id, grade_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 评估报告'; -- ===================================================================== -- 模块 pbl_domain_ext(1 表,M8:world/scene/entity 租户·班级·团队关联,不改基表) -- ===================================================================== -- 35. pbl_domain_binding 复用域对象绑定(零改表唯一关联落点) CREATE TABLE IF NOT EXISTS pbl_domain_binding ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, bind_code VARCHAR(32) NOT NULL COMMENT '绑定业务主键', bind_kind VARCHAR(32) NOT NULL COMMENT '绑定种类:tenant_world/class_scene/team_entity/bp_script/session_world(appcodes_kv: pbl_bind_kind)', class_code VARCHAR(32) DEFAULT NULL COMMENT '班级编码', team_code VARCHAR(32) DEFAULT NULL COMMENT '团队编码', bp_code VARCHAR(32) DEFAULT NULL COMMENT '蓝图编码', session_code VARCHAR(32) DEFAULT NULL COMMENT '运行会话编码', ref_module VARCHAR(32) NOT NULL COMMENT '复用域模块:world/scene/entity/script_engine/scense_runtime/scense/scense_game', ref_table VARCHAR(64) NOT NULL COMMENT '复用域表名', ref_id BIGINT DEFAULT NULL COMMENT '复用域行 id', ref_biz_code VARCHAR(64) DEFAULT NULL COMMENT '复用域业务编码', access_mode VARCHAR(16) NOT NULL DEFAULT 'readonly' COMMENT '访问模式:readonly(Phase 0/1 唯一合法值,写保护)', bind_state VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '状态:active/released', extra_json TEXT DEFAULT NULL COMMENT '扩展 JSON', create_by VARCHAR(32) DEFAULT NULL, create_time DATETIME DEFAULT NULL, update_by VARCHAR(32) DEFAULT NULL, update_time DATETIME DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_pbl_domain_binding_code (tenant_id, bind_code), UNIQUE KEY uk_pbl_domain_binding_ref (tenant_id, bind_kind, ref_module, ref_table, ref_biz_code), KEY idx_pbl_domain_binding_tid_class (tenant_id, class_code, team_code), KEY idx_pbl_domain_binding_tid_bp (tenant_id, bp_code), KEY idx_pbl_domain_binding_tid_sess (tenant_id, session_code), KEY idx_pbl_domain_binding_tid_ref (tenant_id, ref_module, ref_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 复用域绑定(零改表)'; -- ===================================================================== -- 模块 pbl_analytics(1 表,M10:分析看板快照,append-only) -- ===================================================================== -- 36. pbl_analytics_snapshot 分析快照(append-only) CREATE TABLE IF NOT EXISTS pbl_analytics_snapshot ( tenant_id VARCHAR(32) NOT NULL COMMENT '租户ID', id BIGINT NOT NULL AUTO_INCREMENT, snap_code VARCHAR(32) NOT NULL COMMENT '快照业务主键', metric_group VARCHAR(32) NOT NULL COMMENT '指标组:blueprint/validation/compile/runtime/evidence/assessment(appcodes_kv: pbl_metric_group)', scope_type VARCHAR(16) NOT NULL DEFAULT 'tenant' COMMENT '范围:tenant/class/team/blueprint', scope_code VARCHAR(32) DEFAULT NULL COMMENT '范围对象编码', period_key VARCHAR(16) NOT NULL COMMENT '周期键:2026-09 / 2026-W38 / 2026-09-15', metrics_json LONGTEXT DEFAULT NULL COMMENT '指标 JSON(计数/均值/分布)', anonymized TINYINT NOT NULL DEFAULT 1 COMMENT '是否匿名聚合 0否1是(KDB 侧强制 1)', sample_size INT NOT NULL DEFAULT 0 COMMENT '样本量', computed_at DATETIME DEFAULT NULL COMMENT '计算时间', create_time DATETIME DEFAULT NULL COMMENT '入库时间(append-only,无 update_time)', PRIMARY KEY (id), UNIQUE KEY uk_pbl_analytics_snap_code (tenant_id, snap_code), UNIQUE KEY uk_pbl_analytics_snap_dim (tenant_id, metric_group, scope_type, scope_code, period_key), KEY idx_pbl_analytics_snap_tid_group (tenant_id, metric_group, period_key), KEY idx_pbl_analytics_snap_tid_scope (tenant_id, scope_type, scope_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='PBL 分析看板快照(append-only)'; SET FOREIGN_KEY_CHECKS = 1; -- ===================================================================== -- 契约自检(供 build.sh / QC grep 核验) -- 表总数:36(pbl_governance 3 + pbl_blueprint 11 + pbl_template 2 + pbl_validation 3 -- + pbl_compiler 4 + pbl_agent_runtime 4 + pbl_evidence 4 + pbl_assessment 3 -- + pbl_domain_ext 1 + pbl_analytics 1 = 36) -- append-only 表(11,无 update_time): -- pbl_audit_log / pbl_blueprint_version / pbl_subobject_review / pbl_blueprint_publish -- pbl_validation_finding / pbl_compile_log / pbl_agent_message / pbl_agent_tool_call -- pbl_agent_arbitration / pbl_evidence_idem / pbl_analytics_snapshot -- 零命中项(mariadb 方言硬约束): -- FOREIGN KEY / REFERENCES / ENUM( / SERIAL / BIGSERIAL / nextval / TIMESTAMP -- 全部索引以 tenant_id 打头;每表 id BIGINT NOT NULL AUTO_INCREMENT + xxx_code 唯一业务主键。 -- ===================================================================== CREATE TABLE IF NOT EXISTS `pbl_compile_task` ( `tenant_id` VARCHAR(64) NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `task_no` VARCHAR(64) NOT NULL COMMENT "任务流水号(确定性派生 CT+blueprint_id+version+seq)", `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图ID", `blueprint_version` INT NOT NULL DEFAULT 0 COMMENT "蓝图版本(须已审批)", `compiler_version` VARCHAR(32) NOT NULL COMMENT "编译器版本号", `ruleset_version` VARCHAR(32) NOT NULL COMMENT "规则集版本", `status` VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT "appcodes:pbl_compile_status(pending/running/success/failed)", `approval_id` BIGINT UNSIGNED NULL COMMENT "关联审批记录(未审批拒绝 F-CP-01)", `game_def_id` BIGINT UNSIGNED NULL COMMENT "产出的 Game Definition ID(success 回填)", `content_fingerprint` VARCHAR(64) NULL COMMENT "产物 SHA-256 指纹(success 回填,US-11 比对锚点)", `error_code` VARCHAR(64) NULL COMMENT "失败错误码(PBL_E_*)", `error_msg` VARCHAR(2048) NULL COMMENT "失败原因(fail-closed 可追溯)", `triggered_by` VARCHAR(64) NULL COMMENT "触发人(审计)", `duration_ms` INT NOT NULL DEFAULT 0 COMMENT "耗时(易变,不参与指纹)", `started_at` DATETIME NULL COMMENT "开始时间", `finished_at` DATETIME NULL COMMENT "结束时间", `created_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT "创建时间(应用层写入)", `updated_at` DATETIME NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT "更新时间(应用层写入)", PRIMARY KEY (`id`), UNIQUE KEY `uk_ct_task_no` (`tenant_id`, `task_no`), KEY `idx_ct_blueprint` (`tenant_id`, `blueprint_id`, `blueprint_version`), KEY `idx_ct_status` (`tenant_id`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="编译任务(approval_id 门禁,F-CP-01/US-10)";