✨ feat: WP-03 三界归真作用域与消息版本谱系(ADR-020 落地)
- 迁移 5:conversation.realm(默认真界,检查约束);message.realm 快照、canonized_at、parent_message_id 自引用与 variant_kind(origin/revision/candidate)
- 界域端点:GET conversation(realm/当前分支)与 POST realm(入境/出境显式切换,留审计——ADR-020 切换必须可见)
- 归真端点 POST /v1/messages/{id}/canonizations:scope 必须与消息界域一致(不一致 422);幂等(重复归真 200 原状态);境界归真产出 world.canonized Outbox 事件(世界知识候选入口,WP-04 消费);幻境归真仅标记试演记录
- 编辑版本 POST /v1/messages/{id}/revisions:新消息 variant=revision 引用原消息(markdown 修订同样经灵台引擎规范化),原消息永不修改
- 测试 44 项全绿(+8):界域快照、归真正/反/幂等、幻境试演、revision 原消息不变、跨域 401/403/404 fail-closed
This commit is contained in:
1 parent
37c53862c4
commit
603a683c14
6 files changed
+432
-6
No files matched your search
@@ -0,0 +1,42 @@
|
||||
"""三界作用域与消息版本谱系
|
||||
|
||||
Revision ID: 8f48659a83f6
|
||||
Revises: 5cf6d328c10a
|
||||
Create Date: 2026-09-10 13:22:56.404702
|
||||
|
||||
"""
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision: str = '8f48659a83f6'
|
||||
down_revision: str | Sequence[str] | None = '5cf6d328c10a'
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""Upgrade schema."""
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('conversation', sa.Column('realm', sa.String(), nullable=False))
|
||||
op.add_column('message', sa.Column('realm', sa.String(), nullable=False))
|
||||
op.add_column('message', sa.Column('canonized_at', sa.DateTime(timezone=True), nullable=True))
|
||||
op.add_column('message', sa.Column('parent_message_id', sa.String(), nullable=True))
|
||||
op.add_column('message', sa.Column('variant_kind', sa.String(), nullable=False))
|
||||
op.create_foreign_key(op.f('fk_message_message'), 'message', 'message', ['parent_message_id'], ['id'], ondelete='set null')
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""Downgrade schema."""
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_constraint(op.f('fk_message_message'), 'message', type_='foreignkey')
|
||||
op.drop_column('message', 'variant_kind')
|
||||
op.drop_column('message', 'parent_message_id')
|
||||
op.drop_column('message', 'canonized_at')
|
||||
op.drop_column('message', 'realm')
|
||||
op.drop_column('conversation', 'realm')
|
||||
# ### end Alembic commands ###
|
||||
Reference in new issue
Block a user