跳转到正文
报告库
用途分类 / 数据分析

Ai Research Explore Skill 安全审计

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

Rigor Explore compatible skill slug for meaningful and potentially novel deep learning research candidates. Use when the researcher has chosen the task family, dataset, benchmark, evaluation method, provided SOTA references, and wants candidate-only exploration on top of `current_research` with auditable repo understanding, idea gating, fair comparison, and governed experiments written to `explore

第三方安全检查结论

先别安装或运行

本次检查尚未完成,以下仅展示已取得的结果。

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

Campaign 模式会自动执行配置中的评估命令

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

`evaluation_source.command` 会被绑定为命令,并且任何非兼容模式 campaign 都会调用基准评估;这条路径不依赖 `--run-selected-variants`。执行助手接收该字符串并在目标仓库中运行。

为什么需要注意

如果 campaign 文件来自不可信来源或用户只预期规划,命令可读取或修改仓库与当前账户可访问的文件、启动网络进程,或消耗 GPU/CPU。

在提供 campaign 文件且进入非兼容模式时,编排器会无条件调用基准评估;这不受 `--run-selected-variants` 控制。评估字符串随后作为 `--command` 交给执行助手在目标工作树运行。因此,只要 campaign 含有恶意、过时或破坏性的 `evaluation_source.command`,就可能修改文件、消耗算力或访问该进程可用的凭据。用户可要求作者把基准执行也改为独立显式选择,并限制命令、环境变量、网络及写入目录。

scripts/orchestrate_explore.py:341来自代码打开原文件
def bind_evaluation_command_to_variant_spec(    variant_spec: Dict[str, Any],    evaluation_source: Dict[str, Any],) -> Dict[str, Any]:    if variant_spec.get("base_command") or not evaluation_source.get("command"):        return variant_spec    normalized = dict(variant_spec)    normalized["base_command"] = str(evaluation_source["command"]).strip()    normalized["base_command_source"] = "evaluation_source"    if evaluation_source.get("primary_metric") and not normalized.get("primary_metric"):
查看另外 6 个位置
scripts/orchestrate_explore.py:2063来自代码打开原文件
    eval_contract = eval_contract_payload(analysis_data, campaign, metric_policy)    baseline_gate: Dict[str, Any] = {"decision": "not-applicable", "reason": "Baseline gate was not evaluated."}    baseline_payload: Dict[str, Any] = {}    if not compatibility_mode:        baseline_gate, baseline_payload, _baseline_runtime = run_baseline_evaluation(            train_execute_script=train_execute_script,            run_execute_script=run_execute_script,            repo_path=workspace_repo_path,            current_research=current_research,            evaluation_source=campaign["evaluation_source"],            baseline_gate_cfg=campaign["baseline_gate"],            runtime_root=runtime_root,            model_profile_json=args.model_profile_json,            required_model_capabilities=args.require_model_capability,            gpu_monitor_enabled=not args.no_gpu_monitor,        )        baseline_gate = compare_baseline_to_sota(
scripts/orchestrate_explore.py:1067来自代码打开原文件
    else:        run_args = [                "--repo",                str(repo_path),                "--command",                command,                "--timeout",                str(int(baseline_gate_cfg.get("timeout") or 60)),                "--runtime-root",                str(runtime_root),            ]        payload = run_json(run_execute_script, add_model_profile_args(run_args, model_profile_json, required_model_capabilities))        payload.setdefault("stop_reason", "command_completed" if payload.get("status") == "success" else "command_checked")    runtime_seconds = round(time.perf_counter() - start, 3)
scripts/orchestrate_explore.py:1988来自代码打开原文件
    parser.add_argument("--include-setup-pass", action="store_true", help="Include env-and-assets-bootstrap in the planned chain.")    parser.add_argument("--run-selected-variants", action="store_true", help="Execute a small number of exploratory variants through the trusted execution helpers.")    parser.add_argument("--max-executed-variants", type=int, default=None, help="Maximum number of exploratory variants to execute when execution is enabled.")    parser.add_argument("--variant-timeout", type=int, default=None, help="Timeout in seconds for each executed exploratory variant.")    args = parser.parse_args()
scripts/orchestrate_explore.py:345来自代码打开原文件
) -> Dict[str, Any]:    if variant_spec.get("base_command") or not evaluation_source.get("command"):        return variant_spec    normalized = dict(variant_spec)    normalized["base_command"] = str(evaluation_source["command"]).strip()    normalized["base_command_source"] = "evaluation_source"    if evaluation_source.get("primary_metric") and not normalized.get("primary_metric"):
scripts/orchestrate_explore.py:2065来自代码打开原文件
    baseline_payload: Dict[str, Any] = {}    if not compatibility_mode:        baseline_gate, baseline_payload, _baseline_runtime = run_baseline_evaluation(            train_execute_script=train_execute_script,            run_execute_script=run_execute_script,            repo_path=workspace_repo_path,            current_research=current_research,            evaluation_source=campaign["evaluation_source"],            baseline_gate_cfg=campaign["baseline_gate"],            runtime_root=runtime_root,            model_profile_json=args.model_profile_json,            required_model_capabilities=args.require_model_capability,            gpu_monitor_enabled=not args.no_gpu_monitor,        )        baseline_gate = compare_baseline_to_sota(
minimal-run-and-audit/scripts/run_command.py:306来自代码打开原文件
        parser.error(f"model profile is missing required capabilities: {', '.join(missing)}")    execution = execute_command(        repo,        args.command,        args.timeout,        args.shell_mode,        runtime_root,        model_adapter,        args.monitor_gpu,    )    metric_data = parse_metrics(combine_logs([execution.get("stdout", ""), execution.get("stderr", "")]))
高风险

“可行性检查”会导入并执行仓库中的 Python 顶层代码

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

运行时 smoke 检查使用 `exec_module` 加载候选文件。Python 导入并非静态语法检查;文件的顶层语句会执行。最终可行性检查无论是否实际运行候选变体都会调用这些探针。

为什么需要注意

恶意或仅有副作用的研究代码可在检查阶段执行文件修改、网络调用、环境变量读取或昂贵初始化,而用户可能只认为这是分析。静默处理输出不会阻止这些副作用。

该检查不是纯静态分析:它把目标仓库加入 Python 搜索路径,并通过 `exec_module` 加载候选文件,这会执行模块顶层代码及其导入。候选来自对仓库文件名的启发式排名,且可行性阶段在候选运行前也会调用这些探针。因此,被选中的仓库文件若含导入时副作用,可能读写文件、启动进程或使用现有凭据。用户可要求仅用 AST/编译检查,或在无网络、最小环境变量和只读仓库的隔离进程中运行导入探针。

scripts/passes/execution_feasibility.py:247来自代码打开原文件
def import_probe_check(repo_path: Path, target_location_map: Sequence[Dict[str, Any]]) -> Dict[str, Any]:    targets = safe_runtime_targets(target_location_map)    if not targets:        return {            "name": "import-probe",            "status": "passed",            "passed": [],            "blockers": [],            "notes": ["no-safe-import-targets"],        }    passed: List[str] = []    blockers: List[str] = []    sys_path_added = False    repo_root = str(repo_path)    if repo_root not in sys.path:        sys.path.insert(0, repo_root)        sys_path_added = True    try:        for item in targets:            rel = str(item.get("file") or "")            module_path = repo_path / rel            if not module_path.exists():                blockers.append(f"missing:{rel}")                continue            module_name = f"_research_explore_smoke_{hashlib.sha1(rel.encode('utf-8')).hexdigest()[:12]}"            try:                spec = importlib.util.spec_from_file_location(module_name, module_path)                if spec is None or spec.loader is None:                    blockers.append(f"import-spec:{rel}")                    continue                module = importlib.util.module_from_spec(spec)                exec_module_silenced(spec, module)                passed.append(rel)            except ModuleNotFoundError as exc:                blockers.append(f"missing-dependency:{rel}:{exc.name or 'unknown'}")            except Exception as exc:  # pragma: no cover - defensive, exercised via repo fixtures                blockers.append(f"import-error:{rel}:{exc.__class__.__name__}")            finally:
查看另外 6 个位置
scripts/passes/execution_feasibility.py:303来自代码打开原文件
def constructor_probe_check(repo_path: Path, target_location_map: Sequence[Dict[str, Any]]) -> Dict[str, Any]:    targets = safe_runtime_targets(target_location_map)    if not targets:        return {            "name": "constructor-probe",            "status": "passed",            "passed": [],            "blockers": [],            "notes": ["constructor-probe-not-applicable"],        }    passed: List[str] = []    blockers: List[str] = []    soft_notes: List[str] = []    sys_path_added = False    repo_root = str(repo_path)    if repo_root not in sys.path:        sys.path.insert(0, repo_root)        sys_path_added = True    try:        for item in targets:            rel = str(item.get("file") or "")            target_symbol = str(item.get("target_symbol") or "")            symbol_root = target_symbol            if ":" in symbol_root:                symbol_root = symbol_root.split(":", 1)[1]            symbol_root = symbol_root.split(".", 1)[0].strip()            if not symbol_root or symbol_root == "unspecified-symbol":                soft_notes.append(f"unresolved-target-symbol:{rel}")                continue            module_path = repo_path / rel            module_name = f"_research_explore_ctor_{hashlib.sha1(rel.encode('utf-8')).hexdigest()[:12]}"            try:                spec = importlib.util.spec_from_file_location(module_name, module_path)                if spec is None or spec.loader is None:                    blockers.append(f"constructor-spec:{rel}")                    continue                module = importlib.util.module_from_spec(spec)                exec_module_silenced(spec, module)                if hasattr(module, symbol_root):
scripts/orchestrate_explore.py:2337来自代码打开原文件
    feasibility_bundle = run_execution_feasibility_pass(        analysis_output_dir=analysis_output_dir,        repo_path=workspace_repo_path,        campaign=campaign,        analysis_data=analysis_data,        variant_matrix=variant_matrix,        source_mapping=source_mapping,        executed_runs=executed_runs,    )    helper_stage_trace.append(build_stage_trace_entry("smoke-validation", "ai-research-explore/passes/execution_feasibility.py", f"Smoke report status: `{feasibility_bundle.get('smoke_report', {}).get('status', 'unknown')}`."))
scripts/passes/execution_feasibility.py:515来自代码打开原文件
    ]    runtime_checks = [        import_probe_check(repo_path, source_mapping.get("target_location_map", [])),        constructor_probe_check(repo_path, source_mapping.get("target_location_map", [])),        short_run_check(executed_runs, variant_matrix),    ]    static_smoke = summarize_smoke(
explore-code/scripts/plan_code_changes.py:95来自代码打开原文件
def collect_candidate_edit_targets(repo: Path, current_research: str, task_family: str) -> List[str]:    tokens = focus_tokens(current_research, task_family)    scored: List[tuple[int, str]] = []    for path in repo.rglob("*"):        if path.is_dir():            continue        if any(part in SKIP_PARTS for part in path.relative_to(repo).parts):            continue        if path.suffix.lower() not in CODE_SUFFIXES:            continue        rel = path.relative_to(repo).as_posix()        score = score_path(rel, task_family, tokens)        if score:            scored.append((score, rel))    scored.sort(key=lambda item: (-item[0], item[1]))    return [rel for _, rel in scored[:8]]
scripts/passes/execution_feasibility.py:259来自代码打开原文件
    blockers: List[str] = []    sys_path_added = False    repo_root = str(repo_path)    if repo_root not in sys.path:        sys.path.insert(0, repo_root)        sys_path_added = True    try:        for item in targets:            rel = str(item.get("file") or "")            module_path = repo_path / rel            if not module_path.exists():                blockers.append(f"missing:{rel}")                continue            module_name = f"_research_explore_smoke_{hashlib.sha1(rel.encode('utf-8')).hexdigest()[:12]}"            try:                spec = importlib.util.spec_from_file_location(module_name, module_path)                if spec is None or spec.loader is None:                    blockers.append(f"import-spec:{rel}")                    continue                module = importlib.util.module_from_spec(spec)                exec_module_silenced(spec, module)                passed.append(rel)            except ModuleNotFoundError as exc:
scripts/orchestrate_explore.py:2161来自代码打开原文件
    code_plan = initial_code_plan    feasibility_bundle = run_execution_feasibility_pass(        analysis_output_dir=analysis_output_dir,        repo_path=workspace_repo_path,        campaign=campaign,        analysis_data=analysis_data,        variant_matrix=variant_matrix,        source_mapping=source_mapping,        executed_runs=[],    )    helper_stage_trace.append(build_stage_trace_entry("execution-feasibility", "ai-research-explore/passes/execution_feasibility.py", f"Short-run feasibility: `{feasibility_bundle.get('feasibility', {}).get('short_run_feasibility', 'unknown')}`."))
高风险

可选模型运行器在本机执行命令,但不是系统沙箱

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

文档说明模型读取 README、选择步骤并观察执行结果,同时明确声明这是本机执行而非系统沙箱。任务文件虽预先限制命令,获准命令仍继承启动进程的本机权限。

为什么需要注意

若预审命令、依赖或仓库脚本不可信,运行时可能读取或修改该账户可访问的文件、使用环境中的凭据,或启动网络和子进程;记录层面的命令白名单并不提供操作系统级隔离。

这是可选的模型执行入口,但其活动命令在本机运行,文档明确说它不是系统沙箱。虽然命令和验收条件由预审任务文件限定、模型不能修改,获准命令仍可能按启动进程的本机权限访问文件或消耗计算资源。用户应要求作者列出命令白名单,并用低权限账户、容器或隔离工作区运行。

ai-research-reproduction/references/agent-runner.md:167来自说明文档打开原文件
这是可选的模型执行入口。任务文件预先限定可运行命令及验收条件;模型读取原始README、选择步骤、观察执行结果,最终由独立验证器决定是否成功。原有确定性入口继续可用。恢复时使用相同参数并增加 `--resume`,状态和预算跨会话累计。这是本机执行,不是系统沙箱;P1 不支持自主修改科研代码,也不证明论文指标复现。正常暂停会保留已执行命令和证据,不再显示为“被阻塞”,也不声称整体验收完成。`agent.controller_status` 表示控制状态,`agent.task_outcome` 表示任务结果。命令可增加上述 `verification` 验收产物与 JSON 数值指标;退出码为 0 但产物缺失、指标超出容差,仍不能通过最终验收。验收条件由任务文件预先审核,模型不能修改。这些检查不单独保证产物新鲜度或科研可比性;需要时使用全新目标工作目录。
查看另外 1 个位置
ai-research-reproduction/references/agent-runner.md:173来自说明文档打开原文件
`agent.controller_status` 表示控制状态,`agent.task_outcome` 表示任务结果。命令可增加上述 `verification` 验收产物与 JSON 数值指标;退出码为 0 但产物缺失、指标超出容差,仍不能通过最终验收。验收条件由任务文件预先审核,模型不能修改。这些检查不单独保证产物新鲜度或科研可比性;需要时使用全新目标工作目录。
中风险

环境引导程序会执行仓库控制的依赖和安装脚本

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

引导程序根据仓库顶层的 `environment.yml`、`requirements.txt`、`pyproject.toml` 或 `setup.py` 自动选择安装流程。它会执行 conda 环境创建、pip requirements 安装或 `pip install -e .`;这些流程可能运行仓库的构建后端或下载并执行第三方包代码。

为什么需要注意

恶意仓库或被投毒的依赖可在安装阶段执行代码、修改新环境或用户缓存、访问网络,并读取引导进程可见的文件和凭据。虚拟环境只隔离包,不是安全沙箱。

该风险成立,但仅在用户实际运行环境引导程序且未使用 `--dry-run` 时发生。程序会根据目标仓库中的环境文件执行 conda/mamba 创建和 pip 安装;对 `pyproject.toml` 或 `setup.py` 还会执行可触发仓库构建后端的可编辑安装。因此,不可信仓库可能在安装阶段执行代码或引入恶意依赖。用户可要求作者增加安装前确认、锁定依赖,并在隔离环境中运行。

env-and-assets-bootstrap/SKILL.md:51来自说明文档打开原文件
## NotesUse `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.
查看另外 3 个位置
env-and-assets-bootstrap/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)
env-and-assets-bootstrap/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,        )
env-and-assets-bootstrap/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)
中风险

任务队列的 CPU、GPU 和内存预算只是声明式准入,不限制进程实际资源

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

队列按任务声明的 `resource_request` 判断能否启动,但状态明确标为 `request-based-admission-not-os-enforcement`。随后任务命令作为普通宿主子进程提交执行,未显示 cgroup、容器、作业对象或 GPU 配额限制。

为什么需要注意

任务若低报资源需求或实际用量激增,仍可耗尽主机内存、占满 GPU 或挤压其他工作负载;多个并发任务会放大影响。超时只能限制持续时间,不能防止短时间资源耗尽。

该风险成立。队列只比较任务自行声明的资源请求与调度预算,状态还明确说明这是“基于请求的准入,而非操作系统强制”。获准后,命令通过普通宿主 `subprocess.Popen` 启动。因此,低报资源需求或运行中需求突增的任务仍可能耗尽 CPU、内存或 GPU,影响用户的其他进程。用户可限制并发和超时,并要求作者提供容器、cgroup、Windows Job Object 或等效的硬资源限制。

ai-research-reproduction/_bundled/shared/scripts/task_queue.py:193来自代码打开原文件
def _normalize_resources(value: Any) -> Dict[str, int]:    resources = value if isinstance(value, dict) else {}    result = {        "cpu_slots": int(resources.get("cpu_slots", 1)),        "gpu_slots": int(resources.get("gpu_slots", 0)),        "memory_mib": int(resources.get("memory_mib", 0)),    }    if result["cpu_slots"] < 1 or result["gpu_slots"] < 0 or result["memory_mib"] < 0:        raise ValueError("resource_request requires cpu_slots >= 1 and non-negative gpu_slots/memory_mib")    return result
查看另外 6 个位置
ai-research-reproduction/_bundled/shared/scripts/task_queue.py:416来自代码打开原文件
def _fits(request: Dict[str, int], available: Dict[str, int]) -> bool:    return all(request[key] <= available[key] for key in ("cpu_slots", "gpu_slots", "memory_mib"))
ai-research-reproduction/_bundled/shared/scripts/task_queue.py:517来自代码打开原文件
        scheduler_id = lease.lease_id        store.state["scheduler"] = {            "status": "running",            "scheduler_id": scheduler_id,            "pid": os.getpid(),            "started_at": utc_now(),            "heartbeat_at": utc_now(),            "max_workers": max_workers,            "resource_budget": totals,            "resource_semantics": "request-based-admission-not-os-enforcement",            "fail_fast": fail_fast,        }
ai-research-reproduction/_bundled/shared/scripts/task_queue.py:619来自代码打开原文件
                            continue                        for key in available:                            available[key] -= request[key]                        job["runtime_run_id"] = new_run_id()                        store.transition(job, "running", started_at=utc_now())                        futures[executor.submit(_execute_job, dict(job))] = job                        peak_running_jobs = max(peak_running_jobs, len(futures))                        launched = True
ai-research-reproduction/_bundled/shared/scripts/task_queue.py:508来自代码打开原文件
        for job in store.jobs():            if job["status"] == "queued" and not _fits(job["resource_request"], totals):                store.transition(                    job,                    "blocked",                    "resource-request-exceeds-budget",                    finished_at=utc_now(),                    scheduler_budget=totals,                )
ai-research-reproduction/_bundled/shared/scripts/task_queue.py:518来自代码打开原文件
        scheduler_id = lease.lease_id        store.state["scheduler"] = {            "status": "running",            "scheduler_id": scheduler_id,            "pid": os.getpid(),            "started_at": utc_now(),            "heartbeat_at": utc_now(),            "max_workers": max_workers,            "resource_budget": totals,            "resource_semantics": "request-based-admission-not-os-enforcement",            "fail_fast": fail_fast,        }
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:
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 3 项风险
中风险

运行信息默认持久化到用户主目录,并会影响以后对其他项目的建议

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

经验存储默认开启。复现运行处于 partial 或 blocked 时,会把阻塞摘要、文档命令和仓库指纹追加到 `~/.rigorpilot/lessons.jsonl`;探索技能随后被要求参考由这些记录生成的 `PERSONAL_RIGOR.md`。虽然有凭据关键词过滤,但注释明确说明它不保证拦截所有秘密。

为什么需要注意

研究项目名称、路径片段、失败原因和命令参数可能在预期输出目录之外长期保留,在共享账户或备份中暴露,并影响以后不相关项目的决策。未被正则识别的秘密格式也可能写入该文件。

该风险成立,但范围有限:仅在执行被请求且结果为 partial/blocked(或成功解决了既有失败)时记录。记录功能默认开启,并在用户主目录下追加阻塞摘要、命令细节和仓库指纹;探索技能被要求在该覆盖文件存在时参考它,因此旧记录可能影响以后项目的建议。过滤器只是基于关键词和常见格式,源码明确称其不保证拦截秘密。用户可设置 `RIGORPILOT_LESSONS=0`,并要求作者在写入前展示或确认内容。

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
查看另外 5 个位置
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"def lessons_path() -> Path:    return lessons_home() / "lessons.jsonl"def overlay_path() -> Path:    return lessons_home() / "PERSONAL_RIGOR.md"
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/_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/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":
SKILL.md:118来自说明文档打开原文件
  details.- Load `../ai-research-reproduction/references/research-thinking-loop.md` before proposing or ranking candidate changes; it is the required greedy observe-ground-design-compare cycle.- Load `../ai-research-reproduction/references/research-rigor-principles.md` before making novelty, contribution, SOTA, or comparability statements.- Consult `~/.rigorpilot/PERSONAL_RIGOR.md` if present, under `../ai-research-reproduction/references/continuous-learning-policy.md` (advisory only; core wins).- Load `../ai-research-reproduction/references/deep-learning-experiment-principles.md` when training,
中风险

默认会解析仓库中发现的 URL 并尝试网络访问

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

仓库定位符提取默认启用,所有提取结果随后交给 GitHub、arXiv、DOI 或通用 URL 提供商解析。提供商结果明确标记为 `network-fetched`。

为什么需要注意

打开不可信仓库可能使本机访问仓库作者植入的外部或内部地址,暴露访问时间、源 IP 和被请求的 URL,并可能触达本机可见但公网不可见的服务。所示证据未证明凭据会被发送。

仓库本地定位符提取默认开启,提取结果与其他种子一起逐条交给解析器;识别为 GitHub、arXiv、DOI 或普通 URL 后,会调用相应提供商。提供商成功结果明确记录为 `network-fetched`。因此,只要仓库文本含可识别 URL,运行技能可能联系该地址或相关公共 API,暴露请求时间、来源 IP,并可能访问内部 URL。用户可关闭 `enable_repo_local_extraction`、禁用网络,或要求域名允许列表和内网地址拦截。

scripts/passes/lookup_sources.py:324来自代码打开原文件
) -> Dict[str, Any]:    sources_dir.mkdir(parents=True, exist_ok=True)    output_dir = analysis_output_dir or (sources_dir.parent / "analysis_outputs")    output_dir.mkdir(parents=True, exist_ok=True)    lookup_config = campaign.get("research_lookup", {}) if isinstance(campaign.get("research_lookup"), dict) else {}    seed_records = collect_seed_records(campaign, analysis_data, code_plan)    repo_local_seeds = extract_repo_local_seeds(repo_path) if lookup_config.get("enable_repo_local_extraction", True) else []    raw_records = dedupe_preserving_order([*seed_records, *repo_local_seeds])    resolved_records = [resolve_provider_record(raw, lookup_config) for raw in raw_records]    stored_bundle = store_records(sources_dir, resolved_records)    records = stored_bundle["records"]
查看另外 5 个位置
scripts/passes/lookup_sources.py:235来自代码打开原文件
            break    if locator_info:        optional_record = resolve_optional_record(locator_info, lookup_config)        resolved = optional_record or {}        if not resolved:            provider_type = locator_info.get("provider_type")            if provider_type == "github":                resolved = resolve_github_record(locator_info)            elif provider_type == "arxiv":                resolved = resolve_arxiv_record(locator_info)            elif provider_type == "doi":                resolved = resolve_doi_record(locator_info)            elif provider_type == "url":                resolved = resolve_url_record(locator_info)            else:
scripts/lookup/normalizers.py:139来自代码打开原文件
def parse_generic_url(locator: str) -> Optional[Dict[str, Any]]:    text = canonicalize_url(locator)    if not HTTP_URL_RE.match(text):        return None    parsed = urllib.parse.urlsplit(text)    return {        "provider_type": "url",        "source_type": "web",        "locator_type": "url",        "raw_locator": str(locator or "").strip(),        "normalized_id": f"url:{text}",        "identifier": text,        "host": parsed.netloc.lower(),        "url": text,    }
scripts/lookup/providers/github_provider.py:69来自代码打开原文件
        readme_meta = _fetch_readme(owner, repo)        return {            **record,            "title": str(payload.get("full_name") or record["title"]),            "summary": str(payload.get("description") or ""),            "url": str(payload.get("html_url") or record["url"]),            "repo_full_name": str(payload.get("full_name") or repo_full_name),            "parse_status": "resolved",            "fetch_status": "network-fetched",            "evidence_class": "external_provider",            "provider_metadata": {
scripts/lookup/repo_extractors.py:84来自代码打开原文件
        locators = _extract_locators(text)        relative_path = path.relative_to(repo_root).as_posix()        for locator in locators:            if locator in seen_locators:                continue            seen_locators.add(locator)            seeds.append(                {                    "kind": _classify_kind(locator),                    "title": locator,                    "summary": f"Repo-local extracted source from `{relative_path}`.",                    "query": locator,                    "source_url": locator if locator.lower().startswith("http") else "",                    "source_repo": "",                    "source_file": "",                    "source_symbol": "",                    "origin": "repo_local_extracted",                    "raw_locator": locator,                    "extracted_from_repo_paths": [relative_path],                }
scripts/lookup/providers/github_provider.py:73来自代码打开原文件
            "summary": str(payload.get("description") or ""),            "url": str(payload.get("html_url") or record["url"]),            "repo_full_name": str(payload.get("full_name") or repo_full_name),            "parse_status": "resolved",            "fetch_status": "network-fetched",            "evidence_class": "external_provider",            "provider_metadata": {
中风险

模型请求和持久化轨迹可能包含私有研究或仓库内容

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

运行器会通过 HTTP 向所选模型服务发送请求,并在本地保存消息、请求、响应、工具活动和结果。文档自身警告不要在未审查时发布私有仓库轨迹。

为什么需要注意

启用远程模型时,提交给模型的任务或 README 内容会离开本机;本地轨迹也形成包含研究上下文和操作记录的敏感副本。共享输出目录或发布轨迹可能进一步披露这些信息。

文档支持存在模型 HTTP 请求和详细的本地持久化记录:状态保存消息和结果,轨迹保存请求、响应及工具活动。它还明确警告私有仓库轨迹在发布前必须审查。因此,若提示、工具输出或响应包含私有代码或研究数据,它们可能进入模型请求或本地轨迹。用户应确认模型服务、保留政策和轨迹目录,并限制敏感文件进入上下文及对外发布。

ai-research-reproduction/references/agent-runner.md:115来自说明文档打开原文件
Optional `parameters` are transmitted, not just recorded: the current transportsupports `temperature` or `top_p` (not both), and `stop_sequences`. Unsupportedfields are rejected before HTTP; `max_tokens` remains controlled by the taskbudget. Leave sampling settings absent unless the selected model supports them:the [Messages API](https://platform.claude.com/docs/en/api/messages/create)deprecates these controls for newer models. A local protocol test is not acompatibility claim for every model or gateway.
查看另外 2 个位置
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
ai-research-reproduction/references/agent-runner.md:161来自说明文档打开原文件
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.
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。发现 3 项风险
低风险

实验初始化会在仓库父目录创建隐藏工作树并新增 Git 分支

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

工作树位置固定在 Git 根目录的父目录下;若分支不存在,编排器使用 `git worktree add -b` 创建分支和完整工作树。这发生在主要扫描和规划之前。

为什么需要注意

磁盘会留下新的工作树、分支和隐藏目录;大型仓库可能占用明显空间,并影响后续分支管理或清理流程。

编排器把工作树放到 Git 根目录父目录下的隐藏目录;若实验分支不存在,会执行 `git worktree add -b`,从当前 HEAD 新建分支和完整工作树。这属于技能预期的隔离机制,但仍会在用户指定输出目录之外创建持久文件和 Git 引用,并可能占用大量磁盘。用户可事先确认父目录可写、工作树位置与清理策略,或要求只使用用户指定的现有隔离分支。

scripts/orchestrate_explore.py:127来自代码打开原文件
def experiment_worktree_root(git_root: Path, experiment_branch: str) -> Path:    base_dir = git_root.parent / f".{git_root.name}-explore-worktrees" / slugify(experiment_branch)    return base_dir / git_root.name
查看另外 2 个位置
scripts/orchestrate_explore.py:222来自代码打开原文件
    worktree_root = experiment_worktree_root(git_root, experiment_branch)    if worktree_root.exists():        worktree_info = validate_existing_worktree(worktree_root, experiment_branch)    else:        worktree_root.parent.mkdir(parents=True, exist_ok=True)        if branch_exists:            run_text(["git", "worktree", "add", str(worktree_root), experiment_branch], cwd=git_root)        else:            run_text(["git", "worktree", "add", "-b", experiment_branch, str(worktree_root), head_sha], cwd=git_root)            created_branch = True        branch_sha = run_text(["git", "rev-parse", "--verify", branch_ref], cwd=git_root)        worktree_info = validate_existing_worktree(worktree_root, experiment_branch)
scripts/orchestrate_explore.py:2019来自代码打开原文件
    durable_current_research = validate_current_research(repo_path, current_research)    experiment_branch = choose_experiment_branch(current_research, args.experiment_branch)    workspace_info = ensure_experiment_workspace(repo_path, experiment_branch)    context_id = build_context_id(current_research, experiment_branch)    workspace_repo_path = Path(workspace_info["workspace_root"]).resolve()    helper_stage_trace = [        build_stage_trace_entry("validate-current-research", "ai-research-explore/validate_current_research", f"Validated durable current research `{current_research}` as `{durable_current_research['kind']}`."),        build_stage_trace_entry("workspace", "ai-research-explore/ensure_experiment_workspace", f"{'Created' if workspace_info['created_branch'] else 'Validated'} isolated {workspace_info['mode']} for branch `{experiment_branch}` at `{workspace_info['workspace_root']}`."),    ]    scan_data = run_json(scan_script, ["--repo", str(workspace_repo_path), "--json"])    helper_stage_trace.append(build_stage_trace_entry("repo-scan", "repo-intake-and-plan/scripts/scan_repo.py", f"Scanned repository structure and README signals for `{repo_path.name}`."))
低风险

可选参数会在源 README 旁写入持久文件

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

启用 source-adjacent-readme 后,工具会在原 README 所在目录创建 RIGORPILOT_README.md,而不只写入专用输出目录。文档称冲突文件不会被覆盖。

为什么需要注意

源仓库会多出一个可被 Git 检测、误提交或被其他工具消费的文件;重复运行还可能刷新工具拥有且未改变的副本。

这段代码的正常用途

写入源 README 同目录的行为属显式可选功能,只有添加 `--source-adjacent-readme` 才会发生。该文件是保留原始内容的注释副本;普通证据仍保留在输出目录,而且无关文件、已编辑文件及链接冲突不会被覆盖,原 README 保持不变。用户若不希望源目录新增文件,不启用该参数即可,并可要求确认报告中的写入路径。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
ai-research-reproduction/references/output-spec.md:176来自说明文档打开原文件
## Optional source-adjacent READMEAdd `--source-adjacent-readme` to `orchestrate_repro.py` or `run_agent.py` toalso create `RIGORPILOT_README.md` in the original README's directory. Keepthe standard `repro_outputs/ANNOTATED_README.md` and its evidence files.
查看另外 1 个位置
ai-research-reproduction/references/output-spec.md:189来自说明文档打开原文件
The bundle retains `readme_delivery.json` to identify its generated copy.Repeating with the same source and output may refresh an unchanged owned copy.An unrelated or edited file, symlink, hard link, or conflicting receipt is notoverwritten. Keep the receipt with the evidence; do not use it to claim thatsource code or external media were verified. The original README remains intact.
低风险

失败和后续解决的运行默认会被记录为长期经验

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

技能说明称失败及后来解决的运行会由 lessons_store.py 自动记录,除非设置 RIGORPILOT_LESSONS=0。

为什么需要注意

这会在当前活动输出之外留下额外的持久记录,可能包含项目故障或研究过程信息,并影响以后使用这些经验的运行。提供的片段没有展示存储内容或清理期限。

这段证据能说明什么

入口文档确实说明失败及后来解决的运行默认会由脚本记录为 lessons,并提供环境变量关闭;但所给源码没有展示记录的内容、存储位置、保留期限或是否会发送到外部,因此无法确认“长期经验”的具体隐私或账户影响。用户可在运行前设置 `RIGORPILOT_LESSONS=0`,并要求作者披露该脚本记录哪些字段、保存在哪里以及如何清除。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
ai-research-reproduction/SKILL.md:123来自说明文档打开原文件
- Load `references/deep-learning-experiment-principles.md` when dataset, split, metric, checkpoint, training, or evaluation details matter.- Consult `~/.rigorpilot/PERSONAL_RIGOR.md` if present, under `references/continuous-learning-policy.md` (advisory only; core wins).- Failed and later-resolved runs are auto-recorded as lessons via `shared/scripts/lessons_store.py` (`RIGORPILOT_LESSONS=0` disables).- Load `references/research-safety-principles.md` before protocol-sensitive
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 1 项风险
中风险

通用来源解析可请求任意 HTTP(S) 地址,未显示内网地址限制或响应大小限制

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

来源提取会从仓库文本收集 URL,而通用 URL 提供器对规范化后的地址直接调用 `urlopen`。可见代码没有主机白名单,也没有拒绝回环、链路本地或私有网段;`response.read()` 也没有字节上限。

为什么需要注意

恶意仓库或活动配置中的 URL 可能使运行机器请求内部管理端点、云实例元数据服务或本机服务,形成服务器端请求伪造。大型响应还可能造成内存压力。提供的代码未证明响应会被外传,但内部响应会进入本地研究记录处理链。

该风险成立,条件是来源查询处理了仓库文件中提取的 URL。提取器收集任意 HTTP(S) URL,通用提供器随后直接获取该 URL;可见传输代码没有主机或 IP 范围检查,并使用无参数的 `response.read()`。恶意仓库可据此诱导访问本机、内网或云元数据地址,或返回很大的响应以消耗内存。用户可要求仅允许批准的公网域名、阻止私有/回环/链路本地地址并限制响应字节数。

scripts/lookup/repo_extractors.py:51来自代码打开原文件
def _extract_locators(text: str) -> List[str]:    found: List[str] = []    for url in extract_urls(text):        if url not in found:            found.append(url)    for pattern in (ARXIV_ID_RE, DOI_RE):        for match in pattern.finditer(text):            raw = match.group(0).strip()            if raw and raw not in found:                found.append(raw)    return found
查看另外 4 个位置
scripts/lookup/providers/url_provider.py:13来自代码打开原文件
def resolve_url_record(locator_info: Dict[str, Any]) -> Dict[str, Any]:    url = canonicalize_url(locator_info.get("url") or locator_info.get("raw_locator") or "")    parsed = urllib.parse.urlsplit(url) if url else None    record = {        "provider_type": "url",        "source_type": "web",        "locator_type": locator_info.get("locator_type", "url"),        "raw_locator": locator_info.get("raw_locator", ""),        "normalized_id": locator_info.get("normalized_id", f"url:{url}" if url else ""),        "title": url,        "url": url,        "authors": [],        "year": None,        "venue": parsed.netloc if parsed else "",        "repo_full_name": "",        "doi": "",        "arxiv_id": "",        "parse_status": "parsed-only",        "fetch_status": "parsed-only",        "evidence_class": "parsed_locator",        "provider_metadata": {"resolved_via": "url", "host": parsed.netloc.lower() if parsed else ""},    }    if not url:        return record    try:        payload = http_get(url, accept="text/html, application/xhtml+xml;q=0.9")        parser = MetadataHTMLParser()        parser.feed(payload.decode("utf-8", errors="ignore"))        canonical = parser.canonical_url() or url
scripts/lookup/providers/base.py:60来自代码打开原文件
def http_get(url: str, *, accept: str = "application/json, text/plain;q=0.9, text/html;q=0.8") -> bytes:    request = urllib.request.Request(        url,        headers={            "User-Agent": USER_AGENT,            "Accept": accept,        },    )    with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS) as response:        return response.read()
scripts/lookup/normalizers.py:64来自代码打开原文件
def extract_urls(text: str) -> list[str]:    found: list[str] = []    for match in URL_RE.finditer(str(text or "")):        url = match.group(0).rstrip(".,);]")        if url not in found:            found.append(url)    return found
scripts/lookup/providers/url_provider.py:35来自代码打开原文件
    }    if not url:        return record    try:        payload = http_get(url, accept="text/html, application/xhtml+xml;q=0.9")        parser = MetadataHTMLParser()        parser.feed(payload.decode("utf-8", errors="ignore"))        canonical = parser.canonical_url() or url
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。未发现风险
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。发现 2 项风险
中风险

缺少主指标时,运行排名可能使用日志中最后出现的任意非损失指标

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

训练日志解析器把最后出现的非 loss/error 指标指定为 `best_metric`,并不比较哪个数值实际最佳。若主指标缺失,排名逻辑明确回退到该值。

为什么需要注意

包含多个指标或指标顺序变化的日志可能使错误指标决定“最佳”候选,误导后续算力投入、研究方向或 SOTA 比较。

训练日志解析不会计算跨步骤的真正最佳值:它先排除名称包含 loss/error 等词的指标,然后选择字典中最后写入的非损失指标;若全是损失类,也选择最后一个或最后的验证损失。当配置的主指标不可用时,排名函数会回退到这个 `best_metric`。这可能让无关指标影响候选排序和后续试验建议。用户可要求主指标必须精确匹配,否则将该运行标为不可排名,并明确校验指标方向和聚合方式。

run-train/scripts/run_training.py:97来自代码打开原文件
    priority_names = [        name for name in observed_metrics        if not any(token in name.lower() for token in {"loss", "error", "rmse", "mae", "wer", "cer"})    ]    if priority_names:        chosen = priority_names[-1]        best_metric = {"name": chosen, "value": observed_metrics[chosen]}    elif observed_metrics:        validation_losses = [name for name in observed_metrics if name.lower() in {"val_loss", "validation_loss", "valid_loss"}]        chosen = validation_losses[-1] if validation_losses else list(observed_metrics)[-1]        best_metric = {"name": chosen, "value": observed_metrics[chosen]}
查看另外 3 个位置
scripts/orchestrate_explore.py:693来自代码打开原文件
def metric_payload_for_policy(item: Dict[str, Any], primary_metric: Optional[str]) -> Tuple[Optional[float], Optional[str], bool]:    observed_metrics = item.get("observed_metrics", {})    if primary_metric and isinstance(observed_metrics, dict) and primary_metric in observed_metrics:        return safe_float(observed_metrics[primary_metric]), primary_metric, True    best_metric = item.get("best_metric")    if primary_metric and isinstance(best_metric, dict) and best_metric.get("name") == primary_metric:        return safe_float(best_metric.get("value")), primary_metric, True    fallback_value, fallback_name = default_metric_payload(item)    return fallback_value, fallback_name, False
scripts/orchestrate_explore.py:736来自代码打开原文件
    def sort_key(item: Dict[str, Any]) -> Tuple[int, int, float, float]:        ranking_metric = item.get("ranking_metric")        ranking_value = ranking_metric.get("value") if isinstance(ranking_metric, dict) else None        fallback_value, _fallback_name = default_metric_payload(item)        return (            status_rank.get(item.get("status", "not_run"), 0),            1 if item.get("matched_primary_metric") else 0,            adjust_for_goal(ranking_value),            adjust_for_goal(fallback_value),        )    return sorted(decorated, key=sort_key, reverse=True)
ai-research-reproduction/references/explore-variant-spec.md:150来自说明文档打开原文件
## Notes- Keep `current_research` durable and auditable.- In campaign mode, pair `variant_spec` with a frozen task family, dataset, evaluation source, and provided SOTA table.- Keep exploratory output candidate-only.- Do not treat pre-execution ranking scores as trusted scientific conclusions.- If `primary_metric` is omitted, downstream ranking falls back to parsed `best_metric`.
低风险

执行前的“预期成功/增益”分数是固定公式,不是模型或数据证据

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

成功率随轴激进程度、步骤和子集规模增加而下降,而预期增益按同一因素增加;这些合成分数直接用于候选排序。公式没有使用历史运行结果或任务特定证据。

为什么需要注意

用户可能把名称为 `predicted_success_score` 和 `predicted_gain_score` 的值误认为预测验证结果,从而优先运行并不合适的候选并浪费算力。

这段代码的正常用途

候选描述的公式和排序行为属实,但源码与文档都把它限定为“执行前”的启发式优先级,而不是模型预测、历史数据估计或科学证据。实际运行后另有基于状态和指标的排序。其主要风险是用户误读字段名 `predicted_*`;现有上下文已明确说明这些分数的构成和局限,因此不支持把它视为隐藏或冒充证据的行为。用户仍可要求界面将其标为 heuristic,并审阅权重后再据此分配算力。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
explore-run/scripts/plan_variants.py:129来自代码打开原文件
    for item in raw_variants:        subset_scale = normalized_lookup_score(item.get("subset_size"), subset_lookup)        step_scale = normalized_lookup_score(item.get("short_run_steps"), step_lookup)        axis_scale = axis_aggressiveness_score(item.get("axes", {}), axes)        raw_cost = 0.50 * step_scale + 0.35 * subset_scale + 0.15 * axis_scale        cost_efficiency_score = clamp_score(1.0 - raw_cost)        predicted_success_score = clamp_score(1.0 - (0.45 * axis_scale + 0.35 * step_scale + 0.20 * subset_scale))        predicted_gain_score = clamp_score(0.50 * axis_scale + 0.30 * step_scale + 0.20 * subset_scale)        total_score = (            weights["cost"] * cost_efficiency_score            + weights["success_rate"] * predicted_success_score            + weights["expected_gain"] * predicted_gain_score        )        annotated_item = dict(item)        annotated_item.update(            {                "cost_score": round(raw_cost, 4),                "cost_efficiency_score": round(cost_efficiency_score, 4),                "predicted_success_score": round(predicted_success_score, 4),                "predicted_gain_score": round(predicted_gain_score, 4),                "total_score": round(total_score, 4),                "estimated_runtime_units": round(1.0 + 3.0 * step_scale + 2.0 * subset_scale + axis_scale, 4),                "feasibility_annotations": [],
查看另外 5 个位置
explore-run/scripts/plan_variants.py:202来自代码打开原文件
def prune_variants(raw_variants: List[Dict[str, Any]], spec: Dict[str, Any]) -> List[Dict[str, Any]]:    max_variants = int(spec.get("max_variants") or 0)    max_short_cycle_runs = int(spec.get("max_short_cycle_runs") or 0)    ordered = sorted(        raw_variants,        key=lambda item: (            -item.get("total_score", 0.0),            -item.get("predicted_gain_score", 0.0),            -item.get("predicted_success_score", 0.0),            -item.get("cost_efficiency_score", 0.0),            item.get("cost_score", 0.0),            item.get("id", ""),        ),    )
ai-research-reproduction/references/explore-variant-spec.md:90来自说明文档打开原文件
Interpretation:- `cost`  Lower runtime and smaller subsets are cheaper.- `success_rate`  Lighter, less aggressive candidates are more likely to run cleanly.- `expected_gain`  Candidates that move farther from the current setting are treated as having higher upside.The weights are normalized before scoring. This stage is heuristic and should be treated as exploratory prioritization, not scientific proof.
explore-run/scripts/plan_variants.py:206来自代码打开原文件
    ordered = sorted(        raw_variants,        key=lambda item: (            -item.get("total_score", 0.0),            -item.get("predicted_gain_score", 0.0),            -item.get("predicted_success_score", 0.0),            -item.get("cost_efficiency_score", 0.0),            item.get("cost_score", 0.0),            item.get("id", ""),        ),    )
explore-run/scripts/plan_variants.py:251来自代码打开原文件
        },        "selection_policy": {            "factors": ["cost", "success_rate", "expected_gain"],            "weights": normalize_weights(spec),            "scores": {                "cost_score": "Lower is cheaper; derived from steps, subset size, and axis aggressiveness.",                "cost_efficiency_score": "Higher is cheaper after inverting cost_score.",                "predicted_success_score": "Higher means the candidate is more likely to run cleanly.",                "predicted_gain_score": "Higher means the candidate is more likely to produce a measurable improvement.",                "total_score": "Weighted composite used for pre-execution candidate ranking.",            },        },
ai-research-reproduction/references/explore-variant-spec.md:99来自说明文档打开原文件
The weights are normalized before scoring. This stage is heuristic and should be treated as exploratory prioritization, not scientific proof.### Post-execution result rankingAfter candidates actually run, downstream ranking should use real execution evidence:- `status` first- then `primary_metric`- then `metric_goal`

Skill 逻辑拆解

7 个说明模块

该技能用于在明确授权且已有持久化 `current_research` 锚点时,规划或运行候选研究;其文档要求冻结数据集、评测、SOTA 参考和预算,并将结果标为探索性证据。

查看原文
SKILL.md:28来自说明文档打开原文件
Use this skill only when the request has both:- Explicit exploration authorization such as candidate-only work, isolated  branch or worktree, sweep, several variants, or exploratory ranking.- A durable `current_research` context such as a branch, commit, checkpoint,  run record, or already-trained local model state.
SKILL.md:56来自说明文档打开原文件
1. Confirm `current_research` and explicit explore-lane authorization.2. Accept either legacy `variant_spec` or higher-level `research_campaign`.3. In campaign mode, freeze the task, dataset, benchmark, evaluation source,   SOTA reference, and budget before candidate work.4. Build only the repo-understanding artifacts needed for the current campaign,
SKILL.md:73来自说明文档打开原文件
   requires real execution evidence.9. Write candidate-only outputs to `analysis_outputs/`, `sources/`, and   `explore_outputs/` as appropriate; never present exploratory gains as trusted   reproduction success. Include `SCIENTIFIC_CHANGELOG.md` and   `COMPARABILITY_REPORT.md` for candidate scientific meaning and comparison   boundaries.

配套运行器会在指定仓库目录启动子进程,并把完整 stdout、stderr、资源采样、状态和事件持久化到每次运行的目录。超时或取消时,它会终止进程组。

查看原文
ai-research-reproduction/_bundled/shared/scripts/runtime_runner.py:480来自代码打开原文件
    stderr_capture = TailBuffer(capture_limit)    stdout_path = run_dir / "stdout.log"    stderr_path = run_dir / "stderr.log"    resources_path = run_dir / "resources.jsonl"    stdout_path.touch()    stderr_path.touch()    resources_path.touch()    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/_bundled/shared/scripts/runtime_runner.py:555来自代码打开原文件
            now = time.monotonic()            if cancel_path.exists():                cancelled = True                journal.event("cancel_detected", source="CANCEL")                _terminate_process_tree(process, journal)                break            if timeout >= 0 and now - started_monotonic >= timeout:                timed_out = True                journal.event("timeout_detected", timeout_seconds=timeout)                _terminate_process_tree(process, journal)                break            if now >= next_heartbeat:

研究来源解析可以访问 arXiv、DOI、GitHub 和普通网页;通用传输设置了 6 秒超时,但提供的代码对响应体没有大小上限。

查看原文
scripts/lookup/providers/__init__.py:3来自代码打开原文件
from .arxiv_provider import resolve_arxiv_recordfrom .doi_provider import resolve_doi_recordfrom .github_provider import resolve_github_recordfrom .optional_provider import resolve_optional_recordfrom .url_provider import resolve_url_record
scripts/lookup/providers/base.py:60来自代码打开原文件
def http_get(url: str, *, accept: str = "application/json, text/plain;q=0.9, text/html;q=0.8") -> bytes:    request = urllib.request.Request(        url,        headers={            "User-Agent": USER_AGENT,            "Accept": accept,        },    )    with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS) as response:        return response.read()

配套复现流程默认启用跨运行的个人经验存储:运行阻塞信息和命令摘要可写入 `~/.rigorpilot/lessons.jsonl`,之后生成供技能参考的 `PERSONAL_RIGOR.md`;可用环境变量关闭。

查看原文
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"def lessons_path() -> Path:    return lessons_home() / "lessons.jsonl"def overlay_path() -> Path:    return lessons_home() / "PERSONAL_RIGOR.md"
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
SKILL.md:120来自说明文档打开原文件
- Load `../ai-research-reproduction/references/research-rigor-principles.md` before making novelty, contribution, SOTA, or comparability statements.- Consult `~/.rigorpilot/PERSONAL_RIGOR.md` if present, under `../ai-research-reproduction/references/continuous-learning-policy.md` (advisory only; core wins).- Load `../ai-research-reproduction/references/deep-learning-experiment-principles.md` when training,

该 Skill 面向已明确授权的候选研究探索,并要求存在持久的 `current_research` 基准;其说明明确否认把候选结果当作已验证的新颖性或可信复现。

查看原文
SKILL.md:10来自说明文档打开原文件
Use this as the Rigor Explore compatible skill slug after the researcherexplicitly authorizes candidate-only work on top of a durable`current_research` anchor. The installed slug remains `ai-research-explore` forcompatibility. Rigor Explore is for meaningful and potentially novel deeplearning research candidates while preserving scientific rigor, comparability,reproducibility, and auditable collaboration. Novelty and significance remainhypotheses before literature contrast, ablation evidence, and fair comparison.The skill does not promise autonomous discovery, global benchmark completeness,novelty proof, or trusted reproduction success.
SKILL.md:28来自说明文档打开原文件
Use this skill only when the request has both:- Explicit exploration authorization such as candidate-only work, isolated  branch or worktree, sweep, several variants, or exploratory ranking.- A durable `current_research` context such as a branch, commit, checkpoint,  run record, or already-trained local model state.

编排器会为实验创建或复用独立 Git 分支/工作树,并把分析、来源缓存和探索结果写入多个输出目录。

查看原文
scripts/orchestrate_explore.py:222来自代码打开原文件
    worktree_root = experiment_worktree_root(git_root, experiment_branch)    if worktree_root.exists():        worktree_info = validate_existing_worktree(worktree_root, experiment_branch)    else:        worktree_root.parent.mkdir(parents=True, exist_ok=True)        if branch_exists:            run_text(["git", "worktree", "add", str(worktree_root), experiment_branch], cwd=git_root)        else:            run_text(["git", "worktree", "add", "-b", experiment_branch, str(worktree_root), head_sha], cwd=git_root)            created_branch = True        branch_sha = run_text(["git", "rev-parse", "--verify", branch_ref], cwd=git_root)
scripts/orchestrate_explore.py:1993来自代码打开原文件
    repo_path = Path(args.repo).resolve()    output_dir = Path(args.output_dir).resolve()    runtime_root = Path(args.runtime_root).resolve() if args.runtime_root else output_dir / "_runtime"    try:        model_adapter = load_model_profile(Path(args.model_profile_json) if args.model_profile_json else None)        missing_model_capabilities = missing_capabilities(model_adapter, args.require_model_capability)    except ModelAdapterError as exc:        parser.error(str(exc))    if missing_model_capabilities:        parser.error(f"model profile is missing required capabilities: {', '.join(missing_model_capabilities)}")    analysis_output_dir = output_dir.parent / "analysis_outputs"    analysis_output_dir.mkdir(parents=True, exist_ok=True)    sources_dir = output_dir.parent / "sources"

候选变体执行受执行策略控制,并会受基准放弃、人工检查点和阻塞清单限制;但基准评估本身在 campaign 模式下另行自动执行。

查看原文
scripts/orchestrate_explore.py:2307来自代码打开原文件
    short_run_runtime_seconds = 0.0    should_run_variants = bool(campaign["execution_policy"]["run_selected_variants"])    if not compatibility_mode and baseline_gate.get("decision") == "abandon":        should_run_variants = False    if not compatibility_mode and checkpoint_state != "not-required":        should_run_variants = False    if experiment_manifest.get("status") == "blocked":        should_run_variants = False    if should_run_variants:        if variant_matrix.get("base_command") and variant_matrix.get("variants"):
scripts/orchestrate_explore.py:2063来自代码打开原文件
    eval_contract = eval_contract_payload(analysis_data, campaign, metric_policy)    baseline_gate: Dict[str, Any] = {"decision": "not-applicable", "reason": "Baseline gate was not evaluated."}    baseline_payload: Dict[str, Any] = {}    if not compatibility_mode:        baseline_gate, baseline_payload, _baseline_runtime = run_baseline_evaluation(            train_execute_script=train_execute_script,            run_execute_script=run_execute_script,            repo_path=workspace_repo_path,            current_research=current_research,            evaluation_source=campaign["evaluation_source"],            baseline_gate_cfg=campaign["baseline_gate"],            runtime_root=runtime_root,            model_profile_json=args.model_profile_json,            required_model_capabilities=args.require_model_capability,            gpu_monitor_enabled=not args.no_gpu_monitor,        )        baseline_gate = compare_baseline_to_sota(

来源查找默认从仓库文件中提取定位符、尝试外部提供商解析,并将解析记录持久化到 `sources/records` 和索引文件。

查看原文
scripts/passes/lookup_sources.py:324来自代码打开原文件
) -> Dict[str, Any]:    sources_dir.mkdir(parents=True, exist_ok=True)    output_dir = analysis_output_dir or (sources_dir.parent / "analysis_outputs")    output_dir.mkdir(parents=True, exist_ok=True)    lookup_config = campaign.get("research_lookup", {}) if isinstance(campaign.get("research_lookup"), dict) else {}    seed_records = collect_seed_records(campaign, analysis_data, code_plan)    repo_local_seeds = extract_repo_local_seeds(repo_path) if lookup_config.get("enable_repo_local_extraction", True) else []    raw_records = dedupe_preserving_order([*seed_records, *repo_local_seeds])    resolved_records = [resolve_provider_record(raw, lookup_config) for raw in raw_records]    stored_bundle = store_records(sources_dir, resolved_records)    records = stored_bundle["records"]
scripts/lookup/cache_store.py:153来自代码打开原文件
        record["source_id"] = source_id        slug = slugify(record.get("title") or normalized_id)        filename = stable_filename(str(record.get("source_type") or "source"), slug, digest)        artifact_path = records_dir / filename        record["artifact_path"] = f"sources/records/{filename}"        record["artifact_abspath"] = str(artifact_path)        record["digest"] = digest        artifact_path.write_text(            json.dumps({"schema_version": "2.0", **record}, indent=2, ensure_ascii=False),            encoding="utf-8",        )        stored_records.append(record)

该技能只适用于研究者已明确授权候选探索,并且已有可持久识别的 current_research 基线(如分支、提交、检查点或训练状态)的情况;缺少这些条件时不应启动探索。

查看原文
SKILL.md:28来自说明文档打开原文件
Use this skill only when the request has both:- Explicit exploration authorization such as candidate-only work, isolated  branch or worktree, sweep, several variants, or exploratory ranking.- A durable `current_research` context such as a branch, commit, checkpoint,  run record, or already-trained local model state.

工作流会进行有界的候选修改或运行、冒烟检查、证据收集和相对当前基线的排名,并在阻塞、预算耗尽或人工检查点处停止。

查看原文
SKILL.md:43来自说明文档打开原文件
- Outer loop: understand the repository, freeze task/dataset/evaluation/budget,  preserve user ideas, map sources, gate ideas, and decide whether the next  experiment is worth running.- Inner loop: make one bounded candidate change or run, smoke-check it, collect  evidence, rank it against the current anchor, and either stop or return to the  outer loop with the new evidence.This rhythm is a guide, not a rigid autonomous loop. Stop at explicit blockers,unclear scientific meaning, exhausted budget, missing anchor/evaluation, or ahuman checkpoint.

活动模式会在 analysis_outputs、sources 和 explore_outputs 下生成多种研究地图、评分、计划、运行账本和状态文件;最小活动只应生成当前工作确实需要的文件。

查看原文
references/research-campaign-spec.md:287来自说明文档打开原文件
## Output ExpectationsThe following artifacts are the full advanced campaign surface. A minimalcampaign should produce only the files justified by the active work; do notinflate the run with empty artifacts just to satisfy this list.Campaign mode writes:
references/research-campaign-spec.md:295来自说明文档打开原文件
- `analysis_outputs/RESEARCH_MAP.md`- `analysis_outputs/CHANGE_MAP.md`- `analysis_outputs/EVAL_CONTRACT.md`- `analysis_outputs/SOURCE_INVENTORY.md`- `analysis_outputs/SOURCE_SUPPORT.json`- `analysis_outputs/IMPROVEMENT_BANK.md`- `analysis_outputs/IDEA_CARDS.json`- `analysis_outputs/IDEA_SEEDS.json`- `analysis_outputs/IDEA_EVALUATION.md`- `analysis_outputs/IDEA_SCORES.json`- `analysis_outputs/MODULE_CANDIDATES.md`- `analysis_outputs/INTERFACE_DIFF.md`- `analysis_outputs/ATOMIC_IDEA_MAP.md`- `analysis_outputs/ATOMIC_IDEA_MAP.json`- `analysis_outputs/IMPLEMENTATION_FIDELITY.md`- `analysis_outputs/IMPLEMENTATION_FIDELITY.json`- `analysis_outputs/RESOURCE_PLAN.md`- `analysis_outputs/status.json`- `sources/index.json`- `sources/SUMMARY.md`- `sources/records/`- `explore_outputs/CHANGESET.md`- `explore_outputs/IDEA_GATE.md`- `explore_outputs/EXPERIMENT_PLAN.md`- `explore_outputs/EXPERIMENT_MANIFEST.md`- `explore_outputs/EXPERIMENT_LEDGER.md`- `explore_outputs/TRANSPLANT_SMOKE_REPORT.md`- `explore_outputs/TOP_RUNS.md`- `explore_outputs/status.json`

随附的模型运行器会保存消息、请求、响应、工具调用、用量和进程日志等详细证据;文档明确提醒,私有仓库的轨迹在发布前需要检查。

查看原文
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
ai-research-reproduction/references/agent-runner.md:161来自说明文档打开原文件
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.
从这里开始 · 工作说明SKILL.md
ai-research-explore
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。

文件引用关系图

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

检查范围与遗漏

  • 有检测结果未通过证据校验或未完成处理,本报告不能代表完整检查。
逐文件查看涉及的内容

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

  • 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已纳入全文
  • env-and-assets-bootstrap/scripts/bootstrap_env.py已纳入全文
  • env-and-assets-bootstrap/scripts/bootstrap_env.sh已纳入全文
  • env-and-assets-bootstrap/scripts/plan_setup.py已纳入全文
  • env-and-assets-bootstrap/scripts/prepare_assets.py已纳入全文
  • explore-code/scripts/plan_code_changes.py已纳入全文
  • explore-code/scripts/write_outputs.py已纳入全文
  • explore-run/scripts/plan_variants.py已纳入全文
  • explore-run/scripts/write_outputs.py已纳入全文
  • minimal-run-and-audit/scripts/run_command.py已纳入全文
  • minimal-run-and-audit/scripts/write_outputs.py已纳入全文
  • run-train/scripts/run_training.py已纳入全文
  • run-train/scripts/write_outputs.py已纳入全文
  • scripts/lookup/__init__.py已纳入全文
  • scripts/lookup/cache_store.py已纳入全文
  • scripts/lookup/inventory_writer.py已纳入全文
  • scripts/lookup/normalizers.py已纳入全文
  • scripts/lookup/providers/__init__.py已纳入全文
  • scripts/lookup/providers/arxiv_provider.py已纳入全文
  • scripts/lookup/providers/base.py已纳入全文
  • scripts/lookup/providers/doi_provider.py已纳入全文
  • scripts/lookup/providers/github_provider.py已纳入全文
  • scripts/lookup/providers/optional_provider.py已纳入全文
  • scripts/lookup/providers/url_provider.py已纳入全文
  • scripts/lookup/record_schema.py已纳入全文
  • scripts/lookup/repo_extractors.py已纳入全文
  • scripts/lookup/source_support.py已纳入全文
  • scripts/orchestrate_explore.py已纳入全文
  • scripts/passes/__init__.py已纳入全文
  • scripts/passes/atomic_idea_decomposition.py已纳入全文
  • scripts/passes/candidate_idea_generation.py已纳入全文
  • scripts/passes/execution_feasibility.py已纳入全文
  • scripts/passes/idea_cards.py已纳入全文
  • scripts/passes/idea_ranking.py已纳入全文
  • scripts/passes/implementation_fidelity.py已纳入全文
  • scripts/passes/improvement_bank.py已纳入全文
  • scripts/passes/lookup_sources.py已纳入全文
  • scripts/passes/source_mapping.py已纳入全文
  • scripts/write_outputs.py已纳入全文
  • references/ai-research-explore-policy.md已纳入全文
  • references/research-campaign-spec.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/explore-variant-spec.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-pitfall-checklist.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已纳入全文
  • analyze-project/references/analysis-policy.md已纳入全文
  • env-and-assets-bootstrap/references/assets-policy.md已纳入全文
  • env-and-assets-bootstrap/references/env-policy.md已纳入全文
  • explore-code/references/explore-policy.md已纳入全文
  • explore-run/references/execution-policy.md已纳入全文
  • minimal-run-and-audit/references/reporting-policy.md已纳入全文
  • repo-intake-and-plan/references/repo-scan-rules.md已纳入全文
  • run-train/references/training-policy.md已纳入全文
  • ai-research-reproduction/SKILL.md已纳入全文
  • analyze-project/SKILL.md已纳入全文
  • env-and-assets-bootstrap/SKILL.md已纳入全文
  • explore-code/SKILL.md已纳入全文
  • explore-run/SKILL.md已纳入全文
  • minimal-run-and-audit/SKILL.md已纳入全文
  • repo-intake-and-plan/SKILL.md已纳入全文
  • run-train/SKILL.md已纳入全文
  • agents/openai.yaml已纳入全文
  • references/idea-evaluation-framework.md已纳入全文
  • references/smoke-validation-policy.md已纳入全文
  • references/source-mapping-policy.md已纳入全文
  • references/sources-naming-policy.md已纳入全文

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

  • SKILL.md工作说明
  • agents/openai.yaml配套文件
  • references/ai-research-explore-policy.md配套文件
  • references/idea-evaluation-framework.md配套文件
  • references/research-campaign-spec.md配套文件
  • references/smoke-validation-policy.md配套文件
  • references/source-mapping-policy.md配套文件
  • references/sources-naming-policy.md配套文件
  • scripts/lookup/__init__.py脚本
  • scripts/lookup/cache_store.py脚本
  • scripts/lookup/inventory_writer.py脚本
  • scripts/lookup/normalizers.py脚本
  • scripts/lookup/providers/__init__.py脚本
  • scripts/lookup/providers/arxiv_provider.py脚本
  • scripts/lookup/providers/base.py脚本
  • scripts/lookup/providers/doi_provider.py脚本
  • scripts/lookup/providers/github_provider.py脚本
  • scripts/lookup/providers/optional_provider.py脚本
  • scripts/lookup/providers/url_provider.py脚本
  • scripts/lookup/record_schema.py脚本
  • scripts/lookup/repo_extractors.py脚本
  • scripts/lookup/source_support.py脚本
  • scripts/orchestrate_explore.py脚本
  • scripts/passes/__init__.py脚本
  • scripts/passes/atomic_idea_decomposition.py脚本
  • scripts/passes/candidate_idea_generation.py脚本
  • scripts/passes/execution_feasibility.py脚本
  • scripts/passes/idea_cards.py脚本
  • scripts/passes/idea_ranking.py脚本
  • scripts/passes/implementation_fidelity.py脚本
  • scripts/passes/improvement_bank.py脚本
  • scripts/passes/lookup_sources.py脚本
  • scripts/passes/source_mapping.py脚本
  • scripts/write_outputs.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配套文件
  • run-train/SKILL.md配套文件
  • minimal-run-and-audit/SKILL.md配套文件
  • repo-intake-and-plan/SKILL.md配套文件
  • env-and-assets-bootstrap/SKILL.md配套文件
  • analyze-project/SKILL.md配套文件
  • explore-code/SKILL.md配套文件
  • explore-run/SKILL.md配套文件
  • ai-research-reproduction/_bundled/shared/scripts/runtime_runner.py脚本
  • ai-research-reproduction/_bundled/shared/scripts/task_queue.py脚本
  • run-train/references/training-policy.md配套文件
  • run-train/scripts/run_training.py脚本
  • run-train/scripts/write_outputs.py脚本
  • minimal-run-and-audit/references/reporting-policy.md配套文件
  • minimal-run-and-audit/scripts/run_command.py脚本
  • minimal-run-and-audit/scripts/write_outputs.py脚本
  • repo-intake-and-plan/references/repo-scan-rules.md配套文件
  • env-and-assets-bootstrap/references/env-policy.md配套文件
  • env-and-assets-bootstrap/references/assets-policy.md配套文件
  • env-and-assets-bootstrap/scripts/bootstrap_env.py脚本
  • env-and-assets-bootstrap/scripts/plan_setup.py脚本
  • env-and-assets-bootstrap/scripts/prepare_assets.py脚本
  • env-and-assets-bootstrap/scripts/bootstrap_env.sh脚本
  • analyze-project/references/analysis-policy.md配套文件
  • ai-research-reproduction/references/research-pitfall-checklist.md配套文件
  • explore-code/references/explore-policy.md配套文件
  • explore-code/scripts/plan_code_changes.py脚本
  • explore-code/scripts/write_outputs.py脚本
  • explore-run/references/execution-policy.md配套文件
  • ai-research-reproduction/references/explore-variant-spec.md配套文件
  • explore-run/scripts/plan_variants.py脚本
  • explore-run/scripts/write_outputs.py脚本

代码和说明中提到的操作

读取文件
scripts/lookup/cache_store.py:32来自代码打开原文件
        }    payload = json.loads(index_path.read_text(encoding="utf-8"))    records = payload.get("records", [])
scripts/lookup/cache_store.py:126来自代码打开原文件
            if existing_path and existing_path.exists():                existing_payload = json.loads(existing_path.read_text(encoding="utf-8"))            merged = merge_records(existing_payload, record)
scripts/lookup/providers/base.py:68来自代码打开原文件
    )    with urllib.request.urlopen(request, timeout=REQUEST_TIMEOUT_SECONDS) as response:        return response.read()
修改文件
scripts/lookup/cache_store.py:159来自代码打开原文件
        record["digest"] = digest        artifact_path.write_text(            json.dumps({"schema_version": "2.0", **record}, indent=2, ensure_ascii=False),
scripts/lookup/cache_store.py:202来自代码打开原文件
    index_path = sources_dir / "index.json"    index_path.write_text(json.dumps(index_payload, indent=2, ensure_ascii=False), encoding="utf-8")    return {
scripts/lookup/inventory_writer.py:35来自代码打开原文件
    summary_path = sources_dir / "SUMMARY.md"    summary_path.write_text("\n".join(lines), encoding="utf-8")    return summary_path
连接外部网站
scripts/lookup/normalizers.py:43来自代码打开原文件
    if text.lower().startswith("doi:"):        return f"https://doi.org/{text[4:].strip()}"    return text
scripts/lookup/normalizers.py:88来自代码打开原文件
        "arxiv_id": arxiv_id,        "url": f"https://arxiv.org/abs/{arxiv_id}",    }
scripts/lookup/normalizers.py:107来自代码打开原文件
        "doi": doi,        "url": f"https://doi.org/{doi}",    }
读取密钥或账号配置
scripts/lookup/providers/optional_provider.py:10来自代码打开原文件
OPTIONAL_PROVIDER_ENV_VARS = {    "openrouter": "RESEARCH_LOOKUP_OPENROUTER_API_KEY",    "perplexity": "RESEARCH_LOOKUP_PERPLEXITY_API_KEY",
scripts/lookup/providers/optional_provider.py:11来自代码打开原文件
    "openrouter": "RESEARCH_LOOKUP_OPENROUTER_API_KEY",    "perplexity": "RESEARCH_LOOKUP_PERPLEXITY_API_KEY",    "parallel": "RESEARCH_LOOKUP_PARALLEL_API_KEY",
scripts/lookup/providers/optional_provider.py:12来自代码打开原文件
    "perplexity": "RESEARCH_LOOKUP_PERPLEXITY_API_KEY",    "parallel": "RESEARCH_LOOKUP_PARALLEL_API_KEY",}
运行命令
scripts/orchestrate_explore.py:10来自代码打开原文件
import reimport subprocessimport sys
scripts/orchestrate_explore.py:63来自代码打开原文件
def run_json(script: Path, args: List[str]) -> Dict[str, Any]:    result = subprocess.run([sys.executable, str(script), *args], check=True, capture_output=True, text=True)    return json.loads(result.stdout)
scripts/orchestrate_explore.py:77来自代码打开原文件
def run_text(command: List[str], cwd: Optional[Path] = None) -> str:    result = subprocess.run(command, check=True, capture_output=True, text=True, cwd=str(cwd) if cwd else None)    return result.stdout.strip()
安装其他软件包
ai-research-reproduction/scripts/orchestrate_repro.py:252来自代码打开原文件
        score -= 10    if text_value.startswith(("pip install", "conda install", "conda env create", "conda activate", "git clone", "cd ")):        score -= 12
env-and-assets-bootstrap/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.")
env-and-assets-bootstrap/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.")
读取了多少行
15,367
文件校验值(用于核对版本)
69dd2f19f74e2c8ba9659638dbf17880cb729d5625ac8dd00476e9a675f5bd2c