# 变更日志(Changelog)

本项目的所有重要变更都记录在此文件。

格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。

本仓库为 monorepo,包含两个同源项目:`web/`(二级市场投研工作台)与 `agent/`(卫星互联网产业决策辅助 Agent)。变更条目会标注所属项目。

---

## [Unreleased]

### 新增(Added)
**2026-06-07 晚 · expert/wiki round-2 增量入库 + skills/expert-wiki-ingest skill 落地**

- **(skill)** 新建 `skills/expert-wiki-ingest/`(项目根 process skill 目录):`SKILL.md`(frontmatter + 5 phase 数据流 + sub-agent 提示词模板 + 5 个踩坑小记)+ `skill.html`(自包含可视化镜像,JetBrains Mono + Fraunces + dark sage/gold/sky/clay 调色板)+ `skills/README.md`(目录索引 + 与 `agent/skills/` 边界说明)
- **(infra)** 7 个 wiki 构建脚本路径统一(`extract.py` `merge.py` `build_index.py` `build_html.py` `build_processing_status.py` `build_docs.py` `redact_check.py` `build_redact_html.py`)— 抽 `_paths.py` 共享模块,按 `env > repo-relative > legacy /Users/john/lichao` 顺序解析,以前在 InvesResearch 仓库根本跑不动的脚本现在直接 `python3 expert/wiki/_scripts/<name>.py` 就能跑
- **(infra)** `extract.py` 升级为**增量模式**(`INCREMENTAL=1` 默认 / `EXTRACT_FORCE=1` 强制重抽);自动跳过已在 `_extract_report.json` 的 ok 条目;支持多源(`RAW_ROOT="path1,path2"`);`slugify` 新增 drop `1商业航天材料/` 前缀逻辑(老数据兼容)+ 保留 `2科普视频文案/` / `3其余素材/` 前缀(新数据 namespace)
- **(infra)** `build_index.py` 修 `publisher` 字段 list/scalar 类型守护(sub-agent 偶尔写成 list,以前直接崩)
- **(infra)** `build_processing_status.py` 模板里把硬编码 `/Users/john/lichao/商业航天材料` 改成 `{html.escape(str(ROOT))}` 动态注入,`build_docs.py` 的 ROOT 改成 `WIKI.parent`(老的指 `/Users/john/lichao`,新的指 `expert/`)
- **(wiki)** **expert/wiki 知识库 round-2 增量入库交付**:
  - **输入**:`expert/raw/2科普视频文案/`(60 docx 科普视频脚本)+ `expert/raw/3其余素材/`(7 PDF 含 Stanford State of AI 2025 / NASA MSR IRB / Musk 2016 IAC / ADRAS-J / Ecosystem Map 2024 / Mars Sample Return / C 公司投资介绍)
  - **Phase 1** `extract.py` 增量抽 67 文件(+4 fail = 图扫描 PDF `pdftotext`/`pdfplumber` 都拿不到字,已删 0 字节 md + 打 fail 补丁到 `_extract_report.json`)
  - **Phase 2** 4 路并行 sub-agent(`agent-8..11-round2`)按 greedy bin-pack 切批(每 batch ~270KB)抽 entities/people/concepts/reports/timeline,各 sub-agent **同 message 并行派**(`run_in_background=true`),wall time ~30 分钟(vs 串行 ~2 小时)
  - **Phase 3** `merge.py` 合并:70 entities / 7 people / 35 concepts / 0 reports 经多 agent merge 出补充视角(`## 补充视角 — agent-N-round2` 追加段)
  - **Phase 4 + 5** `build_index.py` + `build_html.py` + `build_processing_status.py` + `build_docs.py` 全部重生
  - **输出**(增量,old → new):
    - entities **248 → 424**(+176)
    - people **33 → 63**(+30)
    - concepts **231 → 391**(+160)
    - reports **35 → 102**(+67,每个源 .md 一条)
    - timeline **483 → 931**(+448 条事件,2016 IAC / Artemis 全程 / OneWeb GSLV / Starship 全 IFT / Golden Dome / ADRAS-J 等高密度补全)
    - `index.html` **1.10 MB → 1.89 MB**(+0.79 MB,自包含浏览器)
- **(docs)** `index.html` Tier 3 PRD 全集加 skill 入口卡;`docs.html` 仓库根加 R7 行;skill 链接 `SKILL.md` + `skill.html` 双锚
- **(infra)** `expert/wiki/_drafts/` 与 `expert/wiki/_extracted/` 已在 `.gitignore`(`expert/wiki/_extracted/` / `expert/wiki/_drafts/_redact_report.*`),round-2 草稿 + 抽取产物不进 git(保留 wiki/{entities,people,concepts,reports,timeline,*.html} 入 git)
- **关键约束**:本轮**不需要真 LLM key**(sub-agent 是 Claude Code 内置 Agent 工具,不是 LiteLLM provider);agent/ 业务逻辑(decision / classifier / thesis 等)**0 改动**;`expert/X/` 与 launchd cron(03:00 daily x-ingest)**0 影响**

**2026-06-07 · 长会话收尾文档/网页同步 + 观测性时间漂移修复**
- **(docs)** `README.md` / `NEXT-STEPS.md` §4 / `CHANGELOG.md` / `index.html` 顶部 meta / `plan.html` × 3 处 / `docs.html` 导航 — 测试口径从 287/330 统一拉到 **337**,时间锚 2026-06-03 → 2026-06-07,补本会话新增的 2 条 commits(`3491f45` cron + `bee2e5c` plan 门户)。
- **(agent)** `agent/satellite_agent/observability.py` `collect_metrics(...)` 加可注入 `now: datetime | None` 参数(生产仍走 `datetime.utcnow()`)— 修 `tests/test_observability.py::test_collect_counts` 在测试 fixture 与现实日期偏离 ≥ 6 天时 `events_recent_total` 漂移的时间炸弹。`test_collect_counts` / `test_prometheus_format_well_formed` 同步传 `now=NOW`。
- **(infra)** `.gitignore` 加 `agent/data/` 与 `agent/.env` — 运行时 `agent.db` SQLite + launchd 重定向产物 `*.err/*.out`(不在 `*.log` 通配里)从此不会被 `git add .` 误带进 git;`agent/.env` 与根目录 `.env` 双重屏蔽,真实 API key 永远本地。

**2026-06-06 · expert/ 上游整合 P0-C/D 收尾 + launchd cron + 全貌门户(7 commits)**
- **(infra)** `expert/` 580 文件入库:`expert/wiki/`(549 md 知识库 · 商业航天 7-agent 抽取 · 249 entities / 232 concepts / 34 people / 35 reports / 483 timeline)+ `expert/X/`(95 账号 x_agent 抓取管线 + `pyproject.toml` + `config.example.yaml`)。`.gitignore` 同步屏蔽 `expert/raw/` / `X/data/` / cookies / xlsx / `wiki/_extracted/` / `wiki/index.html`(1.1MB)。(commit `954aabd`)
- **(agent)** **P0-C 1/4 · wiki/entities → SEED_COMPANIES 20 → 33**(+13):芯片 +2(星联芯通 / 艾可萨科技);运营支撑 +11(上海垣信 千帆 G60 运营 / 中国广电 / 中国时空信息集团 / 中国移动 / 千乘探索 / 千寻位置 / 国星宇航 / 星移联信 / 星速科技 / 银河航天 / 长光卫星)。配套 `agent/scripts/import_wiki_seeds.py`(启发式 importer · 249 → 41 candidates / 27 curated + 14 火箭制造类 `_skip_for_now` 留 ontology 加第 5 主线再入)+ `_wiki_seed_candidates.json` 审计材料。(commit `a55745d`)
- **(agent)** **P0-C 2/4 · wiki/concepts → ontology +15 词**:CORE_NETWORK +3(天地一体化网络 / 天地融合 / 卫星通信频段)+ OPERATIONS +7(ITU 申报 / ITU 协调 / 频率轨位 / 高精度定位 / 高精准位置 / 时空服务 / 时空信息)+ MARITIME_AVIATION +4(远洋宽带 / 海事宽带 / 海上平台 / 民航宽带)+ TECHNOLOGY +4(RTK / InSAR / A-BDS / AIS)。配套 `agent/scripts/import_wiki_concepts.py` + `_wiki_concepts_candidates.json`(189 novel / 25 overlap / 18 已覆盖 / 17 军事跳过)。(commit `83c56b6`)
  - **遗留(下下下轮)**:wiki/timeline 283 条 → samples/labeled_validation 反推 100+(需 LLM 辅助打 4 字段 ground_truth)/ wiki/people NER 词表 / ontology 加第 5 主线"发射制造"。
- **(agent)** **P0-D 100% · `XSqliteSource` + EH-1 `x-ingest` action**(commit `6902021`):
  - `agent/satellite_agent/sources/x_sqlite.py`:read-only WAL 打开(`mode=ro&immutable=1` + 三段 fallback 兜底老 sqlite)· `since` ISO8601 增量水位 + `limit` 截窗 · 9 大账号分类(全球卫星运营商 / 民营美国 / 各国官方 / 在轨项目 / 媒体 / ...)不强映射主线 · 默认 `include_replies/retweets=False` 降噪 · `translations` 表 zh 译文拼接 · `X_SQLITE_PATH` env > 构造参数 > 默认 `expert/X/data/x.sqlite3` · 文件不存在 yield 0 + `last_error` 不抛。
  - `sources/__init__.py`:`load_source('x-sqlite' / 'x_sqlite' / 'x')` 三别名注册。
  - `jobs.py · _action_x_ingest`:封装 XSqliteSource → ingest_from_source · 支持 since / limit / include_replies / include_retweets / categories / use_llm · 返回顶层 `stats` + `last_error`。
  - `tests/test_x_sqlite_source.py` +13 测试覆盖 fixture SQLite 子集 schema + since 增量 + reply/retweet/empty 过滤 + category 白名单 + translations 拼接 + URL 构造 + source 标签 + 三别名 + 端到端 action。
  - **端到端 smoke**(真 `expert/X/data/x.sqlite3` 3123 推文):`satagent job run x-ingest`(since=2026-06-04 limit=30)→ **ingested 30 / 0 duplicates / errors**;classifier 分流 27 无主线 + 2 核心网 + 1 运营支撑。
- **(docs)** `NEXT-STEPS.md` §3.1.X 标 P0-C 2/4 + P0-D 100% ✅;时间锚 → 2026-06-06。(commit `3d253cf`)
- **(ops)** **launchd `com.invesresearch.satagent-x-ingest` 03:00 daily 上线**(commit `3491f45`):
  - `agent/scripts/run_x_ingest.sh` wrapper(`source .env` → 进 `agent/` → `satagent job run x-ingest`)
  - `agent/scripts/launchd/com.invesresearch.satagent-x-ingest.plist`(StartCalendarInterval Hour=3 Minute=0 / StandardOutPath / StandardErrorPath 重定向到 `agent/data/`)
  - `agent/docs/x-ingest-cron-runbook.md` operator 运维手册(安装 / 查看 / 排错 / 卸载 / since 水位策略)
  - **首跑实测**:357 推文入 events / 25 命中 4 主线 / 332 条无主线(主要 HR/招聘类降噪)
- **(docs)** **`plan.html` 全貌门户上线**(commit `bee2e5c`):四问索引(为什么 / 是什么 / 已做 / 下一步) + 双产品线对比(agent/ vs web/) + 22 项交付矩阵(Phase 1-3c + 横切 + EH-1/3 + FE Round 1 + ADVICE + Tier 1.2 + P0-C/D + cron) + 三状态卡(cron 在岗 / LLM key 待 operator 填 / 7 天观察期) + 三档路线图(本周 / 两周后 / 季度后) + 浅米黄编辑墨水 palette。`index.html` 面板 #3(`docs.html`)升级为"plan.html 总览 + docs.html 索引"双入口;`docs.html` / `next-steps.html` 沦为详尽档案。
  - 三层文档结构正式形成:**plan.html(全貌)** → **docs.html(目录)** → **NEXT-STEPS.md(权威源)** + **各专题 md/html 对子**(ADVICE / FE-SKILLS / data-flow / ...)。

**2026-06-04 晚晚晚晚 · EH-1 token budget(LiteLLM `last_usage` → jobs 月度预算)**
- **(agent)** `agent/satellite_agent/db.py` schema:
  - 新增 `token_usage_log` 表(`job_id` / `job_run_id` 都 `ON DELETE SET NULL` — 删 job 不删审计历史)+ `idx_token_usage_job_month` 索引
  - `jobs` 表加 `token_budget_monthly` INTEGER 列(NULL = 不限),走 `_MIGRATIONS` 老 DB 升级
- **(agent)** `agent/satellite_agent/llm.py` 加模块级 `_USAGE_SINKS: list`:`LiteLLMClient.chat()` 拿到 `last_usage` 后遍历调用每个 sink(单 sink 抛错被吞掉,不影响 chat 主流程)。这是 D V2 后续 cost accounting 的钩子。
- **(agent)** `agent/satellite_agent/jobs.py`:
  - 新增 `_collect_llm_usage()` 上下文管理器 — 临时 push sink → 自动 pop,嵌套安全
  - 新增 `get_monthly_token_usage(conn, job_id, month)` — 按 `created_at LIKE 'YYYY-MM%'` 月度 SUM
  - 新增 `set_token_budget_monthly(conn, name, monthly)` — 显式改 `jobs.token_budget_monthly`(None = 取消)
  - 新增 `_check_budget(conn, job)` — 跑前校验:超额返 dict,可跑返 None
  - **`run_job` 集成**:跑 action 前 budget 检查 → 超额直接 `status=skipped` + `error=token_budget_exceeded`(**不撞** consecutive_failures);action 期间用 `_collect_llm_usage` 收集 sink;跑完(成功 / 失败)都写 `token_usage_log`(LLM 已经消耗 token,失败也得记账)
  - `Job` dataclass 加 `token_budget_monthly` 字段
- **(agent)** `agent/satellite_agent/cli.py`:
  - `satagent job set-budget <name> --monthly N`(`--monthly` 缺省 = 设回 NULL,取消预算)
  - `satagent job token-usage [--name N] [--month YYYY-MM] [--format md|json]` — 单 job 看 used/budget/remain;全局看 per-job 汇总 + grand_total
  - `satagent job list` 多一列 `budget`
- **(agent)** `agent/tests/test_jobs.py` +11 测试覆盖:sink push/pop + 嵌套 + 异常清理 / chat 触发 sink / 坏 sink 不影响 chat / 成功跑写 log / 失败跑也写 log / set+get budget / 超额 skip / 未超额跑 / NULL=不限 / 月度边界(上月不算本月)
- **(agent)** 全量测试 **311 → 322 passed / 2 skipped**(+11 EH-1 token budget,0 回归)。
- **关键约束**:LLM key 在不在不影响本轮(管线 100% StubLLM + monkeypatch 单测覆盖);D V2 真实 LLM 跑通后,operator 用 `satagent job token-usage` 直接看每月成本,用 `set-budget` 限月度上限,Token 预算失控的风险被钉死在 agent 层。

**2026-06-04 晚晚晚 · stash 三文件 cherry-pick · 解锁 D V2 真实 LLM E2E**
- **(root)** `.gitignore` 加 secrets 区(`.env / .env.local / *.key / *.pem / secrets/`)— `agent/.env` 永远不进 git,真实 API key 走本地文件管理。
- **(agent)** `agent/.env.example` 用 2026-06-03 stash 里的 5-provider 模板覆盖(原版只有 18 行 DeepSeek-only):智谱主推(Coding Plan 默认 + 通用 API base_url 切换注释)+ DeepSeek / Qwen / OpenAI / Anthropic Claude 全列出 + LLM 触发门阈值 + FastAPI / CORS / DB / Anthropic 各章节占位。智谱 Coding Plan endpoint(`/api/coding/paas/v4`)与通用 API endpoint(`/api/paas/v4`)切换注释写清楚 — 普通智谱 API 用户不会被默认值卡 401。
- **(agent)** `agent/README.md` 加 `## LLM Provider 配置` 章节(不动 Skills / FE Round 1 段):5 provider 表格 + `agent/.env` 安全指引 + D V2 真实 LLM 跑通命令(`satagent validate --samples ... --compare-llm > reports/d-v2-real-<provider>-<date>.md`)。
- **(stash)** `stash@{0}` 用 `git stash drop` 清理 — stash 里 `llm.py` / `test_llm.py` 已被 5573b79 LiteLLM commit 覆盖(`memory/wip_zhipu_llm_preset.md` 明示不要恢复),三文件已 cherry-pick 完毕,stash 历史使命完成。
- **(agent)** 全量测试 311 passed / 2 skipped(零代码改动,纯文档 / 配置 / .gitignore)。
- **关键约束 / follow-up**:**用户填真 key 之后**,跑 `cp agent/.env.example agent/.env` → 编辑填 key → `set -a; source .env; set +a` → `satagent validate --compare-llm > agent/reports/d-v2-real-<provider>-<date>.md` 即出真实 LLM E2E 报告。期望阈值见 `agent/reports/d-v2-demo-stub-llm.md` 末段表。

**2026-06-04 晚晚 · ADVICE D V2 · rules vs +LLM 对比脚手架**
- **(agent)** `agent/satellite_agent/validation.py` 新增三件套:
  - `run_validation_compare(samples_path, llm)` — 同一份 corpus 跑两次(rules-only / +LLM),返回 `{rules, llm, diff}` 结构。`llm=None` 时显式 `ValueError` 拒绝(没 LLM 时 compare 没意义,直接调 `run_validation` 即可)。
  - `_compute_diff(rules_result, llm_result)` — 字段级(per-field exact_rate / fixed / regressed)+ 样本级(fixed / regressed / unchanged_pass / unchanged_fail)+ LLM 调用率(escalate / applied / applied_rate)三视角 diff。
  - `render_compare_table(compare_result)` — markdown 渲染:Overall 对比表、per-field exact_rate delta、per-sample pass 状态变化、LLM 兜底调用率、免责声明。
- **(agent)** `run_judgment` 加 `llm_audit` 字段返回,把 `evidence.llm` 审计块(escalated/reason/applied/explanation)冒泡给 compare 模块统计。
- **(agent)** `agent/satellite_agent/cli.py` `satagent validate` 子命令加 `--compare-llm` flag:自动隐含 `--llm`,无 key 时 `sys.exit(2)` 清楚报错 `--compare-llm 需要 LLM client`。与 `--llm` 优先级:`--compare-llm` 走 D V2 分支,否则走 D V1。
- **(agent)** `agent/tests/test_validation.py` 新增 `_CountingStubLLM`(完全离线 phrase 表 stub)+ 5 个 D V2 测试:
  - `test_run_validation_compare_requires_llm` — 没 llm 时 ValueError
  - `test_run_validation_compare_e2e_with_stub_llm` — 3 sample fixture(1 rules 通过 / 1 LLM 救 / 1 全失),验证 diff 三视角
  - `test_run_validation_compare_detects_regression` — LLM 反向退化场景(rules 过 → LLM 弄坏)被 regressed list 正确捕获
  - `test_compute_diff_with_identical_results` — 同一份 result 自己对自己 → delta=0,fixed/regressed=[]
  - `test_render_compare_table_contains_key_sections` — markdown 输出必含 Overall / per-field / per-sample / LLM 调用率 / 免责声明
- **(agent)** `agent/reports/d-v2-demo-stub-llm.md` 落地一份"理想 LLM" demo 报告(用 StubLLM 模拟修 v0.2 corpus 里 3 条 中性→增强 缺口 g005/g013/g015):Overall 56.7%→66.7%(+10%)、thesis_impact 80%→90%、strategy 73%→80%、LLM applied 3/30(10% 调用率)。文档化"怎么读这份报告"+"真实 LLM 跑通后该看什么"4 个期望阈值,让 operator 看一眼就懂 D V2 方法学。
- **(docs)** `ADVICE-INTEGRATION.md` §4.1 `#### 后续 follow-up(D V2/V3)` 节重组:把"D V2 = 接时序数据"降级到 D V2.5(那是更远 V2.5+ 范围),把"D V2 = rules vs +LLM 对比脚手架"标 ✅;`agent/docs/next-development-plan-input-quality.md` 加 D V2 交付段。
- **(agent)** 全量测试 **306 → 311 passed / 2 skipped**(+5 D V2 测试,0 回归)。
- **关键约束 / follow-up**:真实 LLM E2E **不在本 commit 跑** — 本地未配 LLM key(`stash@{0}` 有智谱预设但 user 还没填真 key)。用户填真 key 后 `satagent validate --samples ... --compare-llm > agent/reports/d-v2-real-<provider>-<date>.md` 即可生成真实报告。Stub demo 报告与真实报告并列存放,两者方法学一致、可直接对比。

**2026-06-04 晚 · ADVICE D V1 反推 · 规则版 strategy + 多主线调优(Overall 23.3% → 56.7%)**
- **(agent)** `agent/satellite_agent/ontology.py` 关键词反推扩词(基于 v0.2 corpus 11 条 中性→增强 + 18 条 strategy mismatch 失败样本逐条诊断):
  - **POSITIVE_KEYWORDS** 英文 3 单/现在时形态:`completes / complete / completion / launches / announces / announced / announcing / adopts / adopted / finalizes / finalized / expands / expanded / expansion / combines / combining / combination / consolidates / consolidating / acquisition / merger / commercial operation / world's first / first space-based`(原列表只覆盖 `completed/launched` 过去式,英文公告/新闻常用现在时,且 ASCII >5 字符走 substring 时 `complete` ≠ `completion`,要显式列出)
  - **POSITIVE_KEYWORDS** 中文央企里程碑动词:`组建 / 落户 / 入驻 / 首家 / 首批 / 首颗 / 揭牌 / 挂牌 / 开通 / 正式启动 / 标志着`("成立"故意不入榜,n021 中国电信成立子公司 gt=中性 会误伤)
  - **NEGATIVE_KEYWORDS** 产品/服务停掉:`discontinued / shut down / cancelled / sunset / end-of-life`(g016 Qualcomm Snapdragon Satellite "discontinued" 之前无词典命中)
  - **THREAD.CORE_NETWORK** 增 `core network` 英文兜底 + `constellation` + `satellite communications/communication`(g013 标准文 / g017-g019 合并文里大量出现;bare `NTN` 不入,r016/r025 "NTN 芯片"会误挂)
  - **THREAD.OPERATIONS** 增 `satcom / spectrum / concession / communications operator / satellite operator`(g018 IRIS² 政府授权 / g019 Viasat-Inmarsat / g022 India satcom 漏挂)
- **(agent)** `agent/satellite_agent/validation.py` `_infer_strategy` V1 → V1.1 重写,加 `threads` 参数走兜底:
  - **加速** 收紧到 "已经在 scale":`PRODUCT + MARKET_SIZE` 或 `COMPETITIVENESS + MARKET_SIZE`(原规则 MARKET 单独默认推加速,与 g002/g003 政策窗口 gt=进入 不符)
  - **进入** 扩到 `COMPETITIVENESS 单独`(g002 中国移动获许可)+ `MARKET_SIZE / BUSINESS_MODEL 单独`(g003 工信部促进政策 = window opening)+ TECH/PRODUCT 单独(保持)
  - **进入 兜底**:增强 + 无 useful dim + 至少 1 thread → 进入(action 优于"观察",原规则把 6 条 thread 锚点清晰但维度词没命中的 strengthen 信号都推"观察")
  - **观察 兜底**:增强 + 0 thread + 0 dim → 观察(非相关 negative sample g027/g028/g029 仍保护性兜底)
- **(agent)** `agent/satellite_agent/validation.py` `run_judgment` 修关键 bug:用 `title + content` 拼接 classify(原代码 `event.get("content") or event.get("title")` 当 content 非空时丢掉 title 里的极性动词,g012 "Apple announces..." 的 announces 在 title 不在 content)
- **(agent)** `agent/satellite_agent/validation.py` `thread_in_focus` 选择从 "threads[0]" 改成 **按 keyword evidence 命中数排序**(原规则跟 ontology 字典顺序绑死 — CORE_NETWORK 永远第一,导致 operations/terminal 主导的 g005/g015/g019/g023 被错挂核心网)
- **(agent)** `agent/tests/test_validation.py` `_infer_strategy` 单元测试改写以反映 V1.1 语义(MARKET 单独 → 进入 / scale 二维组合才 加速 / threads 兜底 → 进入 / 0 锚点 → 观察)
- **(agent)** `agent/tests/test_global_samples.py` 门控阈值从 ≥0.20 抬到 ≥0.50,docstring 写清 V1.1 各字段提升(impact 50%→80% / strategy 40%→73% / threads 41%→48% / focus 56%→63%)
- **(agent)** 全量测试 303 → 306 passed / 2 skipped(+3 新 V1.1 strategy 测试,0 回归;`labeled_real.jsonl` 维持 0.60 基线,`labeled_regression.jsonl` 维持 1.00 基线)
- **关键诊断**:Overall 17/30 = **56.7%**(v0.2 baseline 23.3% → 56.7%,**2.4× 提升**),剩余 3 条 thesis_impact 中性→增强(g005/g013/g015)+ 5 条 strategy 进入→加速 overshoot 都需要 LLM 语义判断,留给 D V2(`P1 LLM 兜底真实对比`,用同一份 v0.2 corpus 跑 rules vs LLM 增量定量化)

**2026-06-04 ADVICE P0 · 全球语料 seed v0.1 → v0.2(16 → 30 samples)**
- **(agent)** `agent/samples/labeled_global_satellite_internet_202606.jsonl` 扩到 30 条:加 14 条 g017-g030,覆盖原本缺位的 **欧洲(4)** / **亚洲其他(3)** / **非相关负样本(3)**;_meta 升级 v0.1 → v0.2,显式标注 single_source_cap(SpaceNews 5/30 = 17%,远低于 50% 红线)
- 新加事件:Eutelsat-OneWeb 合并(2023-09-28)/ ESA IRIS² SpaceRISE(2024-12-16)/ Viasat-Inmarsat 收购完成(2023-05-31)/ Vodafone+AST 首次太空 5G 通话(2023-09-19)/ Jio JioSpaceFiber × SES IMC 2023(2023-10-27)/ India IN-SPACe 行政分配频谱(2024-10-15)/ ITU WRC-23 闭幕(2023-12-15)/ 千帆星座 G60 首批 18 颗(2024-08-06)/ KDDI au+Starlink 首座移动塔(2022-12-01)/ 国资委组建中国星网(2021-04-28)/ NOAA GOES-U 气象星(非相关)/ AstroForge Odin 小行星采矿(非相关)/ ESA EarthCARE 地球观测(非相关)/ 3GPP Release 18 NTN
- **(agent)** `agent/tests/test_global_samples.py` +2 新测试:`test_global_samples_include_non_relevant_negative_examples`(强制 ≥2 负样本 + threads_actual=[] + thread_in_focus=None + thesis_impact=中性)与 `test_global_samples_single_source_cap_below_half`(任意单一来源占比 < 50%)
- **(agent)** 现有断言上调:`n_samples ≥ 30`(原 15)/ region 集扩到 `{中国, 北美, 欧洲, 亚洲其他, 全球监管/标准}`(原 3 个)
- **(agent)** 验证基线诚实下调:v0.1(16 简单正样本)Overall ~60% → v0.2(30 含硬多主线 + 3 负样本)Overall 23.3%,门控阈值从 ≥0.25 调到 ≥0.20 并在测试 docstring 写清楚 "这个 delta 是 corpus 在做事,不是回归;提升靠规则调优或 LLM 兜底,不是再放松门控"
- **(agent)** 全量测试 301 → 303 passed / 2 skipped(+2 新测试)
- 关键诊断:rules-based 分类器在 strategy 维度普遍偏保守("观察" vs gt "进入"),非相关负样本 g027/g028/g029 在 threads 维度均正确为空(n/a)— 暴露的主要缺口在 strategy 推断 + 多主线场景 partial 漏判,正好是下一步 P1 LLM 兜底真实对比的发力点



---

## [0.3.0] — 2026-06-04

### 新增(Added)
**2026-06-03 晚晚 · 14-commit 长会话(159 → 287 tests + ADVICE 三件套 D V1/B/E 全部交付)**
- **(agent)** Tier 1.2 LiteLLM 路由(`5573b79`):`LiteLLMClient` 单实现统一 zhipu(zai) / DeepSeek / Qwen / OpenAI / Anthropic 5 家 provider · `last_usage` token 计量为 EH-1 budget follow-up 铺路 · 下游 `.chat()` / `.classify()` 接口零改动 · `agent/satellite_agent/llm.py` `agent/pyproject.toml` litellm>=1.50 · 159 → 168 tests
- **(agent)** FE Round 1 · C · Red Flag 自查(`9566bda`):`agent/satellite_agent/quality_checks.py` 新模块 · 11 条 universal_red_flags 中实施 5(`E_INVALID_DIMENSION` / `E_LOSS_COMPANY_HIGHLIGHTED` / `E_SINGLE_COMPANY_DEPENDENCY` / `E_CASTLE_IN_AIR` / `E_ECHO_CHAMBER`)+ 6 stub(transparent `supported=False` 标依赖) · decide() 末尾 hook · markdown 输出 `## ⚠️ Quality Check` 段 + 🔴/🟡/🟢 emoji · 168 → 196 tests
- **(agent)** FE Round 1 · A V1 · 证伪触发器(`906478e`):`thesis_state.triggers TEXT` schema · `agent/satellite_agent/triggers.py` 新模块 + `@register_check` 注册器 + 3 内置 check(`thread_sentiment_below` / `event_count_drop` / `company_order_concentration`)+ 24h cooldown · `thesis.update_thesis_scores` 默认 hook · `thesis.compute_alerts(include_triggers=True)` 把 trigger alert 排在 risk 前(只读路径不消耗 cooldown)· CLI `satagent trigger set/list/delete/check` · 196 → 226 tests
- **(agent)** FE Round 1 · B · 5 步语法第 3+5 步(`b55d474`):`decision._compute_contradiction` 3 级 fallback(debate_bear → risks_softfallback → empty)+ `_compute_falsification` 读 trigger 距离 · `triggers.py` 加 `_DISTANCES` 镜像 `_CHECKS` + `evaluate_distance` / `list_trigger_distances` · `report["_layers"]` 元数据字典 + 5 层 emoji(📌fact / 📊calc / 💭assumption / 🎯judgment / ⚠️falsification)· render 加 "反方矛盾" + "如何崩塌" 两段 · 修 `decision ↔ triggers` 循环导入(惰性 import)· 226 → 241 tests
- **(agent)** FE Round 1 · A v2 · WYHTB 看牛/看熊(`e239e44`):`thesis_state.wyhtb_bull` / `wyhtb_bear` 两列 JSON · `thesis.set/get/clear_wyhtb_conditions` wholesale 替换 helper + `compute_wyhtb_status` 给 bull/bear `{met,total,unknown}` 计数 · CLI 顶层 `satagent wyhtb set/show/clear` · `_compute_contradiction` 升级 4 级 fallback(wyhtb_bear 第 1 优先)· `decide()` 新挂 `report["ceo"]["wyhtb_status"]` · render 加 `## WYHTB Status` 段 + 反方矛盾段 ✅/❌/⚪ icon · 241 → 262 tests
- **(agent)** live.html FE Round 1 · 前端 5 色 layer 渲染(`8580b54`):5 个 CSS `.fe-section.layer-*` 颜色(复用 sky/plum/gold/rose/clay)+ 4 个 `renderFE*`(WYHTB Status / 反方矛盾 / 如何崩塌 / Quality Check)+ `renderFESections` wrapper(CEO + Investor panel 都接)· `injectDemoFEFields` 只在 DEMO_MODE 跑(真实 API 不污染)· 322 lines insertion · 0 backend regression
- **(agent)** `.gitignore` 加 `new/` 排除(`f374372`):FE_Skills_Final_CN 原料 2.6 MB 保留本地参考但不入 git
- **(root)** `ADVICE-INTEGRATION.md`(`3bc8e9d`):把外部第三方评估 `new/advice.md`(给智坊团队整体)沉淀成 PRD 改进文档,准备下一步引入开发 · 9 节结构(类 FE-SKILLS-INTEGRATION.md):4 问框架 / 5 工作主线 / 5 风险映射 / 高 ROI 三件套详细方案(**D 验证回路 V1 - 吻合度对照表 3-5 天最高 ROI** / B skill 沉淀 2-3 天 / E 运营支撑专题 demo 0.5-1 天)/ 中长 ROI 推后(C 数据壁垒 / 受众错配缓解)/ 不采用项(MWC 落地 / 关键人 / 商业化 / 拆子 agent / 全网最全 / "学生水平"研报)/ 推荐顺序(D 优先于 FE Round 2)/ 时间锚 + 4 选项 · 关键洞察:本会话 10 commits 几乎全住在评估 ① "能跑通吗" 层,需要把重心转向 ②③④
- **(root)** `advice-integration.html`(`c75fe2c`):ADVICE-INTEGRATION.md 网页版 827 行单文件零依赖 · 6 节结构 + dark sage 主题色(区别 fe-skills 的 clay,代表"反思评估 / 校准")· 4 问 card / 5 主线 + 5 风险 matrix / D B E 三张 plan card(plan-head + 4 pblk)/ 13 行 timeline / 6 张边界 b-item / 4 选项 ASK · index.html 加 ADVICE 入口卡片 / fe-skills-integration.html nav 加 ADVICE 横向跳转
- **(agent)** ADVICE D V1 · 判断吻合度对照表(`e14dfc0`):`samples/labeled_validation.jsonl` 10 条 ground truth + `agent/satellite_agent/validation.py` 新模块 (~290 行: load / run_judgment / compare 4 种 match_kind / _summarize_match / _detect_blind_spots top-3 / render_validation_table) + CLI `satagent validate` + jobs.ACTIONS `validate-baseline` (注册 5 个) · **实测 baseline**: thesis_impact 90% / threads 67% / strategy 60% / thread_in_focus 56% / **Overall 60% V1 ≥50% 工程目标达成 ✅** · 25 新测试 · 262 → 287
- **(agent)** ADVICE B · 5 个 skill 文档沉淀分析师 know-how(`2f852b5`):`agent/skills/satellite_internet_research.md`(总览 4 主线 + 6 维度 + 5 步分析)+ `thesis_impact_judgment.md`(单事件 → 主线 4 种 over-fire 陷阱 + 防护)+ `strategy_recommendation_5_levels.md`(5 档触发条件 + ⭐ D V1 反推盲点修复建议)+ `wyhtb_writing_guide.md`(operator 录入指南 + 4 主线起步清单)+ `trigger_design_patterns.md`(3 内置 check 经验阈值 + 自定义扩展)~780 行 · agent/README.md 加 Skills 入口章节 · agent/docs/architecture.md §1.1 加 "agent 严谨引擎 vs skill 判断库" 分层说明
- **(agent)** ADVICE E · 运营支撑专题纵切片 demo(`2fbe5c0`):`samples/scenario_operations_focus.jsonl` 10 条事件(8 从 labeled_real 抽 + 2 近期新构造)· live.html 加 `?focus=主线` URL 参数 + sticky sage banner + DOM 后处理 `.fe-focus`/`.fe-blur` 视觉过滤 · `agent/docs/scenario-operations.md` 200 行 (数据集表 + 灌库命令 + 实测数字 + CEO 演示 narrative 6 步 + operator 工作流)· 实测 window=365 运营支撑 sentiment +5.02 远超其他主线,top main_drivers 前 2 都是运营支撑(商业模式 / 公司竞争力)
- 原 web/agent 文档套件(详见 2026-06-02 此前条目):`web/docs/enhancement-prd.md` + `web/docs/enhancement-prd.html` / `web/docs/architecture-notes.md` / `web/docs/system-design.md` / `web/docs/oss-survey.md` / `web/docs/harness-best-practices.md` / `agent/docs/schema.md` / `agent/.env.example` / 仓库根 `LICENSE` / `CONTRIBUTING.md` / `CHANGELOG.md` / `CODE_OF_CONDUCT.md` / `SECURITY.md`

---

## [0.2.0] — 2026-06-03

### 新增(Added)
- **(agent)** 决策辅助 Agent 首次正式发版:Phase 3a/3b 规则版双视角决策层
  - CEO 视角:主驱动变量识别 + 强度评分(`decision.py::_top_drivers`)、主线评分、战略建议(进入/加速/等待/退出/观察)+ 触发条件
  - 投资视角:同主线公司相对位势矩阵(`_company_matrix`)、仓位调节信号 + 证据链(`_position_signals`)、主线热度 vs N 周均值 baseline
- **(agent)** 文档套件首次成型:PRD + architecture / ontology / api / regression / roadmap 六份文档,各配同名 `*-viz.html` 可视化页
- **(agent)** FastAPI 端点扩展:`/decision/weekly`(md/csv/html/docx/pptx)、`/thesis/state`、`/alerts`、`/valuation`、`/debate`(Bull/Bear/Judge)、`/metrics`(Prometheus)
- **(agent)** 回归评测:30 条合成样本基线 100% 通过;25 条真实新闻基线 64% 整体通过,macro F1 0.875
- **(web)** 二级市场工作台对外材料:落地页、交互 demo(模拟数据)、4 张架构 SVG、3 份 PRD、部署 pipeline(GitHub + Cloudflare Pages)

### 说明
- 本版本是文档套件的首次正式发版;`web/` 工作台当前展示模拟数据,接入实盘需后端把 MCP 工具与编排跑起来。

---

## [0.1.0] — Phase 1(Research Agent,先于正式发版)

### 新增(Added)
- **(agent)** 输入侧事件结构化:ontology 建模(4 主线 / 6 场景 / 6 维度)、rules-based 事件分类
- **(agent)** 判断层:市场模型(4×7×3=84 行种子)+ 公司卡片
- **(agent)** SQLite 持久化(events / companies schema 已含 numeric 字段)
- **(agent)** CLI(satagent)+ 周报基础聚合版

---

> 历史说明:本变更日志在 v0.2.0 之后补建,早期版本(0.1.0 及更早)的条目依据现有文档(PRD、architecture、regression)中记录的 Phase 1 → 3a 进展回溯整理,日期为近似。后续版本请在发布时同步更新本文件。
