v0.20.2 harden antigravity research workflow

This commit is contained in:
Deep Research System
2026-05-07 12:57:11 +08:00
parent 68e45bcf41
commit e991b26af9
11 changed files with 532 additions and 33 deletions
@@ -0,0 +1,34 @@
# Deep Research Antigravity Rule
When operating this repository from Google Antigravity, use Antigravity as the primary Deep Research executor and use the repository as the method, artifact, and validation framework.
## Non-Negotiables
- Use Antigravity's model quota for main research work.
- Do not default to Python core model-worker commands such as `run`, `research --execute-packets`, or `research --assemble-chapters`, because they may route work through ZenMux/API credits.
- It is acceptable to write phase artifacts directly in Antigravity when following the project skills and evidence schema.
- Use `.agents/skills/antigravity-surface-adapter/SKILL.md` whenever the user asks for Antigravity usage, phase execution, model planning, or quota planning.
- Keep all research outputs under `projects/<slug>/`.
- Use Python scripts only for scaffolding, deterministic checks, citation/report rendering, status, and local material processing unless the user explicitly approves external model/API usage.
## Anti-Hallucination Contract
- No tool receipt, no search claim. The agent may not write that it has searched, checked, verified, or confirmed anything unless a search/browser/terminal/MCP tool call actually happened and the result is logged.
- No source ID, no factual claim. Every concrete fact in drafts must map to a `source_id` in `sources.jsonl` or the current phase ledger.
- No snippet laundering. Search result snippets, AI summaries, and memory are only leads; they cannot support final claims.
- Failed access must be explicit. If a page, PDF, registry, patent, or filing cannot be opened, mark it as inaccessible and do not quote exact values from it.
- Each phase must maintain `phaseX/search_log.md` or `phaseX/search_log.jsonl`.
- Each evidence packet must include `search_receipts`, `sources`, `counter_evidence`, and `unsupported_claims`.
- When evidence is thin, write "该观点证据不足,待进一步验证" rather than smoothing over the gap.
## Quota Discipline
- Surface manager: Gemini 3 Flash.
- Phase 0-1: Claude Opus 4.6 (Thinking).
- Phase 2: Gemini 3.1 Pro (Low).
- Phase 3: Gemini 3.1 Pro (High), with fallback to another model only if quality is inadequate.
- Phase 4: Claude Opus 4.6 (Thinking).
## Pause Points
Pause after Phase 1 and Phase 3. Ask the user to confirm the framework or critique decision before moving to the next major phase.
@@ -0,0 +1,140 @@
---
name: antigravity-surface-adapter
description: Guides Google Antigravity to run Deep Research natively with Antigravity model quotas, while using this repository's skills, source standards, artifacts, and optional Python utilities for validation/rendering.
---
# Antigravity Deep Research Adapter
Use this skill when the user asks to run, plan, review, or finalize a Deep Research project from Google Antigravity.
## Core Rule
Antigravity is the research operator. Use Antigravity's own model selector and task execution to perform the research phases. Python core is an auxiliary toolbox for project scaffolding, deterministic checks, citation/report rendering, and status inspection; do not let it silently route the main research through ZenMux unless the user explicitly asks.
The Deep Research method still comes from this repo:
- Follow `AGENTS.md` for evidence, source tiers, word budgets, pause points, and output hygiene.
- Load project skills from `.agents/skills/*` as needed.
- Write all artifacts under `projects/<slug>/`.
- Keep claims traceable to source IDs in `sources.jsonl`.
## Anti-Hallucination Contract
This project treats Gemini-family research as high risk for false confidence. Follow these rules mechanically:
1. No tool receipt, no search claim. Do not write "I searched", "confirmed", "official data shows", or similar unless the tool call happened and is recorded.
2. No source ID, no factual claim. Every concrete fact needs a `source_id`.
3. Search snippets are leads, not evidence. Open the original paper, filing, registry, patent, guideline, or company disclosure before citing.
4. Failed access is a finding. Write that the source could not be opened; do not infer exact numbers from inaccessible pages.
5. Log all searches in `phaseX/search_log.md` or `phaseX/search_log.jsonl`.
6. Keep an `unsupported_claims` list. It is better to expose uncertainty than to make the report look complete.
7. Before finishing each phase, sample at least 10 factual claims and verify that each has a source ID and opened source.
## Antigravity Model Plan
Switch the Antigravity conversation model by phase:
| Phase | Model | Purpose |
|---|---|
| Surface management | Gemini 3 Flash | Read skills, maintain task list, move phase by phase, run light shell commands, collect artifacts. |
| Phase 0-1 | Claude Opus 4.6 (Thinking) | Material interpretation, strategic framing, research method choice, bold hypotheses, chapter architecture. |
| Phase 2 | Gemini 3.1 Pro (Low) | Evidence collection, chapter research packets, first-pass chapter drafts. |
| Phase 3 | Gemini 3.1 Pro (High) | Independent critique, counter-evidence review, logic and evidence gap analysis. |
| Phase 4 | Claude Opus 4.6 (Thinking) | Final Chinese editorial integration, executive summary, wording quality, final consistency pass. |
Gemini 3 Flash should remain the phase manager. It can ask the user to switch to the phase model before heavy thinking, then resume management after the phase artifact is written.
## Python Core Boundary
Use Python core only when it helps without taking over the research model budget:
- Good: scaffold folders, parse local materials, validate sources/citations, render PDF/DOCX, show status.
- Risky: `research --execute-packets`, `run`, or any command that calls model workers through `configs/models.yaml`.
- If a command would call model workers, ask the user first and state that it may use ZenMux/API credits instead of Antigravity quota.
Safe utility examples:
```bash
uv run python scripts/dr.py init "研究主题" --slug <slug> --method <method>
uv run python scripts/dr.py status <slug>
uv run python scripts/dr.py skills validate
uv run python scripts/dr.py finalize <slug> --no-pdf --no-docx
```
## Native Runbook
1. Open the repository root in Antigravity.
2. Start with Gemini 3 Flash as phase manager. Load this skill, `AGENTS.md`, `mckinsey-method`, `search-strategy`, `source-quality`, `evidence-table`, `citation-manager`, `length-budget`, and `output-hygiene`.
3. Create or confirm `projects/<slug>/` and the phase folders. Use Python `init` only for scaffolding if helpful.
4. Phase 0-1: ask the user to switch to Claude Opus 4.6 (Thinking). Produce:
- `phase1/material_brief.md`
- `phase1/framework.md`
- `phase1/research_brief.md`
- `phase1/research_brief.json`
- `phase1/search_log.md`
- `phase1/unsupported_claims.md`
5. Pause for user confirmation.
6. Phase 2: ask the user to switch to Gemini 3.1 Pro (Low). Build evidence packets and chapter drafts without Python model workers:
- `phase2/task_cards.json`
- `phase2/packets/*.json`
- `phase2/sources.jsonl`
- `phase2/chapter_briefs/*.json`
- `phase2/compressed_findings/*.json`
- `phase2/drafts/chXX.md`
- `phase2/search_log.jsonl`
- `phase2/unsupported_claims.md`
7. Phase 3: ask the user to switch to Gemini 3.1 Pro (High). Produce `phase3/critique.md`, with explicit go/rework/fail decision and a source-audit table for at least 10 core facts.
8. Pause for user decision.
9. Phase 4: ask the user to switch to Claude Opus 4.6 (Thinking). Produce `phase4/final_zh.md`, `phase4/editorial_notes.md`, and `phase4/final_fact_check.md`. Use deterministic renderers afterward for PDF/DOCX.
## Search Strategy
If the `search` CLI from `paperfoot/search-cli` is installed, prefer it as the Antigravity-native search front door:
```bash
search agent-info
search search -q "CRISPR clinical trial 2025" -m academic --json
search search -q "BRCA1 gene patent" -m patents --json
search search -q "FDA warning letter CAPA pharmaceutical" -m general --json
search search -q "biotech market update 2026" -m news --json
```
Useful modes for this repo: `academic`, `scholar`, `patents`, `news`, `deep`, `extract`, `similar`, and `general`.
Do not treat synthesized search answers as evidence. Every important claim still needs source IDs, tier rating, source score, and preferably original PDFs/pages or official records.
If `search` is not installed, use the existing project search tools or Antigravity browser, but keep the same source-tier discipline.
## Suggested Antigravity Permissions
Within this workspace, the user may allow:
- `read_file(<workspace>)`
- `write_file(<workspace>)`
- `command(uv run python scripts/)`
- `command(search)`
- `command(pandoc)`
Keep these as Ask/Deny unless the user explicitly allows them:
- writes outside the workspace
- global Antigravity/Gemini settings
- destructive git commands
- reading `secrets.env`
- broad downloads or package installs
## What To Report Back
Always report concrete artifact paths:
- `projects/<slug>/phase1/research_brief.md`
- `projects/<slug>/phase2/task_cards.json`
- `projects/<slug>/phase2/packet_errors/` if present
- `projects/<slug>/phase3/critique.md`
- `projects/<slug>/phase4/*.pdf` and `*.docx`
If a phase fails, report the failing artifact and the rework plan. Do not hide model switches, quota-sensitive steps, or missing evidence.
+55
View File
@@ -0,0 +1,55 @@
# Deep Research Native Workflow
Description: Run a biomedical Deep Research project in Antigravity using Antigravity model quota, with explicit anti-hallucination gates and source receipts.
## Step 0: Load Context
- Load `AGENTS.md`.
- Load `.agents/rules/deep-research-antigravity.md`.
- Load `.agents/skills/antigravity-surface-adapter/SKILL.md`.
- Load skills: `mckinsey-method`, `search-strategy`, `source-quality`, `evidence-table`, `citation-manager`, `length-budget`, `output-hygiene`.
- Confirm topic, slug, report type, target audience, method, output length, and allowed search tools.
Gate: do not proceed if the topic, slug, and report purpose are unclear.
## Step 1: Phase 0-1 With Opus
- Ask the user to switch the conversation model to Claude Opus 4.6 (Thinking).
- Create project folders under `projects/<slug>/`.
- Read user materials and write `phase1/material_brief.md`.
- Run real searches and log them in `phase1/search_log.md`.
- Write `phase1/framework.md`, `phase1/research_brief.md`, and `phase1/research_brief.json`.
- Write `phase1/unsupported_claims.md` for hypotheses not yet evidenced.
Gate: pause for user confirmation. Do not enter Phase 2 before approval.
## Step 2: Phase 2 With Gemini 3.1 Pro Low
- Ask the user to switch the conversation model to Gemini 3.1 Pro (Low).
- Build `phase2/task_cards.json`.
- For each task card, run real searches and append `phase2/search_log.jsonl`.
- Write `phase2/packets/*.json`; every packet must contain `search_receipts`, `sources`, `counter_evidence`, and `unsupported_claims`.
- Build `phase2/chapter_briefs/*.json` and `phase2/compressed_findings/*.json`.
- Write `phase2/drafts/chXX.md` only from chapter briefs and compressed findings.
Gate: do not draft a chapter from memory or snippets. Every concrete claim needs a source ID.
## Step 3: Phase 3 With Gemini 3.1 Pro High
- Ask the user to switch the conversation model to Gemini 3.1 Pro (High).
- Review framework, packets, sources, chapter briefs, and drafts.
- Write `phase3/critique.md`.
- Include a source-audit table for at least 10 core facts.
- Mark decision as `go`, `rework`, or `fail`.
Gate: pause for user decision after critique.
## Step 4: Phase 4 With Opus
- Ask the user to switch the conversation model to Claude Opus 4.6 (Thinking).
- Write `phase4/final_zh.md` from approved drafts and sources only.
- Write `phase4/editorial_notes.md`.
- Write `phase4/final_fact_check.md`, listing any unresolved or downgraded claims.
- Use deterministic renderer tools afterward for PDF/DOCX.
Gate: final output cannot introduce new facts without adding sources and search logs first.
+46 -7
View File
@@ -18,6 +18,15 @@
- Skills 以 `.agents/skills` 为 canonical registryadapter skill 目录由 `uv run python scripts/dr.py skills sync` 同步。 - Skills 以 `.agents/skills` 为 canonical registryadapter skill 目录由 `uv run python scripts/dr.py skills sync` 同步。
- 默认工作链路为中文主写作;英文只保留在检索关键词、原文摘录、source title、DOI/URL 与来源笔记中。 - 默认工作链路为中文主写作;英文只保留在检索关键词、原文摘录、source title、DOI/URL 与来源笔记中。
### 1.2 Antigravity native 例外
Antigravity 可作为 native Deep Research 执行器使用,而不是只做 Python core 外壳。此时:
- Antigravity 使用 `.agents/rules``.agents/skills``.agents/workflows` 执行研究,主要消耗 Antigravity 模型配额。
- Gemini 3 Flash 只做流程管理;Phase 0-1 与 Phase 4 优先用 OpusPhase 2 用 Gemini 3.1 Pro LowPhase 3 用 Gemini 3.1 Pro High。
- Python core 只做脚手架、资料抽取、确定性校验、引用和 PDF/DOCX 渲染;不得默认运行会触发 ZenMux/API 模型调用的 `run``research --execute-packets``research --assemble-chapters`
- 仍必须遵守本文的信源、证据、反方证据、字数和输出卫生规则。
--- ---
## 2. 研究方法论(所有 agent 必须遵循) ## 2. 研究方法论(所有 agent 必须遵循)
@@ -37,6 +46,19 @@
- **反方证据优先**:每个 chapter 的研究必须主动搜索证伪性论点,不能只找支持证据 - **反方证据优先**:每个 chapter 的研究必须主动搜索证伪性论点,不能只找支持证据
- **数据可追溯**:所有数字、百分比、日期必须有来源 ID(如 `[src_042]` - **数据可追溯**:所有数字、百分比、日期必须有来源 ID(如 `[src_042]`
### 2.2.1 反幻觉与检索回执
Gemini / Antigravity / Gemini CLI 在研究任务中必须默认按"高幻觉风险模型"处理。所有 agent 必须遵守:
- **没有工具回执,不得声称已搜索**:只有在本轮或当前 phase 明确执行过 `search` CLI、`scripts/search.py`、browser、MCP、curl 或同等检索工具,并保存 query / tool / timestamp / URL / title,才能写"已检索/已确认"。
- **没有来源记录,不得写事实结论**:任何事实、数字、日期、公司管线、监管状态、临床结果、市场规模、专利状态必须能在 `sources.jsonl` 或 phase source ledger 中找到对应 `source_id`
- **不得把模型记忆当证据**:模型内置知识只能生成检索关键词或假设,不能作为正文证据。
- **不得伪造不可访问来源**:若无法打开 PDF、网页、注册页或公告原文,必须标注"未能访问原文,仅作为发现线索",不得提取具体数据。
- **不得用二手摘要冒充原文**:搜索结果 snippet、AI summary、媒体转述只能作为发现入口;核心证据必须回到原文、官方记录、论文、专利或披露文件。
- **必须保留检索轨迹**:每个 phase 至少写入 `phaseX/search_log.md``phaseX/search_log.jsonl`,记录关键词、工具、时间、命中源、筛除原因和下一步。
- **必须显式承认不确定性**:找不到证据时写"未找到足够证据",不得用模糊语气填补。
- **自检问题**:每完成一段含事实的文字,问:"这句话的来源 ID 是什么?原文在哪里?我真的打开/检索过它吗?"
### 2.3 字数配额(硬要求) ### 2.3 字数配额(硬要求)
| 报告类型 | 最小字数 | 建议章节数 | | 报告类型 | 最小字数 | 建议章节数 |
@@ -67,6 +89,7 @@
- **产出**`phase1/material_brief.md` + `phase1/framework.md` + `phase1/research_brief.md/json` - **产出**`phase1/material_brief.md` + `phase1/framework.md` + `phase1/research_brief.md/json`
- **暂停点**:用户确认材料解读、研究方法、任务切分、检索策略和章节框架 - **暂停点**:用户确认材料解读、研究方法、任务切分、检索策略和章节框架
- **硬规则**clarification 不只是问范围;必须固化报告用途、基调、成功标准、任务拆分、每个任务轴的 prompt/skills/search route,让低成本 worker 也能独立执行 - **硬规则**clarification 不只是问范围;必须固化报告用途、基调、成功标准、任务拆分、每个任务轴的 prompt/skills/search route,让低成本 worker 也能独立执行
- **反幻觉产物**:必须生成 `phase1/search_log.md`,并在 `research_brief.json` 中记录所有已确认来源与待验证假设。未检索的判断只能标为 hypothesis。
### Phase 2:深度研究 ### Phase 2:深度研究
- **驱动命令**`uv run python scripts/dr.py research <slug> --workers 6` - **驱动命令**`uv run python scripts/dr.py research <slug> --workers 6`
@@ -74,12 +97,14 @@
- **产出**`phase2/task_cards.json` + `packets/*.json` + `sources.jsonl` + `chapter_briefs/*.json` + `compressed_findings/*.json` + `drafts/chXX.md` - **产出**`phase2/task_cards.json` + `packets/*.json` + `sources.jsonl` + `chapter_briefs/*.json` + `compressed_findings/*.json` + `drafts/chXX.md`
- **不暂停**:全自动跑完 - **不暂停**:全自动跑完
- **防碎片化规则**:并发 worker 只写 evidence packet`--build-briefs` 必须先收束为 chapter brief 和 compressed finding;章节正文必须从 compressed finding 写,不得把 packet 按顺序拼贴成报告 - **防碎片化规则**:并发 worker 只写 evidence packet`--build-briefs` 必须先收束为 chapter brief 和 compressed finding;章节正文必须从 compressed finding 写,不得把 packet 按顺序拼贴成报告
- **反幻觉产物**:每个 packet 必须包含 `search_receipts``sources``counter_evidence``unsupported_claims`;没有 `search_receipts` 的 packet 不能进入 chapter brief。
### Phase 3:总编审校 ### Phase 3:总编审校
- **驱动命令**`uv run python scripts/dr.py review <slug>``/dr-review` 只是薄封装) - **驱动命令**`uv run python scripts/dr.py review <slug>``/dr-review` 只是薄封装)
- **主导入口**Python core deterministic reviewdr-chief-editor/Gemini 可作为后续深度审校增强 - **主导入口**Python core deterministic reviewdr-chief-editor/Gemini 可作为后续深度审校增强
- **产出**`projects/<slug>/phase3/critique.md` - **产出**`projects/<slug>/phase3/critique.md`
- **暂停点**:用户决策(修正 / 回炉 phase2 / 整体重来) - **暂停点**:用户决策(修正 / 回炉 phase2 / 整体重来)
- **反幻觉产物**`critique.md` 必须抽查至少 10 条核心事实,逐条给出 source_id、原文状态和是否需要回炉。
### Phase 4:成稿 ### Phase 4:成稿
- **驱动命令**`uv run python scripts/dr.py finalize <slug>` - **驱动命令**`uv run python scripts/dr.py finalize <slug>`
@@ -87,6 +112,7 @@
- **默认链路**final_zh.md → glossary/check(optional) → polish(optional) → citation_check → build_report - **默认链路**final_zh.md → glossary/check(optional) → polish(optional) → citation_check → build_report
- **兼容链路**:仅显式 `--legacy-translate` 时使用 final_en.md → translate → polish - **兼容链路**:仅显式 `--legacy-translate` 时使用 final_en.md → translate → polish
- **产出**`phase4/final_zh.md` + `phase4/final_zh_polished.md`(可选)+ `phase4/*.pdf` + `phase4/*.docx` - **产出**`phase4/final_zh.md` + `phase4/final_zh_polished.md`(可选)+ `phase4/*.pdf` + `phase4/*.docx`
- **反幻觉产物**:终稿不得引入 Phase 2/3 中不存在的新事实;如需新增事实,必须先追加 sources 与 search_log,再写入正文。
--- ---
@@ -183,17 +209,18 @@ uv run python scripts/dr.py methods list
| Codex | `AGENTS.md` + `$CODEX_HOME` adapter(由 `scripts/deploy_adapters.py codex` 部署) | `uv run python scripts/dr.py ...``codex exec "$(uv run python scripts/dr.py prompt dr-run '<topic>')"` | | Codex | `AGENTS.md` + `$CODEX_HOME` adapter(由 `scripts/deploy_adapters.py codex` 部署) | `uv run python scripts/dr.py ...``codex exec "$(uv run python scripts/dr.py prompt dr-run '<topic>')"` |
| Claude Code | `.claude/skills/*/SKILL.md` | `/dr-run <slug-or-topic>` | | Claude Code | `.claude/skills/*/SKILL.md` | `/dr-run <slug-or-topic>` |
| Gemini CLI | `GEMINI.md` + `.gemini/commands/dr/*.toml` | `/dr:run <slug-or-topic>` | | Gemini CLI | `GEMINI.md` + `.gemini/commands/dr/*.toml` | `/dr:run <slug-or-topic>` |
| Antigravity | 打开仓库后由 Agent Manager 运行终端命令 | 要求 agent 运行 `uv run python scripts/dr.py ...` | | Antigravity | `.agents/rules` + `.agents/skills` + `.agents/workflows` | Gemini Flash 管流程,按 phase 切 Opus/GeminiPython core 只做辅助 |
跨平台硬规则: 跨平台硬规则:
- 平台只做 surface adapter,不承载核心调度。 - 除 Antigravity native 模式外,平台只做 surface adapter,不承载核心调度。
- 不在平台 prompt 中手工并发写章节。 - 不在平台 prompt 中手工并发写章节。
- 不把平台 subagent 当默认并发机制。 - 不把平台 subagent 当默认并发机制。
- 真实并发由 `scripts/runtime/workers.py` 的 worker pool 执行。 - 真实并发由 `scripts/runtime/workers.py` 的 worker pool 执行。
- 真实模型选择由 `configs/models.yaml``scripts/runtime/roles.py` 执行。 - 真实模型选择由 `configs/models.yaml``scripts/runtime/roles.py` 执行。
- 信息检索默认走 `scripts/search.py` / `SearchClient` / `search-gateway` skill;不得把 Tavily MCP、browser MCP 或平台 web search 作为默认路径,除非用户明确授权。 - 信息检索默认走 `scripts/search.py` / `SearchClient` / `search-gateway` skill;不得把 Tavily MCP、browser MCP 或平台 web search 作为默认路径,除非用户明确授权。
- 搜索路由必须按任务类型选择:`evidence`=Exa highlights 受控证据发现,`fda/scholar/patents/news`=专用信源路径,`general`=宽泛发现和兜底;Tavily Research 只能作为阶段性 scan/enrichment/rework 输入,不能直接替代 evidence packet 或章节正文。 - 搜索路由必须按任务类型选择:`evidence`=Exa highlights 受控证据发现,`fda/scholar/patents/news`=专用信源路径,`general`=宽泛发现和兜底;Tavily Research 只能作为阶段性 scan/enrichment/rework 输入,不能直接替代 evidence packet 或章节正文。
- Antigravity native 可使用 `paperfoot/search-cli``search` 命令作为统一检索前台;但所有结果仍必须写入 search_log、sources.jsonl,并按 Tier/source-quality 评分。
--- ---
@@ -210,12 +237,13 @@ uv run python scripts/dr.py methods list
- API 密钥**只存** `secrets.env`(已入 gitignore),禁止硬编码到任何 agent/skill/command - API 密钥**只存** `secrets.env`(已入 gitignore),禁止硬编码到任何 agent/skill/command
- 字体文件(~140MB)不入 git,通过 `download-fonts.sh` 获取 - 字体文件(~140MB)不入 git,通过 `download-fonts.sh` 获取
- `bash` 权限默认 `ask`,仅允许 `python *` / `pandoc *` / `ls *` / `cat *` / `curl *` 自动执行 - `bash` 权限默认 `ask`,仅允许 `python *` / `pandoc *` / `ls *` / `cat *` / `curl *` 自动执行
- Antigravity 项目范围内可给予较高权限,但只应写当前 workspace;跨 workspace、全局设置、删除文件、git reset/clean、密钥读取和外部网络批量下载仍需用户明确批准。
--- ---
## 9. 如何判断是否走了 Python Core ## 9. 如何判断是否走了 Python Core
不要用“平台是否 spawn subagent”作为成功标准。v0.20 的验证锚点是 Python runtime 产物: 不要用“平台是否 spawn subagent”作为成功标准。Python-core 模式的验证锚点是 Python runtime 产物:
1. `uv run python scripts/dr.py status <slug>` 能看到 phase 状态。 1. `uv run python scripts/dr.py status <slug>` 能看到 phase 状态。
2. Phase 2 存在 `phase2/task_cards.json` 2. Phase 2 存在 `phase2/task_cards.json`
@@ -225,6 +253,15 @@ uv run python scripts/dr.py methods list
6. `--assemble-chapters` 后存在 `phase2/drafts/chXX.md` 和必要时的 `phase2/chapter_errors/*.json` 6. `--assemble-chapters` 后存在 `phase2/drafts/chXX.md` 和必要时的 `phase2/chapter_errors/*.json`
7. `scripts/v020_regression.py` 输出 `v0.20 regression PASS` 7. `scripts/v020_regression.py` 输出 `v0.20 regression PASS`
Antigravity native 模式的验证锚点是研究产物与检索回执:
1. `.agents/rules/deep-research-antigravity.md` 被启用或明确 at mention。
2. Phase 0-1 存在 `phase1/search_log.md``phase1/research_brief.md/json``phase1/unsupported_claims.md`
3. Phase 2 存在 `phase2/search_log.jsonl``phase2/packets/*.json``phase2/sources.jsonl``phase2/chapter_briefs/*.json``phase2/drafts/chXX.md`
4. 每个 packet 包含 `search_receipts``sources``counter_evidence``unsupported_claims`
5. Phase 3 `critique.md` 包含至少 10 条核心事实 source audit。
6. Phase 4 存在 `final_fact_check.md`,且终稿未引入无来源新事实。
--- ---
## 10. 禁止事项(negative instructions ## 10. 禁止事项(negative instructions
@@ -235,10 +272,12 @@ uv run python scripts/dr.py methods list
2. ❌ 在缺乏 2 个独立信源时仍给出绝对化结论 2. ❌ 在缺乏 2 个独立信源时仍给出绝对化结论
3. ❌ 使用"据报道""有专家认为"等未指明来源的表述 3. ❌ 使用"据报道""有专家认为"等未指明来源的表述
4. ❌ 编造或虚构数据、URL、DOI 4. ❌ 编造或虚构数据、URL、DOI
5.写空洞的套话("随着科技的发展""在大数据时代" 5.声称"已搜索/已验证/官网显示"但没有工具回执和 search_log
6.忽略反方观点,只收集支持证据 6.用搜索摘要、AI summary、snippet 冒充原文证据
7.对输出字数"打折"(综述 <10000 字、研究 <30000 字必须返工 7.写空洞的套话("随着科技的发展""在大数据时代"
8.在正文中使用未在术语表中定义的专业缩写(首次出现需全称+缩写) 8.忽略反方观点,只收集支持证据
9. ❌ 对输出字数"打折"(综述 <10000 字、研究 <30000 字必须返工)
10. ❌ 在正文中使用未在术语表中定义的专业缩写(首次出现需全称+缩写)
--- ---
+21 -5
View File
@@ -1,14 +1,30 @@
# Gemini CLI Project Instructions # Gemini CLI Project Instructions
This repository is Deep Research v0.20. This repository is Deep Research v0.20. Gemini must assume it is high-risk for hallucination and false confirmation in research tasks.
- Python core is the source of truth: `scripts/dr.py`, `scripts/runtime/**`, `configs/models.yaml`, `.agents/skills`. ## Load Order
- Gemini CLI is a surface adapter. Do not perform core orchestration in the chat thread.
- Use `.gemini/commands/dr/*.toml` commands or run `uv run python scripts/dr.py ...` directly. - Treat `AGENTS.md` as the cross-platform rule source.
- For Antigravity-native work, also follow `.agents/rules/deep-research-antigravity.md` and `.agents/skills/antigravity-surface-adapter/SKILL.md`.
- Use `/memory show` or equivalent context inspection when behavior seems inconsistent.
## Non-Negotiable Research Integrity
- Never claim "searched", "verified", "confirmed", "officially shows", or "according to source" unless a tool was actually executed in this session or current phase and the result is logged.
- Every factual claim with a number, date, company, product, clinical phase, regulatory status, market size, patent status, or quote needs a `source_id`.
- Search snippets, AI summaries, and model memory are discovery aids only. They are not evidence.
- If you cannot open the original source, write "未能访问原文,仅作为发现线索" and do not extract exact values from it.
- Maintain a phase search log: query, tool, timestamp, URL/title, selected/rejected status, and reason.
- Prefer saying "未找到足够证据" over filling gaps.
## Platform Mode
- Gemini CLI is normally a Python-core surface adapter. Use `.gemini/commands/dr/*.toml` or run `uv run python scripts/dr.py ...`.
- Antigravity is the exception: it should use its own model quota and skills to execute research natively; Python scripts are auxiliary unless the user explicitly approves model-worker/API usage.
- Keep formal research outputs Chinese-first. Search keywords, source titles, excerpts, DOI/URL and raw notes may remain English. - Keep formal research outputs Chinese-first. Search keywords, source titles, excerpts, DOI/URL and raw notes may remain English.
- Do not modify `projects/**` unless the user is intentionally running a research project. - Do not modify `projects/**` unless the user is intentionally running a research project.
Typical commands: ## Typical Python-Core Commands
```bash ```bash
uv run python scripts/dr.py run "研究主题" --slug <slug> --method mckinsey_market uv run python scripts/dr.py run "研究主题" --slug <slug> --method mckinsey_market
+47 -2
View File
@@ -1,7 +1,7 @@
# Deep Research 系统方案(Python Core + 多平台 Adapter # Deep Research 系统方案(Python Core + 多平台 Adapter
> 本文件是整套方案的**单一真实源**,中断后续接时从此文件恢复上下文。 > 本文件是整套方案的**单一真实源**,中断后续接时从此文件恢复上下文。
> 最后更新:2026-05-05 > 最后更新:2026-05-07
> 实施阶段:v0.20 — Skill-driven Python core 重构 > 实施阶段:v0.20 — Skill-driven Python core 重构
--- ---
@@ -35,6 +35,7 @@
| 交互节奏 | Phase 1 末、Phase 3 末强制确认 | | 交互节奏 | Phase 1 末、Phase 3 末强制确认 |
| 并发执行 | Python task-card worker pool(平台 subagent 仅作可选表层能力) | | 并发执行 | Python task-card worker pool(平台 subagent 仅作可选表层能力) |
| 中文字体 | **思源宋体 + 思源黑体 + 霞鹜文楷**,通过 `download-fonts.sh` 自动拉取 | | 中文字体 | **思源宋体 + 思源黑体 + 霞鹜文楷**,通过 `download-fonts.sh` 自动拉取 |
| Antigravity 适配 | 使用 `.agents/rules` + `.agents/skills` 指导 Antigravity 原生执行 Deep ResearchGemini Flash 管流程,Opus/Gemini Pro 分 phase 执行,Python core 退为辅助工具 |
--- ---
@@ -59,6 +60,19 @@
**Cache 行为**Claude 走 `@ai-sdk/anthropic` 会自动打 `cache_control` 断点,zenmux 的 Anthropic 端点完整支持 4 种 cache 模式。Opus 4.7 cache read 价格仅 0.5 USD/M tokens(对比输入价 25 USD/M,节省 98%)。验证方法见 `AGENTS.md` §6.5。 **Cache 行为**Claude 走 `@ai-sdk/anthropic` 会自动打 `cache_control` 断点,zenmux 的 Anthropic 端点完整支持 4 种 cache 模式。Opus 4.7 cache read 价格仅 0.5 USD/M tokens(对比输入价 25 USD/M,节省 98%)。验证方法见 `AGENTS.md` §6.5。
### 2.1 Antigravity 原生模型策略
Antigravity 当前可选 models 包括 Gemini 3.1 Pro (High/Low)、Gemini 3 Flash、Claude Sonnet 4.6 (Thinking)、Claude Opus 4.6 (Thinking) 与 GPT-OSS 120B。Codex 使用经验显示,若 Antigravity 仍默认调用 Python core model workers,研究主流程容易回到 ZenMux,并且 packet/chapter assembly 有碎片化风险。因此 Antigravity 采用 native 模式:用 skill 指导 Antigravity 自身模型按 phase 写产物,Python core 只负责脚手架、确定性校验、引用和出稿。
默认策略:
- Surface managerGemini 3 Flash,负责读 skill、维护 task list、推进 phase、跑轻量命令和收集 artifact。
- Phase 0-1Claude Opus 4.6 (Thinking),负责材料解读、研究方法选择、大胆假设、章节架构和成功标准。
- Phase 2Gemini 3.1 Pro (Low),负责证据包、反方证据、chapter brief、初稿,优先追求速度和可控成本。
- Phase 3Gemini 3.1 Pro (High),先做总编审校和证伪;若质量不足,再人工决定是否换模型复核。
- Phase 4Claude Opus 4.6 (Thinking),负责最终中文统稿、Executive Summary、表达质量和交付一致性。
- Python core 禁止默认接管 `run/research --execute-packets/assemble-chapters`;只有用户明确授权外部模型/API 消耗时才运行。
--- ---
## 3. 完整架构 ## 3. 完整架构
@@ -69,7 +83,7 @@ v0.20 后,核心编排从平台 prompt 迁移到项目自有 Python runtime
- `scripts/dr.py` 是稳定入口:`init``frame``run``research``review``finalize``skills``models` - `scripts/dr.py` 是稳定入口:`init``frame``run``research``review``finalize``skills``models`
- `scripts/runtime/*` 负责 role/task 模型解析、skill registry、task cards、packet schema、manifest 更新。 - `scripts/runtime/*` 负责 role/task 模型解析、skill registry、task cards、packet schema、manifest 更新。
- `.agents/skills` 是 canonical skill registry`.opencode/skills` 等 adapter 目录由 `dr.py skills sync` 生成。 - `.agents/skills` 是 canonical skill registry,也是 Antigravity 默认 workspace skill 目录`.opencode/skills` 等 adapter 目录由 `dr.py skills sync` 生成。
- OpenCode/Codex/Claude Code 只作为 surface adapter,调用 Python CLI,不再承载默认并发调度。 - OpenCode/Codex/Claude Code 只作为 surface adapter,调用 Python CLI,不再承载默认并发调度。
- Phase 2 默认生成 `phase2/task_cards.json``phase2/packets/*.json`,减少长上下文传递。 - Phase 2 默认生成 `phase2/task_cards.json``phase2/packets/*.json`,减少长上下文传递。
- Phase 2 在正式写章前生成 `phase2/chapter_briefs/*.json`,先把并发证据收束为章节主线,降低碎片化。 - Phase 2 在正式写章前生成 `phase2/chapter_briefs/*.json`,先把并发证据收束为章节主线,降低碎片化。
@@ -78,6 +92,7 @@ v0.20 后,核心编排从平台 prompt 迁移到项目自有 Python runtime
- Phase 4 默认中文原生:`final_zh.md -> build_report`legacy 英译中链路仅由 `--legacy-translate` 显式启用。 - Phase 4 默认中文原生:`final_zh.md -> build_report`legacy 英译中链路仅由 `--legacy-translate` 显式启用。
- Phase 1 必须选择 `research_method`,由 `configs/research_methods.yaml` 决定框架方法和 Phase 2 task axesMECE 不再是唯一默认。 - Phase 1 必须选择 `research_method`,由 `configs/research_methods.yaml` 决定框架方法和 Phase 2 task axesMECE 不再是唯一默认。
- 用户提供资料入口已支持 `input_materials` / `phase0/inputs` / `phase0/extracted`PDF 文本抽取与 FireRed OCR 扫描件识别已先行落地,DOCX/PPTX/表格结构化继续放入 v0.21。 - 用户提供资料入口已支持 `input_materials` / `phase0/inputs` / `phase0/extracted`PDF 文本抽取与 FireRed OCR 扫描件识别已先行落地,DOCX/PPTX/表格结构化继续放入 v0.21。
- Antigravity 入口已落地:`.agents/rules/deep-research-antigravity.md` 约束其优先使用 Antigravity 模型配额,`.agents/skills/antigravity-surface-adapter` 提供 native runbook、模型切换和搜索策略。
``` ```
┌─────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────┐
@@ -715,3 +730,33 @@ OpenCode 的坑:如果只是在主会话里装样子地写"让 X agent 做"
- `scripts/runtime/tasks.py` 把 `evidence` 纳入合法 search route,并更新主要 task axes 的默认路由。 - `scripts/runtime/tasks.py` 把 `evidence` 纳入合法 search route,并更新主要 task axes 的默认路由。
- `scripts/runtime/workers.py` 的 `ProjectSearchProvider` 支持 `evidence` route。 - `scripts/runtime/workers.py` 的 `ProjectSearchProvider` 支持 `evidence` route。
- `skills/search-gateway`、`skills/search-strategy`、`docs/search-playbook.md`、`README.md`、`AGENTS.md` 同步记录搜索分工,避免后续又回到 Tavily MCP 或中文长句搜索。 - `skills/search-gateway`、`skills/search-strategy`、`docs/search-playbook.md`、`README.md`、`AGENTS.md` 同步记录搜索分工,避免后续又回到 Tavily MCP 或中文长句搜索。
- 2026-05-07 v0.20.1 Antigravity native adapter**用 Antigravity 模型配额执行研究**
**设计结论**
- Antigravity 官方机制以 `.agents/skills`、`.agents/rules`、Rules/Workflows、Task Groups 和 browser subagent 为核心;本项目在 Antigravity 中采用 skill-driven native research,而不是默认调用 Python core model workers。
- `AGENTS.md` 继续作为跨平台总规则;Antigravity 专项约束放到 workspace rule 和 skill,避免引入非官方 SOUL.md 作为项目真源。
- Opus 额度有限但大局观强,优先用于 Phase 0-1 和 Phase 4Gemini 3 Flash 做流程管理,Gemini 3.1 Pro Low/High 分别用于 Phase 2/3。
- `paperfoot/search-cli` 可作为 Antigravity 原生检索前台:多 provider、14 modes、JSON/exit code 友好;但不得替代本项目 source tier 与 source-quality 评分。
**已落地**
- 新增 `.agents/skills/antigravity-surface-adapter/SKILL.md`,定义 Antigravity native runbook、pause points、artifact 汇报、模型切换表和 `search-cli` 使用建议。
- 新增 `.agents/rules/deep-research-antigravity.md`,要求 Antigravity 优先使用自身模型配额,Python core 只做脚手架、确定性校验、引用和出稿。
- 撤回 `configs/models.yaml` 中 Antigravity 专用 ZenMux profile,避免误导主流程继续走 Python/ZenMux。
- `docs/platform-adapters.md`、`README.md`、测试用例同步更新。
- 2026-05-07 v0.20.2 Antigravity/Gemini research integrity hardening**反幻觉、反假搜索、workflow gates**
**设计结论**
- Gemini/Gemini CLI/Antigravity 在 deep research 中必须默认视为高幻觉风险模型;项目规则要把"诚实暴露不确定性"写成硬门槛,而不是依赖模型自觉。
- `GEMINI.md` 适合放短而硬的项目级行为约束,并通过层级 context 与 imports 承接 `AGENTS.md`。
- Antigravity `rules` 适合放 Always-On 约束;`workflows` 适合固化 Phase 0-4 执行顺序、人工暂停点和质量 gates。
- Claude/Claude Code 最佳实践可借鉴:根指令要短、具体、可执行,长流程拆到 rules/skills/workflows,避免巨型上下文降低遵从性。
**已落地**
- `AGENTS.md` 新增 Antigravity native 例外、检索回执、source_id、search_log、unsupported_claims 等反幻觉硬规则。
- `GEMINI.md` 重写为短约束:禁止假搜索、禁止无 source_id 事实、要求 search log,并区分 Gemini CLI 与 Antigravity native。
- `.agents/rules/deep-research-antigravity.md` 加入 Anti-Hallucination Contract。
- `.agents/skills/antigravity-surface-adapter/SKILL.md` 加入 phase artifacts、fact-audit、权限建议和检索日志要求。
- 新增 `.agents/workflows/deep-research-native.md`,把四阶段 native research 写成可执行 workflow,并在每阶段设 gate。
- `scripts/deploy_adapters.py antigravity` 同步部署 workflows;已有文件继续默认跳过,`--force` 才备份覆盖。
+15 -5
View File
@@ -95,13 +95,13 @@ uv run python scripts/build_report.py <slug> --engine quarto # Quarto/xelatex
### 多平台兼容 ### 多平台兼容
v0.20 后,所有平台都是 surface adapter,核心调度只在 Python core 中执行。详细调用方式见 `docs/platform-adapters.md` v0.20 后,OpenCode/Codex/Claude Code/Gemini CLI 都是 Python core 的 surface adapter。Antigravity 走 native 模式:用 `.agents/skills` 指导其自身模型按 phase 执行研究,Python core 只做辅助。详细调用方式见 `docs/platform-adapters.md`
- OpenCode:使用 `.opencode/commands/*.md` 薄封装 Python CLI。 - OpenCode:使用 `.opencode/commands/*.md` 薄封装 Python CLI。
- Codex:使用 `AGENTS.md` + 部署到 `$CODEX_HOME` 的 adapter 文件,优先用 GPT 系列做代码/测试/审阅。 - Codex:使用 `AGENTS.md` + 部署到 `$CODEX_HOME` 的 adapter 文件,优先用 GPT 系列做代码/测试/审阅。
- Claude Code:使用 `.claude/skills/*/SKILL.md`,优先用 Opus/Sonnet 做访谈、结构讨论和中文风格审阅。 - Claude Code:使用 `.claude/skills/*/SKILL.md`,优先用 Opus/Sonnet 做访谈、结构讨论和中文风格审阅。
- Gemini CLI:使用 `GEMINI.md``.gemini/commands/dr/*.toml`,优先用 Gemini 做长上下文、多模态和替代框架审阅。 - Gemini CLI:使用 `GEMINI.md``.gemini/commands/dr/*.toml`,优先用 Gemini 做长上下文、多模态和替代框架审阅。
- Antigravity:作为 Agent Manager 打开仓库,要求 agent 在终端运行 `uv run python scripts/dr.py ...` - Antigravity:作为 Agent Manager 打开仓库,使用 `.agents/rules` + `.agents/skills` 指导其用 Antigravity 模型配额原生执行 Deep ResearchPython core 只做脚手架、校验、引用和出稿辅助
部署 Codex adapter(不在仓库内创建 `.codex`): 部署 Codex adapter(不在仓库内创建 `.codex`):
@@ -113,6 +113,15 @@ Codex adapter 会写到 `$CODEX_HOME` 或 `~/.codex`;已有文件会在 `--for
安全默认:部署脚本不会复制 `config.toml`,避免覆盖用户级 Codex 配置。只有明确需要安装本项目 bundled profile 时,才使用 `--include-config` 安全默认:部署脚本不会复制 `config.toml`,避免覆盖用户级 Codex 配置。只有明确需要安装本项目 bundled profile 时,才使用 `--include-config`
部署 Antigravity workspace adapter(只写目标工作区 `.agents/`,默认不覆盖已有文件):
```bash
uv run python scripts/deploy_adapters.py antigravity --target /path/to/workspace --dry-run
uv run python scripts/deploy_adapters.py antigravity --target /path/to/workspace
```
Antigravity 部署不会修改全局设置。若目标工作区已有同名 rule/skill/workflow 文件,默认跳过;只有显式加 `--force` 时才会先生成 `.bak` 备份再覆盖。
部署到新环境后自检: 部署到新环境后自检:
```bash ```bash
@@ -135,7 +144,7 @@ uv run python scripts/dr.py review <slug>
uv run python scripts/dr.py finalize <slug> uv run python scripts/dr.py finalize <slug>
``` ```
OpenCode/Codex/Claude Code/Antigravity/Gemini CLI adapter 只包装这些 CLI,不再承担核心调度或模型选择。 OpenCode/Codex/Claude Code/Gemini CLI adapter 只包装这些 CLI,不再承担核心调度或模型选择。Antigravity 是例外:它优先按 `.agents/skills/antigravity-surface-adapter` 用自身模型配额执行研究,避免主流程重新落回 ZenMux。
模型与搜索 API 选择见: 模型与搜索 API 选择见:
- `docs/model-playbook.md` - `docs/model-playbook.md`
@@ -177,7 +186,7 @@ uv run python scripts/search.py "FDA warning letter CAPA deviation change contro
uv run python scripts/search.py "dual-target siRNA GalNAc" --route patents uv run python scripts/search.py "dual-target siRNA GalNAc" --route patents
``` ```
v0.20 搜索分工:`evidence` 用 Exa highlights 做受控候选证据发现;`scholar/patents/news/fda` 保留专用路由;`general` 只做宽泛发现和兜底;Tavily Research 作为 Phase1 初扫、薄弱章节补证据和 Phase3 回炉工具,结果必须存盘、评分、去重后再进入 evidence packet。 v0.20 搜索分工:`evidence` 用 Exa highlights 做受控候选证据发现;`scholar/patents/news/fda` 保留专用路由;`general` 只做宽泛发现和兜底;Tavily Research 作为 Phase1 初扫、薄弱章节补证据和 Phase3 回炉工具,结果必须存盘、评分、去重后再进入 evidence packet。Antigravity 原生流程可优先使用 `paperfoot/search-cli``search` 命令作为统一检索前台,但所有结论仍必须回到本项目 Tier/source-quality 体系。
--- ---
@@ -344,7 +353,7 @@ Opus 4.7 cache 读取价格 0.5 USD/M tokens(对比输入 25 USD/M,节省 98
### 系统侧(下一阶段) ### 系统侧(下一阶段)
- [x] Python core `init/frame/research/review/finalize/status` 骨架 - [x] Python core `init/frame/research/review/finalize/status` 骨架
- [x] OpenCode/Codex/Claude Code/Gemini CLI wrapper - [x] OpenCode/Codex/Claude Code/Gemini CLI wrapper
- [ ] Antigravity 专用工作流模板(等待官方本地配置格式稳定) - [x] Antigravity 专用 workspace rule + skill,按 Antigravity 模型配额原生执行研究
- [x] 用户资料导入基础能力:PDF 文本抽取 + FireRed OCR 扫描件识别 + phase0 落盘 - [x] 用户资料导入基础能力:PDF 文本抽取 + FireRed OCR 扫描件识别 + phase0 落盘
- [ ] 用户资料导入增强:DOCX / PPTX / 表格抽取 / 版面结构化 - [ ] 用户资料导入增强:DOCX / PPTX / 表格抽取 / 版面结构化
- [ ] PDF reporting 包继续拆分:字体、宽表、引用、渲染验证 - [ ] PDF reporting 包继续拆分:字体、宽表、引用、渲染验证
@@ -499,5 +508,6 @@ direnv allow
- **v0.3** (2026-04-20) — 修正 v0.2 模型名(回到 Opus 4.7 / Sonnet 4.6 / Gemini 3.1 Pro / GPT-5.4 Pro 等真实 slug);改 venv + requirements.txt 跨平台方案(macOS + Debian);新增 `scripts/setup.sh``scripts/activate.sh` - **v0.3** (2026-04-20) — 修正 v0.2 模型名(回到 Opus 4.7 / Sonnet 4.6 / Gemini 3.1 Pro / GPT-5.4 Pro 等真实 slug);改 venv + requirements.txt 跨平台方案(macOS + Debian);新增 `scripts/setup.sh``scripts/activate.sh`
- **v0.13** (2026-05-02) — `build_report.py` 新增 `--engine quarto` 选项:Quarto 1.9 + xelatex 引擎,解决 ReportLab 超宽表格渲染 bug`negative availWidth`/`NoneType` 问题);`report-template.py` 同步修复(`render_table_blocks` 分块 + 等宽列强制分配);README 补充双引擎安装指南与排错 - **v0.13** (2026-05-02) — `build_report.py` 新增 `--engine quarto` 选项:Quarto 1.9 + xelatex 引擎,解决 ReportLab 超宽表格渲染 bug`negative availWidth`/`NoneType` 问题);`report-template.py` 同步修复(`render_table_blocks` 分块 + 等宽列强制分配);README 补充双引擎安装指南与排错
- **v0.20** (2026-05-05) — Skill-driven Python core 重构启动:新增 `scripts/runtime/*``scripts/dr.py init/frame/run/research/review/skills`、task-type 模型映射、中文原生 finalize 默认路径和 `scripts/reporting/*` 报告模块;OpenCode/Codex/Claude Code/Gemini CLI 命令降级为 Python CLI wrapper。 - **v0.20** (2026-05-05) — Skill-driven Python core 重构启动:新增 `scripts/runtime/*``scripts/dr.py init/frame/run/research/review/skills`、task-type 模型映射、中文原生 finalize 默认路径和 `scripts/reporting/*` 报告模块;OpenCode/Codex/Claude Code/Gemini CLI 命令降级为 Python CLI wrapper。
- **v0.20.1** (2026-05-07) — Antigravity-native adapter:新增 `.agents/rules/deep-research-antigravity.md``.agents/skills/antigravity-surface-adapter`,按 Gemini Flash 管理、Opus/Gemini 分 phase 执行研究;Python core 退为辅助工具。
`PLAN.md` §12 了解完整变更历史。 `PLAN.md` §12 了解完整变更历史。
+55 -13
View File
@@ -1,10 +1,10 @@
# v0.20 Platform Adapters # v0.20 Platform Adapters
> v0.20 的唯一核心入口是 Python core`scripts/dr.py`、`scripts/runtime/**`、`configs/models.yaml`、`.agents/skills`。所有 IDE/CLI agent 只做 surface adapter > v0.20 的默认核心入口是 Python core`scripts/dr.py`、`scripts/runtime/**`、`configs/models.yaml`、`.agents/skills`。Antigravity 例外:它使用 `.agents/skills` 与 `.agents/rules` 走 native Deep Research,让 Antigravity 模型配额承担主要研究工作
## Shared Rule ## Shared Rule
不要让平台 agent 自己调度 Phase 2 并发、模型选择或上下文压缩。平台只负责: 除 Antigravity native 模式外,不要让平台 agent 自己调度 Phase 2 并发、模型选择或上下文压缩。默认平台只负责:
- 运行 `uv run python scripts/dr.py ...` - 运行 `uv run python scripts/dr.py ...`
- 展示产物路径与失败包 - 展示产物路径与失败包
@@ -24,6 +24,8 @@ uv run python scripts/dr.py review <slug>
uv run python scripts/dr.py finalize <slug> uv run python scripts/dr.py finalize <slug>
``` ```
Antigravity 不走这条最小链路作为默认研究主流程;详见下方 Antigravity 章节。
## OpenCode ## OpenCode
官方机制:OpenCode 支持 `.opencode/commands/*.md` 自定义命令;文件名就是 slash command,内容是 promptfrontmatter 可指定 `agent``model``subtask`。OpenCode 也支持 primary/subagent 两类 agent,但 v0.20 不再把平台 subagent 当默认并发机制。 官方机制:OpenCode 支持 `.opencode/commands/*.md` 自定义命令;文件名就是 slash command,内容是 promptfrontmatter 可指定 `agent``model``subtask`。OpenCode 也支持 primary/subagent 两类 agent,但 v0.20 不再把平台 subagent 当默认并发机制。
@@ -128,26 +130,55 @@ gemini
## Antigravity ## Antigravity
官方公开资料把 Antigravity 定位为 agent-first IDEagent 可访问 editor、terminal、browser,并可并行规划、执行、验证。它适合把开发者提升为 Agent Manager,但不适合让每个 Antigravity agent 自己维护 Deep Research 的状态机 官方资料显示,Antigravity agent-first IDE主 Agent 可 editor、terminal、browser 工作;浏览器操作由 browser subagent 执行;Agent Manager 可管理多个任务流和 artifacts。基于 Codex 的 skill-driven 经验,本项目在 Antigravity 中不再默认把研究主流程交给 Python model workers,而是让 Antigravity 用自己的模型配额按 phase 执行研究
本项目已提供 Antigravity 入口:
- `.agents/skills/antigravity-surface-adapter/SKILL.md`Antigravity 专用执行说明。
- `.agents/rules/deep-research-antigravity.md`workspace rule,约束其优先使用 Antigravity 模型配额,避免主流程落回 ZenMux。
- `.agents/workflows/deep-research-native.md`:可按 slash workflow 执行的四阶段研究流程与反幻觉 gate。
- `.agents/skills/*`Antigravity 官方默认 skill 目录,直接复用本项目 canonical skill registry。
部署到另一个 Antigravity workspace
```bash
uv run python scripts/deploy_adapters.py antigravity --target /path/to/workspace --dry-run
uv run python scripts/deploy_adapters.py antigravity --target /path/to/workspace
```
该命令只写 workspace-local `.agents/skills``.agents/rules``.agents/workflows`,不修改全局 Antigravity/Gemini 设置;已有文件默认跳过,`--force` 才会备份为 `.bak` 后覆盖。
本项目调用方式: 本项目调用方式:
1. 在 Antigravity 打开仓库根目录。 1. 在 Antigravity 打开仓库根目录。
2. 确认 agent 能读 `AGENTS.md` 2. 在 Customizations / Rules 中确认 workspace rule 已启用;若未自动启用,手动 at mention `deep-research-antigravity` 或直接引用该文件
3. 给 Agent Manager 一个明确任务 3. 选择模型
| Phase / 工作 | Antigravity model | 用法 |
|---|---|---|
| Surface 管理、读 skill、状态推进 | Gemini 3 Flash | 管任务清单、跑轻量命令、收集 artifact |
| Phase 0-1 材料解读、框架规划 | Claude Opus 4.6 (Thinking) | 大局观、研究假设、章节结构 |
| Phase 2 证据包与章节草稿 | Gemini 3.1 Pro (Low) | 质量/速度均衡,按 skill 写 artifacts |
| Phase 3 总编审校 | Gemini 3.1 Pro (High) | 先试高强度 Gemini,不行再换 |
| Phase 4 最终统稿 | Claude Opus 4.6 (Thinking) | 保证中文终稿和交付质量 |
4. 给 Agent Manager 一个明确任务:
```text ```text
只作为 surface adapter,不要自行调度研究 agent 加载 .agents/skills/antigravity-surface-adapter/SKILL.md 和 AGENTS.md
在终端运行: 用 Gemini 3 Flash 做流程管理,按 skill 要求在需要时提示我切换模型。
uv run python scripts/dr.py run "ADC 全球竞争格局" --slug adc-global-landscape --method mckinsey_market 研究主题:"ADC 全球竞争格局"slug: adc-global-landscapemethod: mckinsey_market
然后汇报生成的项目目录、framework 路径和下一步命令 请先创建/确认项目目录,然后进入 Phase 0-1,并在生成 phase1/framework.md 和 research_brief 后暂停
``` ```
使用建议: 使用建议:
- Antigravity 的 Gemini/Opus/Gemini Computer Use/Browser 能力适合可视化 QA、PDF/HTML 预览、跨文件审阅。 - Antigravity 的 Gemini/Opus/Gemini Computer Use/Browser 能力适合可视化 QA、PDF/HTML 预览、跨文件审阅。
- 如果 Antigravity 提供 Opus 和 Gemini 模型,优先用它们做“表层审阅/交互”,不要替代 Python core 的 role/task 模型 - Opus 额度有限,但 Phase 0-1 和 Phase 4 的价值最高,优先花在框架和终稿,不花在 routine 管理
- 对高成本/长任务,要求 Antigravity 先 dry-run,再运行真实 `--execute-packets` - 不要默认运行 `dr.py run``research --execute-packets``research --assemble-chapters`,这些会把主流程重新导向 Python/ZenMux
- Python core 可用于 `init/status/skills validate/finalize/render` 等辅助动作。
- 若本机安装了 `paperfoot/search-cli``search` 命令,Antigravity Phase 0-2 可优先用 `search agent-info``search ... --json` 做统一检索入口。
- 不建议依赖 SOUL.md:它不是 Antigravity 官方 Deep Research 约束入口。本项目用 `AGENTS.md``.agents/rules``.agents/skills` 三层约束即可。
## Model Strategy Across Platforms ## Model Strategy Across Platforms
@@ -157,9 +188,9 @@ uv run python scripts/dr.py run "ADC 全球竞争格局" --slug adc-global-lands
| Codex | GPT 系列用于代码、测试、schema、review | `configs/models.yaml` | | Codex | GPT 系列用于代码、测试、schema、review | `configs/models.yaml` |
| Claude Code | Opus/Sonnet 用于访谈、中文风格、结构讨论 | `configs/models.yaml` | | Claude Code | Opus/Sonnet 用于访谈、中文风格、结构讨论 | `configs/models.yaml` |
| Gemini CLI | Gemini 用于长上下文、多模态、框架审阅 | `configs/models.yaml` | | Gemini CLI | Gemini 用于长上下文、多模态、框架审阅 | `configs/models.yaml` |
| Antigravity | Gemini/Opus 用于 IDE agent、browser/PDF QA | `configs/models.yaml` | | Antigravity | Gemini Flash/Opus/Gemini Pro 分 phase 执行研究 | `.agents/skills` + Antigravity model selector |
核心原则:平台模型负责“怎么帮用户操作项目”,ZenMux/Python role 模型负责“研究任务用哪个模型执行”。 核心原则:除 Antigravity 外,平台模型负责“怎么帮用户操作项目”,ZenMux/Python role 模型负责“研究任务用哪个模型执行”。Antigravity 专门走 native 模式,以消耗 Antigravity 自身模型配额并降低 Python-core 碎片化风险。
## Sources ## Sources
@@ -168,3 +199,14 @@ uv run python scripts/dr.py run "ADC 全球竞争格局" --slug adc-global-lands
- Claude Code skills/slash commands: https://code.claude.com/docs/en/slash-commands - Claude Code skills/slash commands: https://code.claude.com/docs/en/slash-commands
- Gemini CLI custom commands: https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/custom-commands.md - Gemini CLI custom commands: https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/custom-commands.md
- Google Antigravity announcement: https://blog.google/products-and-platforms/products/gemini/gemini-3/ - Google Antigravity announcement: https://blog.google/products-and-platforms/products/gemini/gemini-3/
- Google Antigravity rules/workflows: https://antigravity.google/docs/rules-workflows
- Google Antigravity skills: https://antigravity.google/docs/skills
- Google Antigravity models: https://antigravity.google/docs/models
- Google Antigravity permissions: https://antigravity.google/docs/agent-permissions
- paperfoot/search-cli skill: https://github.com/paperfoot/search-cli/blob/master/SKILL.md
- Gemini CLI GEMINI.md context: https://geminicli.com/docs/cli/gemini-md/
- Gemini CLI GEMINI.md examples issue: https://github.com/google-gemini/gemini-cli/issues/9241
- Practical GEMINI.md hierarchy: https://medium.com/google-cloud/practical-gemini-cli-instruction-following-gemini-md-hierarchy-part-1-3ba241ac5496
- Claude Code best-practice CLAUDE.md: https://github.com/shanraisshan/claude-code-best-practice/blob/main/CLAUDE.md
- Claude MD guide: https://github.com/MuhammadUsmanGM/claude-code-best-practices/blob/main/guides/claude-md-guide.md
- Writing a good CLAUDE.md: https://www.humanlayer.dev/blog/writing-a-good-claude-md
+78
View File
@@ -18,6 +18,8 @@ if str(REPO_ROOT) not in sys.path:
from scripts.runtime.skills import SkillRegistry from scripts.runtime.skills import SkillRegistry
CODEX_TEMPLATE = REPO_ROOT / "codex_adapter_templates" / "codex" CODEX_TEMPLATE = REPO_ROOT / "codex_adapter_templates" / "codex"
ANTIGRAVITY_RULES_DIR = REPO_ROOT / ".agents" / "rules"
ANTIGRAVITY_WORKFLOWS_DIR = REPO_ROOT / ".agents" / "workflows"
@dataclass @dataclass
@@ -105,6 +107,30 @@ def copy_registered_skills(dst: Path, *, force: bool, dry_run: bool = False) ->
return result return result
def copy_antigravity_rules(dst: Path, *, force: bool, dry_run: bool = False) -> DeployResult:
result = DeployResult(platform="rules", target=dst)
if not ANTIGRAVITY_RULES_DIR.exists():
return result
part = copy_tree_contents(ANTIGRAVITY_RULES_DIR, dst, force=force, dry_run=dry_run)
result.written.extend(part.written)
result.skipped.extend(part.skipped)
result.planned.extend(part.planned)
result.backups.extend(part.backups)
return result
def copy_antigravity_workflows(dst: Path, *, force: bool, dry_run: bool = False) -> DeployResult:
result = DeployResult(platform="workflows", target=dst)
if not ANTIGRAVITY_WORKFLOWS_DIR.exists():
return result
part = copy_tree_contents(ANTIGRAVITY_WORKFLOWS_DIR, dst, force=force, dry_run=dry_run)
result.written.extend(part.written)
result.skipped.extend(part.skipped)
result.planned.extend(part.planned)
result.backups.extend(part.backups)
return result
def deploy_codex( def deploy_codex(
*, *,
target: Path | None = None, target: Path | None = None,
@@ -131,6 +157,33 @@ def deploy_codex(
return _merge_results("codex", codex_home, parts) return _merge_results("codex", codex_home, parts)
def deploy_antigravity(
*,
target: Path | None = None,
force: bool = False,
skip_skills: bool = False,
skip_rules: bool = False,
skip_workflows: bool = False,
dry_run: bool = False,
repo_root: Path = REPO_ROOT,
) -> DeployResult:
"""Deploy Antigravity workspace rules and skills into a workspace root.
This intentionally deploys to a workspace-local `.agents` directory, not
global Antigravity/Gemini settings, so existing user configuration is not
touched. Existing files are skipped unless `force=True`.
"""
workspace = (target or repo_root).expanduser()
parts: list[DeployResult] = []
if not skip_skills:
parts.append(copy_registered_skills(workspace / ".agents" / "skills", force=force, dry_run=dry_run))
if not skip_rules:
parts.append(copy_antigravity_rules(workspace / ".agents" / "rules", force=force, dry_run=dry_run))
if not skip_workflows:
parts.append(copy_antigravity_workflows(workspace / ".agents" / "workflows", force=force, dry_run=dry_run))
return _merge_results("antigravity", workspace, parts)
def print_result(result: DeployResult) -> None: def print_result(result: DeployResult) -> None:
action = "planned" if result.planned and not result.written else "written" action = "planned" if result.planned and not result.written else "written"
print(f"{result.platform} adapter deployment") print(f"{result.platform} adapter deployment")
@@ -156,6 +209,14 @@ def build_parser() -> argparse.ArgumentParser:
codex.add_argument("--skip-skills", action="store_true", help="do not copy canonical skills into target/skills") codex.add_argument("--skip-skills", action="store_true", help="do not copy canonical skills into target/skills")
codex.add_argument("--include-config", action="store_true", help="also copy config.toml; off by default to avoid overwriting global Codex config") codex.add_argument("--include-config", action="store_true", help="also copy config.toml; off by default to avoid overwriting global Codex config")
codex.add_argument("--dry-run", action="store_true", help="show files that would be written") codex.add_argument("--dry-run", action="store_true", help="show files that would be written")
antigravity = sub.add_parser("antigravity", help="Deploy Antigravity workspace rules and skills")
antigravity.add_argument("--target", type=Path, help="Workspace root; defaults to this repository")
antigravity.add_argument("--force", action="store_true", help="overwrite existing files and create .bak backups")
antigravity.add_argument("--skip-skills", action="store_true", help="do not copy canonical skills into target/.agents/skills")
antigravity.add_argument("--skip-rules", action="store_true", help="do not copy workspace rules into target/.agents/rules")
antigravity.add_argument("--skip-workflows", action="store_true", help="do not copy workflows into target/.agents/workflows")
antigravity.add_argument("--dry-run", action="store_true", help="show files that would be written without writing")
return parser return parser
@@ -178,6 +239,23 @@ def main() -> int:
print(" codex") print(" codex")
print("Note: config.toml is not copied by default. Use --include-config only if you want the bundled profile.") print("Note: config.toml is not copied by default. Use --include-config only if you want the bundled profile.")
return 0 return 0
if args.platform == "antigravity":
result = deploy_antigravity(
target=args.target,
force=args.force,
skip_skills=args.skip_skills,
skip_rules=args.skip_rules,
skip_workflows=args.skip_workflows,
dry_run=args.dry_run,
)
print_result(result)
print()
print("Open the target workspace in Antigravity and enable/mention the workspace rule if needed:")
print(" .agents/rules/deep-research-antigravity.md")
print("Workflow installed when supported by your Antigravity build:")
print(" .agents/workflows/deep-research-native.md")
print("Existing files are skipped by default. Use --force only when you want .bak backups and replacement.")
return 0
raise SystemExit(f"unsupported platform: {args.platform}") raise SystemExit(f"unsupported platform: {args.platform}")
+40 -1
View File
@@ -7,7 +7,7 @@ REPO_ROOT = Path(__file__).resolve().parents[1]
if str(REPO_ROOT) not in sys.path: if str(REPO_ROOT) not in sys.path:
sys.path.insert(0, str(REPO_ROOT)) sys.path.insert(0, str(REPO_ROOT))
from scripts.deploy_adapters import default_codex_home, deploy_codex from scripts.deploy_adapters import default_codex_home, deploy_antigravity, deploy_codex
def test_default_codex_home_is_external_to_project(tmp_path: Path) -> None: def test_default_codex_home_is_external_to_project(tmp_path: Path) -> None:
@@ -49,3 +49,42 @@ def test_deploy_codex_dry_run_does_not_write(tmp_path: Path) -> None:
assert result.planned assert result.planned
assert not target.exists() assert not target.exists()
def test_deploy_antigravity_writes_workspace_rules_and_skills(tmp_path: Path) -> None:
target = tmp_path / "workspace"
result = deploy_antigravity(target=target, repo_root=REPO_ROOT)
assert result.written
assert (target / ".agents" / "rules" / "deep-research-antigravity.md").exists()
assert (target / ".agents" / "workflows" / "deep-research-native.md").exists()
assert (target / ".agents" / "skills" / "antigravity-surface-adapter" / "SKILL.md").exists()
assert (target / ".agents" / "skills" / "search-strategy" / "SKILL.md").exists()
assert result.target == target
def test_deploy_antigravity_skips_existing_files_by_default(tmp_path: Path) -> None:
target = tmp_path / "workspace"
existing = target / ".agents" / "rules" / "deep-research-antigravity.md"
existing.parent.mkdir(parents=True)
existing.write_text("custom rule\n", encoding="utf-8")
result = deploy_antigravity(target=target, repo_root=REPO_ROOT)
assert existing.read_text(encoding="utf-8") == "custom rule\n"
assert existing in result.skipped
assert not existing.with_name("deep-research-antigravity.md.bak").exists()
def test_deploy_antigravity_force_backs_up_existing_files(tmp_path: Path) -> None:
target = tmp_path / "workspace"
existing = target / ".agents" / "rules" / "deep-research-antigravity.md"
existing.parent.mkdir(parents=True)
existing.write_text("custom rule\n", encoding="utf-8")
result = deploy_antigravity(target=target, repo_root=REPO_ROOT, force=True)
assert existing.read_text(encoding="utf-8") != "custom rule\n"
assert existing.with_name("deep-research-antigravity.md.bak").read_text(encoding="utf-8") == "custom rule\n"
assert existing.with_name("deep-research-antigravity.md.bak") in result.backups
+1
View File
@@ -35,6 +35,7 @@ def test_skill_registry_uses_agents_skills_as_canonical() -> None:
assert "source-quality" in names assert "source-quality" in names
assert "document-ingest" in names assert "document-ingest" in names
assert "deep-research" in names assert "deep-research" in names
assert "antigravity-surface-adapter" in names
assert registry.validate()["ok"] is True assert registry.validate()["ok"] is True