看板升级: GT v0.5.0(20期叙事结构全覆盖) + schema加字段方案 + git清理

- ground-truth v0.5.0: 补完10期narrative_structure标注(MiMo跑批+制片人审定)
- summarize.py: 修复无标注期次格式化崩溃
- 003_add_ai_labels.sql: episodes表加7列(6打标+1置信度)迁移文件
- episode.py: Model同步加7个Optional字段
- CLAUDE.md: 项目主控文件入库
- doco/deliverables: 20期终版文稿md入库
- doco/programs: 中间产物从git移除(本地保留), .gitignore统一管理
- note/寄存条: 两个子项目寄存条入库
- .gitignore: 补充doco中间产物/Excel锁文件/临时文件规则

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
simonkoson
2026-06-26 09:14:29 +08:00
parent 81b331d6d7
commit d91c20a126
91 changed files with 4148 additions and 20891 deletions
+14
View File
@@ -9,12 +9,15 @@
from datetime import date, datetime
from typing import Any
from sqlalchemy import Column
from sqlalchemy import DateTime as SADateTime
from sqlalchemy import Text
from sqlalchemy import Boolean as SABoolean
from sqlalchemy import Integer as SAInteger
from sqlalchemy import Numeric as SANumeric
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.sql import func as sa_func
from sqlmodel import Field, SQLModel
@@ -55,6 +58,17 @@ class Episode(SQLModel, table=True):
# 责编备注
notes: str | None = Field(default=None)
# ── AI 打标字段(看板升级 L2→L3)──
# 全部可空:旧数据不填,AI 打标 + 制片人审核后写入
# 枚举值在应用层校验,不加数据库 CHECK 约束
program_format: str | None = Field(default=None, max_length=20) # 主题材(单选)
equipment_domain: Any | None = Field(default=None, sa_column=Column(JSONB)) # 装备域(多选)
scene_tags: Any | None = Field(default=None, sa_column=Column(JSONB)) # 场景标签(多选)
tech_tags: Any | None = Field(default=None, sa_column=Column(JSONB)) # 技术线标签(多选)
narrative_structure: str | None = Field(default=None, max_length=20) # 叙事结构(单选)
opening_hook: str | None = Field(default=None, max_length=10) # 开篇钩子(单选)
ai_label_confidence: str | None = Field(default=None, max_length=10) # draft/reviewed/inferred
created_at: datetime | None = Field(
default=None,
sa_column=Column(SADateTime(timezone=True), nullable=False, server_default=sa_func.now()),
+26
View File
@@ -0,0 +1,26 @@
-- 003_add_ai_labels.sql
-- 为 episodes 表添加 AI 打标字段(看板升级 L2→L3 桥梁)
-- 前置:执行前先 pg_dump 备份
-- 全部 nullable,不影响现有数据
ALTER TABLE episodes
ADD COLUMN IF NOT EXISTS program_format VARCHAR(20),
ADD COLUMN IF NOT EXISTS equipment_domain JSONB,
ADD COLUMN IF NOT EXISTS scene_tags JSONB,
ADD COLUMN IF NOT EXISTS tech_tags JSONB,
ADD COLUMN IF NOT EXISTS narrative_structure VARCHAR(20),
ADD COLUMN IF NOT EXISTS opening_hook VARCHAR(10),
ADD COLUMN IF NOT EXISTS ai_label_confidence VARCHAR(10);
-- 分析引擎常用分组查询索引
CREATE INDEX IF NOT EXISTS idx_episodes_program_format ON episodes (program_format);
CREATE INDEX IF NOT EXISTS idx_episodes_narrative_structure ON episodes (narrative_structure);
CREATE INDEX IF NOT EXISTS idx_episodes_ai_label_confidence ON episodes (ai_label_confidence);
COMMENT ON COLUMN episodes.program_format IS '主题材(单选): 装备深解/横切类比/历史纵深/前沿科技/事件战例/人物牵引';
COMMENT ON COLUMN episodes.equipment_domain IS '装备域(多选JSONB数组): 陆战装备/海军舰船/航空航天/导弹与反导/信息化/后勤保障/轻武器/跨域/其他';
COMMENT ON COLUMN episodes.scene_tags IS '场景标签(多选JSONB数组): 节点策划/热点跟进/装备首发/展会';
COMMENT ON COLUMN episodes.tech_tags IS '技术线标签(多选JSONB数组): 无人作战/智能化/有人无人协同';
COMMENT ON COLUMN episodes.narrative_structure IS '叙事结构(单选): 主线演进/并列结构';
COMMENT ON COLUMN episodes.opening_hook IS '开篇钩子(单选): 强/中/弱';
COMMENT ON COLUMN episodes.ai_label_confidence IS '打标状态: draft(AI草稿)/reviewed(制片人确认)/inferred(标题推断)';