Repository navigation
Releases
v0.9.12
目标侧指纹清理
- 资产补全 HTTP 探测不再发送
blade-enrich/1.0,改为中性浏览器 UA;可用
TARGET_USER_AGENT环境变量按客户环境覆盖。 - 自更新请求不再发送
blade-selfupdate,使用 HTTP 客户端默认 UA。 api-recon的harvest_static.py/spider_mpa.py不再发送spa-api-recon,
改为中性浏览器 UA(同样支持TARGET_USER_AGENT)。- OAST 回调标记从
blade<taskID>/bladetask改为中性的cb<taskID>/cbtask,
避免目标侧从回调 URL 识别平台。 - Norma 依赖升级:
WebFetch默认 UA 从norma/0.4改为中性浏览器,并支持
WebFetchConfig.UserAgent覆盖(Normade8aa8f)。
v0.9.11
全局战果与凭据台账
- 新增
GET /api/loot:跨任务分页查看 foothold / credential / artifact / footprint,
支持 kind/state/task/company/campaign 过滤;凭据只输出身份、指纹、可登目标,明文不经过该接口。 - 新增
GET /api/loot/export?format=csv|json:流式导出同一过滤条件;CSV/JSON 均不含凭据明文。 - 新增
GET /api/credential-attempts(分页/CSV/JSON):跨任务查看账号尝试(主机、账号、工具、
命令、是否成批、时间)。 - 新增「战果」页面(
/function/loot):战果与账号尝试两个 Tab,支持筛选、翻页、CSV/JSON 导出、
任务跳转;凭据明文仍需在任务内走受控 reveal。 - 数据库补充 partial index
idx_expnodes_loot与idx_cred_attempts_global。
计划任务运维台
- 新增「计划任务」独立页面(
/function/schedules):列表、启用/停用、立即运行、删除、
下次/上次运行时间与最近任务链接。 - 新增
GET /api/task-schedules/{id}/runs:按页读取schedule_runs触发历史
(计划时间、状态 created/failed/claimed、任务 id、错误原因)。 - 复用现有调度语义:立即运行是额外一次、不推进排期;停机不追补;停用清空排期而非删除。
交付包与报告分发
- 完整任务报告支持下载:
GET /api/report?format=md|docx。默认行为不变(内联 Markdown);
md/docx返回附件并带安全文件名;DOCX 由纯 Go OOXML 渲染,不引入 Chromium/LibreOffice。 - 前端报告页新增「Markdown」「DOCX」下载按钮,复用鉴权 fetch + blob 下载。
- SRC 批量交付不再在 500 条处静默截断:改为全量读取,
srcBatchPlan增加total。 - SRC 批量 ZIP 改为临时文件 +
http.ServeContent,避免大任务把整包常驻内存。 - 交付 ZIP 新增
manifest.json与SHA256SUMS:逐文件 sha256/size、跳过项及原因、
任务/格式/版本元信息;解压后可直接sha256sum -c SHA256SUMS。
修复
- 内置 deferred 工具(如
close_candidate)现在会加入会话的UnlockSet:此前有 MCP/技能时,
SearchExtraTools能查到 schema,但ExecuteExtraTool会报 “not unlocked in this session”。
planner/worker/主 agent 统一走mergeDeferred修复。
v0.9.10
移植 ARTEX 的统一报告实现:把同一缺陷的重复上报归并成漏洞文件夹,由报告 Agent 在读取
全部成员原始材料后生成一份统一报告;原始 finding 的报告、评级与证据始终保留。
新增
- Report Agent 的统一报告工具:新增
search_finding_duplicates、get_finding_record、
merge_finding_records、suggest_finding_merge、get_finding_case、
update_finding_case_report,默认绑定到 reporter。工具只在当前任务内操作;归并保留全部
原始记录,疑似分组 2–20 条提交人工确认而不是自动合并;已有案例会被 union 成同一个文件夹。 - 统一报告完整性校验:保存时必须包含有内容的概述、影响、前置条件、复现步骤、证据、
PoC、根因分析、修复建议,代码块必须闭合;评级依据必填,评级不得直接取成员最高等级。 - 案例版本与证据新鲜度:案例
version随任一成员 finding 修改或移出自动前进;统一报告
保存时 CAS 实际读取的version,report_version记录该版本。成员或原报告变化后旧版本写入
返回冲突并要求重新读取,不能只换 version 重试。案例详情、列表、「按漏洞」视图会显示
「统一报告未生成/已更新/待更新」。 - 统一报告导出:发现页导出新增「同一漏洞文件夹合并为一份统一报告」(默认勾选)与
「同时附原始子报告」。导出先展开完整案例并冻结成员证据,再合成为一条统一报告记录;
统一报告缺失或过期时明确标注,并附全部原始证据。Markdown 文件名、CSV 编号、JSON DTO
都标识案例与成员,zip 内统一报告仍复用已冻结的成员流量证据。 - Reporter 工作流提示:仅当 reporter 拥有案例工具时追加统一报告指引(合并须同根因、
疑似分组需具体共同点、版本冲突重新读取),worker 与关闭流量绑定的环境都不会收到该段。 - 数据层:
finding_case_version_changed触发器跟踪成员变化;MergeFindingCase支持
已有案例并集并遵守人工否决;SuggestFindingCase保存分组建议;FindingCaseID用于导出
展开;案例读取补齐成员原始报告。
边界
- 未移植 ARTEX 的「历史整理」评审运行(
finding_case_review_runs)与complete_finding_case_review;
统一报告由 reporter 在正常上报流程中生成,或由人工在案例对话框编辑。 - 统一报告是独立材料,不覆盖、不删除任何原始 finding 或报告;不改变探索/规划策略。
验证
- 新增回归:案例版本随成员修改/移出前进、旧版本保存冲突、空报告拒绝、完整章节校验、
案例并集与人工否决、Reporter 工具归并/建议/保存/跨任务拒绝、工具播种绑定、导出展开与
过期提示、原始子报告选项;Go 全仓测试与db/server/agent/reportrace 通过,go vet、
staticcheck、gofmt通过;前端tsc、59 个单测与静态构建通过。
探索流程切换为 ARTEX 实现
同一目标上 ARTEX 能完成、BLADE 默认 classic-hybrid 反复打转;本轮把 BLADE 的探索层直接
替换为 ARTEX 行为,而不是继续调参开关。
- planner 提示词:默认正文改为 ARTEX 的决策流程(硬底线、0 意图正当理由、
done/exhausted/blocked 复盘、开局只读探测 ≤3 次、深度优先、2–3 条不同机理路线、
TodoWrite 串行链、prove_goal 前量化核对)。移除混合骨架、槽位利用率、广度/台账/复盘/
收官/穷尽/升级阶梯/血缘/意图契约/摘要纪律等代码持有约束块;任务级自定义提示词仍优先。 - 调度:删除 anti-stall 补派与“连续 3 轮空转自动暂停”、supervisor 定时纠偏、
穷尽复核、goalless 遗留物收尾门;0 意图只按心跳/图变化继续等待,与 ARTEX 一致。 - 意图准入:
add_intent只保留 summary、parent 类型、资产可见范围与资产拦截校验;
删除 risk_area/kind/goal_id/uses_loot_ids/depends_on/requires/contract/幂等键/防打转/
队列上限/批量/开局粒度/收官提醒等门与回执。旧字段仍可解析但被忽略。 - 领取与完成:Frontier/Count/Claim 不再按 depends_on/requires 过滤,也不再按 owner
槽位亲和或同逻辑会话互斥拒绝;历史边与 payload 保留为只读数据。完成只由逐 goal
prove_goal(或 goalless frontier 抽干)驱动,无覆盖/深度/遗留物完成门。 - 设置面:设置页移除探索约束预设、队列倍数、收官审计与 supervisor 控件;旧的
profile/policy 数据保留但探索层不再读取。授权/资产拦截、guard、任务约束文本、写入栅栏、
租约/恢复身份、报告与证据功能保持不变。 - 迁移:启动时把 planner 当前正文切换为 ARTEX 默认(旧版本保留在提示词历史);已有
depends_on/requires 意图不再被阻塞,旧任务恢复后会按 ARTEX 顺序执行。
planner 探索入口补齐
- planner 补回 ARTEX 的三个探索入口:
report_finding(已确证漏洞可直接登记)、
add_task_scope、add_company_scope;老库通过一次性迁移补绑,执行类工具仍不回到 planner。 - 移除 planner 的 policy 提示段与穷尽复核反馈注入(探索层已无 policy/穷尽门);任务操作
constraintBlock保留。 - 未删除 BLADE 的战果、遗留物、痕迹、打法库、CVE、AD、opsec、长任务执行等能力;worker
工具面与写回保持原样。 - 前端同步删除探索策略/约束/审核员/收官审计/队列/穷尽复核相关控件与类型:系统设置「探索策略(全局默认)」、
任务创建策略覆盖、任务详情探索策略卡、穷尽复核展示及对应 API;授权范围、任务拦截规则、操作约束注入、
战果/遗留物/痕迹/打法库/CVE 等非探索 UI 保留。
主 agent 工具 schema 瘦身
- 新增
mainDeferredTools(22 项):足迹/遗留物补记与销账、CVE/打法/AD/opsec 查询、
重复漏洞合并、知识沉淀、凭据验证、出口切换等低频工具的 schema 不再随每轮对话发送,
需要时用SearchExtraTools取用。 - 报告核心写回保持常驻:
report_finding、record_fact、report_foothold、
report_credential、insert_assets,以及全部态势查询/意图/提示/目标工具。 - 工具实现与绑定不变;每轮约少 13,700 字符工具 schema。
worker 工具 schema 瘦身
- 新增
workerDeferredTools(18 项):足迹/遗留物销账、CVE/打法/AD/opsec 查询、
执行台账的检索/取消、出口切换、候选关闭等低频工具的 schema 不再随每轮 prompt 发送,
只把名字列进 deferred 块,需要时用SearchExtraTools取用。 - 高频写回与执行主路径保持常驻:
record_fact、report_finding、report_credential、
report_foothold、report_artifact、insert_assets、run/wait/get_execution等。 - 工具实现、绑定与 capability 不变;每轮约少 11,200 字符工具 schema。
- OAST 未配置、
loot_exec关闭时原有的运行期裁剪继续生效。
planner 工具面精简
- planner 默认绑定不再包含写回/动作类工具:
record_playbook、promote_knowledge、
merge_findings、rotate_egress、list_worker_traces。实现全部保留:前三者与
rotate_egress本就在主 agent/worker 上;record_playbook仍绑 playbook agent;
list_worker_traces保留在工具目录,可按需改绑。 - 只读知识查询继续留在规划层:
lookup_cves、lookup_playbooks、record_playbook_feedback、
ad_paths、opsec_notes,规划初期即可按资产/指纹查已有打法与 CVE。 drop_intent、link_intent_source、accept_artifact_risk、accept_footprint_risk、
list_footprints保留在 planner;worker 工具面不变。- planner 的 CVE 提示段改用只读版(不再教它调用 worker 的
cve_exploit);出口纪律按角色
区分 worker(可conclude_intent)与 planner/主 agent(只写回说明);态势提示中的
翻页工具改为search_all_worker_traces。 - 老库通过一次性迁移
planner_tools_slim_v1解绑上述 planner 默认绑定,不触碰其他 agent。
移除被拦退避纪律
- 删除
backoffDisciplineBlock(原始终注入 planner/worker 的「403/429/WAF 后如何退避、
最多重试几次、何时换方向」提示段)。被拦后的处置改由模型结合响应自行判断,不再由代码
规定重试次数与换向节奏。 - 出口代理纪律段保留(禁止绕过代理、出口不可用时的处置),它对应真实的 IP 泄露风险。
移除 P20 探索策略
- 删除
policy/包及意图层策略门、额度快照与拒绝留痕:add_intent只做参数、父节点、
资产范围与拦截校验,不再按内容或节奏拒绝意图。 - 删除策略端点
/api/settings/exploration-policy、/api/tasks/{id}/policy[/preview|/prune]
及server/policy_compile.go;任务创建/计划任务/LLM 任务接口不再接受exploration_policy。 - 任务结构、创建选项、DTO 与数据库读写移除
exploration_policy;tasks.exploration_policy
列保留在库中但不再读写,已有快照数据原样保留。 - planner/worker 不再解析或注入策略段;
policyResolver、policyBlock、SeedRedTeamPolicyDefault
与已无调用点的RecentPolicyRejects/LastIntentCreatedAt/CountIntents一并删除。 - 前端删除任务列表策略角标、
policy_*类型字段、policy_reject/policy_update标签与设置页
「探索策略额外禁止」空行;policy_blocked仅作为历史终态保留,当前代码不再写入。 - 命令门仍可由操作约束(P18)编译成任务级拦截规则;本次只移除探索策略这一来源与全部意图准入。
清理执行审核员与穷尽复核
- 删除运行时已无调用点的 supervisor(执行审核员)与穷尽复核实现、引擎字段/注入、设置字段与
/api/exploration/exhaustion-reviews路由;任务会话列表不再显示「审核 Supervisor」会话与相关活动标签。 - 保留 guard/拦截规则/人工审批(它们不是这两个审核),授权与任务约束不变。
验证
- 新增 ARTEX parity 回归:planner 提示/工具面无 BLADE 约束块;add_intent 最小 payload
直接成功且旧字段被忽略;Frontier/claim 忽略历史依赖与 requires;全仓go test -race、
go vet、staticcheck、gofmt;前端tsc、59 个单测与静态构建。
v0.9.9
修复意图结算回归,并把待领队列上限做成系统设置;同时让规划者已丢弃的意图退出默认
探索链路和摘要计数,但保留数据库节点、血缘与审计入口。
修复
- 非验证意图结算失败:非
verify意图的validated为 nil,json.Marshal得到
JSON null,jsonb_array_length('null')报SQLSTATE 22023,意图永远停在 running,
随后被租约回收、被规划者当成陈旧队列覆盖。结算前统一归一为空数组,并在 SQL 中按
jsonb_typeof保护;新增回归测试覆盖非验证意图正常落终态。 - 续跑意图被规划者删除:
drop_intent拒绝删除带resume_after_restart的待续跑
意图;compactIntents同时向规划者暴露resume_after_restart/resume_slot,
避免重启中断的方向被误判为普通陈旧队列。
新增与调整
- 待领意图上限可配置:新增系统设置
intent_queue_factor(默认 4×workers,
原硬编码 3×;范围 1–32)。规划者每轮现读,保存后下一轮生效,不需要重启;intent_queue
态势增加factor,soft_limit按当前值计算。workers仍按任务首次启动时固化。 - 已丢弃意图退出默认探索链路:「探索链路」不再绘制
state='deleted'的意图及其边;
播报板仍显示「已删除」与删除原因,时间线/node_detail仍可按 id 审计。 - 摘要计数排除已丢弃意图:
graph_overview.intents_total、blackboard_view.totals.intents
与任务总览「意图总数」不再计入 deleted;任务 893 的 19 条意图中 8 条已丢弃,显示为 11。 - 冷摘要不再折叠已丢弃意图:
structuralCold跳过deleted,避免已丢弃方向通过
cold digest 摘要重新进入上下文;历史 digest 正文不做自动重写。 - 不物理删除:deleted 节点、fact/finding 血缘与审计保持不变,避免
CancelIntent
级联误删独占事实/证据。
验证
db、agent、server全量测试通过;go vet、staticcheck、gofmt通过。- 新增结算空数组、续跑意图保护、队列倍数解析/设置往返、deleted 摘要计数与冷摘要排除测试。
- 前端 59 个单测与静态构建通过;设置页实际 chunk 已包含队列倍数控件。
v0.9.8
黑板探索的完整性与恢复可靠性:让模型看到的图变化是真实的、断点续跑的执行身份是稳定的、
证据知道自己从哪来以及何时失效。默认行为保持兼容——不填新字段的旧意图、旧调用仍按原规则领取。
新增
- 真实变更流:新增任务内单调的事件日志(节点/边/锚点/发现/证据绑定/豁免/约束),
事务提交时按探索 ID 升序发布,回滚不出版;纯心跳/租约续期不制造事件。blackboard_view
带change_cursor(ev1:任务:epoch:序号),覆盖节点状态更新、边与删除,而不只是新增节点。
epoch 变化或历史缺段返回resync_required,跨任务游标明确拒绝,不会把「读不到」伪装成「没变化」。
旧after/next_cursor保留为节点新增窗口的 legacy 语义,新调用应改用change_cursor。 - 一致快照与完整性契约:黑板概览、常驻上下文、联合账本、收官审计与图体检都绑定同一
read-only repeatable-read 快照,不再混用不同时刻的缓存;查询、Scan、Rows.Err失败显式
返回 unknown,不把失败计成零。各窗口节返回complete / truncated、精确总数与样本数;
30 秒图体检缓存与账本的 500/2000 行、5 条示例截断不再冒充总数,依赖环按循环强连通分量统计。
启动恢复中ResetRunningIntents失败会让任务循环不启动并报出原因,纯警告也如实进日志。 - 稳定恢复身份与写权威:意图持久化
logical_session_id与单调execution_generation。
首次领取按现有槽位/每意图设置绑定,之后暂停、跨槽接手、连续重启都沿用同一会话;共享槽位
的 transcript 以逻辑会话互斥,不会被两条意图同时执行。事实、发现、战果、检测、续租、
语义结论、验证资产与终态结算都在同一事务里核对 state+owner+generation+session;旧代次晚到
的写入返回ErrStaleExecution,不落库、不计数、不发送成功通知。正常终态与验证资产、阻塞
原因改为同一事务结算;异步长任务回调携带提交时的代次,旧回调不能唤醒或回收新 run;
租约看门狗按代次回收与取消,旧控制句柄不能 detach 新 run。战果/检测/开局事实的节点、锚点
与血缘边改为同事务写入,不再留下无法归因的记录。 - 证据元信息与关系:
record_fact可选evidence_meta(稳定 claim_key、实际观察时间、
有效截止、方法、适用资产、类型化的 activity/execution/finding_binding 来源引用)。来源必须是
本任务或直接关联任务里真实存在的记录;未知时间不伪造。新增contradicts(对称矛盾)与
supersedes(新→旧替代)关系,端点必须是本任务事实、替代不能成环,原件都保留;矛盾/过期/
被替代只在读取时给标记,不自动判定漏洞真假或写 negative。凭据目标可带实际验证时间与有效
期限,历史verified不会被抹掉,也不会被伪装成刚验证过。 - 可选数据前置条件:
add_intent支持结构化requires[](事实/能力/凭据,AND),可引用
本任务节点或按明确 claim_key/enables 声明尚不存在的条件。Frontier、可领计数、普通/paused/
槽位领取与真正领取事务使用同一判定;缺条件时仍是候选方向并返回具体缺项,不误标负面结论。
能力条件只认正向事实;凭据要求实测时需指定目标并满足时效。不填requires的旧意图行为不变。 - 可读状态:节点详情、黑板概览、常驻上下文与
node_detail会显示证据状态(观察时间未知/
已过期/有矛盾/已被替代)、显式前提缺项、逻辑会话与执行代次;凭据继续只印指纹与脱敏目标。
迁移与部署注意
- 新进程的数据库连接声明
blade.writer_protocol=2,未声明的旧连接写入图会被数据库拒绝。
升级必须先排空旧进程,不能让新旧写入器混跑;升级前应备份数据库,降级到旧写协议版本
时不能只回滚二进制。 - 迁移期间以受控 GUC 关闭事件捕获;结构指纹变化会更新 epoch,历史只建立基线,不虚构过去事件。
子系统需实例独占锁后才迁移,避免旧实例仍在运行时改结构。 - 共享槽位 transcript、classic-hybrid/enhanced 的派单/覆盖/收官/发散规则均未改变;
requires只对明确填写的意图生效,不构成新的机械探索门。
验证
- 隔离 PostgreSQL 上新增回归:反序/跨任务提交、回滚与提前 flush 后写拒绝、旧写协议拒绝、
epoch/缺段/跨任务游标 resync、并发外部更新下的快照一致性与查询/Scan 错误传播、
2105 条线索与 505 个战果的精确总数、双次重启会话不漂移与同槽互斥、旧代事实/发现/续租/
语义/结算/控制句柄全部拒绝、条件在竞争更新后失效时领取重查、凭据历史验证与时效、
畸形 requires 安全阻断、战果血缘原子性。 - 功能提交的 CI 已通过 Go 全仓
go test -race、go vet、staticcheck、gofmt与govulncheck。 - 前端 TypeScript 检查、node 单测与静态构建通过;本地已完成黑板数据库迁移、任务重载及
/api/health和前端静态资源验证。
v0.9.7
补上 0.9.6 重启续跑在优雅关停路径上的缺口:标记必须由关停分支自己写,不能指望启动重置。
修复
- 优雅关停也标记重启续跑:进程关停时
runIntent会在退出前把 running 意图 CAS 回 open,
并等 run 收尾;下次启动的ResetRunningIntents只重置仍为 running 的行(崩溃/SIGKILL 路径),
兜不到这些已回退的行,resume_after_restart/resume_slot从未写入。关停分支(含领取后
立即被取消的早退分支)改为调用新增的ParkIntentForRestart,回退 open 的同时直接落续跑标记
和原槽位;任务删除、暂停、租约回收仍保持原语义,不误标。
验证
- 端到端关停用例扩展断言:意图退回 open 时必须带
resume_after_restart,resume_slot等于
原槽位;实测日志输出「因进程关停结束,已标记重启续跑(槽位 1)」。 - 新增 DB 单测覆盖标记写入、槽位值与 CAS 幂等;相关
db/server测试、go build、
go vet、staticcheck全部通过。
v0.9.6
重启恢复的一版:worker 优先续跑重启前被中断的意图,而不是先领另一条排队意图从头探索。
修复
- 重启后优先续跑被中断的意图:
ResetRunningIntents给重启前仍在 running 的意图写入
resume_after_restart/resume_slot;FrontierForSlot优先领取它,worker 用原槽位
transcript 续跑,而不是先领另一条排队意图重新探索。领取后清除标记。 - 跨槽恢复:worker 池数量变化后,新槽位也能按
resume_slot找到原槽 transcript。
验证
db/agent/server全量测试通过;新增重启标记、排序、领取清除与跨槽恢复测试。gofmt/go vet/staticcheck干净。
v0.9.5
联网搜索与经典 planner 行为的一版:DeepSeek 官方搜索、Brave/DDG 回退,经典模式补回
ARTEX 的防停摆/开局/深度优先骨架;不恢复 BLADE 的广度债、台账、收官审计或 supervisor。
经典混合模式
- 补回 ARTEX 的 planner 骨架:经典模式增加防停摆硬底线(目标未达成且无 open/running
时必须至少产出一条)、1–3 次开局只读探测(有 worker fact 立即停止)、深度优先与
2–3 条机理不同路线;一次add_intent超过 4 条只返回batch_warning,不硬拒。 - 只补骨架,不加账本:不恢复广度债、探索/通路台账、收官审计、supervisor、复盘硬轮、
槽位补满或队列背压;增强模式行为不变。
联网搜索
- DuckDuckGo 202:搜索代理留空时,DDG 优先走平台出口代理(直连 DDG 容易被 202 限流);
设置页「测试搜索」与线上工具使用同一套代理回退。 - opencode Go 不支持服务端搜索:opencode 网关只做模型推理,不执行 Anthropic
web_search服务端工具。命中原生网关时自动回退到 DuckDuckGo,失败再回退 Brave 网页
(均经平台出口代理),不再静默摘掉web_search工具;deepseek来源在激活配置是
opencode 时同样回退。 - MissingSessionID:
deepseek来源复用激活 LLM 配置时,搜索请求现在会带上该配置的
CustomHeaders与SessionHeaderKey(如x-opencode-session),不再 400。 - 配置名匹配:opencode / commandcode 搜索配置支持前缀匹配(如
opencode-gs1可被
opencode来源使用);commandcode 配置缺失时回退 DDG/Brave 网页,而不是让工具不可用。 - Brave 网页(brave-html,免费无 Key):新增无 Key 搜索来源,抓取 Brave 公开结果页;
DDG 202 或主后端失败时自动兜底。Bing RSS、Mojeek、公共 SearXNG 实测结果不相关或
captcha,未接入。 - DeepSeek 专用搜索配置:
deepseek搜索来源优先使用名为deepseek/Deepseek
(或deepseek-*)的 LLM 配置,找不到才回退当前激活配置;可以专门建一个低成本
DeepSeek 搜索配置,不影响 planner 的激活模型。建议把该配置标记为「从模型池排除」,
这样主模型故障转移不会切到 DeepSeek,搜索仍按名字使用它。 - 测试回执:搜索测试返回
fallback_from,设置页提示原后端与回退后的实际后端。 - 搜索工具收口:planner / worker 不再注册旧的
deepseek_search/deepseek_fetch;
搜索统一走web_search(DeepSeek 优先),WebFetch仍是客户端通用抓取,不会被
DeepSeek 搜索配置接管。
验证
agent/server全量测试通过;gofmt/go vet/staticcheck干净;前端静态构建通过。- 实测 DeepSeek 官方
web_search、Brave 网页和 DuckDuckGo 出口代理回退;经典混合版硬底线与
态势标题已用 planner 输入回归验证。
v0.9.4
补齐发现处置与交付预检,增加工作区文件保护、运行体检和短时缓存诊断;同时统一
Token 汇总与实时事件顺序,修复提示词升级保护和覆盖豁免范围。不改变黑板架构、
经典模式的探索分组、模型配置或意图发散规则。
本次重发补充:缓存计量兼容(Norma v0.5.12)
- 升级正式 SDK:OpenAI 兼容 DeepSeek
prompt_cache_hit_tokens与网关
opencode.tokens.cache_read;Anthropic 标准缓存字段缺失时兼容同一网关读取字段。 - OpenAI 流式 usage 按请求内逐字段高水位合并,后帧缺字段不清零,累计值重复/回退
不双计;新请求与空响应重试独立。标准字段明确为零时不被更大扩展值覆盖。 - 无效/空扩展字段不会破坏标准用量,不猜测未知输入、输出或写缓存扩展的语义。
新增 BLADE 完整 Provider 路径的流式/非流式回归;不更改请求前缀、模型配置或探索策略。
使用与兼容提示
- 本次重发安装包已包含 Norma
v0.5.12。同名0.9.4安装包与校验值已重新生成;
已安装旧0.9.4的实例通常不会检测到同版本更新,请手动下载新包或从新源码编译,
并使用本次 Release 的SHA256SUMS校验。 - 新入口:系统 → 运行体检(
/system/diagnostics)。只读指标不会为采样主动请求
模型或目标;结构诊断默认关闭,页面可开启 10 分钟窗口(最长 30 分钟)。样本仅存进程
内存,重启即丢失;通过环境变量开启的诊断仍需调整环境并重启后关闭。 - 工作区现有文件写入需要读取返回的
version;同名上传先预览并提交确认的
expected_versions。旧脚本若依赖无条件覆盖,应更新调用方式;聊天附件独立命名不受影响。
这是乐观并发保护,不是对任意外部进程提供全盘写锁。 - 发现处置现在可以填写置信度、反证、补证缺口和撤回原因;SRC 导出有缺项时需要明确
确认仅下载草稿,原始证据不改写。升级不会猜测回填历史缺失用量或已丢失的追加段。
实用功能:处置交付、工作区保护与运行诊断
- 发现处置:全局列表、任务发现与详情共用状态/置信度表单;排除、补证和撤回要求填写对应依据,不改原始证据。
- SRC 下载前预检:先展示报告与证据缺项;有缺项时显式确认仅下载草稿,保留人工决定、不强制阻断导出的原有语义。
- 工作区保护:读取返回版本,小文件按内容 SHA256 校验,大文件按大小/纳秒修改时间确认覆盖;现有文件写入必须提供版本,同名上传先预览确认。
写入暂存后原子替换,并在替换前再次检查版本;文本编辑冲突保留草稿,离开/关闭提示未保存内容。聊天上传继续使用独立命名,不受覆盖确认流程影响。 - 运行体检:新增只读页面,展示资源、数据库等待、活动入库失败、HTTP 与模型延迟指标,并可跳转日志。
- 缓存诊断:逐调用计量无需录制正文;结构诊断默认关闭,可手动开启 10 分钟窗口,到期自动关闭。
仅保留进程内近 30 分钟、最多 256 条结构哈希/长度/断点与白名单 usage 数值,重启丢失;不修改请求、模型或探索策略,不存正文、头或凭据。
首个诊断样本不冒充模型会话首调,无样本/证据不足明确标记原因未知;原始累计 usage 帧不能与计量台账相加。
缺陷修复:实时流、提示词迁移与审计豁免
- 活动流乱序漏帧:同一探索的活动在取得序列 ID 前获取事务级顺序锁;普通活动、
漏洞跟进事务及意图删除的计量 rollup 共用该锁。SSE 把广播当作唤醒信号,从数据库按
已提交 ID 补齐记录,先广播较大的 ID 也不会跳过较小的已提交事件;保留有界重放和重连。 - 跨任务历史串入:历史首页、较早页与首屏引导请求都有独立生命周期;切任务/卸载时
统一取消,迟到成功、失败、分页和滚动回调不能改写新任务。标记不再复用归零后的数字。 - 提示词升级保留用户追加段:正文迁移使用 SavePromptWithAppend,保留 append_text;
新旧迁移共用精确内置正文判定,不再因为自定义正文含“槽位利用率”等词就整份重置;
读取或保存失败不置迁移完成标记。已丢失的历史追加段不擅自回填。 - coverage 豁免范围:只有未指定资产和风险类的豁免才能跳过整个覆盖审计;单格/
单资产/单风险类豁免只作用于匹配范围,其他失败格与浅资产仍会阻断。审计深度门识别
精确豁免,但 DoneAreas/覆盖计数不会把豁免冒充实测结果。 - 迟报缓存及累计输出计量(Norma v0.5.11):输入、缓存读写和输出逐字段维护请求内
高水位,仅发增量;start 已报 input 时,delta 仍可补报 cache,重复累计 output 不双计。
历史缺失用量不自动估算回填。 - P20 race 竞态:策略停摆出厂参数改为常量,测试使用独立 Engine 配置,不再修改
仍在运行的协调器共享参数。
修复
- 单任务详情指标:
GET /api/tasks/{id}复用任务列表的指标填充逻辑,Token、
目标进度、运行中 Worker、漏洞分级与最近活动不再返回未填充的默认零值;
Token 仍按已结算result汇总,不重复计入usage或工具事件。 - 会话 Token 实时汇总:完成合计、会话边界与最新未结算 usage 从同一数据库快照返回;
前端按事件 seq 合并,修复轮询先到时重复加、SSE result 先到时暂时少计,以及刷新后漏掉
未打开 Worker 会话已有的 usage。重复/乱序帧与旧轮询响应不会回退计量水位。 - 无样本命中率:仪表盘与会话页统一为
—(不再把零输入显示为 0.0%);非有限值不伪造
百分比,缓存读大于输入显示“数据异常”。
排障
- 新增默认关闭的
BLADE_LLM_CACHE_DEBUG=1:只记录请求结构哈希/长度、缓存断点位置与原始
usage 数值,不记录提示词、目标内容、响应正文或凭据。用于区分 Planner 零命中的前缀变化
与兼容网关迟报字段;本次不更换模型/探索策略,不宣称已定位或修复真实 Planner 全零命中。
v0.9.3
探索质量与计量正确性的一版:planner 提示词重写瘦身、有界视图可关、兼容网关的输入/缓存
计量修复,并补齐 0.9.2 之后的意图契约与有界黑板视图。
行为变更(请留意)
- planner 可编辑正文由 21.7KB 重写为 4.8KB;增强纪律(开局摸底/补位/广度/台账/复盘/
收官/升级阶梯)全部由代码持有块按开关注入——经典模式装配 34.2KB → 17.2KB,增强
47.5KB → 30.5KB。正文保留影响正确性的语义规则(意图终态与重派口径、否定观察的
evidence 门槛、战果 outstanding、量化目标验收、串行链拆链、按需取细节)。 - 首次启动会把仍是历史内置正文的 planner 正文迁移到 v3(按 sha256 识别 v0.7–v0.9
与首版瘦身 v2);用户自己编辑过的正文不覆盖。领域模板每次启动刷新内置行正文。 - 新增设置「执行与并发 → 态势视图 → 有界黑板视图」,默认开启(与 0.9.2 行为一致);
关闭后 planner 每轮预取完整态势、graph_overview无参也返回全量。
本次更新
- 意图契约(软):
add_intent增加可选contract(mechanism / route / produces /
acceptance / class / estimated_tokens / variant / change_evidence / recheck_of)。
显式给mechanism才参与方向去重:同目标 + 同资产 + 同机制 + 同variant直接返回已有
意图;要重开必须用variant + change_evidence说明材料变化。缺省完全沿用旧行为。 - 有界黑板视图:
graph_overview默认返回有界视图(真实 totals 与窗口分离、revision/
事件游标、路线聚合、活动意图契约),detail=true回到完整态势;新增
blackboard_view(after, limit)只看增量事件。planner 每轮预取改为有界视图。 - 有界视图开关:
planner_bounded_view(设置页「态势视图」)可关闭,关闭后不再裁剪;
每轮现读,改完对下一轮规划生效。 - planner 提示词重写:正文不再引用经典模式被裁掉的字段(intent_queue / breadth /
leads / ledger / chains),也不再把"硬底线/补满槽位"写进经典模式。 - 领域模板改为组合:共享正文 + 5 段领域片段(视角/高价值事实/达成判据/方向侧重/
禁忌),落库仍是完整正文;每份约 25KB → 8.7–11.1KB,改骨架不再需要同步 7 份。
旧正文与装配结果逐字备份在docs/prompts/planner/(含 v2 与恢复步骤)。 - 兼容网关的输入/缓存计量(Norma v0.5.10):官方 Anthropic 在
message_start报输入
侧,部分兼容网关(opencode 等)start 全 0、真实输入只在message_delta。此前只认
start,这类部署的 input/cache 恒为 0,会话页「入/缓/出/命中」因此缺失。现在 start 已报
输入时仍忽略 delta(不重复计数),start 全 0 时由 delta 补齐一次。 - 测试修复:契约用例的
risk_area改用词表内值(recon是 class 标签,不是风险类);
序号断言加空格边界,避免全局 id 到四位数时误命中。
验证与限制
功能提交:1a6866b(意图契约/有界视图)、3ce485d(视图开关)、ac54a60(Norma 升级)、
c73e590(提示词 v3 与迁移)。已在独立 PostgreSQL 测试库通过 agent / db / server 全量
测试与 -race,gofmt / go vet / staticcheck 干净;前端 tsc --noEmit、43 项单测与
静态构建通过;Linux amd64 本地编译通过。
验证范围限于上述检查:提示词效果未做真实任务集 A/B(尤其"精简版是否降低探索质量");
关闭有界视图的 token 成本未量化;缓存命中率取决于网关是否上报
cache_read_input_tokens(opencode 的 DeepSeek 端点目前回 0,属上游行为)。