docs: remove internal process journals and organize public guides

This commit is contained in:
Ed1s0nZ committed 2026-10-16 16:59:01 +08:00
1 parent 3eecedb2af
commit 63955c4d30
24 files changed
+64 -810

No files matched your search

+21
View File
@@ -20,12 +20,18 @@ CyberStrikeAI documentation is organized by user journey. Start with deployment,
- [Agent 与角色](zh-CN/agent-and-role-guide.md)
- [Skills 指南](zh-CN/skills-guide.md)
- [Eino 多代理](zh-CN/MULTI_AGENT_EINO.md)
- [黑板与上下文记忆](zh-CN/blackboard-context-memory.md)
- [Agent 最终回复治理](zh-CN/agent-finalization-best-practices.md)
- [工作流](zh-CN/workflow-graph.md)
- [调用拦截规则](zh-CN/tool-call-guard.md)
- [工具执行治理](zh-CN/tool-execution-governance.md)
- [人机协同最佳实践](zh-CN/hitl-best-practices.md)
### 功能指南
- [资产管理](zh-CN/asset-management.md)
- [项目任务续接](zh-CN/project-resume.md)
- [Token 用量分析](zh-CN/token-usage-monitoring.md)
- [知识库](zh-CN/knowledge-base.md)
- [RBAC 权限管理](zh-CN/rbac.md)
- [机器人接入](zh-CN/robot.md)
@@ -59,11 +65,13 @@ CyberStrikeAI documentation is organized by user journey. Start with deployment,
- [Skills](en-US/skills-guide.md)
- [Eino Multi-Agent](en-US/MULTI_AGENT_EINO.md)
- [Workflows](en-US/workflow-graph.md)
- [Tool Call Guard](en-US/tool-call-guard.md)
- [Tool Execution Governance](en-US/tool-execution-governance.md)
- [HITL Best Practices](en-US/hitl-best-practices.md)
### Feature guides
- [Asset Management](en-US/asset-management.md)
- [Knowledge Base](en-US/knowledge-base.md)
- [RBAC Administration](en-US/rbac.md)
- [Robot / Chatbot](en-US/robot.md)
@@ -85,3 +93,16 @@ CyberStrikeAI documentation is organized by user journey. Start with deployment,
- Commands assume the repository root unless stated otherwise.
- Examples use placeholders; never commit real credentials or target systems without explicit authorization.
- Runtime behavior and configuration defaults are authoritative in `config.example.yaml` and the source code. If a document differs, report it as documentation drift.
### Public documentation scope / 公开文档范围
- 公开文档面向用户和贡献者,保留使用指南、稳定接口与架构说明、兼容性说明和发布记录。内部任务阶段记录、对话确认、一次性核查表和本地验证流水账应保存在仓库外,不作为产品文档提交。
- Public docs serve users and contributors: usage guides, stable API and architecture references, compatibility notes, and release records. Keep internal task journals, conversation approvals, one-off review sheets, and local verification logs outside the repository.
- 中英文目录以各语言索引为准。仅有中文版本的指南会在下方明确标注,英文译文尚未提供。
### Additional guides (Chinese only)
- [Agent finalization](zh-CN/agent-finalization-best-practices.md)
- [Blackboard and context memory](zh-CN/blackboard-context-memory.md)
- [Resuming project tasks](zh-CN/project-resume.md)
- [Token usage analysis](zh-CN/token-usage-monitoring.md)
-168
View File
@@ -1,168 +0,0 @@
# Bug 表核对与修复
范围:2026-10-06 用户提供的 Bug记录表.xlsx。只修复当前仓库已有功能的已确认缺陷。表内命令和建议只作为待核实证据。
## 工作流与维护门禁
- 阶段:P10 缺陷修复。既有代码、接口、测试为上游依据。
- 分支:codex/bug-sheet-fixes;完成验证后合入 main。
- 维护策略:narrow_fix。对大文件仅做局部修复,新增测试放独立文件,不做广泛重构。
- 验收:复现/代码证据确认问题;针对性回归通过;相关包和全仓检查;提交仅包含修复、测试、文档,不包含真实配置或凭据。
- 生命周期记录合并到本文,避免针对同一缺陷制造无关阶段提交。
## 已确认待修复
| 表内条目 | 证据 | 修复计划 |
| --- | --- | --- |
| C2 wait/cancel 资源权限 | handler 直接按 ID 查询和取消,缺少 c2ResourceAllowed | 与同模块接口一致,先校验任务访问权限,再执行 |
| 32 纯文本批量/机器人任务缺少执行证据 | batch_queue_executor 和 finalizeRobotAgentSuccess 显式传 true | 与普通对话的默认策略一致,允许无工具文本回复,保留 pending/HITL 检查 |
| 30、31 角色名路径字符/长度 | 名称未校验,文件名会转换,存在碰撞 | 拒绝路径和控制字符、首尾空格、超过 64 字符及文件名碰撞 |
| 工作流悬空引用 | 角色保存与工作流删除均未检查引用 | 保存时验证存在;删除引用中的工作流返回冲突 |
| 4 登录用户名为空 | 前端无 required,后端空用户名默认 admin | 登录接口及页面拒绝空白/超过 64 字符用户名 |
| Profile UA/响应头/Jitter 保存丢失 | 前端 snake_case 与后端 camelCase 不一致 | 对齐 JSON 字段;保留 0;拒绝负值/倒置范围 |
| 22 取消后显示成功 | 回传结果无条件更新任务终态 | 终态保持不变;取消和结果写入使用状态条件检查 |
| 同 UUID 旧连接断开误判离线 | WS defer 无条件删当前连接及标记 dead | 仅当前登记连接可以删除并退役会话,结束心跳 goroutine |
| 23 WebShell 目录路径及假条目 | normalizeWebshellPath 删除根斜杠;权限兜底正则接受 ls 错误行 | 保留 Unix 绝对路径;树/面包屑/父级保持绝对路径;只接受权限格式目录项 |
| 6 查看通知未清计数 | 查看回调只跳转 | 查看普通事件后标记已读并刷新;待审批通知仍保留待处理状态 |
| 13 配置接口明文返回 API Key | GetConfig 序列化真实配置 | 返回掩码;保存时按原配置路径还原;模型测试在服务端解析指定通道凭据 |
| 19 WebShell 口令明文回显 | 列表和创建/更新响应返回 Password | 响应掩码;保存时保留/替换/清空;执行按有权限的 connection_id 取服务端凭据 |
| Markdown 智能体字段与重复 ID | 保存缺少关键字段和 ID 唯一性检查 | 创建/更新统一校验 name、ID、指令;ID 不允许文件间重复;创建使用排他文件写入 |
| 辅助文件编辑描述丢失 | 辅助文件保存接口不更新 SKILL.md 元数据 | 辅助文件禁用描述编辑;描述未保存时阻止切换文件,提示先保存 SKILL.md |
| C2 终端输出粘连/尾部分号语法错误 | Unix 探测直接追加 `&& pwd`,结果按最后一行切分 | 使用随机分隔标记和换行探测,保留用户命令的输出及退出状态 |
| 事实正文的关系语法未生成图谱 | 关系字段是显式结构化输入,普通正文不是通用关系解析器 | 按问题表给出的替代方案,明确提示关系应填写到关系字段;保持既有正文语义 |
## 不适用
当前仓库未实现的用户容器并发配额、容器生命周期和容器释放后重新调度,不添加对应实现。
## 验证
- `go test ./internal/handler ./internal/app ./internal/agentfinalizer` 通过。
- 新增 C2 跨用户禁止等待/取消、所有者正常操作、机器人纯文本交付、角色名称边界、工作流引用、登录用户名测试。
- 前端已有测试存在 HITL 断言失败,正在核实基线;未修改 HITL 脚本。
- 当前尚未完成全部表内条目核对,也尚未合入 main。
- `go test ./internal/c2 ./internal/database` 通过;新终态保护及连接替换测试通过。
- Profile API 持久化/无效 Jitter 测试和前端实际提交字段测试通过。
- 前端 HITL 断言问题在原始提交 82b0af1 的隔离导出目录也可复现,属于基线问题。
- `go test ./...` 全仓通过。
- WebShell 路径、错误输出、目录树测试与通知查看/待审批区分测试通过。
- 配置凭据处理保留既有字段与空字符串清除语义;掩码标记只用于已保存的同路径凭据,新通道不能直接保存掩码。通道探活新增可选 `channel_id`,模型列表/审查测试支持可选凭据范围,避免同 URL 多密钥选择错误。
- 新增 GET 配置不泄漏/不变更内存、掩码保留/替换/清空、歧义拒绝、WebShell 回显及执行凭据、Markdown 创建/更新唯一性、技能描述切换测试。
- C2 Shell 回归只提取模板中的 Shell 辅助函数,不运行传输循环。验证无换行、有换行、尾部分号、注释、失败退出、带空格目录切换;Unix 系统通过,Windows 路径未修改。模板修复适用于重新生成的客户端。
## 追加:输入校验、权限入口与回传归属
- Excel 第 40 行:权限管理页三个新建角色/添加成员按钮补上 `rbac:write` 标记,复用现有隐藏、禁用与点击守卫。前端用权限被拒绝的真实守卫验证入口不可见且不可点击。
- Excel 第 41 行:并发数内联编辑对空值、小数、0、9 等明确报错并保留编辑框,不发送请求;队列元数据更新在任何修改前拒绝越界值。保留旧配置加载时的归一化行为。
- Excel 第 42 行:项目设置前端和更新 API 均拒绝空/纯空格名称;API 省略名称仍允许部分更新,拒绝时描述等字段不发生部分保存。
- Excel 第 44 行:后端 URL 补齐使用 `IP 非空` 作为分支条件,导致已由前端解析的 IP 被再填入 Domain。改为先判别 URL 主机类型再补齐缺失 IP;IPv4、IPv6 预填及仅 URL 三条数据库保存回归通过。第 22 行截图与第 25 行为同一 WebShell 路径丢失/错误文本条目问题。
- Excel 第 36 行:WebSocket 与 TCP Beacon 回传按连接已登记的会话和监听器校验;HTTP 回传及取任务先校验监听器;已有 UUID 不允许通过其他监听器重新登记改变归属。未授权回传不能更改任务状态、结果或产生完成事件。HTTP 同监听器下的会话认证尚待继续核对,本项不标为全部完成。
- 验证:`form-validation.test.cjs` 4 项通过;项目空名称无部分保存、并发数非法无修改、IP URL 入库及结果来源拒绝均新增回归。全部包回归在提交前再次执行。
## 追加:工作流与现有行为核对
- Excel 第 26 行:新建工作流 ID 限制为以字母/数字开头,仅含字母、数字、下划线、连字符,最多 128 字节;重复 POST 使用数据库原子插入保护,返回 409 且不改变旧版本;PUT 不得更改 ID,不存在目标返回 404。已存储的旧格式 ID 仍可原位编辑。
- Excel 第 31 行:工具 arguments 先解析 JSON,再递归展开字符串中的 `{{inputs...}}` 等模板,避免带引号/换行的值破坏 JSON;显式字段绑定保持优先。实际工作流调用测试工具,验证传入值已展开且原始引号完整保留。
- Excel 第 45 行:流式和非流式入口统一使用工作流自身状态进行最终回复检查,不强制要求本来不应存在的工具执行记录;实际 start→output 流程能完成,真实 HITL 暂停/拒绝流程保留 awaiting_hitl/cancelled 和拒绝原因,不变成 missing_execution_evidence 或成功。
- Excel 第 62 行:列表/详情 API 附带图校验错误;前端将错误显示为“校验未通过”及错误色,当前选中草稿的本地校验变化同步更新列表与画布标题。配置的 enabled 值保留,以免验证展示改变用户保存的数据。
- Excel 第 11 行:当前 HTML 的 `fact-modal-summary` 标注“摘要(索引一行)”,`saveFactModal` 读取 summary 并必填检查,已存在原描述称缺失的字段。第 16 行是跨项目去重建议,当前 `list_vulnerabilities` 按授权项目/会话列举以避免重复,不新增跨项目合并。第 17 行原记录已注明没有点击保存;当前 tool-guard 草稿变更有未保存标识,只有保存动作 PUT 才改变服务端配置。
- Excel 第 57 行:执行当前 `resetAuditLogFilters` 与查询参数构建函数,验证关键词、类别、动作、结果、时间条件全部清空,页码回到 1,模板按钮调用此函数。原描述在当前实现未复现。
- 验证:新增工作流保存/API 校验、纯文本与 HITL 实际运行、实际工具参数传递、列表标记和审计重置回归;后端完整测试及新增前端测试在提交前执行。
## 追加:密码表单反馈与传输核对
- Excel 第 3、6 行:登录空密码通过自定义校验展示原因并聚焦字段,编辑后清除旧错误;显示/隐藏密码按钮在关闭或重新打开登录时恢复隐藏。修改密码显示当前密码必填、新密码长度与确认不一致的具体原因,服务端失败也保留在表单中。
- 四项真实脚本回归通过;隔离预览使用实际模板片段与样式,在 375px 登录布局和桌面密码表单中验证提示、焦点和按钮。预览未使用真实账号凭据。
- Excel 第 4 行:HTTP 下请求体可被截获,属于部署传输配置风险。当前服务已有 TLS、HTTP 到 HTTPS 重定向和同端口协议分流;现有 TLS/重定向测试通过。应在部署中启用 HTTPS,未加入额外客户端加密协议或改动凭据配置。
## 追加:资产语言与导入兼容
- Excel 第 8、9 行:截图与模板对照证明灰色 CN/Beijing 是 placeholder,省市是手工输入,不是时区识别结果。示例增加中、英、俄翻译;不修改用户保存的地理字段,也不新增地区识别或联动能力。
- Excel 第 10 行:CSV 与 XLSX 表头采用当前语言,环境、重要性、状态与已知风险等级显示本地化标签。原始地址、地区、项目、标签、未知枚举值保持原样。导入兼容旧英文列名与当前语言的导出列名、枚举值。
- 验证:7 项测试通过,包含使用仓库内实际 SheetJS 生成和读取 CSV/XLSX,再调用真实导入解析;中、英、俄三种语言均验证地址、项目归属、带引号/换行标题、标签和枚举值不丢失。
## 追加:监听器表单与保存入口
- Excel 第 50 行:编辑保存使用 document 点击委托,但 c2-modal 内层 inline stopPropagation 阻止按钮到达委托。移除内层阻断;背景关闭本来已检查 event.target===this,不会因内部点击关闭。验证实际委托分发到真实 saveListener 后发送 PUT 并在成功后关闭。
- Excel 第 23 行:名称、类型、端口增加必填标识;创建/编辑均提示并聚焦具体错误字段,端口仅允许 1–65535 整数,不再接受 parseInt 的小数或尾随文本。网络/响应解析失败显示错误并保留表单。
- 编辑 API 在修改字段前检查空名称和端口范围;数据库回归验证非法请求不部分保存、合法编辑正常落库。5 项前端测试和针对性后端测试通过。
## 追加:回连地址生成校验
- Excel 第 52 行:截图中的 `bad host/abc` 原先会直接拼入 URL。单行生成与 Beacon 构建均在生成前校验 IP/DNS 主机名,拒绝协议、路径、端口、空格、非法数字 IP 与命令片段;不执行 DNS 查询,也不改变地址解析优先级。
- URL 以监听器协议生成,HTTPS 使用 https;IPv6 使用 net.JoinHostPort 补齐方括号,普通域名及 IPv4 保持原格式。
- 主机校验覆盖全部单行类型;真实 API 验证非法输入返回 400、合法域名与 IPv6 正常生成,测试仅使用 test-only-token。
## 追加:重复包提示与关联事实查看
- Excel 第 28 行:现有预检已经区分相同内容和 ID 冲突,后端跳过/保留不会覆盖本地数据;确认动作仍用于记录冲突处理。按钮明确改为“确认跳过导入”或“确认保留本地版本”,结果分别显示“已跳过导入”“已保留本地版本”。创建、覆盖确认及另存语义保留。14 项既有与新增包导入测试通过。
- Excel 第 15 行:关联事实入口原先先切到 facts 并清空筛选,改为留在当前页面查询并直接打开详情;无关联只提示,多条取消也留在原页。4 项实际函数回归覆盖单条、空集合、多条选择/取消和 API 失败,不再发生列表导航或筛选重置。
## 追加:知识库索引提示与工具挂载核对
- Excel 第 53 行:原截图的服务错误明确为 401 Unauthorized/Incorrect API key。页面改为按认证、权限、限流、超时、网络错误给出对应检查建议,保留原错误供定位;未知错误不推断原因。状态 API 不再五分钟后隐藏失败,下一次索引由现有 resetLastError 清除;空知识列表也显示已有失败。实际状态渲染与错误保留回归通过。
- Excel 第 54 行:当前启动、动态初始化及 ApplyConfig 路径均注册知识检索工具;真实 RegisterKnowledgeTool + Agent.ToolsForRole 验证默认角色和显式允许角色均含搜索/风险列表定义,显式不允许角色不被绕过。截图只有模型回复,缺少当时启用配置、工具目录和角色列表,不能据此证明当前注册缺陷;本项标为当前未复现,保留历史证据不足的限制。
## 追加:nmap 参数拼接
- Excel 第 47 行:截图显示 NSE 将 `-sT` 当作脚本名,原因是 scan_type 根据“最后一个非标志参数”找插入位置,遇到 additional_args 的 --script 值时插入到了标志与值之间。nmap 的 scan_type 改为置于参数列表开头,保留各 flag/value 相邻关系;其他工具的既有插入规则保留。
- `-sC` 与 --script 不是互斥错误;官方说明明确有 --script 时忽略 -sC,故不新增错误拒绝规则。来源:https://nmap.org/book/man-nse.html 。
- 读取真实 tools/nmap.yaml 验证截图参数、nse_scripts 字段和尾部 --max-retries 值的完整顺序;既有空可选参数测试通过。测试不向目标发送扫描;本机没有 nmap,因此不声称完成实际扫描验证。
## 追加:批量队列结果标签
- Excel 第 58 行:截图的子任务为 failed,队列 completed 表示所有子任务已经结束;绿色“已完成”和 100% 被误认为全部成功。列表和详情共用展示函数,现在全部失败显示失败色及“执行失败”,部分失败显示“已结束(N 项失败)”,详情解释进度统计结束任务,包含失败/取消。后端生命周期和重跑规则不变。
- 3 项实际展示函数回归覆盖全失败、混合结果、成功、运行中及已有周期队列的后续运行信息;不扩展调度能力。
## 追加:Agent 取消竞态与最终事件
- Excel 第 24 行:AgentTaskManager 原先允许取消之后的 UpdateTaskStatus/FinishTaskRun 覆盖终态。明确用户取消增加单向取消标记,晚到的 running/completed/failed 更新及 completed 收尾仍保存 cancelled;“中断并继续”不设置该标记。
- 主 SSE 收尾从实际已保存任务取 status,保留原消息字段且不修改调用方对象;前端 done 不再一律覆盖为成功标题,取消/失败/超时/清理异常使用实际结果,取消时遗留工具调用标记取消。任务 eventBus 本来已有真实 status,保持不变。
- 新增取消晚到更新、正常继续、done 实际状态与前端展示回归;完整 handler 包测试通过。Excel 第 60 行仍需审批等待中断的完整路径验证,暂不声明该历史场景全部完成。
## 追加:审批等待取消的闭环验证
- Excel 第 60 行:真实数据库中创建会话/助手消息,启用人工审批,实际 waitHITLApproval 发出 pending 后通过 AgentTaskManager 取消;验证等待返回 context.Canceled、审批记录 cancelled、任务从活跃列表移除、历史与 done 均 cancelled。测试不调用真实模型或扫描目标,因此证明审批/任务收尾路径,不能重建截图中的远端模型过程。
- done 分支的进度控制按钮也按终态显示,不再再次写“已完成”。真实分支执行验证取消、失败和成功标题、控制文案与遗留工具状态;保留已收到工具终态的结果。
### 列表标签布局(表格第 12、13、43 行)
事实列表置顶和关联信息改为统一的可换行容器,关联漏洞 ID 增加明确标签及完整 ID 提示。资产项目标签原最大宽度 180px 超出 126px 列宽,现限制为单元格内容宽度并显示省略号及完整名称提示。使用实际样式表和代表性长名称进行本地浏览器布局检查:项目标签宽 98px,右边界位于单元格内,相邻归属文本保持可见。此检查覆盖标签布局,未作为完整应用流程验证。JavaScript 语法与 diff 检查通过。
### 工作流节点文字边界(表格第 27 行)
默认空白换行不能拆分连续中文,固定 52px 高度也无法容纳长标签。现允许按字符换行,普通节点按标签高度扩展并保留最小高度与内边距;条件节点扩大到 150px,文字超过安全宽度时省略,完整值仍在节点属性面板。使用仓库 Cytoscape 与实际节点样式在本地浏览器检查截图中的中文标签及连续长标签,确认节点内显示。相关 13 项工作流测试、语法和 diff 检查通过。换行属性依据 https://js.cytoscape.org/ 官方文档。
### 侧栏标题及仪表盘项目标签(表格第 2、18 行)
最近对话标题的 flex 子元素填满剩余空间,但原生按钮默认文本居中,导致标题偏向中间。增加明确左对齐。第 2 行截图未提供其他可识别重叠证据,未重新设计侧栏。仪表盘项目标签使用居中 inline-flex 时长文字会首尾裁切且不产生省略号,改为普通块级文本截断,完整名称保留既有 title。实际样式表与代表性 DOM 在 1280px 和 375px 视口下验证:标题左对齐,长项目名称尾部省略,相邻文本可见。此验证不覆盖完整应用交互。
### 工作流进度及已有工具超时配置核对(表格第 29 行,继续核对)
当前 Agent 回调会转发 iteration、tool_call、tool_result 并附带工作流及节点标识,新增回归测试确认此路径;原截图没有运行日志,尚不能确认历史零进度原因。发现已有工具节点 timeout_seconds 虽校验却未执行,现将配置期限传给 MCP 后台执行服务的硬超时,兼容后台等待分离机制,不影响未设置期限的任务。实际慢 MCP 工具测试确认 1 秒期限触发失败;执行服务测试确认等待方取消不抹掉明确期限、不延长已有更短硬超时、期限后迟到成功保留 hard_timeout 及结束时间。工作流和 MCP 包测试通过。此修复不宣称解决 Agent 节点历史全程零进度,也未新增 Agent 超时配置。
### 单资产有限核验范围和写回提示(表格第 48 行)
默认单 Agent 系统提示中的持续深挖、穷尽攻击面和赏金门槛要求,与只读连通性/指纹任务完成条件冲突。现以本轮目标限制执行深度,403/认证失败等按核验目标如实报告,达到目标后结束,仍保留明确全面评估任务的验证要求。自定义资产模板此前替换掉默认模板中 complete_asset_scan 指令,现保留用户模板内容并追加完成后的现有记录动作,不增加探测范围;已有写回指令不重复。新增前端测试验证限定核验模板、资产 ID、写回提示及无额外漏洞/弱口令探测提示。Agent 包测试、资产工具和数据库测试通过,后者覆盖实际 complete_asset_scan 回写时间、会话及漏洞数量。未运行真实模型探测,提示修复不能证明所有模型均会及时结束;历史长时间行为仍保留验证限制。
### HTTP 文件上传归属检查(表格第 36 行扩展路径)
HTTP 上传端点此前只验证共享监听器凭据与任务 ID 路径,未校验任务会话归属。现上传前查询任务及其会话,拒绝其他监听器任务。回归测试验证外部监听器不能覆盖已有文件、所属监听器正常上传可用;原路径安全测试增加真实任务/会话夹具。C2 包测试通过。文件下载端点使用独立 file_id,不可直接当 task_id 校验,未以错误映射限制下载;同监听器会话隔离及下载文件归属继续核对。
### HTTP 会话及文件端点隔离(表格第 36 行)
HTTP 原共享监听器凭据无法证明具体会话身份。现生成客户端为每个运行实例产生随机独立 X-Session-Token,数据库只保存 SHA-256 哈希;首次身份绑定不可覆盖,已有无绑定身份不得由仅知 UUID 的客户端认领。心跳、任务领取、结果回传和文件读写均检查独立凭据;文件下载通过任务 payload.file_id 关联真实所属会话。生成 Go 客户端所有 HTTP 请求同步携带会话凭据,curl 心跳客户端同步生成并携带凭据。双会话回归覆盖正常重连、任务领取、结果回传、文件读写及缺失/其他会话凭据拒绝,验证不修改其他任务或文件。身份测试覆盖哈希存储、旧身份禁止认领和跨监听器拒绝。C2/数据库测试通过,Go 客户端 Linux/Windows/macOS 编译通过,未执行生成客户端。
升级兼容:原 HTTP 客户端没有独立会话凭据,不能继续通过新校验,需要重新生成客户端;新实例使用新身份,不自动接管旧实例任务。自定义 HTTP 客户端需生成至少 32 字符随机凭据、首次注册携带并在同一实例后续请求保持一致。旧会话和任务记录保留。此要求是修复共享身份绕过所必需,未保留可绕过校验的旧协议入口。
### 离线命令收尾及串行派发(表格第 37 行)
看门狗原仅标记会话离线,已发送命令无错误和完成时间。现对 dead 会话已发送 exec/shell 命令,超过客户端既有 timeout_seconds(默认 60 秒)加最小宽限期后写失败、完成时间及远端终止尚未确认说明;不推断远端进程已经停止。显式长超时、queued、成功/取消及非命令任务不受影响,迟到成功不能覆盖失败终态。TCP 串行客户端原一次领取多条并提前标记 sent,现同会话有 sent/running 任务时不再派发,一次领取一条,后续任务保持 queued。回归覆盖离线默认超时、300 秒显式期限、等待任务、正常终态、非命令任务、迟到成功与串行下一任务派发。C2 包测试通过。
### 历史工作流进度核对结论(表格第 29 行)
当前 workflowAgentProgress 转发节点关联的 iteration/tool_call/tool_result;新增 handler 集成测试确认 workflow_node_start、iteration、tool_call、tool_result、workflow_node_result 均落库并发送至流,故现有路径未复现全程零进度。原截图与描述没有可重放运行日志及配置,不能断言历史现象不存在。已有工具节点期限未执行的缺陷已经修复;Agent 节点没有独立无进度超时配置,不凭历史耗时增加新的监控机制或任意期限。默认提示持续扩展探测的冲突另已修复。取消审批场景通过真实 pending → cancel → 历史与 done 的集成测试,第 24 行同步结论。
### 最终整仓验证
当前修复集合 go test ./... 全部通过。前端 node --test web/static/js/*.test.cjs 共 217 项,215 项通过;2 项 HITL UI 源码正则断言失败(刷新默认审批配置、服务端默认审批人更新),相关实现和测试相对基线未改动,另在原基线归档核验同项失败。新增及受影响场景针对性测试通过。未执行真实模型或真实目标探测,不将提示改进解释为所有模型行为保证。
-68
View File
@@ -1,68 +0,0 @@
# Bug 表逐项状态
使用 Excel 行号作为定位键,包含未编号条目。状态只表示已有证据,不把未复现当作不存在。
| Excel 行 | 序号 | 问题摘要 | 状态 |
| --- | --- | --- | --- |
| 2 | 1 | 对话页面显示错乱了,按钮和文字位置全乱了, | 已修复最近对话标题因原生按钮默认居中而偏移;截图中未见其他文字重叠,当前侧栏其余位置不作无依据改动 |
| 3 | 2 | 登录时没填密码也能提交,但提示信息和样式可以在优化下 | 已修复;空值反馈、字段原因及浏览器布局验证通过 |
| 4 | 3 | 登录密码是明文传输的,容易被截获有安全风险,建议参考TDP的加密方案处理 | HTTP 部署存在传输风险;现有 HTTPS 与 HTTP 重定向已实现并通过测试,需启用 TLS |
| 5 | 4 | 登录页用户名字段未做必填校验,提交时 username 字段值为空字符串,应增加非空验证 | 已修复并有针对性验证 |
| 6 | 5 | 修改密码,只有红框提示,没有具体错误原因 | 已修复;空值反馈、字段原因及浏览器布局验证通过 |
| 7 | 6 | 通知,点击查看后跳转到页面,通知的计数还在,只有点了已读在不在。 | 已修复并有针对性验证 |
| 8 | 7 | 新增资产,自动识别出来的不是中文呢,好像是时区的问题。 | 截图中的 CN/Beijing 是占位示例;已改为随界面语言显示 |
| 9 | 8 | 接上一个,改成中国后,省份还是拼音 | 省市为手工输入字段,当前无自动地区联动;原描述误认示例或输入值 |
| 10 | 9 | 资产导出的 语言问题,也是英文 | 已修复导出表头及枚举语言;三种语言的真实 CSV/XLSX 往返测试通过 |
| 11 | 10 | 项目管理,添加事实提示词优化,表单里是没有summary | 当前表单已有摘要(summary)且保存必填,原描述未复现 |
| 12 | 11 | 样式问题 | 已修复:置顶与关联信息统一排列,避免独立徽标挤压 |
| 13 | 12 | 样式问题 | 已修复:关联漏洞 ID 显示明确标签,悬停可查看完整 ID |
| 14 | 13 | 明文回显 API Key | 已修复并有针对性验证 |
| 15 | 14 | 点击查看事实后,弹窗无事实,然后就跳转到事实页面了,觉得留在本页面合适 | 已修复查看入口强制跳页;直接打开事实详情,空关联仅提示,4 项脚本回归通过 |
| 16 | 15 | 不同的项目保存漏洞时能有去重逻辑吗,待确认。隔离好像也没啥问题 | 跨项目全局去重属行为变更建议;现有按项目授权隔离,不改动 |
| 17 | 16 | 拦截规则已经停用了,但是还是被拦截了。可能刚停用还没生效,然后被拦截,(是因为停用之后 未保存只 | 表中已说明未保存开关;当前有未保存状态与保存入口,未发现运行时缺陷 |
| 18 | 17 | 样式问题 | 已修复:仪表盘项目标签正常尾部省略,避免 flex 居中导致首尾裁切 |
| 19 | 18 | 用户并发配额耗尽时任务静默排队,界面无提示 | 当前仓库未实现,不扩展能力 |
| 20 | — | 量任务已经执行结束,任务管理页也将队列标记为“已完成 100%”,但该任务创建的容器仍长期保持“ | 当前仓库未实现,不扩展能力 |
| 21 | 19 | webshell 连接口令明文 | 已修复并有针对性验证 |
| 22 | 20 | 不知道这个是啥,应该是样式问题 | 与第 25 行同一 WebShell 路径/假文件问题,已修复 |
| 23 | 21 | 创建监听器 必填字段不清楚,交互上不知道是哪个必填 | 已修复必填标识、逐字段提示及端口严格校验;前后端回归通过 |
| 24 | 22 | 已经取消的任务,结束之后标签会变成成功,好像没有取消成功 | C2 与 Agent 取消终态保护已修复;done 展示保留真实状态,真实审批等待取消集成测试通过 |
| 25 | 23 | 【WebShell 文件管理】目录树用相对路径导致点进去必报错,且报错文本被解析成假文件条目步骤 | 已修复并有针对性验证 |
| 26 | 24 | 工作流 id 由客户端随便填、零校验 | 已修复新 ID 格式/长度、重复创建及编辑改 ID 校验 |
| 27 | 25 | 样式问题 | 已修复:连续中文换行、普通节点随标签增高、条件节点文字宽度限制 |
| 28 | 26 | 导入相同的工作流id的包,还能点确认,并且按钮显示导入完成。拦截的交互可以优化 | 已修复确认及结果按钮语义;跳过/保留明确显示,14 项包导入测试通过 |
| 29 | 27 | Agent 节点 16 分 43 秒 / 118 次工具调用,全程零进度、零超时 | 当前零进度未复现:节点/迭代/工具事件转发、落库和流发送测试通过;已有工具超时未执行已修复;历史运行缺日志,Agent 独立无进度超时未实现,不扩展能力 |
| 30 | 28 | 工具节点在会话容器内执行 nmap 默认参数必失败 | 当前仓库未实现,不扩展能力 |
| 31 | 29 | 参数模板未解析被原样下发,流程「成功」但结论与事实相反 | 已修复 JSON 参数模板展开,嵌套/转义及实际工具运行回归通过 |
| 32 | 30 | 角色名零校验:含 /、.. 的名字能创建,但之后删不掉 | 已修复并有针对性验证 |
| 33 | 31 | 角色名可以加个 长度限制,否则展示有问题 | 已修复并有针对性验证 |
| 34 | 32 | 批量任务里只要指令不调用任何工具(例如「请只回复:OK」),子任务就必然失败并回「缺少执行证据」 | 已修复并有针对性验证 |
| 35 | — | Markdown 智能体:同文件名静默覆盖、关键字段不校验、name 含路径字符被静默改写 | 已修复并有针对性验证 |
| 36 | — | 任务结果不校验上报者归属 —— 任意植入体可伪造别的会话、甚至别的监听器的任务结果。 | 已修复持久连接及 HTTP 跨会话、跨监听器回传,HTTP 文件端点同步隔离;旧 HTTP 客户端须重新生成 |
| 37 | — | 100s 状态不变、无 error、无 completed_at,会话早已离线。 | 已修复:离线会话超期命令记录失败、错误和完成时间;串行 TCP 后续任务保持排队 |
| 38 | — | 在「工作流」里删掉一个正被角色引用的工作流 → 删除成功且没有任何提示;之后任何人用这个角色发起 | 已修复并有针对性验证 |
| 39 | — | 同一 implant uuid 重复上线互踢,旧连接断开把会话判死 | 已修复并有针对性验证 |
| 40 | — | 无权限用户仍能看到“新建角色”“添加成员”等管理操作按钮;页面同时提示“权限不足”。应在前端按权 | 已补权限入口标记,按钮可见性验证通过 |
| 41 | — | 点击“并发数”当前值进行编辑。 | 已修复并发越界提示,前后端回归通过 |
| 42 | — | 设置页清空“项目名称”后点击保存,页面提示“已保存”,但名称被静默恢复成原值。 | 已修复空名称误报保存成功,前后端回归通过 |
| 43 | — | 样式问题 | 已修复:项目标签按列宽截断,完整名称保留在悬停提示 |
| 44 | — | 输入 目标地址 时,前端正确解析 IP/端口/协议,但提交提示“域名格式无效”,无法创建。 | 已修复 URL 与预填 IP 重复解析,IPv4/IPv6 回归通过 |
| 45 | — | 无工具节点的工作流成功完成后,被误判为缺少执行证据 | 已修复无工具工作流终结与审批拒绝原因,实际运行回归通过 |
| 46 | — | Agent ID 可重复- 两个不同文件可使用同一个 ID。 | 已修复并有针对性验证 |
| 47 | — | nmap 参数缺少前置校验 | 已修复 scan_type 拆开 --script 与脚本名的拼接错误;实际 YAML 参数回归通过 |
| 48 | — | 对单个资产发起“只读连通性与服务指纹核验”后,Agent 已通过 nmap 和 HTTP 指纹工 | 已修复默认提示范围冲突和自定义模板缺少写回提示;写回工具测试通过;未运行真实模型,及时收尾行为保留验证限制 |
| 49 | — | C2 会话终端执行没有换行结尾的命令时,系统内部用于获取当前目录的 pwd 输出会与用户命令输出 | 已修复,Unix Shell 回归通过 |
| 50 | — | 监听器编辑后点击保存没有反应 | 已修复弹窗事件冒泡阻断;实际委托保存和失败提示回归通过 |
| 51 | — | 创建 Malleable Profile 时 UA、响应头和 Jitter 配置被静默丢弃 | 已修复并有针对性验证 |
| 52 | — | C2 载荷生成未校验回连地址,非法地址仍能生成 Oneliner | 已修复:生成前校验主机格式;非法输入拒绝,HTTPS/IPv6 API 回归通过 |
| 53 | — | 知识库索引构建失败原因不怎么太清晰 | 已修复错误原因提示和五分钟后消失;状态渲染及错误保留回归通过 |
| 54 | — | Agent 未挂载知识检索工具 | 当前注册及角色工具可见性测试通过,未复现;历史实例缺配置/角色证据,不绕过现有权限 |
| 55 | — | - 选择其专用测试会话,打开「终端」。 | 已修复,Unix Shell 回归通过 |
| 56 | — | AI看代码给提的问题 | 已修复并有针对性验证 |
| 57 | — | 审计日志搜索无结果后,点击“清空”不会清除关键词或恢复列表,无反应 | 当前重置会清空关键词并请求首个无筛选页面,回归未复现 |
| 58 | — | 任务失败,也显示已完成 | 已修复队列结果标签:全部失败显示失败,混合结果显示失败数;3 项回归通过 |
| 59 | — | 批量任务在“用户并发配额已满”时进入等待调度后,即使后来停止容器、腾出配额,队列仍停在“执行中 | 当前仓库未实现,不扩展能力 |
| 60 | — | 资产扫描任务在后续工具调用的 HITL 审批阶段已被系统中断,审批卡片明确显示“任务已中断、审批 | 已修复取消终态及进度收尾;真实审批等待→取消→历史/done 集成验证通过 |
| 61 | — | 问题:事实正文里的 discovered_on: target/xxx 只会当普通文本保存,不会 | 已按建议明确关系字段说明 |
| 62 | — | 无效工作流仍显示“启用”: 即使工作流校验不通过、无法试运行,列表和详情仍显示为“启用”,容易让 | 已标示已存储/当前草稿的无效工作流,API 与列表回归通过 |
| 63 | — | 编辑辅助文件时,描述修改未保存 | 已修复并有针对性验证 |
+10
View File
@@ -13,6 +13,7 @@
- [Architecture](architecture.md) · [Security Model](security-model.md) · [RBAC](rbac.md)
- [Agents and Roles](agent-and-role-guide.md) · [Skills](skills-guide.md) · [Eino Multi-Agent](MULTI_AGENT_EINO.md)
- [Tool Call Guard](tool-call-guard.md)
- [Workflows](workflow-graph.md) · [Tool Execution Governance](tool-execution-governance.md) · [HITL Best Practices](hitl-best-practices.md)
## Feature guides
@@ -30,3 +31,12 @@
- [Developer Guide](developer-guide.md) · [Plugin Development](plugin-development.md) · [Frontend i18n](frontend-i18n.md)
- [Testing](testing.md) · [Contributing](contributing-guide.md) · [Release Process](release-process.md)
## Additional guides (Chinese only)
English translations of these guides are not yet available:
- [Agent finalization](../zh-CN/agent-finalization-best-practices.md)
- [Blackboard and context memory](../zh-CN/blackboard-context-memory.md)
- [Resuming project tasks](../zh-CN/project-resume.md)
- [Token usage analysis](../zh-CN/token-usage-monitoring.md)
+2
View File
@@ -104,6 +104,8 @@ Limits and behavior:
5. Run the query, select results whose ownership has been verified, and choose **Save Selected**.
6. Review the created, updated, and skipped counts.
FOFA returns the state/province as `region`, which is saved to the asset province field on import. The legacy `province` alias in saved forms or API return-field lists is converted to `region`; this compatibility applies to returned fields, not query expressions.
Internet search results are not automatically your assets. Narrow the query with organization domains, certificates, network ranges, or product fingerprints, then verify authorization before saving results.
## Normalization and deduplication
+4 -2
View File
@@ -28,7 +28,7 @@ This guide defines baseline expectations when adding features, APIs, tools, fron
## New Config Checklist
- Field exists in `config.Config`.
- `config.yaml` sample has comments.
- `config.example.yaml` sample has comments.
- Safe default when omitted.
- Old configs still start.
- Hot-apply behavior documented.
@@ -81,6 +81,8 @@ Answer:
## Documentation Requirements
Keep public documentation focused on lasting information for users and contributors. Store internal task journals, conversation approvals, one-off issue checklists, review drafts, and local verification logs outside the repository. Extract useful contracts, compatibility notes, and design boundaries into maintained guides; summarize fixes in `CHANGELOG.md` rather than publishing process logs.
Each important feature should document:
- purpose;
@@ -90,7 +92,7 @@ Each important feature should document:
- troubleshooting;
- source anchors.
Chinese and English docs must have matching filenames:
Use matching filenames for translations of the same topic. If a translation is unavailable, label the available language in navigation instead of linking to a missing file:
```text
docs/zh-CN/
-48
View File
@@ -1,48 +0,0 @@
## F0 Intake
用户在确认内置眼睛按钮方案后要求“最佳实践优化”。仓库 main 干净,起点 762f798。独立分支 codex/login-password-eye。
Workflow Gate: P7 局部 UI 修整→P9 验证;上游为用户截图及已确认方案;无 API/权限变化,允许实现。
Maintainability Gate: auth.js 1014 行、模板 6987 行、style.css 46717 行。大文件风险高,但只替换现有组件的局部标记/样式/标签同步,不新增职责,按 narrow_fix 执行;无需整体重构。
## F1 Requirements
范围依据:用户明确要求执行上一轮方案。无需另行产品决策。
REQ-001 / AC-001: 密码框与用户名框同宽,右侧内置灰色线条眼睛,图标 20px、触控区域 44px。
REQ-002 / AC-002: 原生非提交按钮支持键盘 Enter/Space,焦点可见;显示/隐藏切换不改变密码值。
REQ-003 / AC-003: 图标随状态切换,显示密码/隐藏密码标签和悬浮提示随现有语言系统同步;登录框重新打开仍默认隐藏。
非目标:后端登录、密码策略及其他密码输入框。
## F2 Design
保留原按钮 ID 和 toggleLoginPasswordVisibility 入口;SVG 为装饰图像并 aria-hidden。按钮以 aria-label/title 命名,以现有 aria-pressed 表示状态;data-i18n-skip-text 防止翻译覆盖图标,data-i18n-attr 同步标签。
相对定位容器+绝对定位按钮;输入框预留右内边距,图标呈现由 aria-pressed 的 CSS 选择器控制。使用现有主题色、原生按钮交互,不引入依赖。
## F3 Plan
修改 index.html 的按钮内部结构,style.css 的局部布局和交互样式,auth.js 的标签同步,扩充已有 password-feedback.test.cjs 的状态/标签断言。
验证:已有密码反馈测试、JS syntax、diff check,实际浏览器桌面/窄屏与语言、键盘切换检查。回退可 revert 本功能代码提交。发布记录在 CHANGELOG.md Unreleased;不合并或发布。
## F4 Implementation
已替换独立文字按钮为输入框内 20px SVG 眼睛,44px 原生按钮点击区域,登录两输入框最小高度 48px;支持主题色及 focus-visible。JS 不再替换按钮 textContent,使用 aria-label/title 同步现有翻译键;模板标记支持语言重绘。更新 CSS/auth.js 缓存版本。已有密码反馈测试 4/4、JS syntax 和 diff check 通过。
## F5 Verification
- node --test web/static/js/password-feedback.test.cjs: 4/4 PASS。
- node --check web/static/js/auth.js、git diff --check: PASS。
- Headless Chrome / Playwright 使用实际登录模板、style.css/mobile.css、实际显隐函数和 applyTranslations;1280/390/320px 各检查等宽输入框、44×44 点击区、Space/Enter 不提交表单的显隐、值不变、focus-visible、双图标切换和中英俄文 aria-label/title 同步,全部 PASS。
- 六张浅色/深色截图已生成,人工查看 1280px 浅色和 320px 深色;布局正常。验证完成登录入场动画后进行尺寸测量。
- 未进行真实服务登录和后端测试:本次未改变认证请求或后端。未执行整个 JS 套件。
- F0–F3 文档提交 2f2e01e/30b680d/6a31e29/4d397a3;F4 代码提交 d590cdd,均已推送。
## F6 Review / Release Record
局部复核完成:CSS 选择器可覆盖共享输入框规则,按钮为 type=button;翻译只更新属性不会移除 SVG;沿用 aria-controls/aria-pressed;auth/CSS URL 版本同时更新避免旧缓存。CHANGELOG.md 已登记 Unreleased 修复。
全部完成阶段均保留文档并提交推送至 codex/login-password-eye。未创建 PR、未合并 main、未发布版本。合并前可使用以下说明:
> 登录页“显示密码”按钮占用输入框宽度并抢占视觉重点。改为内置眼睛按钮,统一两输入框宽高,并保留显隐、键盘和多语言无障碍行为。验证:4 项密码反馈测试、JS syntax/diff check、桌面和两种窄屏 Chrome 检查(浅/深主题、中英俄语言、键盘及点击交互)。
## F8 Merge Summary — 2026-10-08
用户授权合并 main。合并前重新 fetch,origin/main 仍为 762f798,4 项密码反馈测试、JS syntax、diff check 再次通过。功能分支以 fast-forward 合并,本地和远端 main 已推送并核对为 4f64347752860add4c0beb2e03a0ae08706e1cf7。核心实现提交 d590cdd;未创建 PR,未发布版本或部署运行服务。本节为合并后的追踪记录,替代 F6 的未合并状态。
-53
View File
@@ -1,53 +0,0 @@
# REST 删除错误与空列表修复
## F0:接入与门禁
- 分支:codex/rest-error-empty-results;起始提交 68df7c1,工作区干净。
- P10 反馈修复,用户已明确授权修改及必要验证。已有只读分析:工作区 reviews/P-022-rest-semantics/analysis.md。
- 涉及 handler 的 c2.go (1267 行)、webshell.go (1097 行)、vulnerability.go (632 行)、batch_task_manager.go (1486 行)。较大文件负责模块 HTTP 或队列业务;已有模块测试,缺少本次 HTTP 合同回归覆盖。
- Maintainability Gate:高风险文件采用 narrow_fix,只改错误分支及空切片初始化,不增加职责、不移动代码;无需先重构。
- Workflow Gate:上游接口及实现已核对,期望明确,无阻塞依赖;允许实施。验证使用临时 SQLite 和 httptest,不访问部署服务。
- 生命周期范围:完成修复、验证、文档及变更记录;不合并、不部署。
## F1:已确认需求
用户明确要求:C2 Profile 和 WebShell 删除不存在对象返回 404,不暴露底层 SQL 错误;漏洞和批量任务列表无匹配时返回 [];补充必要验证。单对象读取、其他模块错误处理、鉴权及部署不在本次范围。真实数据库失败仍为 500。
## F2:接口设计
保持原 JSON 字段名、成功删除响应和分页字段。C2 缺失映射为 {"error":"profile not found"},WebShell 保持 connection not found。两者真正数据库错误记录内部日志,对外为稳定通用文案。列表在产生集合的现有方法初始化非 nil 空切片,覆盖数据库和内存路径。兼容性:消费者将收到 [] 而非 null;该变更为用户明确要求。
## F3:实施计划
改动 c2.go 的 DeleteProfile、webshell.go 的 DeleteConnection、database/vulnerability.go 的列表初始化、batch_task_manager.go 的 ListQueuesForAccess 初始化。添加独立 HTTP 合同测试,临时数据库验证缺失、成功删除和重复删除、真实 SQL 失败、空库、筛选无匹配及有结果列表;批量列表含内存路径。运行针对性测试及 handler/database 包测试、git diff --check。更新 changelog 与验证记录。回退使用本分支修复提交的 revert。
## F4:实施结果
- C2 Profile 删除将 sql.ErrNoRows 映射为 404;真实错误写内部日志,对外通用 500 文案。
- WebShell 删除使用 errors.Is 识别缺失,对外数据库错误改为通用 500 文案,底层已有日志保留。
- 漏洞数据库列表、批量队列业务列表初始化为空切片,成功的无记录查询序列化为 [];后者同时覆盖数据库与内存路径。
- 独立 httptest 回归覆盖缺失、成功删除、重复删除、SQL 错误脱敏、两类空列表、非空结果和批量内存分支。
- 修复前回归按预期失败,明确捕获原行为;修复后 `go test ./internal/handler -run '^TestREST(Delete|VulnerabilityList|BatchList)Semantics$' -count=1` 通过。
## F5:验证与消费者文档
- 修复前新增合同测试失败,分别捕获 C2 500、WebShell 表名泄露及两个列表 null(批量数据库/内存均覆盖)。
- 修复后针对性合同测试通过。
- `go test ./internal/handler ./internal/database -count=1` 全部通过(handler 20.597s,database 2.551s)。
- `git diff --check` 通过。新增及改动 Go 文件已 gofmt。
- 中英文 API 参考补充缺失删除、通用 500 和空列表 [] 合同。
- 未执行线上请求或部署验证;HTTP 回归使用真实临时 SQLite,通过路由调用 handler,未覆盖完整认证中间件。权限规则未修改。
## F6:合并准备与变更记录
- 修复提交:9f111a13;新增回归验证原缺陷可检出且修复后通过,两个受影响包完整测试通过。
- 差异自查:生产变更仅涉及四个方法,正常删除响应、鉴权、分页及非空列表行为保留;内部错误不会被缺失或空成功分支吞掉。
- API 参考和 CHANGELOG 的 Unreleased/Fixed 已更新。null 到 [] 的迁移属于本次明确授权的合同修复。
- 本分支各阶段已提交并推送;未创建 PR、合并或部署,发布后的线上验证留待部署阶段。
## F8:main 合并记录(2026-10-10)
- 用户明确授权验证通过后推送 main。
- 获取远端最新状态后,origin/main 仍为起始提交 68df7c1;main 快进合并修复分支至 3da1d22b,无冲突。
- 在合并后的 main 运行 `go test ./internal/handler ./internal/database -count=1` 全部通过(handler 20.748s,database 2.697s),`git diff --check origin/main..HEAD` 通过。
- 本次 main 推送包含修复、HTTP 回归测试、中英文 API 文档及 CHANGELOG;未执行部署或线上数据操作。
-46
View File
@@ -1,46 +0,0 @@
# Russian layout overflow
## F0 Intake / workflow and maintainability gates
User reported Russian overflow with a dashboard screenshot. Clean main checkout; dedicated branch codex/russian-layout-overflow.
Workflow: P10 feedback → P7 narrow fix → P9 visual QA. Existing template, translations and screenshot supply upstream UI contract; no missing product/API decisions. Implementation allowed.
Scope: dashboard severity/status/risk presentation and shared sidebar labels. Acceptance: complete readable labels without overlapping adjacent cells at desktop and narrow widths, with existing themes/navigation preserved.
Maintainability: style.css 47,163 lines and index.html are existing large composition files. High size risk; CSS presentation only, no new responsibility. Allowed narrow_fix; no broad refactor required. Validate actual template/styles/translations in Chromium, plus diff check. Assumption: wrapping is preferable to truncating operational status labels; no translation changes.
Lifecycle: F0–F6 documentation here, scoped commits pushed per phase; Unreleased changelog, no merge/release/deploy requested.
## F1 Requirements
Small corrective scope inferred from explicit bug report; no unresolved product decision or separate draft requirements gate needed.
REQ/AC-001: Russian status labels stay inside their cards with no overlap, including false-positive labels.
REQ/AC-002: Risk badge, severity names and navigation labels remain fully readable by wrapping within available space.
REQ/AC-003: Chinese/English, light/dark, desktop/tablet/mobile and collapsed sidebar retain usable layout and click targets. Data/loading/error rendering and API contracts unchanged.
## F2 Design
Use existing shared styles with language-independent wrapping, bounded flex children and auto-fit grid tracks. Status panel uses container width to decide whether progress fits alongside cards; avoid viewport-only decisions when dashboard sits beside a right column. Keep existing colors, semantics, event handlers and translations. Sidebar labels wrap with stable nonshrinking icons; collapsed rules continue hiding labels.
## F3 Implementation Plan
Touch style.css existing navigation/dashboard rules and index.html stylesheet cache key. Constrain and wrap risk/urgent/status/severity/batch labels; make status grid auto-fit and progress responsive to actual panel width. Verify real extracted dashboard/sidebar template with actual i18n dictionaries in headless Chromium at 320/390/768/1024/1440/1920/2938px, light/dark and all three languages; inspect screenshots. Check overlap and label containment, collapsed/sidebar states, nonzero large values and diff whitespace. Record evidence and Unreleased fix. Rollback via reverting scoped implementation commit; no backend changes.
## F4 Implementation
Shared navigation labels now wrap instead of ellipsis. Risk header wraps badge/label, urgent and batch labels are bounded and wrap. Severity legend gives remaining space to complete label text and intrinsic space to numeric columns. Status cards auto-fit with a 110px preferred minimum and bounded multiline labels; progress stacks until chart container has at least 1000px. Container queries at 760/480px adapt risk/chart/legend to the real panel width. Header actions wrap; main grid no longer expands from min-content. Updated stylesheet cache key.
Validation before code commit: headless Chrome 42 language/theme/width scenarios passed for measured label containment, no overlapping status cards and main card element boundaries; existing mobile i18n 8/8 tests and diff check passed.
## F5 Verification
- Chrome/Playwright temporary harness `/tmp/csai-layout-qa.cjs`: actual index.html, style.css/mobile.css, bundled i18next, actual i18n.js changeLanguage/applyTranslations and all three dictionaries. Network/backend replaced with local resource fixtures; no live authentication or backend requests.
- 42 scenarios: zh-CN/en-US/ru-RU × light/dark × 320/390/768/1024/1440/1920/2938 CSS pixels. PASS: target labels stay within their parents, no horizontal text overflow, status cards do not overlap, risk/legend/status/header elements stay within chart card. Dark scenarios use 99,999 counts and critical risk text; light scenarios use zero counts. Real card decorative glow intentionally extends beyond chart bounds; not a label overflow.
- Additional PASS: collapsed desktop sidebar hides labels; mobile expanded sidebar labels remain contained at 320/390px; false-positive cell click and Enter preserve inline filter dispatch (navigation stub, no live API).
- `node --test web/static/js/mobile-ui-i18n.test.cjs`: 8/8 PASS. `git diff --check`: PASS.
- Screenshots/results at `/tmp/csai-layout-proof/`; manually inspected Russian desktop light and mobile dark. Screenshot fixture omits backend-driven donut SVG and dynamic status/theme labels, which were not modified.
- Scope limitation: focused dashboard/shared navigation visual checks, not a full application page audit or live-server end-to-end test. No backend code changed. Implementation commit 132babe3 pushed; preceding phase commits e82ee59f/c356e514/3889de46/f6f93a1b pushed.
## F6 Review / Release Record
Scoped review complete: CSS presentation and cache version only, existing data/translation keys/navigation handlers preserved. Unreleased changelog added. Documentation, implementation and verification committed and pushed on codex/russian-layout-overflow. No merge, version release or deployment performed; ready for merge review. Recommended next step: merge this branch, then smoke the running instance in Russian. No outstanding implementation gap in the requested dashboard/navigation slice.
## F8 Merge Summary — 2026-10-10
用户授权提交 main。合并前工作区干净,fetch 后 main 与 origin/main 均为 8ce62813,功能分支无远端主线冲突,diff check 通过。main 以 fast-forward 合并至 ab04c864,并成功推送 origin/main;实现提交 132babe3 与 F5 验证记录均已包含。合并没有改动已验证的实现,无需重复布局矩阵。此节替代 F6 的未合并状态;未发布版本或部署服务。
@@ -1,63 +0,0 @@
# Self-update recovery and MCP edit fixes
## Intake (F0)
PR #346 was merged at 72cd8d62e36e536a6b18e9e10ea73d8d16294044 on explicit user direction to merge first and repair the reviewed defects afterwards. This is corrective work on branch `codex/self-update-recovery-fixes`; the checkout was clean. No release or deployment is requested.
Workflow gate: P10 feedback/iteration, implementation allowed. The frozen review at a63070d and executable PRR-002/PRR-007 counterexamples define the upstream contract; there are no missing product decisions. Acceptance requires preserved MCP stop state and refusal of ambiguous recovery before filesystem mutation.
Maintainability gate: `apply.go` has 1099 lines and combines recovery orchestration and filesystem IO; `external_mcp.go` has 508 lines. Risk is high for recovery. Allowed slice: narrow fix with a separate pure JSON/evidence validation module, small call-site changes, and focused regression tests. Broad refactoring is not required. Existing update/handler tests and reviewer reproductions cover the affected boundary.
## Requirements (F1, confirmed by the user's repair request)
- R1 / PRR-007: editing an existing MCP without an explicit enable/disable field preserves its runtime activation state. Explicit activation fields and Start/Stop remain supported; a new server defaults to enabled. Environment expansion remains isolated from persisted raw values.
- R2 / PRR-002: incomplete, null, duplicate-key, malformed, or contradictory recovery evidence cannot authorize a second swap, wrong rollback binary, or deletion of recovery records. Valid current records and the documented legacy marker retain safe recovery.
- Non-goals: redesigning update UX, changing release policy, or unrelated refactoring. The two nonblocking review observations are outside this corrective slice unless required by the evidence validation boundary.
## Design (F2)
Recovery remains an internal on-disk contract, with no new HTTP fields. Decode exact JSON field names and types, reject duplicate keys at every depth and null scalars, and reject unknown fields rather than interpreting a newer format as current evidence. The one documented plain-text legacy build marker remains supported by its existing conservative path.
For JSON build records require a target commit and exactly one proof of the old binary (SHA256 or explicit absence), validate hash/commit shapes, and reconcile the record with any persisted State for the same update or its immediate predecessor. Before restoring protected content or building, verify the live/previous files match the indicated pre-swap or post-swap phase. A successful State cannot be reinterpreted as an owed build.
Rollback records require an explicit restore_binary decision; reconcile it, the live/previous hashes and the nested State, then compare with the persisted State when it still exists. Missing persisted State is allowed after the final cleanup crash window, but the self-contained record must remain coherent. Invalid evidence returns an existing state_unreadable/bad_state error and preserves recovery files.
MCP request decoding retains field presence separately from bool values. For existing entries, omission preserves the manager's activation state; explicit disabled or external_mcp_enable fields determine it. New entries default to enabled. Keep raw configuration persistence and environment-expanded connection snapshots separate as today.
Compatibility: properly written current journals remain readable, legacy plain-text recovery remains guarded; hand-edited or unsupported JSON requires manual correction instead of guessed mutation. Rollback of this patch restores old behavior and is not recommended while invalid journals remain.
## Implementation plan (F3)
1. Add recovery evidence parser/validators in a separate internal/update module; add narrow calls in build/rollback readers and pre-mutation paths. Keep producer formats unchanged.
2. Preserve explicit field presence in the MCP request without changing its JSON shape; normalize enable state against the existing manager configuration.
3. Promote the two failing review reproductions into portable regression tests; add duplicate/null/type/contradiction matrices and valid retry controls. Assert no build/swap, unchanged binaries and preserved journals for refusals.
4. Run update/handler targeted suites and race checks, full Go tests, build, JS and shell checks; update changelog and verification record. Open a corrective PR and integrate the verified patch as part of the authorized merge-and-fix task, respecting repository checks.
Docs: this phase record plus concise behavior notes in deployment/developer documentation if needed. No screenshots or production external services are required; tests use local Git and harmless command/HTTP markers. No version bump, tag or release publication.
## Implementation (F4)
Implemented strict recovery decoding in recovery_evidence.go, with exact field names, nested duplicate/type/null checks, commit/hash validation and State reconciliation. Build recovery verifies pre-move versus post-move binary evidence before content restore and rechecks files after compilation. Fresh rollback and legacy-marker recovery also read State strictly. Self-contained rollback journals validate absence/hash coherence even after State cleanup, and actual absence is checked before any cleanup.
MCP edits distinguish omitted activation fields from explicit booleans. Omitted fields preserve the manager state; Start/Stop and persisted disabled are synchronized so restart retains the requested state. Existing environment snapshot expansion is preserved.
Tests added for malformed build/rollback journals, all independent review counterexamples, valid partial binary rename and final cleanup retries, and MCP stop/edit/start plus config reload. Targeted reproductions pass; original full Go, build, five-package race, and 277 JS checks passed before final evidence guard refinements. Final exact-patch validation follows in F5. No production external service was contacted.
### F4 follow-up: activation round-trip consistency
Final GET-to-edit inspection found that manager Start/Stop retained a stale disabled flag even after changing ExternalMCPEnable. Synchronize these two existing fields in the manager as well as persistence, and test the actual GET payload after Start followed by the UI-shaped edit. Maintainability assessment: external_manager.go is 1665 lines (high risk); this narrow fix adds only three assignments beside existing activation assignments, without new control flow or broad refactoring. The additional handler/MCP race suites validate this consistency change.
## Verification and user documentation (F5)
- Recovery code at fab7e603: `go test -race ./internal/update ./internal/handler` passed (84.580s / 16.692s). This includes malformed/null/duplicate/contradictory records, legacy and fresh State entry points, actual absence, pre-merge phase rejection and valid crash controls.
- Final activation consistency change at ff50af02: `go test -race ./internal/handler ./internal/mcp -count=1` passed (18.658s / 3.281s), including Stop/edit/reload/Start/GET/edit behavior. Independent targeted handler tests also passed.
- Full Go suite, `go build ./...`, 277 JS tests and shell syntax passed during implementation. A frozen-code full Go/build rerun and exact-head GitHub CI are tracked in F6 before integration.
- Independent fresh-context code review at ff50af02 found no remaining blockers. Six independent recovery counterexamples were promoted to permanent tests and passed. No acceptance relies solely on test status: refusals assert retained journals/binary data, and valid controls prove continued recovery.
- English and Chinese developer guides describe refusal/reconciliation behavior and MCP activation field precedence. No public request shape or release version changed.
- Limits: local validation is macOS arm64; Windows/Linux results come from CI. No production restart/deployment smoke or exhaustive disk fault testing was performed.
## Review and integration record (F6)
Corrective PR: https://github.com/AIPentest/CyberStrikeAI/pull/347 . Code snapshot ff50af028f87465954911533ac07b420c92767b8 passed independent review; subsequent changes are documentation/changelog only. PRR-002 and PRR-007 are closed by the recorded implementation and regression evidence. The Unreleased changelog records both user-visible fixes. Final integration requires exact-head cross-platform CI success and unchanged reviewed production code; no tag or deployment is part of this task.
The earlier nonblocking version-display crash window and recovery-path symlink observation from PR #346 remain follow-up items, outside the two requested blocker fixes. No broader reliability guarantee is inferred from these tests.
@@ -1,35 +0,0 @@
# SQLite 启动结构补齐设计
输入:已确认 requirements.md。仅影响 internal/database,不改变公开 API 或配置。
## 结构来源与流程
将现有初始化及迁移后最终表定义收敛为随二进制嵌入的 schemas/*.sql,作为最新结构的唯一来源。启动在临时内存 SQLite 中执行定义,使用 SQLite 自身解析 SQL,再从 sqlite_master / pragma_table_xinfo 读取期望表、列、索引。在真实数据库事务中先创建缺表、再按最新列定义 ADD COLUMN,最后创建索引。已有字段、额外表及数据不删除。
```mermaid
flowchart LR
A[嵌入的最新 SQL] --> B[内存 SQLite 解析]
B --> C[对比实际表和列]
C --> D[事务补表和补字段]
D --> E[创建索引与历史数据处理]
E --> F[开始接收请求]
```
## 边界与失败
- 结构对象:table(name, ddl, columns)、column(name, definition)、index(name, ddl)。它们只在启动期间存在,无新增业务对象。
- 列定义保留最新 SQL 的类型、默认值和内联约束;拆分器尊重引号、注释和嵌套括号,避免以简单逗号切割 SQL。
- 不重建表、不凭空为旧数据编造必填值。SQLite 不支持安全 ADD COLUMN 的主键、唯一约束或缺默认值的必填字段,明确报错并回滚结构补齐事务;修复定义/数据后可重新启动。
- 表级约束不自动改变。结构补齐独立于历史数据回填和既有漏洞外键语义迁移;保留外键迁移时应保留额外字段与数据,避免固定列复制造成损失。
- 全部结构补齐必须在索引及业务 SQL 之前完成;任一步失败阻止启动。现有连接保持外键配置;内存参考库用单连接并在结束时关闭。
- 新字段仅更新 SQL 定义即可,不新增手写补字段列表。删除纯字段迁移列表;既有测试改为验证统一结构补齐。
## 兼容与验证
保证已有字段不被改写;默认值用于新列的已有行,未知表/字段保留。针对空库、旧库、重复启动、带引号和复杂默认值、失败回滚、非迁移列表字段、额外字段及外键数据保留做测试。已有时间回填继续保持兼容。
维护性门禁选择 adapter_extraction:从 1,822 行 database.go 提取静态 DDL 与补齐行为,旧入口薄委托;不进行无关重构。
## 覆盖检查与维护门禁补充
全仓库搜索发现处理器另有 HITL 两表与通知已读表,统一移入 application.sql,处理器仅保留数据恢复职责。HITL 文件 1,227 行(high)、通知文件 837 行(medium),只删除静态 DDL 并保留原入口/请求行为,不增加业务复杂度。最终定义覆盖 52 张表(含各数据库文件的同名表)。knowledge 的兼容入口复用同一结构引擎,不再维护字段列表。漏洞历史外键迁移仍按既有语义执行,但基于最新定义、动态复制旧列,保留额外字段、索引、触发器和依赖记录。
@@ -1,13 +0,0 @@
# SQLite 启动结构补齐实现计划
- Branch: codex/startup-schema-reconcile
- 输入:requirements.md(Confirmed)、design.md
- Workflow Gate:P7 后端实现;上游契约与设计齐全,允许实施。
1. 提取现有初始化后的最终 SQL 到 internal/database/schemas,验证其覆盖所有表及索引。
2. 新增 schema_reconcile.go,通过内存参考库与事务实现通用补齐;DDL 分词用于提取准确的列定义。
3. 数据库入口改为薄委托,删除启动对纯字段迁移的依赖;保留数据回填,既有漏洞外键迁移保存额外列。
4. 添加数据库级回归测试,运行 go test ./internal/database ./internal/knowledge ./internal/handler ./internal/app 与 git diff --check。
5. 更新行为文档及 CHANGELOG,记录验证和提交,推送功能分支;本任务不合并或发布。
回滚:恢复代码版本;新增表和字段保留,不自动删除;升级前的历史数据不改写。验证使用临时 SQLite 文件,不操作用户实际数据库。
@@ -1,14 +0,0 @@
# SQLite 启动结构补齐实现记录
- Phase: F4 complete
- Branch: codex/startup-schema-reconcile
- 结构来源:internal/database/schemas/*.sql,嵌入二进制。
- 自动对比:内存 SQLite 解析最新定义,真实连接事务内创建缺表、补字段、创建缺索引。
- 启动入口:NewDB / NewKnowledgeDB,检查失败关闭连接并返回错误。
- 处理器中 HITL/通知表定义收敛到统一定义;请求不再临时创建通知表。
- 删除 database/RBAC/workflow/knowledge/HITL 的纯字段迁移列表。时间、模型用量、安全拦截和审批等数据回填保留。
- 原数据库定义文件从 1,822 行缩减到 270 行;结构与历史语义迁移各自独立。
- 原漏洞外键迁移改为从最新定义创建目标表,动态保存额外列及其值,保留索引、触发器和依赖记录;它不是缺字段检查的依据。
- 不删除额外表/字段,不自动修改已存在字段类型或约束。不可安全 ADD COLUMN 的定义导致补齐事务回滚,启动失败,附表/字段及原始错误。
实现验证:go test ./internal/database ./internal/knowledge ./internal/handler 通过;go test ./internal/app 通过;格式整理后 go test ./internal/database 再次通过。
@@ -1,53 +0,0 @@
# 启动时自动补齐数据库结构
- Status: Confirmed
- Created: 2026-10-10
- Source: 用户要求启动时自动对比所有表的最新结构,缺表、缺字段自动补齐,不依赖迁移代码列出的字段。
- Confirmed by: 用户(当前对话)
- Confirmation date: 2026-10-10
## 问题与目标
当前会创建缺表,但只检查手写迁移列表中的字段。希望以项目最新表结构定义为依据,在服务接收请求之前检查所有应用管理的表,自动补齐缺表、缺字段。以后新增字段只需更新最新表结构定义,无需再维护同一字段的补齐迁移列表。
## 功能需求
| ID | 需求 | 来源 |
| --- | --- | --- |
| REQ-001 | 每次启动时对比所有应用管理表的最新定义和实际结构。 | 用户要求 |
| REQ-002 | 缺表时自动创建,缺字段时自动补齐,不依赖逐字段迁移列表。 | 用户要求 |
| REQ-003 | 项目实际使用的 SQLite 数据库文件均执行上述检查,逐文件检查项目定义的所有表。 | 范围边界 |
| REQ-004 | 已有数据与额外表、字段予以保留;本次不自动删除、重命名字段或修改已有字段类型、约束。 | 范围边界 |
| REQ-005 | 无法安全补齐时停止启动,并报告表、字段和原因。 | 范围边界 |
| REQ-006 | 重复启动不重复添加表或字段,结构检查在依赖相关字段的索引创建及业务访问之前完成。 | 范围边界 |
## 用户场景与验收
| ID | 关联需求 | 验收标准 |
| --- | --- | --- |
| AC-001 | REQ-001、REQ-002、REQ-003 | 空数据库启动后具备最新定义中的全部应用表和字段。 |
| AC-002 | REQ-001、REQ-002 | 旧数据库缺少最新定义中的表或字段时,启动后自动补齐,即使该字段没有手写迁移。 |
| AC-003 | REQ-004 | 补齐后原有数据和额外字段、表仍存在。 |
| AC-004 | REQ-005 | 补齐操作失败时服务不开始接收请求,错误明确指出失败位置和原因。 |
| AC-005 | REQ-006 | 连续启动两次成功,第二次无重复字段错误,依赖新字段的索引可正常创建。 |
## 范围与执行边界
- “所有表”指项目定义并管理的表,不包含 SQLite 内部表或其他应用自行添加的表。
- 本次需求是补齐缺表、缺字段;完整的已有类型、默认值及约束变更不纳入自动修复范围。
- SQLite 不能直接添加的字段定义应明确报错,不擅自降低约束或清空已有数据。
- 历史数据回填、外键修正等语义迁移仍需保留;它们与缺字段检查是不同职责。
- 执行范围:项目使用的 SQLite 文件、保留已有数据、补齐失败阻止启动。
## 工作流与维护性检查
- Workflow Gate:P1 产品契约;后端数据库初始化功能。已有启动入口、建表定义和迁移测试;缺少本功能已确认需求与设计。需求已获明确确认,设计和实现允许推进。
- 执行范围:数据库启动初始化;不改变对外 API。
- Maintainability Gate:database.go 为 1,822 行,风险 high。采用独立模块与薄委托的 adapter_extraction,避免继续在大文件中堆积结构对比逻辑;设计与实现阶段需明确提取边界。
- Feature Lifecycle:F0 完成仓库检查,原 main 工作区干净;专用分支 codex/startup-schema-reconcile。F1 已确认(2026-10-10 当前对话)。文档为本文件;后续阶段记录设计、实现、验证及变更说明。
## 确认
Decision: Confirmed — 用户明确要求按启动对比、缺表补表、缺字段补字段、保留已有数据实施。
用户原文:“对,就按这个改,启动时自动对比 SQLite 最新结构,缺表补表、缺字段补字段,保留已有数据。”
@@ -1,15 +0,0 @@
# SQLite 结构补齐合并准备记录
- Phase: F6 complete (implementation and verification ready; not merged/released)
- Branch: codex/startup-schema-reconcile
- Code commit: 7f8dab4e
- Verification commit: f2f4416a
- Changelog: Unreleased / Added
## 自检结论
启动的建表与补字段依据统一 SQL,仓库生产 Go 代码无独立字段迁移列表。检查覆盖数据库入口及原处理器中的表。新增结构在事务内提交;错误携带表/字段,不被警告吞掉。历史语义迁移单独保留并验证数据不丢失。已有列类型和约束变更仍需独立设计;SQLite 不能安全添加的列会阻止启动。
需求、设计、计划、实现与验证文档齐备。数据库、知识库调用、处理器与应用初始化测试通过。改动仅涉及 SQLite 结构来源、初始化及相关兼容入口,未运行真实数据升级、生产部署或合并发布。
后续可审阅此分支并按项目流程合并;本次请求的代码修改及验证已完成。
@@ -1,27 +0,0 @@
# SQLite 启动结构补齐验证
- Phase: F5 complete
- Date: 2026-10-10
- Implementation commit: 7f8dab4e
## 自动化结果
- `go test ./internal/database ./internal/knowledge ./internal/handler`:通过。
- `go test ./internal/app`:通过。
- SQL 定义格式整理后 `go test ./internal/database`:通过。
- `git diff --check`:通过。
## 回归证据
schema_reconcile_test.go 覆盖:
- 新表/新列直接来自定义,无需旧迁移列表;默认值、CHECK、逗号与括号、带引号的标识符及虚拟生成列。
- 创建缺表后外键实际生效。
- 补字段或创建唯一索引失败时整个结构事务回滚,原行不变。
- NewDB 重开 SQLite 文件时补齐缺表以及原迁移列表未覆盖的 model_token_usage.cached_tokens、rbac_users.display_name、HITL 字段;逐表比较所有定义的列。
- NewKnowledgeDB 使用相同机制重开文件补结构。
- 连续启动两次,数据、额外表及字段保留。
- 历史漏洞外键迁移保留额外字段、触发器、索引和依赖记录,外键开关恢复,删除会话后漏洞保留。
- 既有批量任务审批测试切换到通用结构检查,依旧验证缺字段恢复和幂等。
所有数据库验证使用临时文件/内存,不修改用户实际数据库。未运行生产部署或全仓库测试;未合并功能分支。
@@ -1,57 +0,0 @@
# Task timeout classification fix
## F0 — Intake and gates
- Branch: `codex/task-timeout-classification`; base: `deda642b`, clean and synchronized with origin/main on 2026-10-15.
- Workflow: P10 feedback → P8 backend correction → P9 verification. User authorized fixing the diagnosed bug and merging main.
- Existing evidence: customer screenshot and local handler analysis; customer deployed revision and raw error remain unknown.
- Workflow gate: implementation allowed. No UI/API/schema redesign required; required upstream contract is the existing task deadline and user-approved correction.
- Maintainability gate: narrow_fix; handlers are 318–673 lines, mix orchestration and persistence, moderate coupling. No broad refactor needed. Extract one small timeout predicate and cover context semantics and persisted batch outcome.
- Scope: single-agent, multi-agent, workflow, and batch task deadline classification. Unrelated robot request handling remains outside scope.
## F1 — Confirmed requirements
Confirmed by the user's request to fix the identified defect and merge main.
- R1: A live task must not be classified as globally timed out solely because a child operation returns DeadlineExceeded.
- R2: An expired task deadline must retain the existing timeout behavior, even if the returned error is wrapped or unrelated.
- R3: Cancellation must not be reclassified as deadline expiry, including cancellation whose cause wraps DeadlineExceeded.
- R4: Keep existing failure diagnostics, bounded execution limits, and cancellation behavior. This fix does not promise automatic continuation after every local failure or blindly replay tools.
- Acceptance: regression tests distinguish child timeout, task expiry, cancellation and wrapped HTTP errors; affected packages pass; main includes the reviewed change.
## F2 — Design
Introduce a package-local predicate using the task context's Err(), which reports DeadlineExceeded only when that context's deadline expires. Do not use the returned operation error or an arbitrary cancellation cause as evidence of task budget exhaustion.
Replace the four task-level OR checks with this predicate. Child timeouts follow the existing failed/error path with original error diagnostics and existing trace persistence. Real task expiry follows the unchanged timeout path. No new event schema or retry policy. No change to the 600-minute interactive or 6-hour batch budgets.
## F3 — Implementation plan
1. Add the shared predicate and update four handler call sites.
2. Add deterministic context tests (past deadlines, child contexts, cancellation causes) plus batch handler regression coverage for status/persistence.
3. Run targeted regression tests, affected package suites, and git diff --check; review the diff and update CHANGELOG.md.
4. Commit and push each phase; merge only after checks pass and remote main is rechecked. No release or deployment requested.
Rollback: revert the fix commit; no data migration. Customer-specific fault attribution remains a separate evidence gap.
## F4 — Implementation
Added `taskDeadlineExceeded`, based on task context Err rather than operation error or cancellation cause. Single-agent, multi-agent, role workflow and batch task paths now use it. Existing terminal error details, trace persistence and retry policy are unchanged.
Regression proof: before the fix, `TestBatchTaskDeadlineClassification` failed for both child DeadlineExceeded and wrapped HTTP timeout (got timeout, wanted failed). After the fix, targeted tests pass, including real expiry, unrelated returned error after expiry, custom deadline causes and user cancellation.
## F5 — Verification
- `go test ./internal/handler -run 'Test(BatchTaskDeadlineClassification|TaskDeadlineExceededContextOwnership)' -count=1`: passed after previously demonstrating the defect.
- `go test ./internal/handler ./internal/multiagent ./internal/workflow`: all three packages passed (17.789s, 17.230s, 2.545s).
- `git diff --check`: passed.
- Batch regression verifies finish status, queue failure and preservation of the original diagnostic in SQLite messages; context tests verify child timeout isolation, deadline expiry and cancellation semantics.
- No customer environment reproduction or deployment performed. The customer-specific original timeout source is still unknown; the deterministic classification defect is fixed.
## F6 — Review and merge readiness
- Reviewed all four call sites: each receives the task context created for its own execution budget; checks occur before timeout cleanup. Local errors now follow existing failed/error paths.
- Actual deadline expiry remains recognized even with a custom cause; a cancellation carrying a child timeout is no longer treated as exhausted task budget.
- Scope is four predicate substitutions plus a small shared helper and regression tests. No dependency, schema, public API, replay policy or task budget change.
- Added Unreleased/Fixed changelog entry. Implementation commit: `5ff781bd`; verification commit: `54213f82`.
- Merge is explicitly authorized by the user. Plan: re-fetch origin, fast-forward main if unchanged, push without force and verify remote equality. No deployment or release tag.
@@ -1,71 +0,0 @@
# 调用拦截配置修改冲突检测
## F0 Intake / Gates
2026-10-10,用户要求修复已核实的多用户规则覆盖问题,并明确目标为当前开源版 CyberStrikeAI。main 起点 a8321c4b,工作目录干净;分支 codex/tool-guard-conflict-detection。Pro 版由其他聊天处理,本分支不编辑其文件。
Workflow Gate:P10 缺陷反馈 → P7 局部修复 → P9 验证。上游为用户问题、截图、已完成的源码核实;允许实现保存冲突检测,验收同版本只有一次成功,失败保留草稿并提示刷新。
Maintainability Gate:config.go 2940 行、tool_guard.go 175 行、tool-guard.js 732 行。风险高,按 narrow_fix 执行;config.go 只加一个受现有锁保护的版本字段,行为放在现有专项 handler;不新增全局配置职责,不做无关重构。前后端接口联动,需 handler race 测试和现有前端测试。
Lifecycle Report:F0–F6;影响 handler、调用拦截 JS 和文档;权限和业务规则保持原有约束。GET/PUT 增加版本头,旧无条件 PUT 将拒绝,这是用户要求的覆盖保护所必需;客户端须先读取版本。阶段文档使用本文件,逐阶段提交推送。未要求合并、发布或部署。
## F1 Requirements
依据:用户已明确提出只有一个用户修改成功、其他用户失败并提示,随后明确要求实施修复且指定开源仓库。此处记录已有授权,不将未被确认的新文档标成用户批准。
- REQ-001 / AC-001:两个或更多客户端基于同一配置版本保存,只有一次成功;失败请求不改变成功方配置。
- REQ-002 / AC-002:冲突有合理错误提示;本地草稿保留,刷新获取最新配置后可以重新编辑保存。
- REQ-003 / AC-003:输入校验、权限、试匹配、落盘失败保持原策略行为继续成立。
- 范围解释:现接口提交整个列表,按整份配置保护,避免不同规则的旧快照相互覆盖。无需等待用户退出编辑,正常刷新后的后续修改允许保存。
- 非目标:编辑期间占用租约、多实例共享配置支持、发布或部署。
## F2 Design
GET /api/tool-guard 的 JSON 不变,提供强 ETag 和 Cache-Control: no-store。版本由随机 nonce 和当前有效配置摘要组成;每次成功保存更换 nonce(包括无变化保存),直接更新 manager 也会改变摘要,防止 ABA 旧版本恢复。版本状态归 ConfigHandler,读取/比较/推进由 h.mu 保护。
PUT 必须携带完整精确匹配的 If-Match;未提供返回 428/tool_guard_version_required,不匹配返回 409/tool_guard_conflict。校验、落盘、策略发布、版本推进在同一个保存临界区,失败不推进版本、不返回成功;成功返回新 ETag。星号、弱标签不作为覆盖保护绕过方式。服务重启后旧版本失效。
前端将 ETag 独立保存,PUT 携带读取时版本,成功才更新;冲突不采用错误响应上的新版本、不自动重试,保留原输入。中英俄文提示:配置已被其他用户修改,本次修改未保存,请刷新后重试。试匹配不带 If-Match,不更新版本。缺少响应版本不能静默发无条件写入。
兼容:旧 API 客户端需先 GET 再使用返回 ETag 提交 PUT;前后端同时升级,更新脚本缓存版本。整个列表任意编辑触发版本变化,不同规则同时保存也会冲突。仅保证当前服务实例内协调;多实例共享配置需另行引入持久化条件更新。
## F3 Implementation Plan
修改 internal/handler/config.go 一个字段、tool_guard.go 的版本协议;扩展专项 handler 测试验证真实并发单赢家、顺序旧草稿、无条件写拒绝、无变化保存、失败版本不变、manager 直接更新。修改 tool-guard.js 的版本状态和请求头,中英俄语言提示及 index.html 的 JS 缓存版本;扩展现有 VM 前端测试验证两个页面冲突、草稿保留、重试不换版本、成功更新版本、试匹配无副作用。更新中英文调用拦截文档、Unreleased changelog。
验证命令:go test -race ./internal/handler -run ToolGuard;node --test web/static/js/tool-guard.test.cjs;node --check web/static/js/tool-guard.js;git diff --check。必要时完整 handler 测试确认共享 ConfigHandler 无回归。测试只用临时目录和请求 fixture,不触碰线上业务数据。回滚需要前后端一起回滚,但会恢复覆盖风险;不执行部署。
## F4 Implementation
已实现持锁 ETag 比较与版本推进,强制条件保存;无条件写入 428,旧版本 409,成功保存返回新版本。前端独立记录基线版本,错误不会采用响应新版本,保留草稿;只在 GET/PUT 处理版本,试匹配不参与。中英俄提示及脚本缓存版本已更新。
专项 race 测试通过(3.246s),覆盖 12 个并发请求仅 1 成功、落盘/运行策略与成功回执一致、顺序旧草稿失败、缺版本/星号/弱版本拒绝、无变化保存推进版本、落盘失败可安全重试、manager 直接更新冲突。前端 36/36 通过(135ms),覆盖两个页面竞争、重试不偷偷换版本、草稿保留、重新读取后保存、失败版本保留及试匹配无版本头。JS syntax/diff check 通过;完整 handler 回归正在执行。
## F5 Verification / Documentation
- `go test -race ./internal/handler -run ToolGuard -count=1`:PASS,3.246s。读写和冲突比较均使用原锁,无数据竞争报告。
- `go test ./internal/handler -count=1`:PASS,20.512s。共享 ConfigHandler 和其他 handler 完整包回归通过。
- `node --test web/static/js/tool-guard.test.cjs`:36/36 PASS,135ms。
- `node --check web/static/js/tool-guard.js`、中英俄 JSON 解析与新提示存在校验、`git diff --check`:PASS。
- 中英调用拦截文档和 Unreleased changelog 已记录 GET/PUT 版本协议、错误码、草稿恢复和旧客户端迁移。
- 检查实际 apiFetch:使用 Headers 保留传入 If-Match,返回原生 Response,409/428 交由调用方处理。i18n 使用 no-cache;JS 模板缓存版本已更新。
- 未执行线上双账号写入、完整仓库套件或浏览器视觉检查:本次不部署、不改变视觉布局,测试使用临时文件、handler 请求上下文和现有前端 DOM fixture。多实例保证不在本次范围。
实现提交 `1ecbd405` 已推送;F0–F3 文档提交为 `65f947c9`、`7e6feeb9`、`23034ffa`、`4a1d0e11`,均已推送。
## F6 Review / Merge Readiness
局部复核:版本比较与文件写入、策略发布、版本推进在同一 h.mu 临界区;被拒绝请求在写入前返回;合法保存继续使用原 configFileMu 与原子 rename。前端仅成功 GET/PUT 更新版本,冲突或落盘失败不改变基线,不自动覆盖;无条件客户端无法绕过。HEAD 工作目录干净,阶段记录与实现均已推送,测试和稳定文档一致。
草稿 PR 描述:两名用户读取相同规则后分别保存时,原接口会接受旧草稿并覆盖首次保存。增加强 ETag/If-Match 保护,使同一版本仅一次成功,旧版本返回 409、缺版本返回 428;前端保留冲突草稿,并提供中英俄提示。验证:专项 race、完整 handler、36 项前端测试、JS syntax/JSON/diff 检查通过。API 调用方需先 GET 再携带 ETag 保存。整个规则列表按同一版本保护,需前后端同时升级。
代码修复完成,待 PR 审阅合并;未发布或部署,不声明线上已解决。多实例共享配置、编辑占用租约不在此修复范围。
草稿 PR:[AIPentest/CyberStrikeAI #351](https://github.com/AIPentest/CyberStrikeAI/pull/351)。F5 验证记录 7302c3d8、F6 审阅记录 8477bfcc 均已推送。远端镜像:未同步(本次未构建镜像)。
## F8 Merge Summary — 2026-10-10
用户授权检视无问题后合并 main。检视快照:base `a8321c4bff3a76fe0dfc3b576ed116e9a4d4101e`,head `5d44b59c2fbd8ec2df27949daa791f503cdbe988`;没有阻断 finding。重新执行专项 handler race(4.347s)、完整 handler(20.798s)、36 项前端测试(184ms)、JS syntax、三语言 JSON 和 diff 检查均通过;Self-update 三平台 CI 成功。
PR #351 在 2026-10-10 17:34:52 Asia/Shanghai 合并,merge commit `2335f1b639d0cd42a3ec7907e5e86f166a5d8f4a`。合并命令使用 match-head-commit 绑定检视提交,远端回执 merged=true;本地 main 已 fast-forward,合并树与检视 head 无差异。此记录替代上文待审阅合并状态。未发布版本、构建镜像或升级运行服务。
@@ -1,40 +0,0 @@
# P-026:角色维护的会话失效范围
## 工作流与维护检查
- 请求:修复角色更新/删除使无关用户掉线的问题。阶段:缺陷反馈与修复(P10)。
- 上游依据:用户提供的 A/B 结果、已核对的调用链及明确修复授权;无需新产品、UI 或 API 决策。允许实施。
- 范围:handler 角色更新/删除、AuthManager 精确撤销、回归测试;不更改数据库结构、API 或部署。
- 验收:删除零成员角色保持所有原有 token 有效;变更权限/scope 或删除有成员角色只撤销成员;描述/名称及等价权限集合变更不撤销;失败操作不撤销。
- 维护检查:rbac.go 429 行,auth_manager.go 266 行;数据库文件 1453 行,本次只读取,不添加逻辑。选择 narrow_fix,无需先做结构重构。已有 handler 测试缺少携带真实会话的角色维护回归。
- 假设:现有 Session.Roles 是登录时的角色 ID 快照,适合作为精确失效依据。作用范围仍为当前 AuthManager 实例。
## 实现设计与验证计划
在 AuthManager 增加按角色 ID 撤销方法,直接匹配会话快照的 Roles,覆盖同成员多个 token 和多个角色。角色删除后仍可匹配旧会话,不依赖已删除的数据库关联。
更新前读取旧权限集合,更新成功后比较规范化权限集合和数据库实际保存的 scope;权限顺序、重复、空白不构成实质变化。错误路径保留会话。串行化同 handler 的角色更新/删除,避免旧状态比较被并发角色维护打乱。
登录记录会话撤销版本;发布会话时检查版本,若期间发生角色撤销,则重新读取授权,避免撤销之后再写入旧快照。版本变化只要求并发中的登录重新解析,现有无关会话保持有效。
验证:真实登录 token 的 handler HTTP 回归、security 单元测试、相关包测试与 race 检查、git diff --check。部署及线上复验不在本次范围。
## 实现记录
- `internal/handler/rbac.go`:更新角色前读取权限集合,成功后按权限/scope 变化精确撤销;角色删除改为按角色撤销;用互斥锁串行化角色更新与删除。
- `internal/security/auth_manager.go`:增加 `RevokeRoleSessions`,匹配登录快照而非删除后的数据库关系;登录发布通过版本检查防止撤销后重新写入旧授权。用户授权撤销和全局撤销也推进版本,维持相同安全边界。
- 新增两个回归文件;中英文 RBAC 管理指南及 Unreleased changelog 已同步更新。
- 分支:`codex/fix-rbac-role-session-revocation`。修复已完成,进入检视与 main 合并流程;尚未部署。检视及合并结果另见本次检视记录。
## 验证记录(2026-10-10,Asia/Shanghai)
- 新增 HTTP 回归 12 个场景全部通过,含真实 admin、无关 viewer、多角色成员和同成员多个 token;权限收回或角色删除后重新登录不会保留 `chat:write`,scope 收窄后重新登录得到新 scope。
- `go test ./internal/security ./internal/handler`:两个包全部通过。
- `go vet ./internal/security ./internal/handler`:通过。
- `git diff --check`:通过。
- 原实现对照:使用临时 Go overlay 将两个生产文件映射到基线 HEAD,保持工作树不变,运行同一 HTTP 回归。8 个成功维护场景检出管理员旧 token 的 `401`(预期 `200`),证明测试可识别原缺陷;对照测试退出码 1 为预期结果。
- `go test -race ./internal/security ./internal/handler -run 'TestRBACRoleMaintenanceSessionIsolation|TestRevokeRoleSessions|TestPublishSession|TestAuthManagerAuthenticatesCreatedRBACUser' -count=1`:通过,无 race 报告。
## 边界
作用范围仍为当前服务实例。已经通过鉴权并持有 Principal 的在途请求/后台任务不由会话撤销中断;此次修复保证后续 token 鉴权及新登录快照的行为。上线需按现有发布流程部署,生产环境尚未复验。回滚可恢复本次涉及文件的基线实现,但会恢复全员掉线缺陷。
-33
View File
@@ -1,33 +0,0 @@
# 手工添加漏洞失败:会话关联校验修复
日期:2026-10-10(Asia/Shanghai)。
## 工作流检查
- 用户请求:手工添加漏洞保存失败,截图报 `FOREIGN KEY constraint failed`。
- 阶段/类型:P10 反馈迭代,现有功能缺陷修复。
- 所需及已有依据:添加表单、POST 请求结构、创建 handler、数据库外键和可空字段均已核对。
- 缺失/假设:没有线上请求体,无法确认截图实际填写的会话 ID;代码可确认不存在的会话 ID 会触发该错误。手工漏洞可独立创建的行为沿用数据库现有可空设计。
- 允许实施:是;无需新的架构或产品决策。
- 范围:会话字段可选、关联存在性校验、三种语言提示、前后端回归。
- 验收:省略/留空会话可保存;有效会话可关联并继承项目;非法关联返回明确的 400;无权限关联继续返回 403;独立漏洞仍归属创建人。
## 维护检查
- handler 608 行、database 漏洞模块 548 行、页面脚本 2584 行。页面脚本承担表单、筛选、卡片、复测等多个职责,文件大小属于 blocked 级别的广泛扩展风险。
- 允许类型:narrow_fix。本次仅从现有前端必填表达式去掉会话字段,不扩展该大文件行为;新测试放在独立文件,无需先做整体重构。
- 数据库代码不变,保留外键及现有 NULL 写入行为。
- 验证:Go handler/database 包测试、Node 添加/复测测试、JSON 解析、git diff --check。
## 原因与修复
数据库允许 `vulnerabilities.conversation_id` 为 NULL,删除会话时也保留漏洞。但前端和 POST 请求强制会话必填,并允许用户自由输入未经存在性校验的 ID。填入不存在的 ID 后 INSERT 触发外键错误,接口返回 500。
会话改为可选并给出填写提示;接口修剪关联 ID 的首尾空白,在保留权限校验后检查显式会话和项目是否存在。无效关联返回 400,数据库查询异常仍返回 500。已存在的会话继续由原数据库逻辑自动关联项目。原有创建人归属及授权逻辑保留。
## 验证记录
- Node 添加与复测回归:13 项通过。
- `go test ./internal/handler ./internal/database`:两个包全部通过,新建漏洞回归覆盖 9 个场景。
- 三种语言 JSON 解析及 `git diff --check`:通过。
- 线上部署和真实浏览器保存尚未验证。
+3
View File
@@ -13,10 +13,13 @@
- [架构说明](architecture.md) · [安全模型](security-model.md) · [RBAC](rbac.md)
- [Agent 与角色](agent-and-role-guide.md) · [Skills](skills-guide.md) · [Eino 多代理](MULTI_AGENT_EINO.md) · [Agent 最终回复治理](agent-finalization-best-practices.md)
- [黑板与上下文记忆](blackboard-context-memory.md)
- [调用拦截规则](tool-call-guard.md)
- [工作流](workflow-graph.md) · [工具执行治理](tool-execution-governance.md) · [人机协同最佳实践](hitl-best-practices.md)
## 功能指南
- [项目任务续接](project-resume.md) · [Token 用量分析](token-usage-monitoring.md)
- [资产管理](asset-management.md) · [知识库](knowledge-base.md) · [机器人接入](robot.md) · [视觉分析](VISION.md)
- [WebShell](webshell.md) · [C2](c2.md) · [MCP 联邦](mcp-federation.md)
+2
View File
@@ -104,6 +104,8 @@ example.com
5. 执行查询,选择确认归属的结果后点击 **入库所选**。
6. 根据返回的新增、更新和跳过数量检查导入结果。
FOFA 的省份/地区返回字段为 `region`,导入时会保存到资产的省份字段。旧表单或 API 请求中的 `province` 返回字段别名会自动转换为 `region`;这项兼容只针对返回字段列表,不改变查询表达式。
外部搜索结果不等同于自有资产。建议先通过组织域名、证书、网段或产品指纹缩小范围,确认授权后再入库。
## 规范化与去重
+4 -2
View File
@@ -28,7 +28,7 @@
## 新增配置 Checklist
- `config.Config` 结构体有字段。
- `config.yaml` 示例有注释。
- `config.example.yaml` 示例有注释。
- 省略字段时有安全默认值。
- 旧配置能启动。
- 说明是否热应用。
@@ -81,6 +81,8 @@
## 文档要求
公开仓库只保留面向用户或贡献者的长期文档。内部任务阶段记录、对话确认、一次性问题核对表、评审草稿和本地验证流水账应保存在仓库外。将仍有用的接口约定、兼容性说明和设计边界提炼进正式指南;修复摘要写入 `CHANGELOG.md`,不要用过程记录代替产品文档。
每个重要功能至少补:
- 用途。
@@ -90,7 +92,7 @@
- 排错。
- 源码锚点。
中英文文档要保持文件名一致,分别放在:
同一主题的中英文文档使用相同文件名,分别放在以下目录;暂缺译文时,应在导航中明确标注已有语言,避免链接到不存在的译文:
```text
docs/zh-CN/
+18 -2
View File
@@ -18,6 +18,22 @@ roll back structure repair and stop startup with the table/column and cause.
Resolve the definition or explicitly plan a data migration, then restart; the
repair engine does not invent required values or weaken constraints.
## Historical data and foreign keys
Historical data backfills and foreign-key semantic changes are separate from
missing-table/column repair. Their behavior is documented in
`docs/feature/startup-schema-reconcile/`.
missing-table/column repair. Existing data migrations remain responsible for
time values, token usage, tool guards, and approvals. The historical vulnerability
foreign-key migration creates the destination from the latest definition and
copies existing columns dynamically, preserving extra columns, indexes,
triggers, and dependent records. It is not the source of missing-column checks.
Both application and knowledge databases use the same reconciliation engine.
HITL and notification-read tables are included in the embedded definitions,
so request handlers do not need to create those tables at request time.
## Regression coverage
[Schema reconciliation tests](../schema_reconcile_test.go) cover missing tables
and columns, complex defaults, repeated startup, rollback on failure, and
preservation of existing data and extra schema objects. Keep these properties
when changing definitions or historical migrations.