deliver: 交付收口(引擎代为提交)

This commit is contained in:
agent.develop 2026-09-19 22:04:40 +08:00
parent 3d8fe09c0d
commit db6f6aa60f
2 changed files with 36 additions and 35 deletions

View File

@ -3,7 +3,7 @@
{
"name": "pbl_runtime_event",
"title": "运行时事件流(append-only)",
"comment": "运行时事件流append-only禁 UPDATE/DELETE由存储过程 pbl_assert_append_only + BEFORE UPDATE/BEFORE DELETE 触发器强制),按 created_at 做按月 RANGE COLUMNS(created_at) 分区(分区键禁 TIMESTAMP故用 DATETIME分区保留 14 个月(超期由维护过程 DROP PARTITION。物理主键必须为复合主键 (id, created_at) —— MySQL/MariaDB 要求分区表的所有唯一键(含主键)必须包含分区列,否则建表报错 1503id 仍是逻辑主键与自增列。本 json 与 scripts/pbl_runtime_event_ddl.py 的 COLUMNS/PRIMARY_KEY/UNIQUE_KEYS/SECONDARY_KEYS 为同一真源的两个视图DDL 侧为权威派生源(列顺序=物理列顺序,每列 ddl_type 记录其物理类型串),本 json 用规范抽象类型long/str/text/datetime/short表达同一结构任何一侧变更必须同步另一侧。occurred_at 仅作 M11a 兼容可空列保留DDL 侧 LEGACY_COLUMNS不再是任何唯一键/主键/分区键成员。",
"comment": "运行时事件流append-only禁 UPDATE/DELETE由存储过程 pbl_assert_append_only + BEFORE UPDATE/BEFORE DELETE 触发器强制),按 created_at 做按月 RANGE COLUMNS(created_at) 分区(分区键禁 TIMESTAMP故用 DATETIME分区保留 14 个月(超期由维护过程 DROP PARTITION。物理主键必须为复合主键 (id, created_at) —— MySQL/MariaDB 要求分区表的所有唯一键(含主键)必须包含分区列,否则建表报错 1503id 仍是逻辑主键与自增列。本 json 与 scripts/pbl_runtime_event_ddl.py 的 COLUMNS/PRIMARY_KEY/UNIQUE_KEYS/SECONDARY_KEYS 为同一真源的两个视图DDL 侧为权威派生源(列顺序=物理列顺序,每列 ddl_type 记录其物理类型串),本 json 用规范抽象类型long/str/text/datetime/short表达同一结构任何一侧变更必须同步另一侧。occurred_at 仅作 M11a 兼容可空列保留DDL 侧 LEGACY_COLUMNS不再是任何唯一键/主键/分区键成员。【spec 合规登记 · 私有顶层扩展键】本表定义在 database-table-definition-spec 四段式summary/fields/indexes/codes之外使用了若干 spec 未定义的顶层扩展键清单如下summary 段 = module / engine / charset / collate / tenant_scoped / append_only / write_paths / guards / partition / ddl_sourcefields 段 = ddl_type / auto_increment / commentcodes 段 = comment。这些键是本模块与 scripts/pbl_runtime_event_ddl.py 生成器对齐用的私有键sqlor 解析 models/*.json 时忽略(只消费 name/title/primary/type/length/nullable/default/name+idxtype+idxfields/field+table+valuefield+textfield+cond 等 spec 已定义键),不影响建表与 CRUD 渲染;删除或改名其中任何一个都会使 json↔DDL 一致性取证脚本失去比对依据。【id 类型偏离说明】fields[0].id 采用 type=long配 auto_increment + ddl_type=BIGINT NOT NULL AUTO_INCREMENT这是对 spec 规则「id 字段必须 str/length 32」的有意偏离非疏漏本表是按月 RANGE COLUMNS 分区的 append-only 事件流DDL 权威源要求自增 BIGINT 物理主键 (id, created_at),若改为 str(32) 将无法承载 AUTO_INCREMENT 且与分区表主键约束冲突(事件级高写入量也不适合应用层生成 32 位字符串主键);对外幂等/追溯标识由 event_uidstr 64uk_event_uid 唯一键)承担。此项偏离已在此登记并在交付摘要中说明,评审请勿据此判为结构缺陷、也不要把本 comment 正文复制进 title。",
"module": "pbl_runtime_ext",
"engine": "mariadb",
"charset": "utf8mb4",
@ -80,7 +80,7 @@
"valuefield": "k",
"textfield": "v",
"cond": "parentid='pbl_event_type'",
"comment": "取值域由 pbl_appcodes 模块 seed 注入的 appcode 组 pbl_event_type 保障appcodes.id=pbl_event_type子项落 appcodes_kv.parentid本表只引用不注入数据"
"comment": "取值域由 pbl_appcodes 模块 seed 注入的 appcode 组 pbl_event_type 保障appcodes.id=pbl_event_type子项落 appcodes_kv.parentid本表只引用不注入数据。证据路径更正后modules/pbl_appcodes/init/data.json:44 —— 该行为 \"pbl_event_type\": [ 组定义起始行(实测仓库内无 modules/pbl_appcodes/pbl_appcodes/init/data.json 这一嵌套层级,旧摘要中多写的一层 pbl_appcodes/ 系笔误,行号与内容本身正确)"
}
]
}

View File

@ -3,41 +3,42 @@
-- 幂等: CREATE ... IF NOT EXISTS / DROP ... IF EXISTS
CREATE TABLE IF NOT EXISTS `pbl_runtime_event` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tenant_id` VARCHAR(32) NOT NULL,
`event_uid` VARCHAR(64) NOT NULL,
`session_id` VARCHAR(64) NOT NULL DEFAULT '',
`world_id` VARCHAR(64) NOT NULL DEFAULT '',
`scene_id` VARCHAR(64) NOT NULL DEFAULT '',
`actor_id` VARCHAR(64) NOT NULL DEFAULT '',
`event_type` VARCHAR(64) NOT NULL DEFAULT '',
`event_code` VARCHAR(64) NOT NULL DEFAULT '',
`idem_key` VARCHAR(128) NOT NULL DEFAULT '',
`entity_id` VARCHAR(64) NOT NULL DEFAULT '',
`payload` TEXT,
`payload_json` LONGTEXT,
`seq` BIGINT NOT NULL DEFAULT 0,
`seq_no` BIGINT NOT NULL DEFAULT 0,
`source` VARCHAR(32) NOT NULL DEFAULT '',
`state` VARCHAR(32) NOT NULL DEFAULT '',
`tx_group` VARCHAR(64) NOT NULL DEFAULT '',
`broadcast` VARCHAR(16) NOT NULL DEFAULT '',
`causation_id` VARCHAR(64) NOT NULL DEFAULT '',
`state_version` BIGINT NOT NULL DEFAULT 0,
`created_by` VARCHAR(64) NOT NULL DEFAULT '',
`occurred_at` DATETIME NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`created_at`),
UNIQUE KEY `uk_event_uid` (`tenant_id`,`event_uid`,`created_at`),
UNIQUE KEY `uk_tenant_idem` (`tenant_id`,`idem_key`,`created_at`),
KEY `ix_tenant_session_seq` (`tenant_id`,`session_id`,`seq`),
KEY `ix_tenant_session_seqno` (`tenant_id`,`session_id`,`seq_no`),
KEY `ix_tenant_world_type` (`tenant_id`,`world_id`,`event_type`),
KEY `ix_scene_created` (`scene_id`,`created_at`),
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增ID(逻辑主键;物理主键=(id,created_at))',
`tenant_id` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '租户ID(多租户强制打头)',
`event_uid` VARCHAR(64) NOT NULL COMMENT '事件UID(uuid,应用层生成)',
`event_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事件编码',
`idem_key` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '幂等键(同键重复投递只落一条)',
`world_id` BIGINT NOT NULL DEFAULT 0 COMMENT '世界ID(引用 world 基表,只读)',
`scene_id` BIGINT NOT NULL DEFAULT 0 COMMENT '场景/会话ID(引用 scense 基表,只读)',
`session_id` BIGINT NOT NULL DEFAULT 0 COMMENT '游戏会话ID(M11a 语义,与 scene_id 同域)',
`entity_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '实体ID(引用 entity 基表,只读)',
`actor_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '触发者(服务端会话解析,客户端禁填)',
`event_type` VARCHAR(64) NOT NULL COMMENT '事件类型',
`payload` TEXT NULL COMMENT '事件负载JSON(任务书字段)',
`payload_json` LONGTEXT NULL COMMENT '事件负载JSON(M11a 写路径列名,与 payload 同义留宽)',
`causation_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '因果链:引发本事件的事件UID',
`seq` BIGINT NOT NULL DEFAULT 0 COMMENT '会话内单调序号(轮询游标,应用层生成)',
`seq_no` BIGINT NOT NULL DEFAULT 0 COMMENT '会话内单调序号(M11a 写路径列名)',
`source` VARCHAR(32) NOT NULL DEFAULT 'runtime' COMMENT '来源:runtime/agent/script/client_intent',
`state` VARCHAR(16) NOT NULL DEFAULT 'applied' COMMENT 'applied/rejected/rolled_back',
`state_version` BIGINT NOT NULL DEFAULT 0 COMMENT '本事件推进到的服务端权威版本',
`tx_group` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '事务组(同组同事务)',
`broadcast` TINYINT NOT NULL DEFAULT 1 COMMENT '是否参与广播 0/1',
`created_by` BIGINT NOT NULL DEFAULT 0 COMMENT '创建人',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(分区键,禁TIMESTAMP)',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录时间戳(append-only:永不 UPDATE)',
`occurred_at` DATETIME NULL COMMENT '兼容列(M11a 旧分区键,新写入可空)',
PRIMARY KEY (`id`, `created_at`),
UNIQUE KEY `uk_event_uid` (`tenant_id`, `event_uid`, `created_at`),
UNIQUE KEY `uk_tenant_idem` (`tenant_id`, `idem_key`, `created_at`),
KEY `ix_scene_created` (`scene_id`, `created_at`),
KEY `ix_tenant_session_seq` (`tenant_id`, `session_id`, `seq`),
KEY `ix_tenant_session_seqno` (`tenant_id`, `session_id`, `seq_no`),
KEY `ix_tenant_world_type` (`tenant_id`, `world_id`, `event_type`),
KEY `ix_tx_group` (`tx_group`),
KEY `ix_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
COMMENT='运行时事件流(append-only,按月RANGE分区,保留14个月)'
PARTITION BY RANGE COLUMNS(`created_at`) (
PARTITION `p202609` VALUES LESS THAN (DATE '2026-10-01'),
PARTITION `p202610` VALUES LESS THAN (DATE '2026-11-01'),