团队自托管的 GitLab 代码安全审计工作台。React 前端、登录与管理员权限、SQLite 任务历史、Eino 工具调用 Agent,围绕具体 Git 提交收集证据并支持人工复核。
从提交差异到调查证据,再到问题链路与人工复核,审计过程可以在工作台中逐项查看。
以下为本地工作台的实际界面截图,使用合成示例仓库演示“删除资源时移除对象级权限检查”的审计结果。示例未执行代码,不代表真实业务漏洞、运行复现或模型准确率评测。截图中的“覆盖不完整”和推测关系保留原样。
将发现展开为参与者与步骤组成的链路,风险步骤标红,推测关系使用虚线并明确标注。支持全局视图、阅读与缩放、定位风险,以及查看 Mermaid 源码和下载 SVG。
每个步骤可展示文件、行号、提交 SHA 与代码片段。删除防护逻辑的场景同时展示 BASE 旧版本与 HEAD 新版本,便于对照变更前后的检查条件。引用核对确认代码来源,调用关系和可利用性仍需人工判断。
发现详情保留触发条件、修复建议和观察引用;独立复核使用新的对话上下文读取固定提交,展示复核模型、结论与限制。人工复核状态单独保存,便于团队继续判断和跟进。
查看更多:审计任务、覆盖说明与模型用量
选择项目与 MR 发起审计,按项目、状态、风险、复核状态与问题类型筛选历史任务,查看每次审计对应的固定提交。
任务详情展示 BASE/HEAD SHA、审计摘要及覆盖限制;选文件补审沿用固定版本与策略创建独立任务,保留原结果。
按主审、独立复核、时序图等阶段查看请求次数与输入/输出 token。配置价格后可估算费用;示例未配置价格,界面明确显示“费用未估算”。
截图统一保存在 docs/images/,来源与更新约定见目录说明。
- 登录/退出、管理员创建账号、禁用、角色变更、密码重置与会话撤销。
- 项目管理、手动审计、GitLab Webhook、分页轮询与提交级去重。
- 有界 worker、任务超时/取消、服务重启中断标记、独立重审记录。
- 固定 diff 版本 ID 和 base/head SHA;支持 fork MR、文件重命名、真实 diff 新增/删除行定位。
- Eino 语言无关的 14 个调查工具:文件、目录树、正则搜索、差异、Git 元数据、历史、blame、调查记录和证据核验。
- 管理员授权固定版本的关联仓库上下文,按仓库权限交集查看报告;启用时额外提供 4 个只读工具。
- 严格结果校验、提交代码证据匹配、候选标记、覆盖不足说明、工具与模型调用/token 记录。
- 项目/状态/等级/类型/复核过滤,发现复核及操作日志。
- 问题链路时序图、风险高亮、固定提交证据对照、Mermaid 源码与 SVG 导出。
- 独立上下文发现复核、问题历史与人工复核记录、固定版本选文件补审及分阶段模型用量。
- 管理员系统设置:模型、GitLab、Webhook、审计策略保存到工作目录
config.yaml。 - React 静态资源嵌入 Go 二进制;旧 SQLite 结果导入并明确标记缺失提交证据。
本轮开发中的功能及未完成验收见 生产审计发布清单,不代表当前部署已包含全部能力。
单实例升级、私有数据库/配置备份和恢复命令见 运维说明。备份恢复包不加入 Git;恢复仅写入新目录,不覆盖当前部署。
需要 Go(模块最低声明 1.26,当前验证环境为 1.27.1)、CGO/C 编译器;改动前端需要 Node.js 20.19+ / npm。SQLite 驱动需要 CGO_ENABLED=1。
# 安装并构建前端;产物进入 web/dist 并嵌入 Go 二进制
cd frontend
npm ci
npm run build
cd ..
go test ./...
go build -o aimangebot .
# 首次空数据库启动必须配置管理员,密码至少 12 字节、最多 72 字节
export AIM_ADMIN_USERNAME=admin
export AIM_ADMIN_PASSWORD='请替换为自己的强密码'
./aimangebot打开 http://localhost:8080。首次缺少 config.yaml 时,程序从 config.example.yaml 复制生成权限为 0600 的配置文件。已有 config.yaml 不覆盖;该文件和数据库不纳入 Git。初始账号创建后可移除引导环境变量,不会每次重置密码。
登录后进入 系统设置,填写模型 API 地址、模型名称/API Key、GitLab 实例/Token。模型须支持 OpenAI 兼容 tool calling;保存后写入本地 config.yaml,秘密字段留空保留原值。新审计采用保存后的模型/仓库设置;监听地址、worker 数与可信代理变化需要重启,页面刷新后仍会保留待重启提示。直接手改文件需重启加载,不提供双向文件监控覆盖界面修改。
在 项目 添加 GitLab 数字 ID 和展示名称,再到 审计任务 填写 MR 编号。项目配置(含启用状态)也同步到 config.yaml;写文件失败时数据库修改保留,服务会自动重试同步。项目 ID 是否可访问在发起审计时由 GitLab 验证。管理员可在项目卡片的 成员权限 中授权:
| 项目角色 | 查看结果及证据 | 人工复核 | 发起、重审及取消任务 |
|---|---|---|---|
| 查看 | 是 | 否 | 否 |
| 复核 | 是 | 是 | 否 |
| 执行 | 是 | 是 | 是 |
新成员默认没有项目权限;管理员拥有全局权限,并负责管理项目、用户、设置和操作日志。首次升级只将已有成员对已有项目的访问迁移为执行权限,撤销的授权不会在重启时恢复。撤销执行权限会取消该成员在该项目的未完成任务,保留已保存证据。权限保存于数据库;当前支持单团队中的项目隔离,尚不提供多租户。
fork PR 会读取完整源仓库,因此成员还需要源项目的查看权限。管理员可添加源项目、停用其审计并授予查看权限;未配置或未授权的源项目会阻止成员访问相应审计。撤销源项目读取权限会取消该成员的相关 fork 任务。管理员与系统自动触发仍受服务账号在 GitLab 中的实际仓库权限约束。
管理员可在 项目 → 关联仓库 中选择最多 4 个同一 GitLab 实例内已登记、启用的项目,填写完整 40/64 位提交 SHA。保存后同步到 config.yaml 的项目 context_repositories;新任务冻结项目 ID 和版本,旧报告保留原版本。发起者和报告读者还需要各关联项目的查看权限。移除授权、更换 SHA、停用关联项目或撤销发起者读取权限会停止相关未完成任务,已有证据保留且仍按冻结集合检查可见权限。
关联任务额外提供 list_repositories、read_repository_file、search_repository_code、list_repository_directory。仅访问已授权固定对象,不追随最新分支;来源不可用会明确记录覆盖不足。内容读取、关键词/正则搜索和目录树均与语言无关,原生 Git/API 的既有分页与读取边界仍适用。每源缓存及原生仓库字节预算独立,最多主仓库加 4 个上下文源,不能把单源限额当总资源上限。模型/工具/时间限制继续按阶段执行,不支持无限全仓扫描。
关联观察和时序图引用显示仓库 ID 与固定 SHA;它们可以提供条件和反证,不能替代主 PR 的变更锚点,也不能单凭同名文件或关键词断言跨服务调用。跨仓库报告仅在工作台提供,自动 MR 评论会被阻止,避免将私有上下文发布给权限不明的 MR 读者。不递归读取关联、子模块或 LFS,不执行被审计源码。回滚至旧版权限实现时必须恢复升级前数据库,不能让旧二进制直接服务已有跨仓库结果的数据库。
在 系统设置 → 审计配额 调整工作台任务容量、项目/用户并发和滚动 24 小时审计次数,保存到 config.yaml 后实时生效:
| 限制 | 工作空间 | 每个项目 | 每个用户 |
|---|---|---|---|
| 等待或执行中的任务 | 200 | 50 | 20 |
| 同时执行 | Worker 数(最多 16) | 2 | 2 |
| 24 小时内开始的审计尝试 | 1000 | 200 | 100 |
管理员没有配额豁免;系统自动任务共用工作空间与项目额度,不占个人用户额度。自动重试计入审计次数,并在原任务预留的容量内创建后续任务。已接收任务在次数或并发不足时继续排队,详情显示等待原因及适用的额度恢复时间;降低额度不会删除已有任务。队列容量不足的新请求返回 429 audit_quota_exceeded,相同固定版本的已有任务仍可复用。轮询失败的版本不会被标记为已处理;Webhook 被拒绝时调用方需要再次投递。Retry-After: 60 是建议检查间隔,不保证届时容量可用。额度按数据库中的启动时间跨重启计算,失败、跳过或执行后取消也计入次数;它不估算模型 token 费用。命令行审计由本机操作者直接执行,不使用工作台数据库配额。
默认关闭轮询、Webhook 和评论。在系统设置中明确启用:
- Webhook URL:
https://你的服务/webhook;事件选择 Merge request,Secret Token 与系统设置的 Webhook Token 一致。未签名和未配置项目的请求不会入队。 - 轮询约每 30 秒执行,遍历 opened MR 的分页。
scan_existing_mrs=false时第一次建立已见 SHA 基线,随后新 MR/新 SHA 执行审计;不制造“已完成”的基线任务。 - 相同项目/MR/head/审计策略重复事件去重;运行中的强制重审不创建副本,终态强制重审创建独立尝试。
- 评论只对成功、覆盖完整且当前 MR head 仍匹配的结果发送。发送失败记录
comment.unknown,避免网络结果不确定时自动重复发送。结果不会因评论失败丢失。
使用 TLS 反向代理时,在系统设置填写公开访问地址 public_url: https://audit.example.com,用于写请求 Origin 校验及 Secure Cookie。在执行策略中填写实际代理的 IP/CIDR(trusted_proxies),保存后重启;默认空列表忽略客户端 IP 转发头,拒绝信任所有地址的配置。代理应覆盖转发头,并限制后端只能由代理访问。此配置沿用 Gin 的可信代理机制。不要直接把 HTTP 服务开放到公网;生产代理应强制 HTTPS。单实例部署,数据库持久化磁盘应支持 SQLite WAL。
登录保护采用五分钟窗口:同一账号与 IP 组合最多10次、同一账号跨 IP 最多30次、同一 IP 合计最多100次。成功登录只清除该账号与 IP 的组合计数,不清除其他账号或 IP 总量计数;限流响应包含 Retry-After。内存记录最多8192项,不通过淘汰未过期记录绕过保护,过期后自动恢复。计数仅在当前进程内有效,重启会重置;多实例部署需共享限流设施。
pending → running → succeeded / failed / incomplete / cancelled / skipped。
succeeded表示流程和已请求的证据校验完成,不保证代码不存在漏洞。- 模型 JSON 无效、文件/行/证据不匹配会失败,不通过关键词兜底制造问题。
- 原 GitLab API 模式的 diff 状态/数量受限或 collapsed/too_large,以及被排除或预算外文件、未完成的工具分页、工具失败、未解决假设、任务超时标记
incomplete,显示覆盖原因。 - 文件读取最大 256 KiB;单次工具最多 200 行/16 KiB,每任务缓存 16 MiB,初始 diff 最多 96 KiB。默认 80 次工具调用、200 层提交历史、256 MiB 仓库预算。搜索覆盖固定提交的整个文本代码树,支持路径、扩展名、大小写、正则及
next_cursor续查。完成分页后不再把此前分页标为覆盖不足。原 GitLab API 模式受 20 页文件目录限制。 - 发现定位此次 diff 的 head 新增行或 base 删除行;删除防护逻辑也可报告风险,详情明确标识 HEAD/BASE,并验证对应提交的证据。候选
candidate与证据支持supported都需要人工判断可利用性。 - 依赖清单和关键词不被默认判为漏洞;当前没有 CVE 数据库集成。
- 模型 token 数依赖兼容接口返回 usage;未返回时不能当作零成本。工具详情里
model条目记录返回的 token 数。
frontend/src/ React 页面、共享组件、请求与样式
web/dist/ 可重复生成的嵌入静态产物
web/ui.go SPA 静态资源与 API 404 边界
internal/platform/ auth / settings / store / runner / GitLab / Eino / HTTP
internal/*.go 旧版本兼容类型、工具与对比基线;新服务不注册旧业务路由
config.example.yaml 无真实密钥的默认配置
main.go 启动、资源装配、关闭
业务 API /api/v1;会话由 HttpOnly Cookie 认证;/auth/login 公开,/auth/me 和 /auth/logout 管理会话。详细契约见 design.md。原 /results、/mr_status、/reanalyze_mr 等端点不再注册,旧 HTML 不再作为服务 UI。旧 ReAct/MCP 说明属于旧版本参考,当前运行采用 Eino。
- 停止旧服务,备份
pr_agent.db(WAL 模式先完成 checkpoint/备份)和config.yaml。 - 构建新版本,设置首次管理员凭证,使用原工作目录启动。
- 新表使用
platform_前缀;原results等表保留。旧结果导入一次,标记incomplete,不伪造 SHA/行号。损坏 JSON 会明确报错,修复或从备份恢复后重试。 - 校验项目与历史,配置模型,发起一条审计后再启用自动触发。
- 回退停止新版本并恢复旧二进制/数据库备份。新运行、账号和复核不会自动降级到旧表。
go test ./...
go test -race ./internal/platform
go vet ./...
cd frontend
npm run typecheck
npm run build
npm run devVite 开发代理默认转发到 localhost:8080。提交前前端构建更新 web/dist,确保 Go 嵌入最新 UI。模块版本和前端依赖均有锁文件。
验证包含:会话/权限/跨站写入拒绝、提交去重/重审/并发、取消/超时/恢复、fork refs、diff 行号与证据、旧数据导入、Eino 实际工具调用、旧/新结果逻辑对比,以及本地浏览器登录/设置保存/复核/移动布局。详见 验证记录。固定模型响应测试证明流程行为,不证明真实模型准确率;真实私有 GitLab、模型精度和生产吞吐仍需部署样例验证。
默认启用本地 bare Git 仓库。GitLab 只提供 MR 元数据、clone 地址及可选评论;代码读取、目录、差异、搜索和历史针对固定 base/head 的 Git 对象,不 checkout、不执行仓库代码。fork 的 base/head 分别拉取。服务端需要 Git,Docker 镜像已包含它。系统设置「执行策略」可修改 git_audit 开关、历史深度、仓库预算和工具次数,并保存到 config.yaml。
工具:read_file、list_files、list_directory、read_files、search_code、get_diff、get_change_metadata、compare_files、get_history、git_blame、search_history、record_hypothesis、update_investigation、submit_finding。历史搜索采用 git log -S 的字符串出现次数变化;不是任意语义变化搜索。原生搜索正则为 Git extended regex,关闭本地 Git 时 API 回退使用 Go regex,两者语法有区别。
工具返回提交 SHA、观察编号、代码证据和分页信息。运行详情展示返回结果、调查假设、证据和反证。证据核验只证明代码位置/片段真实,不证明漏洞可利用;本方案不接语言解析器,不声称准确语义引用,也不执行测试或自动下载子模块/LFS 实体。历史默认浅拉取,边界在返回中明确说明。搜索单个候选 blob 最大 16 MiB,Git 命令输出最多 8 MiB;超预算查询需缩小范围。远端必须支持按提交 SHA 拉取,失败不会偷偷改用最新分支。
命令行入口复用同一套 Eino Agent,可以审计本地仓库(ref 会解析为固定 SHA):
./aimangebot -audit-repo /path/to/repository -base main -head feature > audit.json也可直接使用 HTTP(S) clone URL,远端模式要求完整的 base/head SHA:
./aimangebot -audit-repo https://git.example.com/team/repo.git -base FULL_BASE_SHA -head FULL_HEAD_SHA > audit.json私有 HTTP(S) 仓库可通过进程环境变量 AIM_GIT_TOKEN 提供访问 token;不会写入 URL、Git 配置或报告。模型仍读取当前目录 config.yaml。命令行审计不调用 GitLab API、不发评论,也不写入工作台任务数据库;工作台的 MR 提交入口仍使用 GitLab。SSH-only 仓库可先通过已有 SSH 权限克隆,再审计本地路径。
纯 Git 入口与工作台使用相同的大差异分组和覆盖预算;超出预算会在报告中明确标记。CLI 始终输出结果 JSON,退出码:0 为审计完成或策略排除,2 为覆盖不完整,1 为执行失败。审计完成不等于代码没有风险,发现内容仍需查看报告。
新审计发现会尝试生成问题链路时序图,风险步骤标红,点击步骤查看固定提交的文件、行号和证据。推测关系以虚线和文字标明。支持查看 Mermaid 源码和下载 SVG。图为静态代码推导,不代表实际运行或漏洞已复现。生成失败保留发现;历史结果需重新审计。系统设置中可关闭,并同步 generate_sequence_diagrams 到 config.yaml。默认开启,会增加模型调用、耗时与 token;每个发现最多20秒,整轮图生成最多90秒。
设置接口要求先读取当前 config_revision,并随 PUT 提交;版本过期返回409,重新加载后再修改。项目配置同步失败会保留数据库修改和同步待办,服务自动重试;启动时不会以旧配置覆盖尚未同步的项目。调查的支持/排除状态必须关联成功的源码工具 observation;这些引用确认来源,不代表调用语义或漏洞已运行复现。
临时模型/GitLab错误(明确的429、5xx或临时网络错误)最多自动重试两次,默认分别等待5秒、20秒;上游提供有效 Retry-After(秒数或 HTTP 日期)时,以更晚的时间为准。超过24小时的等待建议会停止自动重试,不会提前请求。GitLab SDK 内部重试已关闭,避免与持久化队列叠加。重试记录保留父任务、固定提交和配置,原有发现/证据仍可查看,详情展示模型/GitLab/执行器的结构化失败原因、HTTP 状态和等待时间。旧记录不从错误文字推断原因。取消、权限错误、无效输出和任务总超时不会自动重跑。服务重启后保留检查点并按同一上限恢复当前策略的任务。
工作台支持单服务实例:数据库中的实例租约有效期30秒,每5秒续约,第二个实例在现有租约有效时拒绝启动。正常停止会释放自己的租约并保留未完成任务的检查点;进程异常退出后,替代实例需等待租约失效,最长约30秒。检查点、结果、自动重试和评论写入均检查归属,旧进程无法覆盖接管后的记录;续约失败会取消本地任务并停止 HTTP 服务。升级时先停止旧版本,再启动新版本,不能混用旧、新二进制操作同一数据库。此机制不保证模型或 GitLab 已接收的请求只执行一次;外部评论的完整同步与歧义处理仍在完善。
可用 go build -o /tmp/aimangebot-smoke . 后运行 python3 scripts/smoke-worker-recovery.py --binary /tmp/aimangebot-smoke 验证真实二进制的限流排队、心跳、SIGKILL 后等待租约失效和检查点恢复。脚本使用临时目录及本机合成上游,不访问真实 GitLab/模型或执行仓库代码;默认测试端口19234/19235,约需40秒。--ui-preview 保留测试服务供页面检查,结束时向脚本发送 SIGTERM。
Git 元数据审计覆盖固定提交中的执行位、重命名、符号链接和 gitlink 变化。get_change_metadata 返回经过校验的路径、模式及对象 ID;元数据发现使用独立锚点,页面展示 BASE/HEAD 对照,不制造代码行号。事实变化不等于漏洞,支持状态仍需调查与来源证据。符号链接不跟随,子模块不拉取,二进制内容不能仅靠元数据视为已审计。关闭本地 Git 后,元数据读取受总计40次 API 请求、每目录20页、每页100项的预算限制;缺失信息明确记入覆盖不足。策略版本升级至 v12,旧策略排队任务需重新提交。
上述冒烟脚本增加 --metadata-preview,验证纯模式变化经过 Agent、发现校验和注释型时序图;配合 --ui-preview 可查看合成界面,不代表真实模型准确率。
审计列表接口 GET /api/v1/runs 返回轻量任务记录与 finding_count,不再返回 result、trace 或策略正文;完整发现、证据和时序图通过 GET /api/v1/runs/:id 读取。风险、类型和复核筛选使用与结果事务同步的摘要索引;复核条件只匹配当前结果中的发现。升级首次启动会为历史结果建立索引,耗时取决于历史数据体积;之后启动不重复回填。自定义列表客户端需同步使用 finding_count。
时序图补充阶段按风险与支持状态排序生成,发现列表顺序不变。只复用该发现关联的固定提交源码证据、反证及同文件观察,输入上限32KiB;上下文省略会显式标记。主审计结果先保存,每张图完成后再保存;后续工具读取不会覆盖已完成的图或主审计摘要。总预算90秒、每项20秒,并预留5秒保存时间;生成失败保留发现并标为不可用。该阶段仍在当前任务内运行,不是独立后台任务。
启用 MR 评论后,审计成功会生成事务同步待办;复核保存仍先落地工作台,再由独立发送循环更新同一条 GitLab 评论。详情显示同步状态和版本。已保存讨论/评论 ID,使用安装标记、提交和发布作者核对响应丢失后的结果;未确认结果不会重复创建评论,人工修改正文会停止覆盖。当前 MR 提交变化、权限撤销、发布身份或 GitLab 地址变化时停止发送。首次启用不会追溯发布历史审计,旧版发送记录缺少可靠标识时标为停止同步。
评论每项最多5次自动领取,请求20秒、领取租约30秒;429/5xx 的 Retry-After 可以延后核对,超24小时建议停止自动尝试。核对最多10页、每页100项,预算耗尽或没有唯一匹配保留未知状态;停止状态需管理员检查,不提供强制覆盖或盲目重发。复核记录更新不会清除未知发送结果。正文上限64KiB,快捷命令与提及字符按字面呈现,避免仓库或模型文本触发 GitLab 操作;内容仍需人工核验。评论同步错误不重跑代码审计。
运行 scripts/smoke-worker-recovery.py --binary /tmp/aimangebot-smoke --metadata-preview --comment-preview --ui-preview 可在合成 GitLab 服务上验证只创建一条评论及复核更新;不向真实 GitLab 发帖。生产部署默认保留关闭 MR 评论。
发现和已收尾调查命题的独立复核默认开启,可在系统设置中调整 verify_findings,同步至 config.yaml 并随审计策略固定。每个发现使用新的 Eino 对话和只读工具,重新读取固定提交锚点并查找反证,不复用主审计的推理或工具对话。默认使用同一个模型的独立上下文;系统设置可填写 verification_model,选择同一模型API支持的另一个模型,名称随任务策略固定。复核记录展示实际模型;模型初始化或调用失败保留原发现,不自动回退。不同模型也不代表运行复现或可利用性证明。复核状态单独显示;不会自动升级主发现置信度、删除发现或替代人工复核。信息不足或复核失败会保留发现并标记覆盖不足,反证否定的发现不生成风险时序图。整轮最多60秒、每项15秒、合计40次实际工具调用、每项最多10次,并预留10秒用于保存及后续阶段。--metadata-preview --verification-preview 冒烟模式验证新观察来源与持久化,不用于衡量真实模型准确率。 已收尾的调查使用新的只读对话判断实际命题是否成立,首审状态和证据说明不会进入复核输入;有限路径/工具参数仅作导航,复核必须重新取证。命题复核使用发现复核剩余的同一40次工具/60秒预算,耗尽不会另开预算。界面分开显示初审判断、两次判断一致或分歧、证据不足、未完成和关闭;保留原命题与初审,不自动翻转结论。一致不代表安全证明或运行复现。取消或中断会保留最近检查点的明确未完成状态;旧报告没有的复核记录不自动回填。真实模型效果仍需独立评测,不由流程测试证明。
较大 PR 使用有界分组审计:每组最多24个文件、32KiB变更片段,总计最多8组、256KiB。超大单文件按Git diff的hunk与整行分片,保留原始新增/删除行号,同文件可跨组;超长单行、损坏hunk和上限省略明确记录覆盖不足。每组有独立对话和证据编号,仍可读取整个固定提交仓库;变更清单用于检查跨组调用、配置与保护条件。主审计工具预算和剩余时间按组分配,超出或失败的组明确显示覆盖不足。跨组汇总使用剩余只读工具预算,只补充摘要和限制,不删除或升级发现;独立复核与时序图在合并后统一生成。页面显示每组的文件及完成状态。单组 PR 保留原审计路径,分组不是语义依赖分析或无限制全仓库审计。
问题历史采用保守的版本化指纹:同一目标项目/MR/来源仓库、路径、侧别、风险类型、精确证据和触发条件一致时,行号、标题或 HEAD 改变仍可关联。它不是语义等价或重命名追踪;重复锚点无法唯一定位时不关联。每次审计的发现 ID 和人工复核独立,旧版“误报/已修复”不自动复制到新版。复核决定追加保存,历史迁移只保留已有当前决定作为基线,不编造旧记录,也不改写原始结果/工具证据。详情展示再次发现和本次未再发现,缺失不代表修复或安全。每项最多20次观察/20条复核,总响应最多1000次观察/200条复核,历史缺失列表最多50项,超过时明确标记;当前任务未完成、失败或取消时尤其需要人工确认。--lifecycle-preview 验证三个固定 HEAD 的关联与缺失流程,不用于衡量模型准确率。
文件移动时,可在任务详情打开 历史移动关联。建议仅依据本次固定 BASE→HEAD 的服务端普通文件重命名元数据,加上同 MR/来源仓库/冻结上下文集合内历史发现的精确证据、风险类型和触发条件;不推断任意多次移动、复制、子模块或符号链接。两端路径和 HEAD 可对照查看,多候选明确标记不确定,重复锚点无法唯一标识时省略并提示。Git 重命名不是风险语义等价或旧、新 HEAD 祖先关系的证明。
项目复核者可填写理由确认、拒绝或撤回关联,记录追加保留。每个当前问题最多确认一个旧问题,同一旧问题不能在同一当前任务内被多个问题确认;版本冲突要求刷新,不能静默覆盖他人决定。撤回不删除历史,确认不改变原指纹、发现置信度、风险复核或 MR 评论。查看及保存都检查两端报告权限交集;旧版误报/已修复状态仍不自动继承。仅检查最近20个同范围历史任务,每个结果最多1MiB,最多50条候选/每候选20条决定记录;达到限制明确提示,请人工打开原报告继续对照。建议为空不等于历史问题已经修复。
模型接口需要支持工具调用与 response_format: json_object。JSON 模式只约束语法,最终字段和证据仍由服务端严格校验;接口不支持时明确失败,不静默退回自由文本。
react.max_steps 表示模型决策轮次上限(2–100);Eino 内部模型和工具节点分别计步,服务端转换为对应有界图步数。工具调用和任务超时仍独立限制,最后一轮需返回报告。良性变化不作为漏洞发现;独立复核判断有害后果,不只是描述是否与代码一致。
系统设置的模型服务可设置 model_budget.max_tokens(0–10000000,0为兼容旧配置而关闭)。同一审计的主审、所有分组、汇总、独立复核与时序图共用阈值。提供商返回的用量达到阈值后停止新请求;单次请求可能超额,因此不是实际费用硬限额。用量缺失/无效或请求失败时阻止同一预算的后续请求,保留已有发现;流式调用不能绕过启用的预算。配置随任务冻结,修改后只影响新提交任务。自动重试保持独立结果,但同一自动重试链共享此停止阈值;子任务继承祖先已报告用量,未知用量或达到阈值时停止自动重试。
提交前运行 python3 scripts/check-staged-secrets.py,检查暂存文件中的凭据形态、本机已知密钥及私有配置/数据库路径。仅输出文件名,不输出匹配值;此检查不能替代人工差异检视。
任务详情提供按主审/复核/汇总/时序图阶段的用量和已知费用估算。model_budget.currency为空时不估算;可设置CNY/USD以及 input_price_per_million、output_price_per_million,价格随任务冻结。未知/失败请求显示用量不完整,不显示为完整零成本;未计算缓存折扣等供应商差异。当前尝试与自动重试链合计分别展示,不混算手动重审或选文件补审。
不同复核模型的价格可通过 model_budget.verification_pricing_configured 与 verification_input_price_per_million / verification_output_price_per_million 配置,币种沿用主审币种。不同模型且未配置复核价格时,总费用不予估算,详情解释缺失原因。主审、分组、复核和时序图仍共享同一token停止阈值。独立模型沿用现有API与凭据,不增加外部接收方。
任务详情的“选文件补审”先加载固定 BASE/HEAD 的变更清单,再选择最多100个变更文件新建独立任务。接口为 GET /api/v1/runs/:id/scope 和 POST /api/v1/runs/:id/followup,提交体为 {"files":["path/to/file"]}。只允许已结束且捕获了策略的父任务,项目必须启用,用户需要操作权限及 fork 源项目读取权限;排除文件、未知路径和跨目录路径不能绕过策略。相同父任务/规范文件集合的活动补审复用,配额仍生效。
补审保留原提交、来源仓库、diff版本和策略,不追随最新 MR。原任务结果和复核不改变;Agent 可读取整个固定仓库作为上下文,发现锚点仅限选定变更文件。结果及评论明确选文件范围,始终保留非全量覆盖说明。清单“纳入输入”不是完整审计证明;失败/未完成分组和预算省略可再选择。单个文件可按整行分片;超过分组总预算或含超长单行仍可能部分纳入,页面标明“部分差异纳入”,补审不会解除预算或证明其他文件安全。历史无策略任务需要重新提交。选择文件的父任务关联保存于捕获策略,和自动重试父子关系独立。
启用token预算时,请求发送前保存进行中用量检查点;完成/失败原位更新,避免重复计数。检查点失败或执行所有权丢失时阻止该次模型请求。失败/崩溃留下的未知用量不能按0处理,自动重试停止并保留父任务结果;Git阶段失败且未发起模型请求仍可按既有退避重试。默认max_tokens=0保持原有自动重试行为。retry_info.state新增model_budget_exhausted/model_usage_unknown,详情解释停止原因。详情retry_usage提供有界同身份重试链合计及各尝试;损坏的关联不扩大数据读取,也不隐藏当前任务详情,明确显示链用量无法核对。报告量和费用估算仍不是实际账单硬上限。
本轮开发策略版本为 eino-audit-contract-v14。历史报告保留原版本,不改写原证据;升级后旧策略排队任务拒绝执行并提示重新提交,旧策略不自动跨版本重试。版本隔离不代表当前1234已完成部署,实际发布状态以发布清单为准。
主审在每轮模型请求前按序列化消息及工具schema大小检查上下文;超过128KiB时通过Eino官方Summarization中间件摘要历史。该字节阈值是保守触发估算,不是供应商tokenizer的精确窗口计算。系统指令、固定快照和初始任务保留,原始源码观察/调查/反证/已接受发现仍保存在服务端。摘要仅作不可信导航,不能替代源码证据;需要时重新读取固定Git对象。压缩后112KiB上限,摘要16KiB、导航状态48KiB上限,最多8次;失败、容量不足或取消会明确中止并保留部分结果。此阶段与主审共享模型用量停止阈值,界面显示“上下文压缩”阶段,额外请求计入成本。主审、独立复核、时序图和跨组汇总各自使用独立压缩状态;复核摘要按实际复核模型和复核价格计价。压缩/用量停止的任务保留为incomplete,CLI仍非零退出。本轮加固已通过自动回归并部署;真实模型质量和外部环境验证边界见发布核对。
GitHub Actions在main/codex分支push及main PR执行Go测试/race/vet、27项当前Python工具测试、React类型检查/构建、官方govulncheck可达漏洞扫描、npm audit及嵌入应用构建。工作流仅只读仓库权限,无真实模型或GitLab凭据,无自动发布;远端执行结果独立记录,不能将本机通过冒充CI通过。
HTTP请求采用header10秒、整次读取30秒、写入60秒及idle60秒期限;审计在后台Worker进行,不延长HTTP连接期限。SQLite驱动升级至1.14.52,默认嵌入运行时3.53.4,继续单实例WAL和原有schema;更新前需要一致备份,不能用Go依赖扫描替代C库运行版本检查。





