-- pbls 36 表 DDL(MariaDB 10.x 方言,由 scripts/gen_artifacts.py 从同一 spec 生成) -- 硬约束:tenant_id 打头 / id 为 BIGINT UNSIGNED AUTO_INCREMENT 主键;-- 不使用 外键约束 / 枚举列类型 / 时间戳列类型 / 位图列类型(枚举值走 appcodes 编码表,时间列走 DATETIME 由应用层写入) -- 方言来源:projects/pbls/env/test.json -> db.engine = mariadb(禁 BIGSERIAL/SERIAL/nextval 等 PG 语法) SET NAMES utf8mb4; -- ===== pbl_blueprint (M1) ===== CREATE TABLE IF NOT EXISTS `pbl_blueprint` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `code` VARCHAR(64) NOT NULL COMMENT "蓝图编码", `title` VARCHAR(128) NOT NULL COMMENT "标题", `subject` VARCHAR(64) NOT NULL COMMENT "学科", `grade` VARCHAR(64) NOT NULL COMMENT "年级", `description` TEXT NULL COMMENT "说明", `quality_state` VARCHAR(64) NOT NULL COMMENT "质量状态 pbl_quality_state", `generation_source` VARCHAR(64) NOT NULL COMMENT "生成来源 llm/template_fallback/manual", `approval_status` VARCHAR(64) NOT NULL COMMENT "审批状态", `visibility` VARCHAR(64) NOT NULL COMMENT "可见范围", `content_json` LONGTEXT NULL COMMENT "蓝图正文(结构化模型,非散文)", `version_no` INT NOT NULL DEFAULT 0 COMMENT "当前版本", `compiler_version_id` BIGINT UNSIGNED NOT NULL COMMENT "编译版本", `world_id` BIGINT UNSIGNED NOT NULL COMMENT "编译产物落 world 的溯源ID", `created_by` VARCHAR(32) NOT 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_bp_tenant_code` (`tenant_id`, `code`), KEY `idx_bp_tenant_state` (`tenant_id`, `quality_state`), KEY `idx_bp_tenant_creator` (`tenant_id`, `created_by`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="PBL 蓝图聚合根(第8章 schema 落库)"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_learning_goal` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "所属蓝图", `obj_uid` VARCHAR(32) NOT NULL COMMENT "子对象UID", `code` VARCHAR(64) NOT NULL COMMENT "目标编码", `title` VARCHAR(128) NOT NULL COMMENT "标题", `description` TEXT NULL COMMENT "描述", `bloom_level` VARCHAR(64) NOT NULL COMMENT "布鲁姆层级", `measurable` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "是否可测", `order_no` INT NOT NULL DEFAULT 0 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`), KEY `idx_blueprint_learning_goal_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图子对象 - 学习目标"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_role` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "所属蓝图", `obj_uid` VARCHAR(32) NOT NULL COMMENT "子对象UID", `code` VARCHAR(64) NOT NULL COMMENT "角色编码", `title` VARCHAR(128) NOT NULL COMMENT "角色名", `persona_txt` TEXT NULL COMMENT "人设", `capabilities_json` LONGTEXT NULL COMMENT "能力引用", `headcount` INT NOT NULL DEFAULT 0 COMMENT "名额", `order_no` INT NOT NULL DEFAULT 0 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`), KEY `idx_blueprint_role_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图子对象 - PBL 角色"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_mission` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "所属蓝图", `obj_uid` VARCHAR(32) NOT NULL COMMENT "子对象UID", `code` VARCHAR(64) NOT NULL COMMENT "任务域编码", `title` VARCHAR(128) NOT NULL COMMENT "驱动问题域", `scenario_txt` TEXT NULL COMMENT "情境", `unlock_condition_json` LONGTEXT NULL COMMENT "解锁条件", `order_no` INT NOT NULL DEFAULT 0 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`), KEY `idx_blueprint_mission_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图子对象 - 驱动问题/Mission"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_task` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "所属蓝图", `obj_uid` VARCHAR(32) NOT NULL COMMENT "子对象UID", `mission_id` BIGINT UNSIGNED NOT NULL COMMENT "所属Mission", `code` VARCHAR(64) NOT NULL COMMENT "编码", `title` VARCHAR(128) NOT NULL COMMENT "任务名", `steps_json` LONGTEXT NULL COMMENT "步骤", `difficulty` VARCHAR(64) NOT NULL COMMENT "难度", `order_no` INT NOT NULL DEFAULT 0 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`), KEY `idx_blueprint_task_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图子对象 - 任务"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_artifact_spec` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "所属蓝图", `obj_uid` VARCHAR(32) NOT NULL COMMENT "子对象UID", `code` VARCHAR(64) NOT NULL COMMENT "编码", `title` VARCHAR(128) NOT NULL COMMENT "产出物名", `artifact_type` VARCHAR(64) NOT NULL COMMENT "产出类型", `required_fields_json` LONGTEXT NULL COMMENT "必填字段", `order_no` INT NOT NULL DEFAULT 0 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`), KEY `idx_blueprint_artifact_spec_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图子对象 - 产出物规格"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_evidence_spec` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "所属蓝图", `obj_uid` VARCHAR(32) NOT NULL COMMENT "子对象UID", `evidence_type` VARCHAR(64) NOT NULL COMMENT "证据类型", `source` VARCHAR(64) NOT NULL COMMENT "来源", `min_count` INT NOT NULL DEFAULT 0 COMMENT "最少条数", `rubric_criterion_uid` VARCHAR(32) NOT NULL COMMENT "对齐的评分准则UID", `order_no` INT NOT NULL DEFAULT 0 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`), KEY `idx_blueprint_evidence_spec_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图子对象 - 证据规格"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_reflection_spec` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "所属蓝图", `obj_uid` VARCHAR(32) NOT NULL COMMENT "子对象UID", `trigger` VARCHAR(64) NOT NULL COMMENT "触发点", `prompt_txt` TEXT NULL COMMENT "反思引导语", `min_words` INT NOT NULL DEFAULT 0 COMMENT "最少字数", `evidence_type` VARCHAR(64) NOT NULL COMMENT "产出证据类型", `order_no` INT NOT NULL DEFAULT 0 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`), KEY `idx_bp_rs_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图子对象 - 反思规格"; CREATE TABLE IF NOT EXISTS `pbl_blueprint_version` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图ID", `version_no` INT NOT NULL DEFAULT 0 COMMENT "版本号", `snapshot_json` LONGTEXT NULL COMMENT "全量快照", `change_delta_json` LONGTEXT NULL COMMENT "结构化增量", `quality_state` VARCHAR(64) NOT NULL COMMENT "质量状态", `generation_source` VARCHAR(64) NOT NULL COMMENT "生成来源", `created_by` VARCHAR(32) NOT 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_bpv` (`tenant_id`, `blueprint_id`, `version_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="蓝图版本(change_delta 证明对话式改模型)"; CREATE TABLE IF NOT EXISTS `pbl_template` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `code` VARCHAR(64) NOT NULL COMMENT "模板编码", `title` VARCHAR(128) NOT NULL COMMENT "标题", `subject` VARCHAR(64) NOT NULL COMMENT "学科", `grade` VARCHAR(64) NOT NULL COMMENT "年级", `skeleton_json` LONGTEXT NULL COMMENT "骨架", `fallback_slot_json` LONGTEXT NULL COMMENT "兜底槽位(LLM不可用时填充)", `is_builtin` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "内置", `use_count` INT NOT NULL DEFAULT 0 COMMENT "实例化次数", `quality_state` VARCHAR(64) NOT 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_tpl_tenant_code` (`tenant_id`, `code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="PBL 模板(含离线兜底槽位)"; -- ===== pbl_validation (M2) ===== CREATE TABLE IF NOT EXISTS `pbl_validation_rule` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `code` VARCHAR(64) NOT NULL COMMENT "规则编码", `dimension` VARCHAR(64) NOT NULL COMMENT "维度", `title` VARCHAR(128) NOT NULL COMMENT "标题", `rule_json` LONGTEXT NULL COMMENT "规则体", `threshold_json` LONGTEXT NULL COMMENT "阈值(可配,Q-OPEN-8)", `severity` VARCHAR(64) NOT NULL COMMENT "严重度", `enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "启用", `version_no` INT NOT NULL DEFAULT 0 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_vr_code` (`tenant_id`, `code`, `version_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="校验规则(14 维,规则 JSON 形态 script_type=1)"; CREATE TABLE IF NOT EXISTS `pbl_validation_result` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图ID", `blueprint_version_no` INT NOT NULL DEFAULT 0 COMMENT "校验时版本", `dimension_count` INT NOT NULL DEFAULT 0 COMMENT "维度数(=14)", `passed_count` INT NOT NULL DEFAULT 0 COMMENT "通过数", `failed_count` INT NOT NULL DEFAULT 0 COMMENT "失败数", `score` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT "得分", `quality_state` VARCHAR(64) NOT NULL COMMENT "质量状态", `findings_json` LONGTEXT NULL COMMENT "逐维结论", `rule_set_version` VARCHAR(64) NOT NULL COMMENT "规则集版本", `created_by` VARCHAR(32) NOT 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`), KEY `idx_vres_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="校验结果(14 维 + 5 级质量状态)"; -- ===== pbl_compiler (M3) ===== CREATE TABLE IF NOT EXISTS `pbl_compiler_version` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `code` VARCHAR(64) NOT NULL COMMENT "版本编码", `semver` VARCHAR(64) NOT NULL COMMENT "语义化版本", `rules_hash` VARCHAR(32) NOT NULL COMMENT "规则集SHA256前缀", `entrypoint` VARCHAR(64) NOT NULL COMMENT "入口函数", `enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "启用", `notes` TEXT 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_cv_code` (`tenant_id`, `code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="编译器版本(29.6 确定性)"; CREATE TABLE IF NOT EXISTS `pbl_game_definition` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "来源蓝图", `blueprint_version_no` INT NOT NULL DEFAULT 0 COMMENT "蓝图版本", `compiler_version_id` BIGINT UNSIGNED NOT NULL COMMENT "编译版本", `content_fingerprint` VARCHAR(32) NOT NULL COMMENT "SHA-256 指纹", `definition_json` LONGTEXT NULL COMMENT "Game Definition 正文", `world_id` BIGINT UNSIGNED NOT NULL COMMENT "落库 world", `scene_id` BIGINT UNSIGNED NOT NULL COMMENT "落库 scene", `entity_count` INT NOT NULL DEFAULT 0 COMMENT "实体数", `event_count` INT NOT NULL DEFAULT 0 COMMENT "事件数", `quality_state` VARCHAR(64) NOT NULL COMMENT "编译时质量状态", `duration_ms` INT NOT NULL DEFAULT 0 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_gd_fp` (`tenant_id`, `content_fingerprint`), KEY `idx_gd_bp` (`tenant_id`, `blueprint_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="Game Definition(第9章 schema + 指纹)"; CREATE TABLE IF NOT EXISTS `pbl_capability_registry` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `capability_key` VARCHAR(64) NOT NULL COMMENT "能力键", `category` VARCHAR(64) NOT NULL COMMENT "分类", `args_schema_json` LONGTEXT NULL COMMENT "参数JSON Schema", `permission_required` VARCHAR(64) NOT NULL COMMENT "所需权限", `is_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "启用", `version_no` INT NOT NULL DEFAULT 0 COMMENT "版本", `description` TEXT 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_cap_key` (`tenant_id`, `capability_key`, `version_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="Capability Registry(第11章缺口补齐)"; -- ===== pbl_agent_runtime (M4) ===== CREATE TABLE IF NOT EXISTS `pbl_agent_def` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `code` VARCHAR(64) NOT NULL COMMENT "Agent编码", `agent_type` VARCHAR(64) NOT NULL COMMENT "类型", `name` VARCHAR(128) NOT NULL COMMENT "名称", `model_route` VARCHAR(64) NOT NULL COMMENT "pipeline-llm 路由", `system_prompt_txt` TEXT NULL COMMENT "提示词", `tool_whitelist_json` LONGTEXT NULL COMMENT "工具白名单", `permission_mode` VARCHAR(64) NOT NULL COMMENT "read/write 模式", `is_enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "启用", `version_no` INT NOT NULL DEFAULT 0 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_ad_code` (`tenant_id`, `code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="Agent 定义(Designer/Critic)"; CREATE TABLE IF NOT EXISTS `pbl_tool_registry` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `tool_key` VARCHAR(64) NOT NULL COMMENT "工具键", `title` VARCHAR(128) NOT NULL COMMENT "标题", `agent_scope` VARCHAR(64) NOT NULL COMMENT "作用域", `permission_required` VARCHAR(64) NOT NULL COMMENT "所需权限", `enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "启用", `params_schema_json` LONGTEXT NULL COMMENT "参数白名单Schema", `disabled_reason` VARCHAR(64) NOT NULL COMMENT "禁用原因", `version_no` INT NOT NULL DEFAULT 0 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_tr_key` (`tenant_id`, `tool_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="工具注册表(13 启用 / 9 禁用含 pbl.publish)"; CREATE TABLE IF NOT EXISTS `pbl_agent_trace` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `trace_uid` VARCHAR(32) NOT NULL COMMENT "轨迹UID", `agent_code` VARCHAR(64) NOT NULL COMMENT "Agent", `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "目标蓝图", `input_ref_json` LONGTEXT NULL COMMENT "要素1 输入引用", `thought_txt` TEXT NULL COMMENT "要素2 思考", `action_code` VARCHAR(64) NOT NULL COMMENT "要素3 动作", `action_params_json` LONGTEXT NULL COMMENT "要素4 动作参数", `observation_json` LONGTEXT NULL COMMENT "要素5 观察", `result_state` VARCHAR(64) NOT NULL COMMENT "要素6 结果状态", `llm_calls` INT NOT NULL DEFAULT 0 COMMENT "要素7 LLM调用数", `duration_ms` INT NOT NULL DEFAULT 0 COMMENT "耗时", `created_by` VARCHAR(32) NOT 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_at_uid` (`tenant_id`, `trace_uid`), KEY `idx_at_tenant` (`tenant_id`, `created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="Agent 执行轨迹(第28章 7 要素)"; CREATE TABLE IF NOT EXISTS `pbl_agent_tool_call` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `trace_id` BIGINT UNSIGNED NOT NULL COMMENT "轨迹ID", `tool_key` VARCHAR(64) NOT NULL COMMENT "工具键", `request_json` LONGTEXT NULL COMMENT "请求", `response_json` LONGTEXT NULL COMMENT "响应", `ok` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "成功", `error_code` VARCHAR(64) NOT NULL COMMENT "错误码", `adjudication_code` VARCHAR(64) NOT NULL COMMENT "裁决结论", `duration_ms` INT NOT NULL DEFAULT 0 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`), KEY `idx_tc_trace` (`tenant_id`, `trace_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="工具调用明细(服务端裁决留痕)"; CREATE TABLE IF NOT EXISTS `pbl_approval` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `approval_uid` VARCHAR(32) NOT NULL COMMENT "审批UID", `approval_type` VARCHAR(64) NOT NULL COMMENT "类型", `target_type` VARCHAR(64) NOT NULL COMMENT "对象类型", `target_id` BIGINT UNSIGNED NOT NULL COMMENT "对象ID", `payload_json` LONGTEXT NULL COMMENT "变更内容", `status` VARCHAR(64) NOT NULL COMMENT "状态", `requested_by` VARCHAR(32) NOT NULL COMMENT "发起人", `decided_by` VARCHAR(32) NOT NULL COMMENT "决策人", `decided_at` DATETIME NULL NULL COMMENT "决策时间", `comment_txt` TEXT 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_ap_uid` (`tenant_id`, `approval_uid`), KEY `idx_ap_status` (`tenant_id`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="人工审批单(14.2 四类,无绕过路径)"; CREATE TABLE IF NOT EXISTS `pbl_llm_call_log` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `call_uid` VARCHAR(32) NOT NULL COMMENT "调用UID", `agent_code` VARCHAR(64) NOT NULL COMMENT "Agent", `route` VARCHAR(64) NOT NULL COMMENT "路由", `model` VARCHAR(64) NOT NULL COMMENT "实际模型", `prompt_hash` VARCHAR(32) NOT NULL COMMENT "提示词哈希", `completion_tokens` INT NOT NULL DEFAULT 0 COMMENT "tokens", `latency_ms` INT NOT NULL DEFAULT 0 COMMENT "时延", `status` VARCHAR(64) NOT NULL COMMENT "状态", `error_code` VARCHAR(64) NOT NULL COMMENT "错误码", `fallback_used` TINYINT(1) NOT NULL DEFAULT 0 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_lc_uid` (`tenant_id`, `call_uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="LLM 调用日志(超时/重试/限流/兜底留痕)"; -- ===== pbl_evidence (M5) ===== CREATE TABLE IF NOT EXISTS `pbl_artifact` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `artifact_uid` VARCHAR(32) NOT NULL COMMENT "产出UID", `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图", `team_id` BIGINT UNSIGNED NOT NULL COMMENT "团队", `creator_id` VARCHAR(32) NOT NULL COMMENT "作者", `title` VARCHAR(128) NOT NULL COMMENT "标题", `artifact_type` VARCHAR(64) NOT NULL COMMENT "类型", `content_json` LONGTEXT NULL COMMENT "内容", `version_no` INT NOT NULL DEFAULT 0 COMMENT "版本", `status` VARCHAR(64) NOT NULL COMMENT "状态", `submitted_at` DATETIME NULL 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_art_uid` (`tenant_id`, `artifact_uid`), KEY `idx_art_session` (`tenant_id`, `session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="学生产出物(版本内联 version_no)"; CREATE TABLE IF NOT EXISTS `pbl_evidence` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `artifact_id` BIGINT UNSIGNED NOT NULL COMMENT "产出物", `evidence_type` VARCHAR(64) NOT NULL COMMENT "证据类型", `source_event_id` VARCHAR(32) NOT NULL COMMENT "来源 runtime_event", `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `learner_id` VARCHAR(32) NOT NULL COMMENT "学习者", `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图", `payload_json` LONGTEXT NULL COMMENT "证据体", `occurred_at` DATETIME NOT NULL COMMENT "发生时间", `dedup_key` VARCHAR(32) NOT 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_ev_dedup` (`tenant_id`, `source_event_id`, `evidence_type`), KEY `idx_ev_learner` (`tenant_id`, `learner_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="学习证据(幂等采集,唯一索引防重)"; -- ===== pbl_assessment (M6) ===== CREATE TABLE IF NOT EXISTS `pbl_rubric` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `code` VARCHAR(64) NOT NULL COMMENT "编码", `title` VARCHAR(128) NOT NULL COMMENT "标题", `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图", `criteria_json` LONGTEXT NULL COMMENT "准则数组(含 learning_goal_id/weight)", `total_weight` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT "权重合计", `version_no` INT NOT NULL DEFAULT 0 COMMENT "版本", `status` VARCHAR(64) NOT NULL COMMENT "状态", `approval_id` BIGINT UNSIGNED NOT 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_ru_code` (`tenant_id`, `code`, `version_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="Rubric(准则内联 criteria_json,权重合计=100%)"; CREATE TABLE IF NOT EXISTS `pbl_assessment_record` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `record_uid` VARCHAR(32) NOT NULL COMMENT "记录UID", `learner_id` VARCHAR(32) NOT NULL COMMENT "学习者", `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图", `artifact_id` BIGINT UNSIGNED NOT NULL COMMENT "产出物", `evidence_id` BIGINT UNSIGNED NOT NULL COMMENT "主证据", `rubric_id` BIGINT UNSIGNED NOT NULL COMMENT "Rubric", `scores_json` LONGTEXT NULL COMMENT "逐准则得分", `total_score` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT "加权总分", `max_score` DECIMAL(18,2) NOT NULL DEFAULT 0 COMMENT "满分", `band` VARCHAR(64) NOT NULL COMMENT "等级", `alignment_json` LONGTEXT NULL COMMENT "与学习目标对齐", `feedback_txt` TEXT NULL COMMENT "反馈", `assessor_type` VARCHAR(64) NOT NULL COMMENT "评估者类型", `assessor_id` VARCHAR(32) NOT 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_ar_uid` (`tenant_id`, `record_uid`), KEY `idx_ar_learner` (`tenant_id`, `learner_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="评估记录(total_score 派生 + 对齐判定)"; -- ===== pbl_kdb_ext (M7) ===== CREATE TABLE IF NOT EXISTS `pbl_kdb_item` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `code` VARCHAR(64) NOT NULL COMMENT "条目编码", `item_type` VARCHAR(64) NOT NULL COMMENT "类型", `title` VARCHAR(128) NOT NULL COMMENT "标题", `summary_txt` TEXT NULL COMMENT "摘要", `payload_json` LONGTEXT NULL COMMENT "内容(无向量,Q-OPEN-5)", `source` VARCHAR(64) NOT NULL COMMENT "来源", `is_write_locked` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "写锁(恒1)", `status` VARCHAR(64) NOT NULL COMMENT "状态", `version_no` INT NOT NULL DEFAULT 0 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_kdb_code` (`tenant_id`, `code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="KDB 条目(建表不写入,is_write_locked 恒 1)"; CREATE TABLE IF NOT EXISTS `pbl_kdb_query_log` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `query_uid` VARCHAR(32) NOT NULL COMMENT "查询UID", `caller_type` VARCHAR(64) NOT NULL COMMENT "调用方类型", `caller_id` VARCHAR(32) NOT NULL COMMENT "调用方", `query_json` LONGTEXT NULL COMMENT "查询条件", `hit_count` INT NOT NULL DEFAULT 0 COMMENT "命中数", `latency_ms` INT NOT NULL DEFAULT 0 COMMENT "时延", `ok` TINYINT(1) NOT NULL DEFAULT 0 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_kql_uid` (`tenant_id`, `query_uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="KDB 检索日志(只读侧留痕)"; -- ===== pbl_domain_ext (M8) ===== CREATE TABLE IF NOT EXISTS `pbl_tenant` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `tenant_uid` VARCHAR(32) NOT NULL COMMENT "租户UID", `name` VARCHAR(128) NOT NULL COMMENT "名称", `kind` VARCHAR(64) NOT NULL COMMENT "类型", `plan` VARCHAR(64) NOT NULL COMMENT "套餐", `seat_limit` INT NOT NULL DEFAULT 0 COMMENT "席位", `status` VARCHAR(64) NOT NULL COMMENT "状态", `config_json` LONGTEXT 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_ten_uid` (`tenant_id`, `tenant_uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="租户(多租户边界第25章,不改基表)"; CREATE TABLE IF NOT EXISTS `pbl_class` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `class_uid` VARCHAR(32) NOT NULL COMMENT "班级UID", `name` VARCHAR(128) NOT NULL COMMENT "名称", `grade` VARCHAR(64) NOT NULL COMMENT "年级", `teacher_id` VARCHAR(32) NOT NULL COMMENT "教师", `student_count` INT NOT NULL DEFAULT 0 COMMENT "学生数", `roster_json` LONGTEXT NULL COMMENT "花名册", `status` VARCHAR(64) NOT 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_cls_uid` (`tenant_id`, `class_uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="班级(花名册内联 roster_json)"; CREATE TABLE IF NOT EXISTS `pbl_team` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `team_uid` VARCHAR(32) NOT NULL COMMENT "团队UID", `class_id` BIGINT UNSIGNED NOT NULL COMMENT "班级", `name` VARCHAR(128) NOT NULL COMMENT "名称", `mission_id` BIGINT UNSIGNED NOT NULL COMMENT "Mission", `members_json` LONGTEXT NULL COMMENT "成员", `capacity` INT NOT NULL DEFAULT 0 COMMENT "容量", `status` VARCHAR(64) NOT NULL COMMENT "状态", `session_id` BIGINT UNSIGNED NOT 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_team_uid` (`tenant_id`, `team_uid`), KEY `idx_team_class` (`tenant_id`, `class_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="团队(成员内联 members_json,不改基表)"; -- ===== pbl_scense_ext (M9) ===== CREATE TABLE IF NOT EXISTS `pbl_session_member` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `user_id` VARCHAR(32) NOT NULL COMMENT "用户", `role_code` VARCHAR(64) NOT NULL COMMENT "角色", `team_id` BIGINT UNSIGNED NOT NULL COMMENT "团队", `joined_at` DATETIME NULL NULL COMMENT "加入时间", `last_seen_at` DATETIME NULL NULL COMMENT "心跳", `state_version` BIGINT NOT NULL DEFAULT 0 COMMENT "已见状态版本", `status` VARCHAR(64) NOT 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_sm` (`tenant_id`, `session_id`, `user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="会话成员(复用 world_session,不污染基表)"; CREATE TABLE IF NOT EXISTS `pbl_playtest_feedback` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `user_id` VARCHAR(32) NOT NULL COMMENT "用户", `blueprint_id` BIGINT UNSIGNED NOT NULL COMMENT "蓝图", `feedback_type` VARCHAR(64) NOT NULL COMMENT "类型", `rating` INT NOT NULL DEFAULT 0 COMMENT "评分", `content_txt` TEXT NULL COMMENT "内容", `context_json` LONGTEXT NULL COMMENT "上下文", `handled` TINYINT(1) NOT NULL DEFAULT 0 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`), KEY `idx_pf_session` (`tenant_id`, `session_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="Playtest 反馈/反思(reflection 走证据链外的轻量表)"; CREATE TABLE IF NOT EXISTS `pbl_ui_page_registry` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `page_key` VARCHAR(64) NOT NULL COMMENT "页面键", `title` VARCHAR(128) NOT NULL COMMENT "标题", `route` VARCHAR(64) NOT NULL COMMENT "路由", `widget_type` VARCHAR(64) NOT NULL COMMENT "渲染组件", `requires_role` VARCHAR(64) NOT NULL COMMENT "所需角色", `budget_ms` INT NOT NULL DEFAULT 0 COMMENT "渲染预算", `enabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT "启用", `meta_json` LONGTEXT 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_upr_key` (`tenant_id`, `page_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="前端覆盖层页面注册(12 页面 + 时延预算)"; -- ===== pbl_runtime_ext (M11) ===== CREATE TABLE IF NOT EXISTS `pbl_runtime_event` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `event_uid` VARCHAR(32) NOT NULL COMMENT "事件UID", `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `world_id` BIGINT UNSIGNED NOT NULL COMMENT "世界", `actor_id` VARCHAR(32) NOT NULL COMMENT "触发者", `event_type` VARCHAR(64) NOT NULL COMMENT "事件类型", `payload_json` LONGTEXT NULL COMMENT "事件体", `causation_id` VARCHAR(32) NOT NULL COMMENT "因果链", `state_version` BIGINT NOT NULL DEFAULT 0 COMMENT "状态版本", `seq` BIGINT NOT NULL DEFAULT 0 COMMENT "会话内单调序号", `occurred_at` DATETIME NOT 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_re_uid` (`tenant_id`, `event_uid`, `occurred_at`), KEY `idx_re_session_seq` (`tenant_id`, `session_id`, `seq`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="运行时事件(append-only,按月 RANGE 分区)", KEY `idx_re_part` (`occurred_at`) PARTITION BY RANGE COLUMNS(`occurred_at`) ( PARTITION p2026 VALUES LESS THAN ('2026-01-01'), PARTITION p2027 VALUES LESS THAN ('2027-01-01'), PARTITION p2028 VALUES LESS THAN ('2028-01-01'), PARTITION p2029 VALUES LESS THAN ('2029-01-01'), PARTITION p2030 VALUES LESS THAN ('2030-01-01'), PARTITION p2031 VALUES LESS THAN ('2031-01-01') PARTITION pmax VALUES LESS THAN (MAXVALUE) ); CREATE TABLE IF NOT EXISTS `pbl_entity_state` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `entity_id` VARCHAR(32) NOT NULL COMMENT "实体标识", `state_json` LONGTEXT NULL COMMENT "状态", `state_version` BIGINT NOT NULL DEFAULT 0 COMMENT "单调版本", `checksum` VARCHAR(32) NOT NULL COMMENT "状态摘要", `updated_by` VARCHAR(32) NOT 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_es` (`tenant_id`, `session_id`, `entity_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="实体状态(服务端权威,state_version 客户端禁写)"; CREATE TABLE IF NOT EXISTS `pbl_world_state_snapshot` ( `tenant_id` VARCHAR(32) NOT NULL NOT NULL COMMENT 租户ID(强制打头), `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 主键, `session_id` BIGINT UNSIGNED NOT NULL COMMENT "会话", `snapshot_uid` VARCHAR(32) NOT NULL COMMENT "快照UID", `state_fingerprint` VARCHAR(32) NOT NULL COMMENT "状态指纹", `entities_json` LONGTEXT NULL COMMENT "实体集", `events_through_seq` BIGINT NOT NULL DEFAULT 0 COMMENT "截至序号", `reason` VARCHAR(64) NOT 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_wss_uid` (`tenant_id`, `snapshot_uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT="世界状态快照(掉线补齐/离线兜底)"; -- ===== 枚举 6+2 组由 pbl_appcodes.load_pbl_appcodes() 幂等注入 appcodes,本文件不含 INSERT =====