# nimic - Doramagic AI Context Pack

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

## 充分原则

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

## 给宿主 AI 的使用方式

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

## Claim 消费规则

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

## 它最适合谁

- **想在安装前理解开源项目价值和边界的用户**：当前证据主要来自项目文档。 证据：`README.md` Claim：`clm_0002` supported 0.86

## 它能做什么

- **项目知识预览**（可做安装前预览）：项目可被阅读和解释，但当前证据不足以确认可安装能力或运行入口。 证据：`README.md`, `LICENSE`, `src/nimic/ncode/nimpy/LICENSE`, `nimic_translation_rules.md` 等 Claim：`clm_0001` supported 0.86

## 怎么开始

- 项目证据中没有稳定 Quick Start 命令；此项应留空，而不是由 Doramagic 编造。

## 继续前判断卡

- **当前建议**：先做 Prompt Preview
- **为什么**：当前信息足以做安装前体验，但真实兼容性、输出质量或风险边界还不能直接相信。

### 30 秒判断

- **现在怎么做**：先做 Prompt Preview
- **最小安全下一步**：先跑 Prompt Preview
- **先别相信**：真实输出质量不能在安装前相信。
- **继续会触碰**：宿主 AI 上下文

### 现在可以相信

- **适合人群线索：想在安装前理解开源项目价值和边界的用户**（supported）：有 supported claim 或项目证据支撑，但仍不等于真实安装效果。 证据：`README.md` Claim：`clm_0002` supported 0.86
- **能力存在：项目知识预览**（supported）：可以相信项目包含这类能力线索；是否适合你的具体任务仍要试用或安装后验证。 证据：`README.md`, `LICENSE`, `src/nimic/ncode/nimpy/LICENSE`, `nimic_translation_rules.md` 等 Claim：`clm_0001` supported 0.86

### 现在还不能相信

- **真实输出质量不能在安装前相信。**（unverified）：Prompt Preview 只能展示引导方式，不能证明真实项目中的结果质量。
- **宿主 AI 版本兼容性不能在安装前相信。**（unverified）：Claude、Cursor、Codex、Gemini 等宿主加载规则和版本差异必须在真实环境验证。
- **不会污染现有宿主 AI 行为，不能直接相信。**（inferred）：Skill、plugin、AGENTS/CLAUDE/GEMINI 指令可能改变宿主 AI 的默认行为。
- **可安全回滚不能默认相信。**（unverified）：除非项目明确提供卸载和恢复说明，否则必须先在隔离环境验证。
- **真实安装后是否与用户当前宿主 AI 版本兼容？**（unverified）：兼容性只能通过实际宿主环境验证。
- **项目输出质量是否满足用户具体任务？**（unverified）：安装前预览只能展示流程和边界，不能替代真实评测。

### 继续会触碰什么

- **宿主 AI 上下文**：AI Context Pack、Prompt Preview、Skill 路由、风险规则和项目事实。 原因：导入上下文会影响宿主 AI 后续判断，必须避免把未验证项包装成事实。

### 最小安全下一步

- **先跑 Prompt Preview**：用安装前交互式试用判断工作方式是否匹配，不需要授权或改环境。（适用：任何项目都适用，尤其是输出质量未知时。）
- **安装后只验证一个最小任务**：先验证加载、兼容、输出质量和回滚，再决定是否深用。（适用：准备从试用进入真实工作流时。）

### 退出方式

- **保留安装前状态**：记录原始宿主配置和项目状态，后续才能判断是否可恢复。
- **如果没有回滚路径，不进入主力环境**：不可回滚是继续前阻断项，不应靠信任或运气继续。

## 哪些只能预览

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

## 哪些必须安装后验证

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

## 边界与风险判断卡

- **把安装前预览误认为真实运行**：用户可能高估项目已经完成的配置、权限和兼容性验证。 处理方式：明确区分 prompt_preview_can_do 与 runtime_required。 Claim：`clm_0003` inferred 0.45
- **待确认**：真实安装后是否与用户当前宿主 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。

### 任务路由

- **项目知识预览**：先基于 role_skill_index / evidence_index 帮用户挑选可用角色、Skill 或工作流。 边界：可做安装前 Prompt 体验。 证据：`README.md`, `LICENSE`, `src/nimic/ncode/nimpy/LICENSE`, `nimic_translation_rules.md` 等 Claim：`clm_0001` supported 0.86

### 上下文规模

- 文件总数：41
- 重要文件覆盖：40/41
- 证据索引条目：38
- 角色 / Skill 条目：2

### 证据不足时的处理

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

## Prompt Recipes

### 适配判断

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

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

### 安装前体验

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

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

请严格输出四段：
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
请基于 nimic 的 AI Context Pack，生成一段我可以粘贴给宿主 AI 的开工前指令。这段指令必须遵守 not_runtime=true，不能声称项目已经安装、运行或产生真实结果。
```

## 角色 / Skill 索引

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

- **Nimic**（project_doc）：Nimic is a pure Python module that facilitates writing AOT compilable code with a subset of Python domain specific language , aiming to get C-level performance without leaving Python. Based on ctypes built-in module, it includes emulation of native types, pointers and operations on them, implementing dispatch, operator overloading, and templates. Nimic closely follows Nim programming language, to which nimic code tr… 激活提示：当用户需要理解项目结构、安装方式或边界时参考。 证据：`README.md`
- **Nimic Translation Rules Nim - Python Nimic**（project_doc）：Nimic Translation Rules Nim - Python Nimic 激活提示：当用户需要理解项目结构、安装方式或边界时参考。 证据：`nimic_translation_rules.md`

## 证据索引

- 共索引 38 条证据。

- **Nimic**（documentation）：Nimic is a pure Python module that facilitates writing AOT compilable code with a subset of Python domain specific language , aiming to get C-level performance without leaving Python. Based on ctypes built-in module, it includes emulation of native types, pointers and operations on them, implementing dispatch, operator overloading, and templates. Nimic closely follows Nim programming language, to which nimic code transpiles. 证据：`README.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`
- **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: 证据：`src/nimic/ncode/nimpy/LICENSE`
- **Nimic Translation Rules Nim - Python Nimic**（documentation）：Nimic Translation Rules Nim - Python Nimic 证据：`nimic_translation_rules.md`
- **macOS files**（source_file）：Byte-compiled / optimized / DLL files pycache / .py codz $py.class 证据：`.gitignore`
- **.python-version**（source_file）：3.12 证据：`.python-version`
- **Preprocess**（source_file）：def nearest neighbour compute source index scale: float64, out index: nint, input size: nint - nint ⋮---- result = min nint floor float64 out index scale , input size - 1 ⋮---- reverse channels = nint reverse channels ⋮---- inpRawData = cast ptr UncheckedArray uint8 inpRawData ptr outRawData = cast ptr UncheckedArray float32 outRawData ptr ⋮---- scale h = float64 inpH / float64 outH scale w = float64 inpW / float64 outW ⋮---- src h = nearest neighbour compute source index scale=scale h, out index=h, input size=inpH src w = nearest neighbour compute source index scale=scale w, out index=w, input size=inpW ⋮---- inp f32 = float32 inpRawData src h inpW C + src w C + 1 - reverse channels c + re… 证据：`examples/preprocess.py`
- **Pyproject**（source_file）：project name = "nimic" version = "0.0.5" authors = { name = "Dmytro Makogon"} description = "Pure Python module that facilitates writing AOT compilable code" readme = "README.md" license = "MIT" requires-python = " =3.12" dependencies = classifiers = "Topic :: Software Development :: Compilers", "Programming Language :: Python :: 3", 证据：`pyproject.toml`
- **Init**（source_file）：def import from path module name, file path ⋮---- spec = importlib.util.spec from file location module name, file path module = importlib.util.module from spec spec 证据：`src/nimic/__init__.py`
- **Convert final Expr/Return to Assign using original targets**（source_file）：n templates = {} def template template func ⋮---- is untyped = ⋮---- is untyped = True ⋮---- template source = inspect.getsource template func template source = textwrap.dedent template source template ast = ast.parse template source ⋮---- template def node = template ast.body 0 ⋮---- template body nodes = template def node.body template params = arg.arg for arg in template def node.args.args ⋮---- class ParameterReplacer ast.NodeTransformer ⋮---- def init self, arg map def visit Name self, node class TemplateInliner ast.NodeTransformer ⋮---- def init self, dict with templates def inline call self, call node, targets=None ⋮---- template name = call node.func.id template params = self.dict w… 证据：`src/nimic/inliner.py`
- **Don't use this**（source_file）：import dynlib, macros, os, strutils, typetraits, tables, json, strformat, nimpy/ py types, py utils, nim py marshalling, py nim marshalling 证据：`src/nimic/ncode/nimpy.nim`
- **Enum handling**（source_file）：import std/ json, complex, tables import ./py types, ./py utils import ./py lib as lib 证据：`src/nimic/ncode/nimpy/nim_py_marshalling.nim`
- **PyList Check : proc l: PPyObject : cint {.pyfunc.}**（source_file）：import dynlib, sequtils, strutils, complex, py types 证据：`src/nimic/ncode/nimpy/py_lib.nim`
- **Name the type that is unable to be converted.**（source_file）：import std/ json, complex, tables, strutils import ./py types, ./py utils import ./py lib as lib 证据：`src/nimic/ncode/nimpy/py_nim_marshalling.nim`
- **extra: PyObject HEAD EXTRA in runtime depends on traceRefs. see pyAlloc**（source_file）：when NimMajor, NimMinor < 1, 2 : type csize t = csize 证据：`src/nimic/ncode/nimpy/py_types.nim`
- **generate the calls to PyErr GivenExceptionMatches to check which exception**（source_file）：import py lib as lib import py types 证据：`src/nimic/ncode/nimpy/py_utils.nim`
- **Flags for getting buffers**（source_file）：import py types, py utils import py lib as lib from ../nimpy import PyObject, privateRawPyObj 证据：`src/nimic/ncode/nimpy/raw_buffers.nim`
- **A type specialized version of ..< for convenience so that**（source_file）：type nbool = bool nint = int uintp = uint intp = int 证据：`src/nimic/ncode/pydefs.nim`
- **Math**（source_file）：template radians deg: float64 : float64 = degToRad deg 证据：`src/nimic/ncode/pystd/math.nim`
- **Init**（source_file）：PyObject = object 证据：`src/nimic/nimpy/__init__.py`
- **Py Types**（source_file）：class Py ssize t NInteger ⋮---- PyBUF SIMPLE = 0x0000 PyBUF WRITABLE = 0x0001 PyBUF ND = 0x0008 证据：`src/nimic/nimpy/py_types.py`
- **Raw Buffers**（source_file）：class RawPyBuffer Object ⋮---- buf: pointer shape: pointer def release buf def getBuffer obj, buf, flags=0 ⋮---- data addr = obj.ctypes.data ndim = obj.ndim ShapeArray = ctypes.c ssize t ndim shape arr = ShapeArray obj.shape data ptr = pointer ⋮---- shape ptr = pointer ⋮---- mv = memoryview obj c buf = ctypes.c char mv.nbytes .from buffer mv ⋮---- shape tuple = mv.shape ShapeArray = ctypes.c ssize t len shape tuple shape arr = ShapeArray shape tuple 证据：`src/nimic/nimpy/raw_buffers.py`
- **Nsystem**（source_file）：class SomeCastClass ⋮---- def getitem self, other cls: type - callable ⋮---- fun = lambda x: x ⋮---- fun = lambda x: other cls.cast x ⋮---- cast = SomeCastClass def sizeof x: type - int def fields x: object, y: object None = None - object def countdown a: int, b: int - Generator def alloc shared0 size def dealloc shared p allocShared0 = alloc shared0 deallocShared = dealloc shared def write bytes f, data, start: int, count: int - int ⋮---- buf addr = ctypes.addressof data. n view raw = ctypes.c char start + count .from address buf addr b = bytes raw start:start + count ⋮---- b = data start:start + count ⋮---- b = bytes int data i for i in range start, start + count ⋮---- writeBytes = write… 证据：`src/nimic/nsystem.py`
- **presense of comptime in "if" expression forces aot evaluation**（source_file）：class untyped SomeInteger = int SomeFloat = float ⋮---- byte = uint8 def u8 x: int - uint8: return uint8 x def u16 x: int - uint16: return uint16 x def u32 x: int - uint32: return uint32 x def u64 x: int - uint64: return uint64 x def i8 x: int - int8: return int8 x def i16 x: int - int16: return int16 x def i32 x: int - int32: return int32 x def i64 x: int - int64: return int64 x def f16 x: float - float16: return float16 x def f32 x: float - float32: return float32 x def f64 x: float - float64: return float64 x def ch x: str - char: return char x const = contextlib.nullcontext let = contextlib.nullcontext var = contextlib.nullcontext block = contextlib.nullcontext Type = contextlib.nullcon… 证据：`src/nimic/ntypes.py`
- **--- Generic Type Classes & Aliases ---**（source_file）：class NilPtr ⋮---- slots = ' type name', ⋮---- @property def is nil self - bool def init self, type name: str def bool self - bool def eq self, other - bool def ne self, other - bool def hash self - int def repr self - str resolved = {} dispatch generic = {} dispatch genericT = {} tdefs = {} arg names = {} --- Generic Type Classes & Aliases --- n generic types = { n aliases = {"float": "float64", "int": "int32", "str": "string", "NBool": "bool", def get type params fn: callable - dict ⋮---- lines = ins.getsource fn .split "\n" ⋮---- T str = line line.find " " + 1 : line.find " " .split ", " T def = {} ⋮---- expr sp = expr.split ":" ⋮---- def specialize generic fn: callable, T var: dict str,… 证据：`src/nimic/ntypesystem.py`
- **Algorithm**（source_file）：@dispatch def sort s: mut @ seq string 证据：`src/nimic/std/algorithm.py`
- **Endians**（source_file）：def get addr obj def big endian32 dst: pointer, src: pointer ⋮---- src addr = get addr src dst addr = get addr dst val = ctypes.cast src addr, ctypes.POINTER ctypes.c uint32 0 val swapped = struct.unpack ' I', val 0 ⋮---- def little endian32 dst: pointer, src: pointer 证据：`src/nimic/std/endians.py`
- **Monotimes**（source_file）：class MonoTime ⋮---- slots = " ns", def init self, nanoseconds: int def sub self, other: "MonoTime" - Duration def repr self - str def get mono time - MonoTime ⋮---- """Return the current monotonic time Nim: getMonoTime .""" 证据：`src/nimic/std/monotimes.py`
- **Options**（source_file）：class Option ⋮---- def init self, value=None, has value=False def class getitem cls, T ⋮---- type name = T. name if hasattr T, ' name ' else str T specialized = type f"Option {type name} ", Option, , {" n inner type": T} ⋮---- def is some self - bool def is none self - bool def get self def unsafe get self def eq self, other def repr self def str self def bool self ⋮---- """Allow truthiness check: if opt: ... is equivalent to if opt.is some : ... .""" ⋮---- def some value - Option ⋮---- """Create an Option containing a value.""" ⋮---- def none T=None - Option ⋮---- """Create an empty Option. T is the type parameter used for type annotations, ignored at runtime . In nimic: none int32 transpi… 证据：`src/nimic/std/options.py`
- **Os**（source_file）：fmRead = "r" fmWrite = "w" fmAppend = "a" fmReadWriteExisting = "r+" fmReadWrite = "w+" ⋮---- def create dir dir: str - None class PathComponent Enum ⋮---- pcFile = "pcFile" pcDir = "pcDir" pcLinkToFile = "pcLinkToFile" pcLinkToDir = "pcLinkToDir" pcFile = PathComponent.pcFile pcDir = PathComponent.pcDir class WalkEntry ⋮---- slots = 'kind', 'path' def init self, kind, path def walk dir path: str def extract filename path: str - str def param count - int def param str i: int - str def get app filename - str def open path: str, mode: str = "r" ⋮---- binary map = {"w": "wb", "a": "ab", "r+": "r+b", "w+": "w+b"} actual mode = binary map.get mode, mode handle = builtins "open" path, actual mode… 证据：`src/nimic/std/os.py`
- **Paths**（source_file）：class Path string ⋮---- def init self: Path, x: string ⋮---- self = x def truediv self: Path, tail: string - Path def str self: Path - string 证据：`src/nimic/std/paths.py`
- **Strutils**（source_file）：def int to str i: int, minchars: int = 1 def parse int s: str - int 证据：`src/nimic/std/strutils.py`
- **Syncio**（source_file）：def read file path: str - str def read file bytes path: str - bytes def write file path: str, content: str - None def write buffer f, buffer, size: int - int ⋮---- addr = buffer. n addr data = bytes ctypes.c char int size .from address addr ⋮---- v = getattr buffer, 'contents', buffer v = getattr v, ' n view', v ⋮---- addr = v ⋮---- addr = v.value ⋮---- addr = ctypes.addressof v ⋮---- data = buffer :size ⋮---- data = bytes buffer :size ⋮---- def set file pos f, pos: int - None 证据：`src/nimic/std/syncio.py`
- **Tables**（source_file）：class CountTable ⋮---- def init self, args def class getitem cls, tp ⋮---- self = cls. new cls def wrap args ⋮---- def str self def inc self, key ⋮---- key = repr key ⋮---- class GenCountTable ⋮---- def getitem self, tp initCountTable = GenCountTable 证据：`src/nimic/std/tables.py`
- **Times**（source_file）：class Duration ⋮---- slots = " ns", def init self, nanoseconds: int = 0 def sub self, other: "Duration" - "Duration" def add self, other: "Duration" - "Duration" def repr self - str class DateTime ⋮---- """Nim DateTime — represents a point in calendar time.""" slots = " unix", def init self, unix seconds: int def to unix self - int ⋮---- def get time - DateTime ⋮---- """Return the current calendar time Nim: getTime .""" ⋮---- def in milliseconds dur: Duration - int ⋮---- """Convert a Duration to whole milliseconds Nim: inMilliseconds .""" ⋮---- def in microseconds dur: Duration - int ⋮---- """Convert a Duration to whole microseconds Nim: inMicroseconds .""" ⋮---- def in seconds dur: Duratio… 证据：`src/nimic/std/times.py`
- **Ansi C**（source_file）：class csize t NInteger : n bits, n signed, n rank = 64, False, 7 class cint NInteger : n bits, n signed, n rank = 32, True, 4 class cuint NInteger : n bits, n signed, n rank = 32, False, 4 def c malloc size ⋮---- n = int size. n get value if hasattr size, ' n get value' else int size buf = ctypes.c char n ⋮---- def c free p def c realloc p, size ⋮---- new buf = ctypes.c char n ⋮---- old buf = BUFFER REGISTRY.find buffer for address p. n addr ⋮---- old size = ctypes.sizeof old buf copy size = min old size, n ⋮---- def copy mem dst, src, size: int ⋮---- dst addr = dst. n addr if isinstance dst, pointer else ctypes.addressof dst src addr = src. n addr if isinstance src, pointer else ctypes.add… 证据：`src/nimic/system/ansi_c.py`
- **Else it should be an int giving the minor version for 3.x.**（source_file）：flags = PyCF ONLY AST ⋮---- feature version = -1 ⋮---- feature version = minor Else it should be an int giving the minor version for 3.x. ⋮---- def literal eval node or string ⋮---- """ Evaluate an expression node or a string containing only a Python expression. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None. Caution: A complex expression can overflow the C stack and cause a crash. """ ⋮---- node or string = parse node or string.lstrip " \t" , mode='eval' ⋮---- node or string = node or string.body def raise malformed node node ⋮---- msg = "malformed node or string" ⋮---- def con… 证据：`src/nimic/transpiler.py`
- **Test Preprocess**（source_file）：def preprocess image, output shape:tuple, reverse channels:bool=False ⋮---- inpH = image.shape 0 inpW = image.shape 1 C = image.shape 2 outH = output shape 0 outW = output shape 1 output = np.empty C, outH, outW , dtype=np.float32 ⋮---- frame = np.arange 0, 4 8 3, dtype=np.uint8 .reshape 4, 8, 3 output = preprocess frame, output shape= 2, 4 , reverse channels=False output reversed = preprocess frame, output shape= 2, 4 , reverse channels=True 证据：`examples/test_preprocess.py`

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

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

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

- 你准备在哪个宿主 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。

- **Project Overview and Module Architecture**：importance `high`
  - source_paths: README.md, src/nimic/__init__.py, src/nimic/__main__.py, pyproject.toml
- **Core Type System and DSL Conventions**：importance `high`
  - source_paths: src/nimic/ntypesystem.py, src/nimic/ntypes.py, src/nimic/nsystem.py, nimic_translation_rules.md
- **Transpiler Engine and Template Inlining**：importance `high`
  - source_paths: src/nimic/transpiler.py, src/nimic/inliner.py, nimic_translation_rules.md, examples/preprocess.py
- **Standard Library Shims, nimpy API, and Examples**：importance `medium`
  - source_paths: src/nimic/nimpy/__init__.py, src/nimic/nimpy/py_types.py, src/nimic/nimpy/raw_buffers.py, src/nimic/std/algorithm.py, src/nimic/std/math.py

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

- repo_clone_verified: true
- repo_inspection_verified: true
- repo_commit: `5fc2e1cf57ea2168cb2aa9c46fa27770e9fb5530`
- inspected_files: `README.md`, `pyproject.toml`, `examples/preprocess.py`, `examples/test_preprocess.py`, `src/nimic/__init__.py`, `src/nimic/__main__.py`, `src/nimic/inliner.py`, `src/nimic/nimpy/__init__.py`, `src/nimic/nimpy/py_types.py`, `src/nimic/nimpy/raw_buffers.py`, `src/nimic/nsystem.py`, `src/nimic/ntypes.py`, `src/nimic/ntypesystem.py`, `src/nimic/std/algorithm.py`, `src/nimic/std/endians.py`, `src/nimic/std/math.py`, `src/nimic/std/monotimes.py`, `src/nimic/std/options.py`, `src/nimic/std/os.py`, `src/nimic/std/paths.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: 能力判断依赖假设

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

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

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

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

### Constraint 4: 存在评分风险

- Trigger: no_demo
- Why it matters: 风险会影响是否适合普通用户安装。
- Evidence: risks.scoring_risks | https://news.ycombinator.com/item?id=48646239 | no_demo; severity=medium
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 5: issue/PR 响应质量未知

- Trigger: issue_or_pr_quality=unknown。
- Host AI rule: 抽样最近 issue/PR，判断是否长期无人处理。
- Why it matters: 用户无法判断遇到问题后是否有人维护。
- Evidence: evidence.maintainer_signals | https://news.ycombinator.com/item?id=48646239 | issue_or_pr_quality=unknown
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。

### Constraint 6: 发布节奏不明确

- Trigger: release_recency=unknown。
- Host AI rule: 确认最近 release/tag 和 README 安装命令是否一致。
- Why it matters: 安装命令和文档可能落后于代码，用户踩坑概率升高。
- Evidence: evidence.maintainer_signals | https://news.ycombinator.com/item?id=48646239 | release_recency=unknown
- Hard boundary: 不要把这个坑点包装成已解决、已验证或可忽略，除非后续验证证据明确证明它已经关闭。
