# datoon - Doramagic AI Context Pack

> 定位：安装前体验与判断资产。它帮助宿主 AI 有一个好的开始，但不代表已经安装、执行或验证目标项目。

## 充分原则

- **充分原则，不是压缩原则**：AI Context Pack 应该充分到让宿主 AI 在开工前理解项目价值、能力边界、使用入口、风险和证据来源；它可以分层组织，但不以最短摘要为目标。
- **压缩策略**：只压缩噪声和重复内容，不压缩会影响判断和开工质量的上下文。

## 给宿主 AI 的使用方式

你正在读取 Doramagic 为 datoon 编译的 AI Context Pack。请把它当作开工前上下文：帮助用户理解适合谁、能做什么、如何开始、哪些必须安装后验证、风险在哪里。不要声称你已经安装、运行或执行了目标项目。

## Claim 消费规则

- **事实来源**：Repo Evidence + Claim/Evidence Graph；Human Wiki 只提供显著性、术语和叙事结构。
- **事实最低状态**：`supported`
- `supported`：可以作为项目事实使用，但回答中必须引用 claim_id 和证据路径。
- `weak`：只能作为低置信度线索，必须要求用户继续核实。
- `inferred`：只能用于风险提示或待确认问题，不能包装成项目事实。
- `unverified`：不得作为事实使用，应明确说证据不足。
- `contradicted`：必须展示冲突来源，不得替用户强行选择一个版本。

## 它最适合谁

- **正在使用 Claude/Codex/Cursor/Gemini 等宿主 AI 的开发者**：README 或插件配置提到多个宿主 AI。 证据：`README.md` Claim：`clm_0004` supported 0.86
- **希望把专业流程带进宿主 AI 的用户**：仓库包含 Skill 文档。 证据：`datoon/SKILL.md`, `plugins/datoon/skills/datoon/SKILL.md`, `skills/datoon/SKILL.md` Claim：`clm_0005` supported 0.86

## 它能做什么

- **AI Skill / Agent 指令资产库**（可做安装前预览）：项目包含可被宿主 AI 读取的 Skill 或 Agent 指令文件，可用于把专业流程带入 Claude、Codex、Cursor 等宿主。 证据：`datoon/SKILL.md`, `plugins/datoon/skills/datoon/SKILL.md`, `skills/datoon/SKILL.md`, `SKILL.md` Claim：`clm_0001` supported 0.86
- **多宿主安装与分发**（需要安装后验证）：项目包含插件或 marketplace 配置，说明它面向一个或多个 AI 宿主的安装和分发。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `plugins/datoon/.codex-plugin/plugin.json` Claim：`clm_0002` supported 0.86
- **命令行启动或安装流程**（需要安装后验证）：项目文档中存在可执行命令，真实使用需要在本地或宿主环境中运行这些命令。 证据：`INSTALL.md`, `README.md` Claim：`clm_0003` supported 0.86

## 怎么开始

- `git clone https://github.com/andrii-su/datoon.git` 证据：`INSTALL.md` Claim：`clm_0006` supported 0.86
- `pip install datoon` 证据：`INSTALL.md` Claim：`clm_0007` supported 0.86, `clm_0008` supported 0.86, `clm_0009` supported 0.86, `clm_0010` supported 0.86 等
- `pip install "datoon[tokens]"  # tiktoken token estimates` 证据：`INSTALL.md` Claim：`clm_0008` supported 0.86
- `pip install "datoon[mcp]"     # MCP server dependencies` 证据：`INSTALL.md` Claim：`clm_0009` supported 0.86
- `pip install "datoon[mcp]"` 证据：`INSTALL.md` Claim：`clm_0009` supported 0.86, `clm_0010` supported 0.86
- `npx --version` 证据：`INSTALL.md` Claim：`clm_0011` supported 0.86
- `pip install "datoon[yaml]"` 证据：`README.md` Claim：`clm_0012` supported 0.86
- `pip install "datoon[excel]"` 证据：`README.md` Claim：`clm_0013` supported 0.86
- `pip install "datoon[columnar]"` 证据：`README.md` Claim：`clm_0014` supported 0.86
- `pip install "datoon[numbers]"` 证据：`README.md` Claim：`clm_0015` supported 0.86

## 继续前判断卡

- **当前建议**：仅建议沙盒试装
- **为什么**：项目存在安装命令、宿主配置或本地写入线索，不建议直接进入主力环境，应先在隔离环境试装。

### 30 秒判断

- **现在怎么做**：仅建议沙盒试装
- **最小安全下一步**：先跑 Prompt Preview；若仍要安装，只在隔离环境试装
- **先别相信**：真实输出质量不能在安装前相信。
- **继续会触碰**：命令执行、宿主 AI 配置、本地环境或项目文件

### 现在可以相信

- **适合人群线索：正在使用 Claude/Codex/Cursor/Gemini 等宿主 AI 的开发者**（supported）：有 supported claim 或项目证据支撑，但仍不等于真实安装效果。 证据：`README.md` Claim：`clm_0004` supported 0.86
- **适合人群线索：希望把专业流程带进宿主 AI 的用户**（supported）：有 supported claim 或项目证据支撑，但仍不等于真实安装效果。 证据：`datoon/SKILL.md`, `plugins/datoon/skills/datoon/SKILL.md`, `skills/datoon/SKILL.md` Claim：`clm_0005` supported 0.86
- **能力存在：AI Skill / Agent 指令资产库**（supported）：可以相信项目包含这类能力线索；是否适合你的具体任务仍要试用或安装后验证。 证据：`datoon/SKILL.md`, `plugins/datoon/skills/datoon/SKILL.md`, `skills/datoon/SKILL.md`, `SKILL.md` Claim：`clm_0001` supported 0.86
- **能力存在：多宿主安装与分发**（supported）：可以相信项目包含这类能力线索；是否适合你的具体任务仍要试用或安装后验证。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `plugins/datoon/.codex-plugin/plugin.json` Claim：`clm_0002` supported 0.86
- **能力存在：命令行启动或安装流程**（supported）：可以相信项目包含这类能力线索；是否适合你的具体任务仍要试用或安装后验证。 证据：`INSTALL.md`, `README.md` Claim：`clm_0003` supported 0.86
- **存在 Quick Start / 安装命令线索**（supported）：可以相信项目文档出现过启动或安装入口；不要因此直接在主力环境运行。 证据：`INSTALL.md` Claim：`clm_0006` supported 0.86

### 现在还不能相信

- **真实输出质量不能在安装前相信。**（unverified）：Prompt Preview 只能展示引导方式，不能证明真实项目中的结果质量。
- **宿主 AI 版本兼容性不能在安装前相信。**（unverified）：Claude、Cursor、Codex、Gemini 等宿主加载规则和版本差异必须在真实环境验证。
- **不会污染现有宿主 AI 行为，不能直接相信。**（inferred）：Skill、plugin、AGENTS/CLAUDE/GEMINI 指令可能改变宿主 AI 的默认行为。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `CLAUDE.md` 等
- **可安全回滚不能默认相信。**（unverified）：除非项目明确提供卸载和恢复说明，否则必须先在隔离环境验证。
- **真实安装后是否与用户当前宿主 AI 版本兼容？**（unverified）：兼容性只能通过实际宿主环境验证。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `plugins/datoon/.codex-plugin/plugin.json`
- **项目输出质量是否满足用户具体任务？**（unverified）：安装前预览只能展示流程和边界，不能替代真实评测。
- **安装命令是否需要网络、权限或全局写入？**（unverified）：这影响企业环境和个人环境的安装风险。 证据：`INSTALL.md`

### 继续会触碰什么

- **命令执行**：包管理器、网络下载、本地插件目录、项目配置或用户主目录。 原因：运行第一条命令就可能产生环境改动；必须先判断是否值得跑。 证据：`INSTALL.md`, `README.md`
- **宿主 AI 配置**：Claude/Codex/Cursor/Gemini/OpenCode 等宿主的 plugin、Skill 或规则加载配置。 原因：宿主配置会改变 AI 后续工作方式，可能和用户已有规则冲突。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `CLAUDE.md` 等
- **本地环境或项目文件**：安装结果、插件缓存、项目配置或本地依赖目录。 原因：安装前无法证明写入范围和回滚方式，需要隔离验证。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `INSTALL.md` 等
- **宿主 AI 上下文**：AI Context Pack、Prompt Preview、Skill 路由、风险规则和项目事实。 原因：导入上下文会影响宿主 AI 后续判断，必须避免把未验证项包装成事实。

### 最小安全下一步

- **先跑 Prompt Preview**：用安装前交互式试用判断工作方式是否匹配，不需要授权或改环境。（适用：任何项目都适用，尤其是输出质量未知时。）
- **只在隔离目录或测试账号试装**：避免安装命令污染主力宿主 AI、真实项目或用户主目录。（适用：存在命令执行、插件配置或本地写入线索时。）
- **先备份宿主 AI 配置**：Skill、plugin、规则文件可能改变 Claude/Cursor/Codex 的默认行为。（适用：存在插件 manifest、Skill 或宿主规则入口时。）
- **安装后只验证一个最小任务**：先验证加载、兼容、输出质量和回滚，再决定是否深用。（适用：准备从试用进入真实工作流时。）

### 退出方式

- **保留安装前状态**：记录原始宿主配置和项目状态，后续才能判断是否可恢复。
- **准备移除宿主 plugin / Skill / 规则入口**：如果试装后行为异常，可以把宿主 AI 恢复到试装前状态。
- **记录安装命令和写入路径**：没有明确卸载说明时，至少要知道哪些目录或配置需要手动清理。
- **如果没有回滚路径，不进入主力环境**：不可回滚是继续前阻断项，不应靠信任或运气继续。

## 哪些只能预览

- 解释项目适合谁和能做什么
- 基于项目文档演示典型对话流程
- 帮助用户判断是否值得安装或继续研究

## 哪些必须安装后验证

- 真实安装 Skill、插件或 CLI
- 执行脚本、修改本地文件或访问外部服务
- 验证真实输出质量、性能和兼容性

## 边界与风险判断卡

- **把安装前预览误认为真实运行**：用户可能高估项目已经完成的配置、权限和兼容性验证。 处理方式：明确区分 prompt_preview_can_do 与 runtime_required。 Claim：`clm_0018` inferred 0.45
- **宿主 AI 插件或 Skill 规则冲突**：新规则可能改变用户现有宿主 AI 的工作方式。 处理方式：安装前先检查插件 manifest 和 Skill 文件，必要时隔离测试。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `plugins/datoon/.codex-plugin/plugin.json` Claim：`clm_0019` supported 0.86
- **命令执行会修改本地环境**：安装命令可能写入用户主目录、宿主插件目录或项目配置。 处理方式：先在隔离环境或测试账号中运行。 证据：`INSTALL.md`, `README.md` Claim：`clm_0020` supported 0.86
- **待确认**：真实安装后是否与用户当前宿主 AI 版本兼容？。原因：兼容性只能通过实际宿主环境验证。
- **待确认**：项目输出质量是否满足用户具体任务？。原因：安装前预览只能展示流程和边界，不能替代真实评测。
- **待确认**：安装命令是否需要网络、权限或全局写入？。原因：这影响企业环境和个人环境的安装风险。

## 开工前工作上下文

### 加载顺序

- 先读取 how_to_use.host_ai_instruction，建立安装前判断资产的边界。
- 读取 claim_graph_summary，确认事实来自 Claim/Evidence Graph，而不是 Human Wiki 叙事。
- 再读取 intended_users、capabilities 和 quick_start_candidates，判断用户是否匹配。
- 需要执行具体任务时，优先查 role_skill_index，再查 evidence_index。
- 遇到真实安装、文件修改、网络访问、性能或兼容性问题时，转入 risk_card 和 boundaries.runtime_required。

### 任务路由

- **AI Skill / Agent 指令资产库**：先基于 role_skill_index / evidence_index 帮用户挑选可用角色、Skill 或工作流。 边界：可做安装前 Prompt 体验。 证据：`datoon/SKILL.md`, `plugins/datoon/skills/datoon/SKILL.md`, `skills/datoon/SKILL.md`, `SKILL.md` Claim：`clm_0001` supported 0.86
- **多宿主安装与分发**：先说明这是安装后验证能力，再给出安装前检查清单。 边界：必须真实安装或运行后验证。 证据：`.agents/plugins/marketplace.json`, `.claude-plugin/marketplace.json`, `.claude-plugin/plugin.json`, `plugins/datoon/.codex-plugin/plugin.json` Claim：`clm_0002` supported 0.86
- **命令行启动或安装流程**：先说明这是安装后验证能力，再给出安装前检查清单。 边界：必须真实安装或运行后验证。 证据：`INSTALL.md`, `README.md` Claim：`clm_0003` supported 0.86

### 上下文规模

- 文件总数：92
- 重要文件覆盖：40/92
- 证据索引条目：74
- 角色 / Skill 条目：3

### 证据不足时的处理

- **missing_evidence**：说明证据不足，要求用户提供目标文件、README 段落或安装后验证记录；不要补全事实。
- **out_of_scope_request**：说明该任务超出当前 AI Context Pack 证据范围，并建议用户先查看 Human Manual 或真实安装后验证。
- **runtime_request**：给出安装前检查清单和命令来源，但不要替用户执行命令或声称已执行。
- **source_conflict**：同时展示冲突来源，标记为待核实，不要强行选择一个版本。

## Prompt Recipes

### 适配判断

- 目标：判断这个项目是否适合用户当前任务。
- 预期输出：适配结论、关键理由、证据引用、安装前可预览内容、必须安装后验证内容、下一步建议。

```text
请基于 datoon 的 AI Context Pack，先问我 3 个必要问题，然后判断它是否适合我的任务。回答必须包含：适合谁、能做什么、不能做什么、是否值得安装、证据来自哪里。所有项目事实必须引用 evidence_refs、source_paths 或 claim_id。
```

### 安装前体验

- 目标：让用户在安装前感受核心工作流，同时避免把预览包装成真实能力或营销承诺。
- 预期输出：一段带边界标签的体验剧本、安装后验证清单和谨慎建议；不含真实运行承诺或强营销表述。

```text
请把 datoon 当作安装前体验资产，而不是已安装工具或真实运行环境。

请严格输出四段：
1. 先问我 3 个必要问题。
2. 给出一段“体验剧本”：用 [安装前可预览]、[必须安装后验证]、[证据不足] 三种标签展示它可能如何引导工作流。
3. 给出安装后验证清单：列出哪些能力只有真实安装、真实宿主加载、真实项目运行后才能确认。
4. 给出谨慎建议：只能说“值得继续研究/试装”“先补充信息后再判断”或“不建议继续”，不得替项目背书。

硬性边界：
- 不要声称已经安装、运行、执行测试、修改文件或产生真实结果。
- 不要写“自动适配”“确保通过”“完美适配”“强烈建议安装”等承诺性表达。
- 如果描述安装后的工作方式，必须使用“如果安装成功且宿主正确加载 Skill，它可能会……”这种条件句。
- 体验剧本只能写成“示例台词/假设流程”：使用“可能会询问/可能会建议/可能会展示”，不要写“已写入、已生成、已通过、正在运行、正在生成”。
- Prompt Preview 不负责给安装命令；如用户准备试装，只能提示先阅读 Quick Start 和 Risk Card，并在隔离环境验证。
- 所有项目事实必须来自 supported claim、evidence_refs 或 source_paths；inferred/unverified 只能作风险或待确认项。

```

### 角色 / Skill 选择

- 目标：从项目里的角色或 Skill 中挑选最匹配的资产。
- 预期输出：候选角色或 Skill 列表，每项包含适用场景、证据路径、风险边界和是否需要安装后验证。

```text
请读取 role_skill_index，根据我的目标任务推荐 3-5 个最相关的角色或 Skill。每个推荐都要说明适用场景、可能输出、风险边界和 evidence_refs。
```

### 风险预检

- 目标：安装或引入前识别环境、权限、规则冲突和质量风险。
- 预期输出：环境、权限、依赖、许可、宿主冲突、质量风险和未知项的检查清单。

```text
请基于 risk_card、boundaries 和 quick_start_candidates，给我一份安装前风险预检清单。不要替我执行命令，只说明我应该检查什么、为什么检查、失败会有什么影响。
```

### 宿主 AI 开工指令

- 目标：把项目上下文转成一次对话开始前的宿主 AI 指令。
- 预期输出：一段边界明确、证据引用明确、适合复制给宿主 AI 的开工前指令。

```text
请基于 datoon 的 AI Context Pack，生成一段我可以粘贴给宿主 AI 的开工前指令。这段指令必须遵守 not_runtime=true，不能声称项目已经安装、运行或产生真实结果。
```

## 角色 / Skill 索引

- 共索引 3 个角色 / Skill / 项目文档条目。

- **datoon**（skill）：Smart TOON conversion workflow for structured data in Claude Code. Converts JSON-like payloads to TOON only when structure is suitable and token savings are meaningful. 激活提示：当用户任务与“datoon”描述的流程高度相关时，先用它做安装前体验，再决定是否安装。 证据：`datoon/SKILL.md`
- **datoon**（skill）：Smart TOON conversion workflow for structured data in Claude Code. Converts JSON-like payloads to TOON only when structure is suitable and token savings are meaningful. 激活提示：当用户任务与“datoon”描述的流程高度相关时，先用它做安装前体验，再决定是否安装。 证据：`plugins/datoon/skills/datoon/SKILL.md`
- **datoon**（skill）：Smart TOON conversion workflow for structured data in Claude Code. Converts JSON-like payloads to TOON only when structure is suitable and token savings are meaningful. 激活提示：当用户任务与“datoon”描述的流程高度相关时，先用它做安装前体验，再决定是否安装。 证据：`skills/datoon/SKILL.md`

## 证据索引

- 共索引 74 条证据。

- **Before / After**（documentation）：smart structured-data→TOON gateway — converts only when it actually saves tokens 证据：`README.md`
- **datoon Skill**（documentation）：Smart TOON conversion workflow for structured data in AI-agent sessions. 证据：`skills/datoon/README.md`
- **Install datoon**（documentation）：datoon ships as a Python package, command-line tool, MCP server, and AI-agent skill/plugin. Use the path that matches how you want to consume it. 证据：`INSTALL.md`
- **datoon**（skill_instruction）：Before sending structured payloads to the model: 证据：`SKILL.md`
- **datoon**（skill_instruction）：Before sending structured payloads to the model: 证据：`datoon/SKILL.md`
- **datoon**（skill_instruction）：Before sending structured payloads to the model: 证据：`plugins/datoon/skills/datoon/SKILL.md`
- **datoon**（skill_instruction）：Before sending structured payloads to the model: 证据：`skills/datoon/SKILL.md`
- **Marketplace**（structured_config）：{ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json", "name": "datoon", "description": "Smart JSON-to-TOON conversion with pragmatic auto-gating for LLM prompts.", "owner": { "name": "Andrii Suruhov", "url": "https://github.com/andrii-su" }, "plugins": { "name": "datoon", "description": "Auto-convert structured JSON to TOON only when token savings are meaningful.", "source": "./", "category": "productivity" } } 证据：`.claude-plugin/marketplace.json`
- **Plugin**（structured_config）：{ "name": "datoon", "version": "1.4.1", "description": "Smart JSON-to-TOON conversion with pragmatic auto-gating for LLM prompts.", "author": { "name": "Andrii Suruhov", "url": "https://github.com/andrii-su" }, "homepage": "https://github.com/andrii-su/datoon", "repository": "https://github.com/andrii-su/datoon", "license": "MIT", "keywords": "llm", "prompt-engineering", "json", "toon", "data" } 证据：`.claude-plugin/plugin.json`
- **Marketplace**（structured_config）：{ "name": "datoon-repo", "interface": { "displayName": "Datoon Repo" }, "plugins": { "name": "datoon", "source": { "source": "local", "path": "./plugins/datoon" }, "policy": { "installation": "AVAILABLE", "authentication": "ON INSTALL" }, "category": "Productivity" } } 证据：`.agents/plugins/marketplace.json`
- **Plugin**（structured_config）：{ "name": "datoon", "version": "1.4.1", "description": "Smart JSON-to-TOON conversion with pragmatic auto-gating for LLM prompts.", "author": { "name": "Andrii Suruhov", "url": "https://github.com/andrii-su" }, "homepage": "https://github.com/andrii-su/datoon", "repository": "https://github.com/andrii-su/datoon", "license": "MIT", "keywords": "llm", "prompt-engineering", "json", "toon", "data" , "skills": "./skills/", "interface": { "displayName": "Datoon", "shortDescription": "Auto-convert JSON to TOON when token savings are meaningful.", "longDescription": "Smart structured-data mode for Codex that converts JSON to TOON only when payload shape and estimated savings justify it.", "develope… 证据：`plugins/datoon/.codex-plugin/plugin.json`
- **CLAUDE.md - datoon**（documentation）：This file is the maintainer guide for agents working in this repository. It explains source-of-truth files, generated mirrors, and checks that must stay green. 证据：`CLAUDE.md`
- **Contributing to datoon**（documentation）：Thanks for considering a contribution. datoon is a small package with several distribution surfaces: Python API, CLI, MCP server, Claude Code plugin, Codex skill/plugin, benchmark artifacts, and docs. 证据：`CONTRIBUTING.md`
- **License**（source_file）：Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files the "Software" , to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 证据：`LICENSE`
- **Pyproject**（source_file）：build-system requires = "setuptools =82.0.1", "setuptools-scm toml =10.0.5", "wheel" build-backend = "setuptools.build meta" 证据：`pyproject.toml`
- **Init**（source_file）：all = ⋮---- version = version "datoon" ⋮---- version = "0.0.0" 证据：`src/datoon/__init__.py`
- **Analyzer**（source_file）：def max depth value: Any, depth: int = 1 - int ⋮---- def iter arrays value: Any - Iterator list Any ⋮---- def is uniform object array items: list Any , min rows: int - bool ⋮---- first keys = list items 0 .keys ⋮---- def analyze payload data: Any, config: ConversionConfig - PayloadAnalysis ⋮---- max depth = max depth data uniform array count = sum 证据：`src/datoon/analyzer.py`
- **Cli**（source_file）：def build parser - argparse.ArgumentParser ⋮---- parser = argparse.ArgumentParser ⋮---- def read input path: str None - str ⋮---- def write text path: str None, text: str - None ⋮---- report json = json.dumps payload, ensure ascii=False, indent=2 ⋮---- def resolve format input path: str None, format override: str None - str ⋮---- detected = detect format input path ⋮---- def run mcp server - int ⋮---- def main argv: Sequence str None = None - int ⋮---- raw argv = list sys.argv 1: if argv is None else argv ⋮---- parser = build parser args = parser.parse args argv ⋮---- config = ConversionConfig ⋮---- fmt = resolve format args.input, args.format ⋮---- raw input = read input args.input outcome… 证据：`src/datoon/cli.py`
- **Converter**（source_file）：TOON CLI PACKAGE = "@toon-format/cli@2" ⋮---- all = "DatoonError", "convert json for llm", "estimate tokens" ⋮---- def reject non finite constant: str - Any ⋮---- def normalize json raw text: str - tuple Any, str ⋮---- """Parse and re-serialize JSON into a deterministic compact representation.""" ⋮---- parsed = json.loads raw text, parse constant= reject non finite ⋮---- normalized = json.dumps ⋮---- @lru cache maxsize=8 def load token encoder encoding: str - Any None ⋮---- """Load a token encoder once per name, None when the optional dep is absent.""" ⋮---- import tiktoken type: ignore ⋮---- def estimate tokens text: str, encoding: str = DEFAULT TOKEN ENCODING - int ⋮---- """Estimate token… 证据：`src/datoon/converter.py`
- **Errors**（source_file）：class DatoonError RuntimeError 证据：`src/datoon/errors.py`
- **Mcp Server**（source_file）：mcp = FastMCP ⋮---- config = ConversionConfig outcome = convert json for llm json text, config ⋮---- """Analyze a JSON payload and report whether it is a TOON candidate. Does not invoke the TOON CLI — safe to call without Node.js installed. """ ⋮---- parsed = json.loads json text ⋮---- analysis = analyze payload parsed, config ⋮---- rows = read tabular fmt, text=text json text = json.dumps rows, ensure ascii=False, separators= ",", ":" ⋮---- def main - None 证据：`src/datoon/mcp_server.py`
- **Models**（source_file）：Decision = Literal "convert", "skip" ⋮---- DEFAULT TOKEN ENCODING = "o200k base" ⋮---- @dataclass frozen=True, slots=True class ConversionConfig ⋮---- min savings ratio: float = 0.15 max depth: int = 6 min uniform rows: int = 3 force: bool = False toon cli timeout: int = 30 token encoding: str = DEFAULT TOKEN ENCODING ⋮---- def post init self - None ⋮---- @dataclass frozen=True, slots=True class PayloadAnalysis ⋮---- is candidate: bool reason: str max depth: int uniform array count: int ⋮---- @dataclass frozen=True, slots=True class ConversionReport ⋮---- decision: Decision ⋮---- was forced: bool input token estimate: int output token estimate: int savings ratio: float analysis: PayloadAnal… 证据：`src/datoon/models.py`
- **Init**（source_file）：BINARY FORMATS: frozenset str = frozenset TEXT FORMATS: frozenset str = frozenset {"csv", "jsonl", "yaml", "xml"} ALL FORMATS: frozenset str = BINARY FORMATS TEXT FORMATS ⋮---- EXTENSION MAP: dict str, str = { ⋮---- def detect format path: str Path - str None ⋮---- def read text fmt: str, text: str - list dict str, Any 证据：`src/datoon/readers/__init__.py`
- **Csv**（source_file）：def read csv text: str, , coerce types: bool = True - list dict str, Any ⋮---- reader = csv.DictReader io.StringIO text 证据：`src/datoon/readers/csv.py`
- **Excel**（source_file）：def read excel path: Path, , sheet: int = 0 - list dict str, Any ⋮---- wb = openpyxl.load workbook path, read only=True, data only=True ws = wb.worksheets sheet rows = list ws.iter rows values only=True 证据：`src/datoon/readers/excel.py`
- **Jsonl**（source_file）：def read jsonl text: str - list dict str, Any ⋮---- rows: list dict str, Any = ⋮---- line = line.strip ⋮---- obj = json.loads line 证据：`src/datoon/readers/jsonl.py`
- **Xml**（source_file）：DOCTYPE RE = re.compile r" list dict str, Any ⋮---- root = ET.fromstring text ⋮---- children = list root ⋮---- tag counts: dict str, int = {} ⋮---- dominant tag = max tag counts, key=lambda t: tag counts t items = c for c in children if c.tag == dominant tag ⋮---- def element to dict element: ET.Element - dict str, Any ⋮---- result: dict str, Any = {k: coerce v for k, v in element.attrib.items } 证据：`src/datoon/readers/xml.py`
- **Yaml**（source_file）：SHAPE ERROR = ⋮---- def read yaml text: str - list dict str, Any ⋮---- data = yaml.safe load text ⋮---- def normalize data: Any - list dict str, Any ⋮---- rows: list Any None = None ⋮---- rows = data ⋮---- lists = v for v in data.values if isinstance v, list and v ⋮---- rows = lists 0 证据：`src/datoon/readers/yaml.py`
- **1.9.1 https://github.com/andrii-su/datoon/compare/v1.9.0...v1.9.1 2026-07-07**（documentation）：1.9.1 https://github.com/andrii-su/datoon/compare/v1.9.0...v1.9.1 2026-07-07 证据：`CHANGELOG.md`
- **Marketplace & Registry Listings**（documentation）：How datoon is distributed across MCP marketplaces, what is automated, and the one-time manual steps a maintainer performs. 证据：`MARKETPLACES.md`
- **Security Policy**（documentation）：Security fixes are applied to the latest main branch state. 证据：`SECURITY.md`
- **Agent Skill Evaluation Report**（documentation）：Compare agent behavior on the same structured-data analysis tasks with and without the datoon skill. 证据：`benchmarks/agent_skill_eval/REPORT.md`
- **Payloads**（structured_config）：{ "payloads": { "id": "users-small", "category": "uniform-array", "description": "Small uniform records", "data": { "users": { "id": 1, "name": "Ada", "role": "admin", "active": true }, { "id": 2, "name": "Lin", "role": "analyst", "active": true }, { "id": 3, "name": "Sam", "role": "viewer", "active": false } } }, { "id": "events-medium", "category": "uniform-array", "description": "Event table with timestamps and dimensions", "data": { "events": { "ts": "2026-01-01T00:00:00Z", "event": "page view", "user id": 1001, "country": "US", "is mobile": true }, { "ts": "2026-01-01T00:01:00Z", "event": "signup", "user id": 1002, "country": "DE", "is mobile": false }, { "ts": "2026-01-01T00:02:00Z",… 证据：`benchmarks/payloads.json`
- **Glama**（structured_config）：{ "$schema": "https://glama.ai/mcp/schemas/server.json", "maintainers": "andrii-su" } 证据：`glama.json`
- **Server**（structured_config）：{ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "io.github.andrii-su/datoon", "title": "datoon", "description": "Smart structured-data to TOON gateway: converts to TOON only when it saves LLM tokens.", "version": "1.6.0", "websiteUrl": "https://github.com/andrii-su/datoon", "repository": { "url": "https://github.com/andrii-su/datoon", "source": "github" }, "packages": { "registryType": "pypi", "registryBaseUrl": "https://pypi.org", "identifier": "datoon", "version": "1.6.0", "runtimeHint": "uvx", "runtimeArguments": { "type": "named", "name": "--from", "value": "datoon mcp " } , "packageArguments": { "type": "positional", "value": "mcp" }… 证据：`server.json`
- **Agent Results**（structured_config）：{ "variant": "with skill", "agent id": "019e6b45-6723-75c0-a2da-5a5af19635ac", "agent nickname": "Bacon", "payload name": "1 small.json", "result": { "mode": "convert", "payload file": "/Users/andriisuruhov/github/datoon/benchmarks/agent skill eval/payloads/1 small.json", "scenario": "small", "iteration": 1, "record count": 5, "active count": 4, "total revenue cents": 1385, "top region": "west", "top category": "hardware", "anomaly ids": "s-1-0001", "s-1-0005" , "elapsed seconds": 1.247206375002861, "notes": "datoon decision=convert; Estimated savings 47.79% threshold 15.00% ." } }, { "variant": "without skill", "agent id": "019e6b45-79f7-7033-a490-ec76d7a1817e", "agent nickname": "Euler",… 证据：`benchmarks/agent_skill_eval/agent_results.json`
- **Expected Answers**（structured_config）：{ "1 small.json": { "scenario": "small", "iteration": 1, "record count": 5, "active count": 4, "total revenue cents": 1385, "top region": "west", "top category": "hardware", "anomaly ids": "s-1-0001", "s-1-0005" }, "1 medium.json": { "scenario": "medium", "iteration": 1, "record count": 75, "active count": 60, "total revenue cents": 175310, "top region": "west", "top category": "services", "anomaly ids": "m-1-0001", "m-1-0018", "m-1-0035", "m-1-0052", "m-1-0069" }, "1 large.json": { "scenario": "large", "iteration": 1, "record count": 450, "active count": 360, "total revenue cents": 4242985, "top region": "west", "top category": "services", "anomaly ids": "l-1-0001", "l-1-0098", "l-1-0195",… 证据：`benchmarks/agent_skill_eval/expected_answers.json`
- **1 Large**（structured_config）：{ "scenario": "large", "iteration": 1, "source": "datoon agent skill evaluation", "records": { "id": "l-1-0001", "region": "south", "category": "software", "active": true, "units": 2, "revenue cents": -1311, "anomaly": true }, { "id": "l-1-0002", "region": "west", "category": "services", "active": true, "units": 3, "revenue cents": 1348, "anomaly": false }, { "id": "l-1-0003", "region": "south", "category": "training", "active": true, "units": 4, "revenue cents": 1385, "anomaly": false }, { "id": "l-1-0004", "region": "west", "category": "hardware", "active": true, "units": 5, "revenue cents": 1422, "anomaly": false }, { "id": "l-1-0005", "region": "south", "category": "software", "active":… 证据：`benchmarks/agent_skill_eval/payloads/1_large.json`
- **1 Medium**（structured_config）：{ "scenario": "medium", "iteration": 1, "source": "datoon agent skill evaluation", "records": { "id": "m-1-0001", "region": "south", "category": "software", "active": true, "units": 2, "revenue cents": -1311, "anomaly": true }, { "id": "m-1-0002", "region": "west", "category": "services", "active": true, "units": 3, "revenue cents": 1348, "anomaly": false }, { "id": "m-1-0003", "region": "south", "category": "training", "active": true, "units": 4, "revenue cents": 1385, "anomaly": false }, { "id": "m-1-0004", "region": "west", "category": "hardware", "active": true, "units": 5, "revenue cents": 1422, "anomaly": false }, { "id": "m-1-0005", "region": "south", "category": "software", "active"… 证据：`benchmarks/agent_skill_eval/payloads/1_medium.json`
- **1 Small**（structured_config）：{ "scenario": "small", "iteration": 1, "source": "datoon agent skill evaluation", "records": { "id": "s-1-0001", "region": "south", "category": "software", "active": true, "units": 2, "revenue cents": -1311, "anomaly": true }, { "id": "s-1-0002", "region": "west", "category": "services", "active": true, "units": 3, "revenue cents": 1348, "anomaly": false }, { "id": "s-1-0003", "region": "south", "category": "training", "active": true, "units": 4, "revenue cents": 1385, "anomaly": false }, { "id": "s-1-0004", "region": "west", "category": "hardware", "active": true, "units": 5, "revenue cents": 1422, "anomaly": false }, { "id": "s-1-0005", "region": "south", "category": "software", "active":… 证据：`benchmarks/agent_skill_eval/payloads/1_small.json`
- **2 Large**（structured_config）：{ "scenario": "large", "iteration": 2, "source": "datoon agent skill evaluation", "records": { "id": "l-2-0001", "region": "east", "category": "services", "active": true, "units": 3, "revenue cents": -1422, "anomaly": true }, { "id": "l-2-0002", "region": "north", "category": "training", "active": true, "units": 4, "revenue cents": 1459, "anomaly": false }, { "id": "l-2-0003", "region": "east", "category": "hardware", "active": true, "units": 5, "revenue cents": 1496, "anomaly": false }, { "id": "l-2-0004", "region": "north", "category": "software", "active": false, "units": 6, "revenue cents": 1533, "anomaly": false }, { "id": "l-2-0005", "region": "east", "category": "services", "active":… 证据：`benchmarks/agent_skill_eval/payloads/2_large.json`
- **2 Medium**（structured_config）：{ "scenario": "medium", "iteration": 2, "source": "datoon agent skill evaluation", "records": { "id": "m-2-0001", "region": "east", "category": "services", "active": true, "units": 3, "revenue cents": -1422, "anomaly": true }, { "id": "m-2-0002", "region": "north", "category": "training", "active": true, "units": 4, "revenue cents": 1459, "anomaly": false }, { "id": "m-2-0003", "region": "east", "category": "hardware", "active": true, "units": 5, "revenue cents": 1496, "anomaly": false }, { "id": "m-2-0004", "region": "north", "category": "software", "active": false, "units": 6, "revenue cents": 1533, "anomaly": false }, { "id": "m-2-0005", "region": "east", "category": "services", "active"… 证据：`benchmarks/agent_skill_eval/payloads/2_medium.json`
- **2 Small**（structured_config）：{ "scenario": "small", "iteration": 2, "source": "datoon agent skill evaluation", "records": { "id": "s-2-0001", "region": "east", "category": "services", "active": true, "units": 3, "revenue cents": -1422, "anomaly": true }, { "id": "s-2-0002", "region": "north", "category": "training", "active": true, "units": 4, "revenue cents": 1459, "anomaly": false }, { "id": "s-2-0003", "region": "east", "category": "hardware", "active": true, "units": 5, "revenue cents": 1496, "anomaly": false }, { "id": "s-2-0004", "region": "north", "category": "software", "active": false, "units": 6, "revenue cents": 1533, "anomaly": false }, { "id": "s-2-0005", "region": "east", "category": "services", "active":… 证据：`benchmarks/agent_skill_eval/payloads/2_small.json`
- **3 Large**（structured_config）：{ "scenario": "large", "iteration": 3, "source": "datoon agent skill evaluation", "records": { "id": "l-3-0001", "region": "west", "category": "training", "active": true, "units": 4, "revenue cents": -1533, "anomaly": true }, { "id": "l-3-0002", "region": "south", "category": "hardware", "active": true, "units": 5, "revenue cents": 1570, "anomaly": false }, { "id": "l-3-0003", "region": "west", "category": "software", "active": false, "units": 6, "revenue cents": 1607, "anomaly": false }, { "id": "l-3-0004", "region": "south", "category": "services", "active": true, "units": 7, "revenue cents": 1644, "anomaly": false }, { "id": "l-3-0005", "region": "west", "category": "training", "active":… 证据：`benchmarks/agent_skill_eval/payloads/3_large.json`
- **3 Medium**（structured_config）：{ "scenario": "medium", "iteration": 3, "source": "datoon agent skill evaluation", "records": { "id": "m-3-0001", "region": "west", "category": "training", "active": true, "units": 4, "revenue cents": -1533, "anomaly": true }, { "id": "m-3-0002", "region": "south", "category": "hardware", "active": true, "units": 5, "revenue cents": 1570, "anomaly": false }, { "id": "m-3-0003", "region": "west", "category": "software", "active": false, "units": 6, "revenue cents": 1607, "anomaly": false }, { "id": "m-3-0004", "region": "south", "category": "services", "active": true, "units": 7, "revenue cents": 1644, "anomaly": false }, { "id": "m-3-0005", "region": "west", "category": "training", "active"… 证据：`benchmarks/agent_skill_eval/payloads/3_medium.json`
- **3 Small**（structured_config）：{ "scenario": "small", "iteration": 3, "source": "datoon agent skill evaluation", "records": { "id": "s-3-0001", "region": "west", "category": "training", "active": true, "units": 4, "revenue cents": -1533, "anomaly": true }, { "id": "s-3-0002", "region": "south", "category": "hardware", "active": true, "units": 5, "revenue cents": 1570, "anomaly": false }, { "id": "s-3-0003", "region": "west", "category": "software", "active": false, "units": 6, "revenue cents": 1607, "anomaly": false }, { "id": "s-3-0004", "region": "south", "category": "services", "active": true, "units": 7, "revenue cents": 1644, "anomaly": false }, { "id": "s-3-0005", "region": "west", "category": "training", "active":… 证据：`benchmarks/agent_skill_eval/payloads/3_small.json`
- **1 Large.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 62.42% threshold 15.00% .", "was forced": false, "input token estimate": 17756, "output token estimate": 6672, "savings ratio": 0.6242396936246902, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/1_large.report.json`
- **1 Medium.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 61.71% threshold 15.00% .", "was forced": false, "input token estimate": 2972, "output token estimate": 1138, "savings ratio": 0.617092866756393, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/1_medium.report.json`
- **1 Small.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 47.79% threshold 15.00% .", "was forced": false, "input token estimate": 226, "output token estimate": 118, "savings ratio": 0.4778761061946903, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/1_small.report.json`
- **2 Large.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 62.42% threshold 15.00% .", "was forced": false, "input token estimate": 17757, "output token estimate": 6673, "savings ratio": 0.6242045390550206, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/2_large.report.json`
- **2 Medium.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 61.71% threshold 15.00% .", "was forced": false, "input token estimate": 2972, "output token estimate": 1138, "savings ratio": 0.617092866756393, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/2_medium.report.json`
- **2 Small.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 47.56% threshold 15.00% .", "was forced": false, "input token estimate": 225, "output token estimate": 118, "savings ratio": 0.47555555555555556, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/2_small.report.json`
- **3 Large.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 62.42% threshold 15.00% .", "was forced": false, "input token estimate": 17758, "output token estimate": 6674, "savings ratio": 0.6241693884446446, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/3_large.report.json`
- **3 Medium.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 61.71% threshold 15.00% .", "was forced": false, "input token estimate": 2972, "output token estimate": 1138, "savings ratio": 0.617092866756393, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/3_medium.report.json`
- **3 Small.Report**（structured_config）：{ "decision": "convert", "reason": "Estimated savings 47.56% threshold 15.00% .", "was forced": false, "input token estimate": 225, "output token estimate": 118, "savings ratio": 0.47555555555555556, "analysis": { "is candidate": true, "reason": "Detected 1 uniform object array s within depth 4.", "max depth": 4, "uniform array count": 1 } } 证据：`benchmarks/agent_skill_eval/reports/3_small.report.json`
- **Scored Agent Results**（structured_config）：{ "variant": "with skill", "agent id": "019e6b45-6723-75c0-a2da-5a5af19635ac", "agent nickname": "Bacon", "payload name": "1 small.json", "result": { "mode": "convert", "payload file": "/Users/andriisuruhov/github/datoon/benchmarks/agent skill eval/payloads/1 small.json", "scenario": "small", "iteration": 1, "record count": 5, "active count": 4, "total revenue cents": 1385, "top region": "west", "top category": "hardware", "anomaly ids": "s-1-0001", "s-1-0005" , "elapsed seconds": 1.247206375002861, "notes": "datoon decision=convert; Estimated savings 47.79% threshold 15.00% ." }, "correct": true, "mismatches": {} }, { "variant": "without skill", "agent id": "019e6b45-79f7-7033-a490-ec76d7a… 证据：`benchmarks/agent_skill_eval/scored_agent_results.json`
- **.editorconfig**（source_file）：charset = utf-8 end of line = lf insert final newline = true indent style = space indent size = 4 trim trailing whitespace = true 证据：`.editorconfig`
- **.gitattributes**（source_file）：.skill binary 证据：`.gitattributes`
- **Python**（source_file）：Python pycache / .py cod .pyo .pyd .python-version .venv/ venv/ env/ 证据：`.gitignore`
- **.Pre Commit Config**（source_file）：repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: check-json - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - id: check-merge-conflict - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.13.2 hooks: - id: ruff args: --fix - id: ruff-format - repo: https://github.com/executablebooks/mdformat rev: 0.7.22 hooks: - id: mdformat exclude: ^ / CHANGELOG\.md SKILL\.md $ 证据：`.pre-commit-config.yaml`
- 其余 14 条证据见 `AI_CONTEXT_PACK.json` 或 `EVIDENCE_INDEX.json`。

## 宿主 AI 必须遵守的规则

- **把本资产当作开工前上下文，而不是运行环境。**：AI Context Pack 只包含证据化项目理解，不包含目标项目的可执行状态。 证据：`README.md`, `skills/datoon/README.md`, `INSTALL.md`
- **回答用户时区分可预览内容与必须安装后才能验证的内容。**：安装前体验的消费者价值来自降低误装和误判，而不是伪装成真实运行。 证据：`README.md`, `skills/datoon/README.md`, `INSTALL.md`

## 用户开工前应该回答的问题

- 你准备在哪个宿主 AI 或本地环境中使用它？
- 你只是想先体验工作流，还是准备真实安装？
- 你最在意的是安装成本、输出质量、还是和现有规则的冲突？

## 验收标准

- 所有能力声明都能回指到 evidence_refs 中的文件路径。
- AI_CONTEXT_PACK.md 没有把预览包装成真实运行。
- 用户能在 3 分钟内看懂适合谁、能做什么、如何开始和风险边界。

---

## Doramagic Context Augmentation

下面内容用于强化 Repomix/AI Context Pack 主体。Human Manual 只提供阅读骨架；踩坑日志会被转成宿主 AI 必须遵守的工作约束。

## Human Manual 骨架

使用规则：这里只是项目阅读路线和显著性信号，不是事实权威。具体事实仍必须回到 repo evidence / Claim Graph。

宿主 AI 硬性规则：
- 不得把页标题、章节顺序、摘要或 importance 当作项目事实证据。
- 解释 Human Manual 骨架时，必须明确说它只是阅读路线/显著性信号。
- 能力、安装、兼容性、运行状态和风险判断必须引用 repo evidence、source path 或 Claim Graph。

- **项目概述、安装与快速入门**：importance `high`
  - source_paths: README.md, INSTALL.md, pyproject.toml, src/datoon/__init__.py, src/datoon/models.py
- **核心转换流程与决策门控机制**：importance `high`
  - source_paths: src/datoon/converter.py, src/datoon/analyzer.py, src/datoon/models.py, src/datoon/errors.py, src/datoon/cli.py
- **多格式读取器、归一化与错误处理**：importance `high`
  - source_paths: src/datoon/readers/__init__.py, src/datoon/readers/csv.py, src/datoon/readers/jsonl.py, src/datoon/readers/xml.py, src/datoon/readers/yaml.py
- **插件生态、技能与社区运维要点**：importance `medium`
  - source_paths: .claude-plugin/marketplace.json, .claude-plugin/plugin.json, .agents/plugins/marketplace.json, plugins/datoon/.codex-plugin/plugin.json, plugins/datoon/skills/datoon/SKILL.md

## Repo Inspection Evidence / 源码检查证据

- repo_clone_verified: true
- repo_inspection_verified: true
- repo_commit: `ccf316238253a626ece1c3046e8d3af441b87788`
- inspected_files: `README.md`, `pyproject.toml`, `uv.lock`, `docs/app.js`, `src/datoon/__init__.py`, `src/datoon/analyzer.py`, `src/datoon/cli.py`, `src/datoon/converter.py`, `src/datoon/errors.py`, `src/datoon/mcp_server.py`, `src/datoon/models.py`, `src/datoon/readers/__init__.py`, `src/datoon/readers/_coerce.py`, `src/datoon/readers/_tabular.py`, `src/datoon/readers/columnar.py`, `src/datoon/readers/csv.py`, `src/datoon/readers/excel.py`, `src/datoon/readers/jsonl.py`, `src/datoon/readers/numbers.py`, `src/datoon/readers/xml.py`

宿主 AI 硬性规则：
- 没有 repo_clone_verified=true 时，不得声称已经读过源码。
- 没有 repo_inspection_verified=true 时，不得把 README/docs/package 文件判断写成事实。
- 没有 quick_start_verified=true 时，不得声称 Quick Start 已跑通。

## Doramagic Pitfall Constraints / 踩坑约束

这些规则来自 Doramagic 发现、验证或编译过程中的项目专属坑点。宿主 AI 必须把它们当作工作约束，而不是普通说明文字。

### Constraint 1: 可能修改宿主 AI 配置

- Trigger: 项目面向 Claude/Cursor/Codex/Gemini/OpenCode 等宿主，或安装命令涉及用户配置目录。
- Host AI rule: 列出会写入的配置文件、目录和卸载/回滚步骤。
- Why it matters: 安装可能改变本机 AI 工具行为，用户需要知道写入位置和回滚方法。
- Evidence: capability.host_targets | https://github.com/andrii-su/datoon | host_targets=mcp_host, claude_code, claude
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 2: 失败模式：configuration: Token estimate uses cl100k_base, not the tokenizer of target models

- Trigger: Developers should check this configuration risk before relying on the project: Token estimate uses cl100k_base, not the tokenizer of target models
- Host AI rule: Before packaging this project, run the relevant install/config/quickstart check for: Token estimate uses cl100k_base, not the tokenizer of target models. Context: Source discussion did not expose a precise runtime context.
- Why it matters: Developers may misconfigure credentials, environment, or host setup: Token estimate uses cl100k_base, not the tokenizer of target models
- Evidence: failure_mode_cluster:github_issue | https://github.com/andrii-su/datoon/issues/42 | Token estimate uses cl100k_base, not the tokenizer of target models
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 3: 失败模式：configuration: v1.9.0

- Trigger: Developers should check this configuration risk before relying on the project: v1.9.0
- Host AI rule: Before packaging this project, run the relevant install/config/quickstart check for: v1.9.0. Context: Source discussion did not expose a precise runtime context.
- Why it matters: Upgrade or migration may change expected behavior: v1.9.0
- Evidence: failure_mode_cluster:github_release | https://github.com/andrii-su/datoon/releases/tag/v1.9.0 | v1.9.0
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 4: 来源证据：Unify reader error taxonomy (ValueError vs DatoonError)

- Trigger: GitHub 社区证据显示该项目存在一个配置相关的待验证问题：Unify reader error taxonomy (ValueError vs DatoonError)
- Host AI rule: 来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。
- Why it matters: 可能增加新用户试用和生产接入成本。
- Evidence: community_evidence:github | https://github.com/andrii-su/datoon/issues/41 | 来源类型 github_issue 暴露的待验证使用条件。
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 5: 来源证据：YAML reader does not validate that list items are objects

- Trigger: GitHub 社区证据显示该项目存在一个配置相关的待验证问题：YAML reader does not validate that list items are objects
- Host AI rule: 来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。
- Why it matters: 可能增加新用户试用和生产接入成本。
- Evidence: community_evidence:github | https://github.com/andrii-su/datoon/issues/43 | 来源讨论提到 python 相关条件，需在安装/试用前复核。
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 6: 能力判断依赖假设

- Trigger: README/documentation is current enough for a first validation pass.
- Host AI rule: 将假设转成下游验证清单。
- Why it matters: 假设不成立时，用户拿不到承诺的能力。
- Evidence: capability.assumptions | https://github.com/andrii-su/datoon | README/documentation is current enough for a first validation pass.
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 7: 失败模式：migration: cli.py imports Sequence from typing (deprecated alias)

- Trigger: Developers should check this migration risk before relying on the project: cli.py imports Sequence from typing (deprecated alias)
- Host AI rule: Before packaging this project, run the relevant install/config/quickstart check for: cli.py imports Sequence from typing (deprecated alias). Context: Observed when using python
- Why it matters: Developers may hit a documented source-backed failure mode: cli.py imports Sequence from typing (deprecated alias)
- Evidence: failure_mode_cluster:github_issue | https://github.com/andrii-su/datoon/issues/44 | cli.py imports Sequence from typing (deprecated alias)
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 8: 来源证据：cli.py imports Sequence from typing (deprecated alias)

- Trigger: GitHub 社区证据显示该项目存在一个维护/版本相关的待验证问题：cli.py imports Sequence from typing (deprecated alias)
- Host AI rule: 来源显示可能已有修复、规避或版本变化，说明书中必须标注适用版本。
- Why it matters: 可能影响升级、迁移或版本选择。
- Evidence: community_evidence:github | https://github.com/andrii-su/datoon/issues/44 | 来源讨论提到 python 相关条件，需在安装/试用前复核。
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 9: 维护活跃度未知

- Trigger: 未记录 last_activity_observed。
- Host AI rule: 补 GitHub 最近 commit、release、issue/PR 响应信号。
- Why it matters: 新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。
- Evidence: evidence.maintainer_signals | https://github.com/andrii-su/datoon | last_activity_observed missing
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

- Trigger: no_demo
- Evidence: downstream_validation.risk_items | https://github.com/andrii-su/datoon | no_demo; severity=medium
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。
