-- pbl_agent_runtime M4a DDL(自动生成,勿手改) -- 生成源:pbl_agent_runtime/m4a_tables.py(四段式表定义 → to_sql) -- 表:pbl_agent_def / pbl_agent_tool / pbl_agent_trace(append-only) / pbl_agent_trace_stage(append-only) / pbl_agent_approval -- 工具注册表 seed:13 enabled + 9 disabled(scripts/seed_m4a.py 幂等注入,build.sh 调用) CREATE TABLE IF NOT EXISTS `pbl_agent_def` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID(强制打头)', `agent_code` VARCHAR(128) NOT NULL COMMENT 'Agent 编码:designer / critic', `agent_name` VARCHAR(128) COMMENT 'Agent 名称', `agent_type` VARCHAR(64) COMMENT '类型:authoring(设计) / review(评审)', `loop_pattern` VARCHAR(128) COMMENT '循环模式:observe_think_propose[_execute]', `authority_boundary` TEXT COMMENT '权威边界说明(Agent 非真相源,14.1)', `write_allowed` TINYINT(1) NOT NULL DEFAULT 0 DEFAULT 0 COMMENT '是否允许写操作:designer=1 / critic=0', `allowed_tools` LONGTEXT COMMENT '该 Agent 可调用的 tool_code 白名单(JSON 数组)', `denied_tools` LONGTEXT COMMENT '显式黑名单(JSON 数组,优先级高于 allowed)', `model_binding` LONGTEXT COMMENT '模型绑定:{model,capability,fallback}', `offline_fallback` VARCHAR(64) COMMENT '模型不可达兜底策略:template_fallback / none', `status` VARCHAR(64) DEFAULT 'enabled' COMMENT '状态:enabled / disabled', `description` TEXT COMMENT '说明', `created_by` VARCHAR(64) COMMENT '创建人', `created_at` DATETIME COMMENT '创建时间', `updated_at` DATETIME COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_agent_def` (`tenant_id`, `agent_code`), KEY `idx_agent_def_status` (`tenant_id`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Agent 定义表:本迭代仅 designer / critic 两个(第 13.1 章)。write_allowed=0 表示零写权限(Critic,14.1 不直接修改 Blueprint)。'; CREATE TABLE IF NOT EXISTS `pbl_agent_tool` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID(强制打头)', `tool_code` VARCHAR(128) NOT NULL COMMENT '工具编码,如 blueprint.create', `tool_name` VARCHAR(128) COMMENT '工具名称', `tool_group` VARCHAR(64) COMMENT '分组:blueprint/template/validation/critic/trace/approval/compile/kdb/publish/marketplace/experiments/agent/world', `status` VARCHAR(64) NOT NULL DEFAULT 'disabled' COMMENT '状态:enabled / disabled', `required_permission` VARCHAR(128) COMMENT '所需权限域:pbl_authoring / agent_tools / publishing / kdb / platform_admin', `require_approval` TINYINT(1) NOT NULL DEFAULT 0 DEFAULT 0 COMMENT '是否强制人工审批(14.2)', `approval_action_type` VARCHAR(64) COMMENT '强制审批类别:publish / compile_execute / blueprint_approve / tool_registry_change', `allowed_agents` LONGTEXT COMMENT '允许调用的 agent_code 列表(JSON 数组)', `write_operation` TINYINT(1) NOT NULL DEFAULT 0 DEFAULT 0 COMMENT '是否写操作(Critic 零写权限据此拒绝)', `input_schema` LONGTEXT COMMENT '入参 JSON Schema(S8 契约校验)', `output_schema` LONGTEXT COMMENT '出参 JSON Schema', `backend_mapping` VARCHAR(255) COMMENT '后端权威服务映射,如 pbl_blueprint.create_blueprint', `disable_reason` TEXT COMMENT '禁用原因(disabled 时必填,out_of_scope 锚点)', `scope_note` TEXT COMMENT '范围备注(Phase / owner 决策锚点)', `sort_no` INT COMMENT '排序号', `created_by` VARCHAR(64) COMMENT '创建人', `created_at` DATETIME COMMENT '创建时间', `updated_at` DATETIME COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_agent_tool` (`tenant_id`, `tool_code`), KEY `idx_tool_status` (`tenant_id`, `status`), KEY `idx_tool_group` (`tenant_id`, `tool_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Agent 工具注册表:第 31 章裁剪子集(13 enabled + 9 disabled)。fail-closed default-deny:仅本表 enabled 记录可被 invoke_tool 执行;disabled 记录保留 disable_reason 供审计与拒绝回执。'; CREATE TABLE IF NOT EXISTS `pbl_agent_trace` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID(强制打头)', `trace_no` VARCHAR(128) NOT NULL COMMENT '轨迹编号(业务主键)', `agent_code` VARCHAR(64) COMMENT '产生轨迹的 Agent:designer / critic', `session_no` VARCHAR(128) COMMENT '会话号(多轮对话归并)', `status` VARCHAR(64) DEFAULT 'open' COMMENT '轨迹状态:open / done / deny', `step_reached` VARCHAR(64) COMMENT '裁决链到达步:S1~S8 / EXECUTED', `deny_code` VARCHAR(64) COMMENT '拒绝错误码(被拒时填)', `deny_reason` TEXT COMMENT '拒绝原因(含 disable_reason / 越权说明)', `input_context` LONGTEXT COMMENT '① 输入上下文', `retrieved_knowledge` LONGTEXT COMMENT '② 检索到的知识(含 KDB 桩降级路径)', `tool_calls` LONGTEXT COMMENT '③ 工具调用(入参+出参,含被拒调用)', `proposed_action` LONGTEXT COMMENT '④ 提案动作(Agent 只 Propose,14.1)', `result` LONGTEXT COMMENT '⑤ 执行结果(allow/deny + 结果体)', `approval` LONGTEXT COMMENT '⑥ 审批信息(approval_no/status/approver)', `final_output` LONGTEXT COMMENT '⑦ 最终输出', `created_by` VARCHAR(64) COMMENT '创建人', `created_at` DATETIME COMMENT '创建时间', `appended_at` DATETIME COMMENT '最后追加时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_trace_no` (`tenant_id`, `trace_no`), KEY `idx_trace_agent` (`tenant_id`, `agent_code`, `created_at`), KEY `idx_trace_session` (`tenant_id`, `session_no`), KEY `idx_trace_status` (`tenant_id`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Agent 执行轨迹(第 28 章 7 要素,US-20 可查不可篡改)。append-only:无 update/delete 对外接口,DB 层 append_only 标记,要素只能追加;已完成(done/deny)轨迹再追加 → PBL_E_APPEND_ONLY。 [APPEND-ONLY: 禁止 UPDATE/DELETE]'; CREATE TABLE IF NOT EXISTS `pbl_agent_trace_stage` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID', `trace_no` VARCHAR(128) NOT NULL COMMENT '轨迹编号', `stage` VARCHAR(64) NOT NULL COMMENT '要素名(7 要素之一)', `payload` LONGTEXT COMMENT '要素内容', `seq_no` INT COMMENT '追加序号(同轨迹内自增)', `created_at` DATETIME COMMENT '追加时间', PRIMARY KEY (`id`), KEY `idx_stage_trace` (`tenant_id`, `trace_no`, `seq_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='轨迹要素追加流水:每次 append_trace 落一行,只增不改不删,用于举证 7 要素逐条可查与追加顺序(US-20)。 [APPEND-ONLY: 禁止 UPDATE/DELETE]'; CREATE TABLE IF NOT EXISTS `pbl_agent_approval` ( `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` VARCHAR(64) NOT NULL COMMENT '租户ID(强制打头)', `approval_no` VARCHAR(128) NOT NULL COMMENT '审批单号(业务主键)', `trace_id` INT COMMENT '关联轨迹ID', `trace_no` VARCHAR(128) COMMENT '关联轨迹编号', `agent_code` VARCHAR(64) COMMENT '提案 Agent', `action_type` VARCHAR(64) NOT NULL COMMENT '审批类别(四类之一)', `tool_code` VARCHAR(128) COMMENT '触发审批的工具编码', `object_type` VARCHAR(64) COMMENT '对象类型:blueprint / tool / compile_task', `object_id` VARCHAR(128) COMMENT '对象ID', `action_payload` LONGTEXT COMMENT '提案内容快照(审批人据此判断)', `status` VARCHAR(64) NOT NULL DEFAULT 'pending' COMMENT '状态:pending / approved / rejected / expired', `requester_type` VARCHAR(64) COMMENT '提案方类型:agent / user', `requester_id` VARCHAR(64) COMMENT '提案方ID', `approver_id` VARCHAR(64) COMMENT '指定审批人(可空=任一授权人)', `approver_type` VARCHAR(64) COMMENT '实际审批人类型(必须 user)', `decided_by` VARCHAR(64) COMMENT '实际审批人ID', `decided_at` DATETIME COMMENT '审批时间', `comment` TEXT COMMENT '审批意见', `expires_at` DATETIME COMMENT '过期时间(过期后 pending 视为无效)', `created_at` DATETIME COMMENT '创建时间', `updated_at` DATETIME COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_approval_no` (`tenant_id`, `approval_no`), KEY `idx_approval_pending` (`tenant_id`, `status`, `approver_id`), KEY `idx_approval_trace` (`tenant_id`, `trace_no`), KEY `idx_approval_action` (`tenant_id`, `action_type`, `status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='人工审批单(14.2):四类强制审批 publish / compile_execute / blueprint_approve / tool_registry_change。Agent 不可自批:decide_approval 仅 actor_type=user 可调用。';