INSERT INTO ias_upgrade_logs (
    version,
    released_at,
    title,
    description,
    changes,
    modules
) VALUES (
    '0.3.0',
    '2026-07-09T00:00:00+08:00',
    '进程拆分与 JetStream 数据面',
    '按架构拆分设计新增 daemon 控制面、独立 worker 和 async-nats JetStream 公共数据面，HTTP、调度、日志和本地 NATS 部署配置同步接入。',
    '[
        "新增 ias-daemon 控制面，负责 worker 进程管理、control socket、JetStream 初始化和状态汇总；依赖边界测试确保 daemon 不依赖 AI、上下文、微信或邮件业务 crate。",
        "ias-common 新增 MessageEnvelope、inbound/outbound/function/schedule/log/DLQ payload、固定 stream/subject 命名和 JetStreamBus 薄封装，统一使用 async-nats + JetStream durable pull consumer、explicit ack、有限并发消费、消费循环持续回收 handler 任务、handler 失败显式 NAK 和最后一次失败后显式 DLQ 转发；DLQ message id 使用原消息 id + UUID，避免同毫秒并发去重碰撞。",
        "新增 ias-channel、ias-assistant、ias-function、ias-scheduler 和 ias-logging worker；微信入站、assistant 回复、工具调用、邮件提醒、定时触发和结构化日志均通过 JetStream subject 路由；邮件提醒只发布微信 outbound，不会误进入 assistant inbound；WeChat Worker 启动后继续发送上线提醒和版本更新通知。",
        "CLI 新增 ias daemon run、ias worker assistant/wechat/mail/function/scheduler/logging 和 ias http --host；ias service start/stop/restart/status/logs 改为管理 daemon 控制面。",
        "HTTP 新增 /v1/daemon/status，daemon control socket 不可用时返回 degraded 状态，HTTP 可独立启动。",
        "数据库新增 ias_schedules、ias_schedule_fires 和 ias_assistant_turns 表；Scheduler Worker 通过 fire_id 主键保证同一触发只发布一次，失败 fire 可重试，publishing 超时后可回收；Assistant Worker 持久化 active/completed/cancelled turn 状态，worker 重启后 function result 可继续当前 turn。",
        "删除 ias-service::run_service、旧 ias-service supervisor、内存队列/control/runtime 单进程代码和旧微信 looper，避免新 daemon 与旧 supervisor 双实现并存；daemon 对初始启动失败或运行后退出的 worker 会在后续健康检查 tick 中按配置重试。",
        "新增 docker-compose.nats.yml，本地 NATS JetStream 使用 file store ./data/nats，客户端和监控端口默认只绑定 127.0.0.1。",
        "新增 worker 消息序列化/幂等测试、daemon cargo tree 依赖边界测试、max_deliver 语义测试和 JetStream ack/redelivery/DLQ 集成测试模板；/data 已加入 .gitignore，避免误提交 NATS file store；已验证 cargo fmt --check、cargo check 和 cargo test，真实 NATS JetStream 集成测试默认 ignored，需要启动 docker-compose.nats.yml 后手动运行。"
    ]'::jsonb,
    '{
        "ias-common": "0.2.0",
        "ias-ai": "0.1.14",
        "ias-wechat": "0.1.1",
        "ias-context": "0.1.6",
        "ias-http": "0.1.17",
        "ias-mail": "0.1.17",
        "ias-db": "0.1.2",
        "ias-service": "0.1.27",
        "ias-daemon": "0.1.0",
        "ias-channel": "0.1.0",
        "ias-assistant": "0.1.0",
        "ias-function": "0.1.0",
        "ias-scheduler": "0.1.0",
        "ias-logging": "0.1.0",
        "ias-main": "0.3.0"
    }'::jsonb
) ON CONFLICT (version) DO UPDATE SET
    released_at = EXCLUDED.released_at,
    title = EXCLUDED.title,
    description = EXCLUDED.description,
    changes = EXCLUDED.changes,
    modules = EXCLUDED.modules;
