- 缘契域 domains/yuanqi:covenants(当前版)+ covenant_events(不可变历史);提议—问心—铭契—撤回全链;边界变更立即生效;多维关系并存,服务层拒绝 affinity/好感度单一键;浪漫维度成人资格标记位 - 道体铸魂与分灵 domains/jingsheng/soul.py:soul_forgings 确认流(锚点变更 pending→confirmed 应用并签发新魂籍版本,确认前人物锚点不变);分灵创建新人物(继承资料与谱系 lineage 链、不继承原身份,魂籍从 v1 起) - 河图域 domains/hetu:persistent_worlds 境界 + world_entities/world_relations 境界作用域重建 + 世谱挂接;境界正史视图(scope=persistent_world 归真集合);canonize 后置推进正史计数 - 三界分流:reality→息壤提取(不变);persistent_world→境界实录+正史推进;simulation→只记试演实录;factual_records 增 scope 列——境界/幻境实录与真界本相隔离 - 正影打通:引文 target_type=memory 时被引记忆 superseded → 返回 successor_memory_id 提示,不静默替换 - 前端:人物详情页缘契面板(提议维度选择/铭契/撤回/事件史)+ 世界页重建(境界目录/实体/正史概览)+ covenants/worlds api 库 - 退役:旧 personality/drive/evolution/world 模块、服务、端点、仓储、schema、前端五页与组件样式;迁移 007 退役九张旧表与 characters.current_personality_version_id - 验收(test_m6_domains 六用例):多维无单一好感度/铭契版本链/事件不可抹除/撤回立即生效/边界即时/铸魂确认流+魂籍版本/分灵谱系/境界正史不进真界(实录 scope 隔离+真界候选=0)/引文正影后继 - 四套件:后端 379、前端 199、BFF 4、神识 5 包全绿(2 个预存环境失败不变);迁移 007 净库+±1 干净
60 lines
3.2 KiB
Python
60 lines
3.2 KiB
Python
"""缘契域表模型:契约当前版 + 不可变事件历史。
|
||
|
||
设计依据 docs/domain/core-domains.md §3 与 data-model.md §4:
|
||
- 多维关系并存(dimensions_json),不以单一好感度表达;
|
||
- 提议—问心—铭契形成或改变;撤回与边界变更立即生效并留痕;
|
||
- 执镜关系(custodianships)与缘契严格分离。
|
||
"""
|
||
|
||
from datetime import datetime
|
||
|
||
from sqlalchemy import DateTime, ForeignKey, String, Text
|
||
from sqlalchemy.orm import Mapped, mapped_column
|
||
|
||
from app.core.ids import new_id
|
||
from app.core.time import utc_now
|
||
from app.db.base import Base
|
||
|
||
|
||
class Covenant(Base):
|
||
"""缘契当前生效版本(互动者=owner_scope 用户,1.0 单用户档)。"""
|
||
|
||
__tablename__ = "covenants"
|
||
|
||
id: Mapped[str] = mapped_column(String(80), primary_key=True, default=lambda: new_id("cov"))
|
||
character_id: Mapped[str] = mapped_column(
|
||
String(80), ForeignKey("characters.id"), nullable=False, index=True
|
||
)
|
||
owner_scope: Mapped[str] = mapped_column(String(80), nullable=False, index=True)
|
||
# 多维关系维度:{"trust": "L4", "mentorship": "...", "companionship": "..."}——
|
||
# 结构自由但禁止单一好感度数值(service 层拒绝 affinity/favorability 键)
|
||
dimensions_json: Mapped[str] = mapped_column(Text, nullable=False, default="{}")
|
||
# 主称谓(可选;多维并存时不强制唯一)
|
||
primary_title: Mapped[str | None] = mapped_column(String(120))
|
||
# 边界:停止词/话题边界/接触边界——撤回与变更立即生效
|
||
boundaries_json: Mapped[str] = mapped_column(Text, nullable=False, default="{}")
|
||
# 成人内容授契(默认关;按会话临时开启,不落长期状态)
|
||
adult_consent: Mapped[bool] = mapped_column(default=False, nullable=False)
|
||
# pending(提议中)/ sealed(已铭契)/ withdrawn(已撤回)
|
||
status: Mapped[str] = mapped_column(String(20), nullable=False, default="pending", index=True)
|
||
version: Mapped[int] = mapped_column(nullable=False, default=0)
|
||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now)
|
||
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now, onupdate=utc_now)
|
||
|
||
|
||
class CovenantEvent(Base):
|
||
"""缘契事件(不可变 append-only):propose / wenxin / seal / withdraw / boundary。"""
|
||
|
||
__tablename__ = "covenant_events"
|
||
|
||
id: Mapped[str] = mapped_column(String(80), primary_key=True, default=lambda: new_id("cove"))
|
||
covenant_id: Mapped[str] = mapped_column(String(80), ForeignKey("covenants.id"), index=True)
|
||
character_id: Mapped[str] = mapped_column(String(80), nullable=False, index=True)
|
||
# propose(提议)/ wenxin(问心·人物自陈候选)/ seal(铭契确认)/
|
||
# withdraw(撤回)/ boundary(边界变更)
|
||
type: Mapped[str] = mapped_column(String(20), nullable=False, index=True)
|
||
# 事件载荷:提议维度 / 问心候选 / 铭契确认的最终维度 / 边界快照
|
||
payload_json: Mapped[str] = mapped_column(Text, nullable=False, default="{}")
|
||
actor: Mapped[str] = mapped_column(String(20), nullable=False, default="user") # user / character
|
||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now, index=True)
|