- 天工阁域 domains/tiangong:backstage_tasks(委托包+验收标准+结果证据);有限分解(parent 链)与受控并行(各自后台 Run);子任务全终态级联父任务进入待验收;按证据 accept/reject - kernel.start_backstage_run(kind=background_task):loop 后台分支不占前台席位、与前台对话并行;断言放宽容纳无人物功能任务;结果只经回调回呈任务——无身份写入路径 - 叩心域 domains/kouxin:knocking_candidates(event/time_anchor/manual 触发 + 草稿 + 裁决快照);四约束裁决(总开关→静默窗口【本地时区判定】→24h 频率→预算),dispatch 未过 429 且快照留痕;候选默认不自动发送;expire_stale 过期推进不触碰缘契 - 辰正 domains/zhengchen:temporal_context() 复用 time_sense 计算核(快照/农历/季节),产出【时态感知】投影段接入镜树生成 prompt(客观时间语境,不附情绪臆测——守一纪律) - 退役:modules/goal_orchestrator|planner|perception|big_cycle、application/planning、services/governance|goal_persist、candidates 表链(imports 候选抽取 API 面)、goals/plans/agent_roster/perception_channels/big_cycles/旧候选表(迁移 009);前端 admin goals/plans/agents/perception/world 页与六组件;governance 只留 GenerationPreferences;admin 治理面收敛为司命+百工两枢;pivots 健康以域表计数重建 - 验收(test_m8_tiangong 五用例):后台任务无身份写入(记忆/魂籍/缘契零新增);后台与前台并行;分解级联;叩心四约束逐项;不回应不降低关系(缘契维度/状态/版本零变化) - 四套件:后端 345、前端 203、BFF 4、神识 5 包全绿(2 个预存环境失败不变);迁移 009 净库干净
88 lines
4.5 KiB
Python
88 lines
4.5 KiB
Python
"""天工阁_受托任务_叩心候选与约束_退役旧目标计划感知大周天模块
|
||
|
||
Revision ID: 009
|
||
Revises: 008
|
||
Create Date: 2026-08-27 20:31:23.297111
|
||
|
||
"""
|
||
from typing import Sequence, Union
|
||
|
||
from alembic import op
|
||
import sqlalchemy as sa
|
||
|
||
|
||
# revision identifiers, used by Alembic.
|
||
revision: str = '009'
|
||
down_revision: Union[str, Sequence[str], None] = '008'
|
||
branch_labels: Union[str, Sequence[str], None] = None
|
||
depends_on: Union[str, Sequence[str], None] = None
|
||
|
||
|
||
def upgrade() -> None:
|
||
"""Upgrade schema."""
|
||
# ### commands auto generated by Alembic - please adjust! ###
|
||
op.create_table('backstage_tasks',
|
||
sa.Column('id', sa.String(length=80), nullable=False),
|
||
sa.Column('owner_scope', sa.String(length=80), nullable=False),
|
||
sa.Column('character_id', sa.String(length=80), nullable=True),
|
||
sa.Column('parent_task_id', sa.String(length=80), nullable=True),
|
||
sa.Column('title', sa.String(length=200), nullable=False),
|
||
sa.Column('brief', sa.Text(), nullable=False),
|
||
sa.Column('acceptance_criteria', sa.Text(), nullable=False),
|
||
sa.Column('status', sa.String(length=30), nullable=False),
|
||
sa.Column('result_digest', sa.Text(), nullable=False),
|
||
sa.Column('evidence_json', sa.Text(), nullable=False),
|
||
sa.Column('run_id', sa.String(length=80), nullable=True),
|
||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||
sa.Column('completed_at', sa.DateTime(timezone=True), nullable=True),
|
||
sa.ForeignKeyConstraint(['character_id'], ['characters.id'], ),
|
||
sa.ForeignKeyConstraint(['parent_task_id'], ['backstage_tasks.id'], ),
|
||
sa.PrimaryKeyConstraint('id')
|
||
)
|
||
op.create_index(op.f('ix_backstage_tasks_character_id'), 'backstage_tasks', ['character_id'], unique=False)
|
||
op.create_index(op.f('ix_backstage_tasks_owner_scope'), 'backstage_tasks', ['owner_scope'], unique=False)
|
||
op.create_index(op.f('ix_backstage_tasks_parent_task_id'), 'backstage_tasks', ['parent_task_id'], unique=False)
|
||
op.create_index(op.f('ix_backstage_tasks_run_id'), 'backstage_tasks', ['run_id'], unique=False)
|
||
op.create_index(op.f('ix_backstage_tasks_status'), 'backstage_tasks', ['status'], unique=False)
|
||
op.create_table('knocking_candidates',
|
||
sa.Column('id', sa.String(length=80), nullable=False),
|
||
sa.Column('character_id', sa.String(length=80), nullable=False),
|
||
sa.Column('owner_scope', sa.String(length=80), nullable=False),
|
||
sa.Column('trigger', sa.String(length=20), nullable=False),
|
||
sa.Column('draft', sa.Text(), nullable=False),
|
||
sa.Column('channel', sa.String(length=20), nullable=False),
|
||
sa.Column('status', sa.String(length=20), nullable=False),
|
||
sa.Column('ruling_json', sa.Text(), nullable=False),
|
||
sa.Column('created_at', sa.DateTime(timezone=True), nullable=False),
|
||
sa.Column('dispatched_at', sa.DateTime(timezone=True), nullable=True),
|
||
sa.ForeignKeyConstraint(['character_id'], ['characters.id'], ),
|
||
sa.PrimaryKeyConstraint('id')
|
||
)
|
||
op.create_index(op.f('ix_knocking_candidates_character_id'), 'knocking_candidates', ['character_id'], unique=False)
|
||
op.create_index(op.f('ix_knocking_candidates_owner_scope'), 'knocking_candidates', ['owner_scope'], unique=False)
|
||
op.create_index(op.f('ix_knocking_candidates_status'), 'knocking_candidates', ['status'], unique=False)
|
||
# ### end Alembic commands ###
|
||
|
||
# 旧域退役:太一(goals)/洛书(plans)/天工阁旧 roster/感知/大周天
|
||
op.drop_table('goals')
|
||
op.drop_table('plans')
|
||
op.drop_table('agent_roster')
|
||
op.drop_table('perception_channels')
|
||
op.drop_table('big_cycles')
|
||
|
||
|
||
def downgrade() -> None:
|
||
"""Downgrade schema."""
|
||
# ### commands auto generated by Alembic - please adjust! ###
|
||
op.drop_index(op.f('ix_knocking_candidates_status'), table_name='knocking_candidates')
|
||
op.drop_index(op.f('ix_knocking_candidates_owner_scope'), table_name='knocking_candidates')
|
||
op.drop_index(op.f('ix_knocking_candidates_character_id'), table_name='knocking_candidates')
|
||
op.drop_table('knocking_candidates')
|
||
op.drop_index(op.f('ix_backstage_tasks_status'), table_name='backstage_tasks')
|
||
op.drop_index(op.f('ix_backstage_tasks_run_id'), table_name='backstage_tasks')
|
||
op.drop_index(op.f('ix_backstage_tasks_parent_task_id'), table_name='backstage_tasks')
|
||
op.drop_index(op.f('ix_backstage_tasks_owner_scope'), table_name='backstage_tasks')
|
||
op.drop_index(op.f('ix_backstage_tasks_character_id'), table_name='backstage_tasks')
|
||
op.drop_table('backstage_tasks')
|
||
# ### end Alembic commands ###
|