跳转到正文
报告库
用途分类 / 文档处理

Env And Assets Bootstrap Skill 安全审计

作者说它能做什么(原文)

Rigor Setup skill for README-first deep learning repo reproduction. Use when the task is specifically to prepare a conservative conda-first environment, checkpoint and dataset path assumptions, cache location hints, and setup notes before any run on a README-documented repository. Do not use for repo scanning, full orchestration, paper interpretation, final run reporting, or generic environment se

第三方安全检查结论

先别安装或运行

已检查文件
24
发现的风险
4
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。发现 2 项风险
高风险

`--run-selected` 会在本机执行由不受信任 README 自动选出的命令

原文依据:5 处
发现了什么

编排器从仓库文档提取并按启发式规则选择命令;启用 `--run-selected` 后,所选字符串被交给持久运行器并最终通过 `subprocess.Popen` 启动。仅仅出现在 README 中不代表该命令已被用户逐项审核。

为什么需要注意

恶意或被篡改的仓库可把 Python 脚本或其他程序包装成推理、评测或训练示例,从而以当前用户权限读取或修改文件、访问网络、消耗 GPU/CPU,或调用用户账户中的工具。

该风险有源码支持,但只有用户显式传入 `--run-selected` 才会执行。编排器会从 README/链接文档提取候选项,自动按类别和评分选出命令,然后把命令交给运行器;运行器最终在目标仓库目录通过 `subprocess.Popen` 启动。README 属于目标仓库控制的数据,自动选择不等于逐项人工审核。用户可限制为不启用该参数,并要求作者展示最终 argv、来源位置和工作目录后再授权。

ai-research-reproduction/scripts/orchestrate_repro.py:303来自代码打开原文件
    for category in ["inference", "evaluation", "training", "other"]:        candidates = [item for item in commands if item.get("category") == category]        if not candidates:            continue        runnable = [            item            for item in candidates            if not item.get("needs_substitution") and command_feasibility(item, repo_path)[0]        ]        if not runnable:            continue        best = max(runnable, key=lambda item: command_score(item, produced_out_dirs))        return {            "selected_goal": category,            "goal_priority": category,            "documented_command": best.get("command", ""),            "command_source": best.get("source", "readme"),
查看另外 4 个位置
ai-research-reproduction/scripts/orchestrate_repro.py:1292来自代码打开原文件
            )        else:            run_data = maybe_run_command(                repo_path,                chosen["documented_command"],                args.timeout,                args.user_language,                args.shell_mode,                runtime_root,                model_adapter,                args.monitor_gpu,            )
ai-research-reproduction/_bundled/shared/scripts/runtime_runner.py:487来自代码打开原文件
    try:        argv = build_command(command, shell_mode)        environment = dict(os.environ if child_env is None else child_env)        spec["requested_argv"] = list(argv)        atomic_write_json(run_dir / "spec.json", spec)        if shell_mode == "direct":            argv = resolve_direct_argv(argv, repo, environment)        spec["argv"] = list(argv)        atomic_write_json(run_dir / "spec.json", spec)        creationflags = subprocess.CREATE_NEW_PROCESS_GROUP if os.name == "nt" else 0        process = subprocess.Popen(            argv,            env=environment,            cwd=repo,            stdout=subprocess.PIPE,            stderr=subprocess.PIPE,            text=True,            encoding="utf-8",            errors="replace",            bufsize=1,            creationflags=creationflags,            start_new_session=os.name != "nt",        )    except (FileNotFoundError, ShellSyntaxRequired, OSError, ValueError) as exc:
ai-research-reproduction/scripts/orchestrate_repro.py:1107来自代码打开原文件
    parser.add_argument("--user-language", default="en", help="Language tag for human-readable reports.")    parser.add_argument("--run-selected", action="store_true", help="Execute the selected documented command.")    parser.add_argument("--include-analysis-pass", action="store_true", help="Run analyze-project and record its outputs in the stage ledger.")
ai-research-reproduction/_bundled/shared/scripts/runtime_runner.py:497来自代码打开原文件
        creationflags = subprocess.CREATE_NEW_PROCESS_GROUP if os.name == "nt" else 0        process = subprocess.Popen(            argv,            env=environment,            cwd=repo,            stdout=subprocess.PIPE,            stderr=subprocess.PIPE,            text=True,            encoding="utf-8",            errors="replace",            bufsize=1,            creationflags=creationflags,            start_new_session=os.name != "nt",        )    except (FileNotFoundError, ShellSyntaxRequired, OSError, ValueError) as exc:
高风险

环境 bootstrap 会执行仓库控制的依赖安装和构建代码

原文依据:5 处
发现了什么

除非指定 `--dry-run`,bootstrap 会直接调用 conda/mamba 或 pip。检测到 `pyproject.toml` 或 `setup.py` 时会执行 editable install;检测到 `requirements.txt` 时会安装其中列出的包。这些输入来自目标仓库。

为什么需要注意

恶意构建后端、setup 脚本或依赖包可在安装期间以当前用户权限执行代码,窃取可访问的数据或凭据、修改用户文件,或安装持久化组件。隔离 Python 环境并不等同于隔离主机权限。

bootstrap 默认不是 dry-run,因此会执行环境创建和安装。它依据目标仓库顶层的环境文件选择操作:`requirements.txt` 触发 pip 安装,`pyproject.toml` 或 `setup.py` 触发 editable install;这些安装过程可能运行仓库或依赖包提供的构建代码,并修改环境、下载软件包或访问网络。用户可先使用 `--dry-run`,审查环境文件、锁定依赖来源,并在隔离环境中执行。

scripts/bootstrap_env.py:23来自代码打开原文件
def run_command(command: List[str], *, cwd: Path, dry_run: bool) -> None:    print(f"+ {format_command(command)}")    if dry_run:        return    subprocess.run(command, cwd=cwd, check=True)
查看另外 4 个位置
scripts/bootstrap_env.py:60来自代码打开原文件
def install_with_manager(manager: str, env_name: str, repo_path: Path, rel_env_file: Optional[str], *, dry_run: bool) -> None:    if rel_env_file == "requirements.txt":        run_command(            [manager, "run", "-n", env_name, "python", "-m", "pip", "install", "-r", rel_env_file],            cwd=repo_path,            dry_run=dry_run,        )    elif rel_env_file in {"pyproject.toml", "setup.py"}:        run_command(            [manager, "run", "-n", env_name, "python", "-m", "pip", "install", "-e", "."],            cwd=repo_path,            dry_run=dry_run,        )
scripts/bootstrap_env.py:114来自代码打开原文件
    if env_file and env_file.name in CONDA_ENV_FILES:        if manager is None:            raise SystemExit("A conda-compatible manager is required for environment.yml-based setup. Install conda or mamba first.")        create_command = [manager, "env", "create", "-f", rel_env_file]        if not declared_env_name:            create_command.extend(["-n", resolved_env_name])        run_command(create_command, cwd=repo_path, dry_run=args.dry_run)        print_activation_instructions(declared_env_name or resolved_env_name, using_conda=True)
scripts/bootstrap_env.py:75来自代码打开原文件
def install_with_venv(env_python: Path, repo_path: Path, rel_env_file: Optional[str], *, dry_run: bool) -> None:    if rel_env_file == "requirements.txt":        run_command(            [str(env_python), "-m", "pip", "install", "-r", rel_env_file],            cwd=repo_path,            dry_run=dry_run,        )    elif rel_env_file in {"pyproject.toml", "setup.py"}:        run_command(            [str(env_python), "-m", "pip", "install", "-e", "."],            cwd=repo_path,            dry_run=dry_run,        )
scripts/bootstrap_env.py:101来自代码打开原文件
    )    parser.add_argument("--dry-run", action="store_true", help="Print commands without executing them.")    args = parser.parse_args()
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
中风险

可选模型 runner 会把仓库片段、任务内容和命令结果发送到配置的模型端点

原文依据:6 处
发现了什么

模型可以请求读取初始仓库清单中的文件;读取的最多 12,000 字符会作为 tool result 加入后续消息。命令结果也包含 stdout/stderr,并进入同一消息记录,随后传给 `provider.complete`。环境变量名称过滤不能清除文件内容或程序主动打印的秘密。

为什么需要注意

私有源代码、数据路径、日志、令牌或其他敏感输出可能离开本机并到达官方 API 或配置的网关;完整消息和响应还会保存在轨迹与状态文件中,分享输出目录时可能再次泄露。

可选模型 runner 会把任务内容放入消息,允许模型读取初始清单中的仓库文件,并把最多 12,000 字符的内容作为工具结果加入后续消息;命令结果也包含 stdout/stderr 并进入同一记录,随后整个消息集合传给配置的模型提供方。子进程环境变量过滤不能清除文件正文或程序输出中的敏感信息。用户应只对可信仓库启用此 runner,限制可读文件和批准命令,并确认模型端点及其数据保留政策。

ai-research-reproduction/scripts/run_agent.py:440来自代码打开原文件
                            value = {"files": sorted(files)}                        elif name == "read_file":                            if args["path"] not in files:                                raise ValueError("File was not in the permitted initial inventory")                            offset = max(0, int(args.get("offset", 0)))                            with safe_file(repo, args["path"]).open("r", encoding="utf-8") as handle:                                handle.seek(offset)                                value = {"path": args["path"], "text": handle.read(12000), "next_offset": handle.tell()}                        elif name == "update_plan":
查看另外 5 个位置
ai-research-reproduction/scripts/run_agent.py:478来自代码打开原文件
                                    capture_limit=16000, model_adapter=profile)                            value["checks"] = command_checks(repo, command, value)                            value["verified"] = value["checks"]["passed"]                            state.setdefault("attempts", []).append({"command_id": command_id, "runtime_id": call["runtime_id"], "verified": value["verified"]})                            state["results"][command_id] = value                            state["last_command"] = command_id                        elif name == "finish":                            checks = verify_task(repo, output, task, state, files)                            state["verification"] = checks                            state["summary"] = args["summary"]                            state["status"] = "success" if all(checks["commands"].values()) and checks["source_unchanged"] else "blocked"                            if state["status"] == "blocked":                                state["blocker"] = "Independent verification failed"                            value = {"status": state["status"], "checks": checks}                        else:                            raise ValueError("Unknown tool")                    except (ValueError, KeyError, OSError) as exc:                        value = {"error": str(exc)}                    event("tool_result", tool=name, result=value)                    state["tool_results"].append({"type": "tool_result", "tool_use_id": call["id"],                        "content": json.dumps(value, ensure_ascii=False), "is_error": "error" in value})                    state["pending"].pop(0)
ai-research-reproduction/scripts/run_agent.py:505来自代码打开原文件
                    continue                if state["tool_results"]:                    state["messages"].append({"role": "user", "content": state.pop("tool_results")})                    state["tool_results"] = []                request_bytes = len(json.dumps([SYSTEM, TOOLS, state["messages"]]).encode())                used = sum(state["usage"].values())                reserve = request_bytes + budget["max_output_tokens"] + 1024                if state["model_calls"] >= budget["max_model_calls"] or used + reserve > budget["max_total_tokens"]:                    block("Model call/token reservation budget reached")                    break                state["model_calls"] += 1                state["model_pending"] = True                state["usage_complete"] = False                save()                event("model_request", call=state["model_calls"], reserved_tokens=reserve)                response = provider.complete(state["messages"], SYSTEM, TOOLS, budget["max_output_tokens"], min(60, remaining))                if not isinstance(response, dict):
ai-research-reproduction/references/agent-runner.md:157来自说明文档打开原文件
Usage and elapsed execution time accumulate across resumes (offline pause timeis excluded). Before each model request, UTF-8 request bytes plus output tokensand overhead provide a conservative token reservation. Reported usage is stored;gateway token accounting may differ. Output size is checked between actions,not an OS disk quota. `CANCEL` is checked between actions; use the runtime CANCELfile to stop an active process. Credentials are not included in provider errors.Do not publish traces from private repositories without reviewing their contents.
ai-research-reproduction/scripts/run_agent.py:388来自代码打开原文件
                "model_profile": profile, "endpoint_identity": endpoint_identity, "harness_identity": harness_identity, "files": files, "created_at": utc_now(), "elapsed_seconds": 0.0,                "messages": [{"role": "user", "content": json.dumps({"goal": task["goal"], "readme": task.get("readme", "README.md"),                    "commands": task["commands"], "required_commands": task["required_commands"]})}],                "plan": [], "results": {}, "pending": [], "tool_results": [], "model_calls": 0, "tool_calls": 0,                "usage": {"input_tokens": 0, "output_tokens": 0}, "usage_complete": True, "verification": {}}
ai-research-reproduction/scripts/run_agent.py:469来自代码打开原文件
                                command_text = subprocess.list2cmdline(argv) if os.name == "nt" else shlex.join(argv)                                clean_env = {k: v for k, v in os.environ.items() if not re.search(r"KEY|TOKEN|SECRET|PASSWORD|CREDENTIAL|AUTH", k, re.I)}                                credential_name = profile.get("credential_env")                                if credential_name:                                    clean_env.pop(credential_name, None)                                clean_env["PYTHONIOENCODING"] = "utf-8"                                value = run_persistent_command(repo=safe_file(repo, command.get("cwd", ".")), command=command_text,                                    timeout=max(1, min(command.get("timeout_seconds", 30), int(remaining))),                                    runtime_root=output / "_runtime", run_id=call["runtime_id"], child_env=clean_env,                                    capture_limit=16000, model_adapter=profile)                            value["checks"] = command_checks(repo, command, value)                            value["verified"] = value["checks"]["passed"]                            state.setdefault("attempts", []).append({"command_id": command_id, "runtime_id": call["runtime_id"], "verified": value["verified"]})                            state["results"][command_id] = value                            state["last_command"] = command_id                        elif name == "finish":                            checks = verify_task(repo, output, task, state, files)                            state["verification"] = checks                            state["summary"] = args["summary"]                            state["status"] = "success" if all(checks["commands"].values()) and checks["source_unchanged"] else "blocked"                            if state["status"] == "blocked":                                state["blocker"] = "Independent verification failed"                            value = {"status": state["status"], "checks": checks}                        else:                            raise ValueError("Unknown tool")                    except (ValueError, KeyError, OSError) as exc:                        value = {"error": str(exc)}                    event("tool_result", tool=name, result=value)                    state["tool_results"].append({"type": "tool_result", "tool_use_id": call["id"],                        "content": json.dumps(value, ensure_ascii=False), "is_error": "error" in value})                    state["pending"].pop(0)
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。发现 1 项风险
中风险

执行复现后默认会在项目外自动追加长期“经验”记录

原文依据:6 处
发现了什么

经验记录默认开启,存放于 `~/.rigorpilot` 或 `RIGORPILOT_HOME`。当运行结果为 partial/blocked 时,编排器自动记录阻塞原因、文档命令和仓库指纹;写入采用追加模式。秘密正则只是尽力过滤,并非完整的数据分类或脱敏。

为什么需要注意

用户主目录会发生未必预期的持久修改;私有仓库名称、README 指纹、路径、命令或错误上下文可能跨运行保留,并可能在之后生成的个人 overlay 中出现。

该风险有支持,但记录只在执行被请求且结果符合记录条件时发生。经验功能默认开启,目录默认为用户主目录下的 `.rigorpilot`(也可由 `RIGORPILOT_HOME` 改写);partial/blocked 会记录阻塞摘要、文档命令和仓库指纹,并追加写入 JSONL。源码明确说明秘密检测只是尽力而为。用户可在运行前设置 `RIGORPILOT_LESSONS=0`,或要求作者改为明确选择加入并展示待写入内容。

ai-research-reproduction/_bundled/shared/scripts/lessons_store.py:41来自代码打开原文件
def lessons_home() -> Path:    root = os.environ.get("RIGORPILOT_HOME")    return Path(root).expanduser() if root else Path.home() / ".rigorpilot"def lessons_enabled() -> bool:    return os.environ.get("RIGORPILOT_LESSONS", "1") != "0"
查看另外 5 个位置
ai-research-reproduction/scripts/orchestrate_repro.py:54来自代码打开原文件
def maybe_record_lesson(repo_path: Path, context: Dict[str, Any]) -> Optional[str]:    """Record failure blockers and later resolutions per the continuous-learning policy."""    store = load_lessons_store()    if store is None or not store.lessons_enabled():        return None    fingerprint = store.repo_fingerprint(repo_path)    status = context.get("status")    try:        if status in {"partial", "blocked"}:            path = store.record_lesson(                kind="failure-fix",                skill="ai-research-reproduction",                summary=f"[{status}] {context.get('main_blocker', 'unrecorded blocker')}",                detail=str(context.get("documented_command") or ""),                fingerprint=fingerprint,            )            return str(path) if path else None        if status == "success":
ai-research-reproduction/_bundled/shared/scripts/lessons_store.py:125来自代码打开原文件
    }    path = lessons_path()    path.parent.mkdir(parents=True, exist_ok=True)    with path.open("a", encoding="utf-8") as handle:        handle.write(json.dumps(entry, ensure_ascii=False) + "\n")    return path
ai-research-reproduction/_bundled/shared/scripts/lessons_store.py:21来自代码打开原文件
VALID_KINDS = {"failure-fix", "user-correction", "preference", "generalization"}# Best-effort blocklist: keyword shapes plus common bare-credential formats.# This is a guardrail, not a guarantee — callers still must not pass secrets.SECRET_RE = re.compile(    r"(api[_-]?key|secret|token|password|passwd|authorization|bearer\s+\S|-----BEGIN"    r"|AKIA[0-9A-Z]{16}|ghp_[A-Za-z0-9]{20,}|gho_[A-Za-z0-9]{20,}|sk-[A-Za-z0-9_-]{16,}"    r"|xox[a-z]-[A-Za-z0-9-]{10,}|AIza[0-9A-Za-z_-]{30,})",    re.IGNORECASE,)MAX_FIELD_CHARS = 300
ai-research-reproduction/scripts/orchestrate_repro.py:62来自代码打开原文件
    try:        if status in {"partial", "blocked"}:            path = store.record_lesson(                kind="failure-fix",                skill="ai-research-reproduction",                summary=f"[{status}] {context.get('main_blocker', 'unrecorded blocker')}",                detail=str(context.get("documented_command") or ""),                fingerprint=fingerprint,            )            return str(path) if path else None
ai-research-reproduction/scripts/orchestrate_repro.py:1391来自代码打开原文件
    context["lesson_recorded"] = maybe_record_lesson(repo_path, context) if args.run_selected else None
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。未发现风险
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

6 个说明模块

该技能的主要入口用于生成环境、数据集、checkpoint 和缓存路径的准备方案;说明还明确引用了可实际创建环境和安装依赖的 bootstrap 脚本。

查看原文
SKILL.md:43来自说明文档打开原文件
## Output expectations- conservative environment setup notes- candidate conda commands- asset path plan- checkpoint and dataset source hints- unresolved dependency or asset risks
SKILL.md:53来自说明文档打开原文件
Use `references/env-policy.md`, `references/assets-policy.md`, `scripts/bootstrap_env.py`, `scripts/plan_setup.py`, and `scripts/prepare_assets.py`.Use `scripts/bootstrap_env.sh` only as a POSIX wrapper around the Python bootstrapper when a shell entrypoint is more convenient.

资源准备脚本只扫描 README、配置文件和常见资源目录,并写出一个 JSON 清单;可执行文件由调用者指定输出位置。

查看原文
scripts/prepare_assets.py:27来自代码打开原文件
def collect_text_hints(repo: Path) -> List[Dict[str, str]]:    hints: List[Dict[str, str]] = []    readme = first_existing(repo, ["README.md", "README"])    if readme:        text = readme.read_text(encoding="utf-8", errors="replace")        for line in text.splitlines():            lowered = line.lower()            if not any(keyword in lowered for keyword in KEYWORDS):                continue            urls = URL_RE.findall(line)            paths = PATH_RE.findall(line)            if not urls and not paths:
scripts/prepare_assets.py:108来自代码打开原文件
    repo = Path(args.repo).resolve()    assets_root = Path(args.assets_root).resolve()    output_json = Path(args.output_json).resolve()    output_json.parent.mkdir(parents=True, exist_ok=True)    data = prepare_assets(repo, assets_root)    output_json.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")    print(json.dumps(data, indent=2, ensure_ascii=False))    return 0

随附的完整复现组件会从 README 及其本地文档链接提取命令、自动选择推理/评测/训练目标,并在用户启用 `--run-selected` 时运行所选命令。

查看原文
ai-research-reproduction/scripts/orchestrate_repro.py:303来自代码打开原文件
    for category in ["inference", "evaluation", "training", "other"]:        candidates = [item for item in commands if item.get("category") == category]        if not candidates:            continue        runnable = [            item            for item in candidates            if not item.get("needs_substitution") and command_feasibility(item, repo_path)[0]        ]        if not runnable:            continue        best = max(runnable, key=lambda item: command_score(item, produced_out_dirs))        return {            "selected_goal": category,            "goal_priority": category,            "documented_command": best.get("command", ""),            "command_source": best.get("source", "readme"),            "documented_command_kind": best.get("kind", "run"),            "documented_command_section": best.get("section"),            "documented_command_source_file": best.get("source_file"),            "requires_substitution": bool(best.get("needs_substitution")),            "goal_candidates": goal_candidates,        }
ai-research-reproduction/scripts/orchestrate_repro.py:1107来自代码打开原文件
    parser.add_argument("--user-language", default="en", help="Language tag for human-readable reports.")    parser.add_argument("--run-selected", action="store_true", help="Execute the selected documented command.")    parser.add_argument("--include-analysis-pass", action="store_true", help="Run analyze-project and record its outputs in the stage ledger.")    parser.add_argument(

可选的模型驱动入口限制模型只能选择预先审核的命令 ID,但执行仍发生在本机而非操作系统沙箱;输出、状态和轨迹会持久化。

查看原文
ai-research-reproduction/references/agent-runner.md:10来自说明文档打开原文件
The researcher supplies a repository, a reviewed task JSON, and a model profile.The agent reads files, records a plan, chooses reviewed command IDs, observesruntime results, and requests final verification. It cannot invent command argvor edit source through its tools. Every command cites an exact source snippet;argv changes require a recorded `adaptation`. Read task argv before approving it.This is local execution with credential environment filtering, not an OS sandbox.Approved programs can access the host and network; use only trusted repositoriesuntil an isolated executor is configured. Commands that change scientific
ai-research-reproduction/references/agent-runner.md:125来自说明文档打开原文件
The standard README bundle is accompanied by `agent_state.json` (task/modelidentity, messages, plan, pending calls, results), `trajectory.jsonl` (requests,responses, public reasons, tools and usage), and `_runtime/` process evidence.The verifier requires all `required_commands` to pass their exit/stdout and any
从这里开始 · 工作说明SKILL.md
env-and-assets-bootstrap
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。

文件引用关系图

25 处引用
哪些文件发起引用引用了什么
连线表示真实的文件引用,不是运行顺序。点击节点可高亮相关连线,并查看具体文件和原文位置。虚线表示还有文件需要定位。
文件与检查记录24 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文
  • ai-research-reproduction/_bundled/shared/scripts/lessons_store.py已纳入全文
  • ai-research-reproduction/_bundled/shared/scripts/runtime_runner.py已纳入全文
  • ai-research-reproduction/_bundled/shared/scripts/task_queue.py已纳入全文
  • ai-research-reproduction/scripts/orchestrate_repro.py已纳入全文
  • ai-research-reproduction/scripts/run_agent.py已纳入全文
  • scripts/bootstrap_env.py已纳入全文
  • scripts/bootstrap_env.sh已纳入全文
  • scripts/plan_setup.py已纳入全文
  • scripts/prepare_assets.py已纳入全文
  • references/assets-policy.md已纳入全文
  • references/env-policy.md已纳入全文
  • ai-research-reproduction/references/agent-operating-principles.md已纳入全文
  • ai-research-reproduction/references/agent-runner.md已纳入全文
  • ai-research-reproduction/references/continuous-learning-policy.md已纳入全文
  • ai-research-reproduction/references/deep-learning-experiment-principles.md已纳入全文
  • ai-research-reproduction/references/language-policy.md已纳入全文
  • ai-research-reproduction/references/output-spec.md已纳入全文
  • ai-research-reproduction/references/patch-policy.md已纳入全文
  • ai-research-reproduction/references/research-rigor-principles.md已纳入全文
  • ai-research-reproduction/references/research-safety-principles.md已纳入全文
  • ai-research-reproduction/references/runtime-and-model-adapter.md已纳入全文
  • ai-research-reproduction/SKILL.md已纳入全文
  • agents/openai.yaml已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明
  • agents/openai.yaml配套文件
  • references/assets-policy.md配套文件
  • references/env-policy.md配套文件
  • scripts/bootstrap_env.py脚本
  • scripts/bootstrap_env.sh脚本
  • scripts/plan_setup.py脚本
  • scripts/prepare_assets.py脚本
  • ai-research-reproduction/SKILL.md配套文件
  • ai-research-reproduction/references/agent-operating-principles.md配套文件
  • ai-research-reproduction/references/research-rigor-principles.md配套文件
  • ai-research-reproduction/references/deep-learning-experiment-principles.md配套文件
  • ai-research-reproduction/scripts/orchestrate_repro.py脚本
  • ai-research-reproduction/references/runtime-and-model-adapter.md配套文件
  • ai-research-reproduction/references/agent-runner.md配套文件
  • ai-research-reproduction/scripts/run_agent.py脚本
  • ai-research-reproduction/references/patch-policy.md配套文件
  • ai-research-reproduction/references/output-spec.md配套文件
  • ai-research-reproduction/references/language-policy.md配套文件
  • ai-research-reproduction/references/continuous-learning-policy.md配套文件
  • ai-research-reproduction/_bundled/shared/scripts/lessons_store.py脚本
  • ai-research-reproduction/references/research-safety-principles.md配套文件
  • ai-research-reproduction/_bundled/shared/scripts/runtime_runner.py脚本
  • ai-research-reproduction/_bundled/shared/scripts/task_queue.py脚本

代码和说明中提到的操作

运行命令
scripts/bootstrap_env.py:8来自代码打开原文件
import shutilimport subprocessimport sys
scripts/bootstrap_env.py:27来自代码打开原文件
        return    subprocess.run(command, cwd=cwd, check=True)
scripts/bootstrap_env.sh:1来自代码打开原文件
#!/usr/bin/env bashset -euo pipefail
读取文件
scripts/plan_setup.py:35来自代码打开原文件
        return None    text = path.read_text(encoding="utf-8", errors="replace")    match = re.search(r"^\s*name:\s*([A-Za-z0-9._-]+)\s*$", text, flags=re.MULTILINE)
scripts/prepare_assets.py:31来自代码打开原文件
    if readme:        text = readme.read_text(encoding="utf-8", errors="replace")        for line in text.splitlines():
scripts/prepare_assets.py:56来自代码打开原文件
                continue            text = path.read_text(encoding="utf-8", errors="replace")            if not any(keyword in text.lower() for keyword in KEYWORDS):
安装其他软件包
scripts/plan_setup.py:99来自代码打开原文件
    elif env_file.name == "requirements.txt":        append_venv_flow(setup_commands, f"python -m pip install -r {rel_env_file}")        notes.append("Fell back to a virtualenv plus requirements installation plan.")
scripts/plan_setup.py:102来自代码打开原文件
    elif env_file.name == "pyproject.toml":        append_venv_flow(setup_commands, "python -m pip install -e .")        notes.append("Detected a pyproject-based installation flow.")
scripts/plan_setup.py:105来自代码打开原文件
    elif env_file.name == "setup.py":        append_venv_flow(setup_commands, "python -m pip install -e .")        notes.append("Detected a setup.py-based editable install flow.")
修改文件
scripts/prepare_assets.py:114来自代码打开原文件
    data = prepare_assets(repo, assets_root)    output_json.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")    print(json.dumps(data, indent=2, ensure_ascii=False))
ai-research-reproduction/scripts/orchestrate_repro.py:118来自代码打开原文件
        context_path = Path(handle.name)        handle.write(json.dumps(context, indent=2, ensure_ascii=False))
ai-research-reproduction/scripts/run_agent.py:328来自代码打开原文件
        with (output / "SUMMARY.md").open("a", encoding="utf-8") as handle:            handle.write("\n" + explanation + "\n")
读取密钥或账号配置
ai-research-reproduction/scripts/orchestrate_repro.py:101来自代码打开原文件
    command = [sys.executable, str(script), *args]    child_env = os.environ.copy()    child_env["PYTHONIOENCODING"] = "utf-8"
ai-research-reproduction/scripts/run_agent.py:65来自代码打开原文件
    path = (repo / name).resolve()    if (not path.is_relative_to(repo) or any(p == ".git" or p.startswith(".env") for p in Path(name).parts)            or any(p == ".git" or p.startswith(".env") for p in path.relative_to(repo).parts)):
ai-research-reproduction/scripts/run_agent.py:66来自代码打开原文件
    if (not path.is_relative_to(repo) or any(p == ".git" or p.startswith(".env") for p in Path(name).parts)            or any(p == ".git" or p.startswith(".env") for p in path.relative_to(repo).parts)):        raise ValueError("File path is outside the permitted repository scope")
连接外部网站
ai-research-reproduction/scripts/orchestrate_repro.py:357来自代码打开原文件
        rel = match.group(1)        if rel.startswith(("http://", "https://")):            continue
ai-research-reproduction/scripts/run_agent.py:343来自代码打开原文件
        raise ValueError("All budget limits must be positive integers")    endpoint_identity = fingerprint(profile.get("endpoint") or os.getenv("ANTHROPIC_BASE_URL") or "https://api.anthropic.com")    harness_identity = fingerprint([Path(__file__).read_bytes().replace(b"\r\n", b"\n").hex(), SYSTEM, TOOLS,
ai-research-reproduction/references/runtime-and-model-adapter.md:65来自说明文档打开原文件
  "capabilities": ["text", "tool_calling", "structured_output"],  "endpoint": "https://gateway.example/v1",  "credential_env": "LAB_MODEL_API_KEY",
读取了多少行
5,249
文件校验值(用于核对版本)
014ea02cb83c8891be3bce2d185da8e4dd443bc826b05423e4536efda51ed25f