Technical Design 1 - jiale-li-orion/SecFusionAgent GitHub Wiki
SecFusionAgent Technical Design 1
English | 中文 · 1 | Technical Design 2
改动 M1–M3 的运行架构、数据存储、接口或技术选型之前先读本文。本文把冻结的 Requirements-SPEC 与 01–05 的信息语义落成可实现的后端架构,当前覆盖 System Architecture、Data Lifecycle、Technology Baseline、Data Model,以及 M1 情报监测、M2 证据留存与规范化、M3 情报富化与关联;同时固定 M4/M5/M7 将使用的 Case–Trajectory–Experience 演化接缝(seam)。M4–M6 运行时由 Technical Design 2 承接。
Requirements 持有“系统需要做什么”;01-Data-Sources-and-Processing 持有 source、证据、object/relation、retrieval 与数据生命周期;02-CTI-Baseline-Reuse-and-Ownership 持有 CTI 复用边界;03-Normative-Knowledge-and-Policy 和 04-AI-Model-Data-and-Agent-Application-Security 持有专项语义;05-Incident-News-Intelligence 持有 Incident / News Watch 的 source role、监测源与事件型数据生命周期。本文决定这些对象由哪些进程处理、写入什么存储、通过什么接口连接,以及第一版代码采用什么技术栈。
本文为 Technical Design 1,范围止于 M1–M3 Data Plane、M3→M4 handoff 与 Case / Trajectory / Experience 存储接缝。M4–M6 的 Task Routing、Perception、Investigation State、Agent Runtime、Execution Control Plane 与 Decision/QA 由 Technical Design 2 继续定义。
实现状态 — 2026-10-04
M1–M3 Data Plane 已进入 M3→M4 storage/read handoff 已验证 / semantic enrichment contract 已冻结 / source lifecycle compatibility 收口。四种 retention path 都已有 executable path:hot_window 由 NVD + Redis Hot Bug 工作集承载;durable_managed 由 managed document revision/chunk、PostgreSQL FTS、provider-neutral dense embedding 与 evidence-gated semantic extraction承载;selective_index 已从 GitHub repo metadata扩展到 Issue / PullRequest / Commit / Release 一等对象和显式 reference graph;incident_signal 已有 SignalItem / IncidentCandidate / durable Incident timeline。Hot Bug promotion与 provider enrichment继续经过 AcquisitionRun → EvidenceIngress → evidence-backed knowledge writer。
M3→M4 的 storage/read boundary 已经落地:knowledge read 返回 claim/relation 对应的 EvidenceRef;Current Projection 包含 current_vulnerability_view、current_affected_versions、current_fix_status、current_repo_security_state 和 current_incident_view。enrichment-v1 vocabulary、八类产品数据源 coverage contract、monitoring latency sample 与 evidence-aware enrichment scorer 已进入可执行 contract;deterministic/source-asserted write 会拒绝未注册 vocabulary,semantic 未注册结果标记为 exploratory。Document semantic processor 仍要求 proposal 携带原文 verbatim quote,quote 无法在 chunk 中定位时拒绝写入。此后 canonical CWE/has-weakness、NVD/CVE5/OSV/CSAF source-specific applicability、FIRST EPSS、GitHub Advisory EPSS/fixed-version、显式 PoC、InternetAsset→CPE→完整 NVD configuration applicability join 都已落地;剩余 M3 工作主要是扩大授权 live asset、paper/incident、semantic provider 等真实 denominator,而不是再发明一套统一风险字段。ANN / hybrid retrieval / rerank 继续由实际 retrieval workload 决定。
当前正式代码坐标已通过 make check:522 passed / 12 skipped,Ruff 全绿,mypy 534 source files / 0 errors;真实 PostgreSQL/Redis + LocalStack integration suite 12/12。同一正式 deployment deployment:0e16e1b574d5b6383434e7fc80f64cc4 已形成 M1/M3/M6/fault-recovery 六个 BenchmarkRun 与 CompetitionReport;其中 M1 固定窗口有 12/12 evaluable scheduled samples,p50=357.709s、p95=7241.893s、within-6h=100%;同一正式 run 的独立 expected-event manifest 下 source_delivery_coverage=61.538%,该值保留为真实覆盖短板,不由 latency 结果掩盖。M3 当前正式 aggregate 为 292 TP / 1 FP / 1 FN。Product QA 已证明兼容模型端点可以沿 TD1 Evidence/Knowledge → TD2/2A Context/Decision 路径形成正式证据;M3 semantic/dense provider E2E 仍是独立扩展 denominator,不与 structured M3 或 Product QA 的已闭环结果混写。Data Source ownership、外部 access blocker 与凭据约束继续按 source/provider 事实记录,不用“当前有没有某个临时 credential”定义架构完成度。
这轮 compatibility closeout 进一步把配置声明变成 runtime invariant:SourceModel.enabled 表示 source capability,schedule_policy.enabled 只控制 scheduler;time_bounded source 必须有 downstream consumer,Hot Bug adapter 必须同时具备 hot / durable normalizer,Incident adapter 必须有 signal extractor。Shodan / Censys / FOFA / ZoomEye 在 provider 边界统一为 AssetObservation;CVE Program/cvelistV5 已闭合 Hot→durable canonical promotion;durable Incident 在首次 promotion 后继续吸收 material signal并追加 revision/timeline/evidence;Managed HTML content 使用 bounded revalidation;EvidenceIngress 对“同 provider revision / idempotency key、不同 content hash”保留 revision-collision Observation。以上变化不扩大 M3→M4 边界,只保证交给 M4 的世界状态具有可执行、可追溯的生命周期。
2026-09-29 graph-completion follow-up:EnrichmentRole 的 deterministic fixed-point 不再把“某 dimension 已有一个 resolved fact”误当成“该 dimension 的所有辅助图关系都已闭合”。graph.github_references 与 graph.osv_fix_boundary 现在是显式 supplemental operator:当 FIX_REMEDIATION 已 resolved、但 exact development/fix prerequisite 已存在且对应 graph edge 尚未 materialize 时仍可继续执行一轮;这不会把 dimension 改回 missing,也不进入 formal M3 denominator。GitHub exact-reference path 同时改为 local-first:优先按 github_pull_request / github_issue / git_commit_sha / github_release_tag 强标识复用 canonical development object,只有 miss 才重新 acquisition。以 CVE-2026-48746 为 production probe,NVD 与 GitHub Advisory 中对 vllm-project/vllm#43426 的 exact reference 已在 0 次新增 GitHub fetch 下 materialize 为两条 evidence-backed references-development-object,并与既有 PR merged-as/head-commit/belongs-to-repo 形成真实二跳图。
架构
SecFusionAgent 的 Data Plane 同时存在三个不同的分类轴,不能互相替代:
- Source taxonomy:八类外部来源,回答“谁对什么事实负责”;
- Processing path:Bug Stream、Structured Development Index、Insight Corpus、Incident Watch 四条主路径,加 Internet Asset on-demand side path,回答“这条 source stream 怎样发现、处理、留存和晋升”;
- Durable value/state family:Knowledge、Incident、Insight、Experience,回答“系统长期积累什么”。
同一个 provider 可以产生多条 source stream,同一 source class 也可以根据对象/内容进入不同 processing path。processing convergence 只复用 runtime/retention 机制,不合并 source authority 或 provenance。Website 的“八类来源 → 四条主处理路径 + asset side path”与本设计使用同一语义。
SourceDefinition.retention_mode 是 processing path 的可执行编码,不再增加第二套枚举:
| Processing path | RetentionMode |
典型行为 |
|---|---|---|
| Bug Stream | hot_window |
高频 current working set,按需 promotion |
| Structured Development Index | selective_index |
稳定对象/关系持续同步,正文按需固定 |
| Insight Corpus | durable_managed |
原始版本、投影、切块、semantic/index 长期保存 |
| Incident Watch | incident_signal |
短 TTL signal/candidate,promotion 后进入 durable Incident |
| On-demand observation side path | time_bounded |
query-bound observation,带 observed_at,必要时 promotion |
同一 taxonomy category 可以出现多个 retention mode;retention mode 不反向决定 category。durable_promoted 是运行时晋升后的状态,不是第六种 source processing path。
SecFusionAgent 按 workload 设计数据生命周期。当前有四类需要长期区分的情报工作负载:
- Bug Stream:CVE/NVD/OSV/GHSA/KEV 等高频、已有 canonical store 的漏洞流。本地维护近期新增、近期更新、高频访问和正在调查的工作集,历史记录按需回查外部 canonical source。
- Incident Intelligence:攻击、被盗、数据泄露、供应链事故、在野利用、资金转移等突发事件。最初通常只有新闻、研究员、on-chain 或 telemetry 信号,系统先做热聚类 / 时间线 watch,形成持续分析价值后晋级 durable Incident。
- Insight Corpus:论文、厂商技术报告、安全研究、system/model card、标准法规等长期知识资产。本地持有版本、投影、semantic result 与 retrieval index。
- Investigation Experience:从 M4/M5 的 Case/Trajectory 和 M7 outcome 中抽取的调查方法、失败模式与 stop/fallback policy,属于 Agent 自身演化资产。
Investigation State 贯穿 Bug/Incident 调查,具有低吞吐、高价值、强一致性的特征,由 PostgreSQL durable 状态持有。
运行时由调度器、Source Worker、Hot Cache、Incident Correlator、Evidence Ingestion、Normalization、Enrichment、索引器组成。PostgreSQL 保存 durable 状态、当前投影与长期知识,S3-compatible 产物存储保存需要长期保留的 raw JSON/HTML/PDF,Redis Hot Cache 保存 bounded bug 工作集与短生命周期 incident 信号/聚类,独立 Redis Broker 承担 Celery task transport。
flowchart LR
subgraph External[External sources]
BugCold[Canonical bug DB\nCVE / NVD / OSV / GHSA / KEV]
IncidentSignal[Incident signals\nnews / on-chain / researcher / telemetry]
Primary[Primary confirmation\nproject / vendor / repo / authority]
Structured[GitHub / package & model platforms]
Managed[Paper / vendor / blog / normative content]
OnDemand[Internet asset / high-cost providers]
end
subgraph Runtime[SecFusionAgent backend]
Scheduler[Scheduler]
Adapters[Source Workers / Adapters]
HotIngress[Hot Bug Ingress + Diff]
Incident[Incident Correlator / Timeline Watch]
Ingress[Durable Evidence Ingestion]
Normalize[Normalization]
Enrich[Enrichment]
Promote[Promotion Gate]
Indexer[Indexer]
Model[LLM Provider Adapter]
API[FastAPI]
end
subgraph Storage[Local state]
Hot[(Redis Hot Working Set\nBug + Incident Candidate)]
PG[(PostgreSQL + pgvector\nDurable Knowledge + Current Views)]
Blob[(S3 / MinIO Artifact Store)]
Broker[(Redis Celery Broker)]
end
Scheduler --> Broker
Broker --> Adapters
BugCold --> Adapters --> HotIngress --> Hot
IncidentSignal --> Adapters --> Incident --> Hot
Primary --> Adapters
Hot --> Normalize
Hot --> Enrich
Incident --> Enrich
Enrich --> Promote
Promote --> Ingress
Structured --> Adapters
Managed --> Adapters
OnDemand --> Adapters
Adapters --> Ingress
Ingress --> Blob
Ingress --> PG
PG --> Normalize
Normalize --> PG
Enrich --> Model
Enrich --> PG
PG --> Indexer
Blob --> Indexer
Indexer --> PG
PG --> API
外部来源按 01 已冻结的接入模式进入后端,同时采用不同保留模式:
| 接入模式 | 典型来源 | 本地生命周期 | 长期权威 |
|---|---|---|---|
| Canonical bug feed / external query | CVE/NVD/OSV/GHSA/KEV | hot_window:最新发布、最新更新、高频访问和 active 工作流进入 Redis;TTL/LFU 后可淘汰 |
外部 canonical source |
| Structured index | GitHub、package/model registry、target repo graph | selective_index:稳定 ID/relation 留本地;正文和高成本对象按需快照 |
外部平台 + 本地关系图 |
| Managed content | 厂商公告、博客、论文、标准法规、Insight Watch | durable_managed:raw 版本、投影、semantic result、retrieval index 长期保存 |
本地证据 + 原始来源 |
| Incident 信号 | 新闻快讯、on-chain alert、研究员披露、威胁 telemetry | incident_signal:短 TTL 信号 + 热聚类;持续富化后决定是否晋级 Incident |
原始来源分别持有 |
| On-demand 观测 | Censys/Shodan/FOFA/ZoomEye、商业情报 | time_bounded:query/filter/result 带观测时间;默认短 TTL,调查或回答需要时晋级 |
provider 观测 |
| 已晋升 bug / incident 证据 | 被调查、被引用、形成长期关系或进入评测集的版本 | durable_promoted:固定实际消费版本和必要原始证据 |
本地证据 + 外部版本 |
Bug Stream 的本地价值来自 current 工作集;Incident Intelligence 的价值来自事件演化、跨源 corroboration 与时间线;Insight Corpus 的价值来自长期语义资产;Experience 的价值来自 Agent 调查方法演化。四类 workload 共享 source/证据/来源链路 contract,但保留、consistency、indexing 和 enrichment depth 独立配置。
数据生命周期与温度分层
热度由四类信号决定:source change recency、access frequency、workflow activity、domain priority。新发布和新版本自动进入热集合;用户查询、M3 enrichment、M5 investigation 会提高访问/工作流热度;目标 AI Infra repo、KEV/PoC/critical 信号可以提高处理优先级。活跃调查、待晋升和评测集 pin 会阻止淘汰。
准入、处理优先级与淘汰分开计算。准入决定对象是否进入 Redis;处理优先级决定是否立即触发高成本 enrichment;淘汰根据 TTL、LFU/LRU 和工作流 protection 回收容量。Redis 的 max-memory policy 作为容量保护,业务层继续持有晋升与淘汰语义。
Bug Stream write path
delta / updated record
-> cheap parse + current projection
-> Redis hot working set
-> change classification
-> selected enrichment
-> promote OR expire/evict
Bug read path
Redis hit
-> external-current projection
Redis miss
-> PostgreSQL durable SecFusion knowledge (if promoted)
-> external canonical source for current record
-> hot admission
高频 source 的版本变化先做 field-level diff。CVSS/CWE/KEV/reference 等结构化字段变化更新对应投影;description、patch explanation 等语义字段变化才触发 semantic extraction / embedding。处理规则使用 change type -> invalidate affected derived state,降低 write amplification。
晋升把临时工作状态变成长期资产。触发条件包括:进入 M4/M5 investigation;成为 M6 answer citation;进入评测集/人工裁定真值;形成 target repo / supply-chain / incident 的长期 relation;出现需要保留的 source conflict;analyst review 决定长期保留。需要 durable conclusion 前先固定实际消费的 provider 版本。
降级用于清理长期存储里仍可稳定从外部重取、且已经没有 durable relation / 评测集 / audit 依赖的 payload。降级可以删除本地 raw body 和 derived cache,同时保留外部 ID、晋升历史与必要来源链路 pointer。具体降级 policy 在数据规模实测后启用。
缓存一致性、Warm 状态与物化当前投影
三层数据的权威固定如下:
External provider
authority for current external canonical record
PostgreSQL durable knowledge / incident / experience
authority for SecFusionAgent 自己确认、推导和长期保存的状态
Redis hot cache
authority for nothing; it is a replaceable working projection
Cache consistency 遵循权威分层:Redis miss 或淘汰不能改变长期结论。一个对象同时存在热与 durable 状态时,read path 返回热 external 记录构成的当前投影,同时合并 PostgreSQL 中的 SecFusion-derived knowledge;两者保留各自版本,避免较旧 durable 快照覆盖最新外部状态。
Warm 不增加新的数据库产品,由 PostgreSQL 中的 物化当前视图 / 当前投影 承担。它比 raw claim/relation 更适合高频查询,又可以从 durable history 增量重建。第一批投影包括:
current_vulnerability_view
current_fix_status
current_affected_versions
current_repo_security_state
current_incident_view
底层继续保存多来源 claim/relation/时间线事件;投影根据 KnowledgeChange 与 incident.changed 发件箱事件做 incremental view maintenance。CVSS 或 KEV 变化更新对应字段,description/technical analysis 变化才 invalidates semantic 投影与 embedding。M4/M6 默认读取当前投影,需要解释冲突或历史状态时回到底层证据图。
Current Projection 的 logical identity 固定为 projection_type + subject_id,同时保留 deterministic projection_id。PostgreSQL 写入只允许 upstream_revision 单调前进;同一 projection identity 的并发 rebuild 在 transaction 内先取得由 deterministic ID 派生的 advisory lock,再执行 conditional upsert,避免 deterministic PK 与 logical UNIQUE index 的 speculative insert 互锁。这个锁只序列化同一 identity,不把无关 projection 变成全局单线程,也不移除数据库 uniqueness invariant。
Incident Intelligence 来源策略
Incident / News Watch 的具体监测源、source role、接入优先级与接入探针由 05-Incident-News-Intelligence 持有。Technical Design 只固定它们进入运行时后的行为:signal/telemetry 先进入短 TTL staging,primary/forensic/authority 可以参与晋升和 durable enrichment;source_family/upstream_source 用于消除转载造成的伪 corroboration。
Incident 热到持久生命周期
Incident 输入具有 burst、duplicate、uncertain 和持续修订特征,先进入热信号缓冲:
SignalItem
-> deterministic anchor extraction
-> IncidentCandidate clustering
-> timeline watch / source follow-up
-> promotion decision
-> durable SecurityIncident
-> M3 enrichment
-> M4 confirmed / conflict / unknown
-> M5 investigation
-> postmortem / insight / experience
SignalItem 保存在 Redis 短 TTL namespace,包含 source、original/cited source、published/observed time、title/summary、entity hints、URL、content hash 和可验证 anchor。Web3 anchor 优先使用 project、chain、token、address、tx hash、amount 和时间窗;通用 cyber incident 优先使用 organization、product、domain/IP、CVE/GHSA、threat actor、campaign 和时间窗。当前实现只允许 deterministic strong anchor 参与候选关联;semantic similarity 预留为后续 recall assist,需要和强 anchor/证据门禁配合,避免同一项目短时间内两次独立事故被强行合并。
IncidentCandidate 保存聚类状态、watch priority、next poll、last material change、source diversity 和 unresolved questions。事件初期不把每条转载新闻永久写入 PostgreSQL/S3;重复转载在 TTL 后淘汰。出现下列信号时晋级 durable Incident:
- 受影响项目/厂商或官方渠道确认;
- 多个独立 source 对同一可验证 anchor 形成 corroboration;
- on-chain transaction、公开 IOC、GitHub patch/advisory 等可直接验证证据;
- 事件影响触发 M4/M5 investigation、持续资金跟踪或用户查询;
- analyst / 评测集明确 pin。
晋级后创建 SecurityIncident object,并把支撑当前时间线/claim 的 source 版本固定为 durable 证据。后续新闻仍先进入热聚类,产生 material change 的 item 再晋升。全文向量化面向已晋升 technical report、postmortem、厂商公告和高价值分析,不对所有快讯做 embedding。
Incident Watch 使用 adaptive follow-up:有新资金移动、官方 response、exploit 持续、影响范围变化时提高 watch priority;长时间没有 material change 后逐步降低 polling,进入 resolved/postmortem 状态后转为低频版本 watch。具体 cadence 由 source capability 和 M8 budget 配置。
背压与选择性富化
M1 可以高频发现变化,M3 的高成本处理必须有独立预算。每个热更新先经过确定性规范化/diff,随后按 priority 进入 enrichment queue;语义处理、Internet asset lookup 和大规模 repo traversal 拥有独立 concurrency/rate/cost budget。
priority 信号由 target repo/risk domain match、KEV/PoC/critical status、change type、access frequency、active investigation 和 SLA 组成。queue backlog 超过预算时,低优先级对象保留在 Redis 工作集并延迟 enrichment,source monitoring 继续推进,不让 LLM/API 吞吐反向阻塞新漏洞发现。
这个策略把 monitoring 新鲜度与 enrichment depth 解耦:M1/M2 先保证“新变化已可见”,M3 根据价值和系统容量逐步加深处理。M7 分别记录 hot-ingest latency、enrichment wait time 和处理器延迟。
运行时归属
| Runtime | Code owner | 状态 owner | 职责 |
|---|---|---|---|
api |
apps/api |
无独立业务状态 | 暴露 source health / knowledge read API,后续承载 M4–M6 application API |
scheduler |
packages/monitoring |
sources/source_state |
读取 source schedule,创建 scheduled acquisition task |
source adapter |
packages/sources |
无独立 durable runtime state | 实现 API/Git/RSS/Web/query provider protocol,产生 IngestEnvelope |
acquisition runtime |
packages/monitoring/acquisition |
acquisition_runs |
为 scheduled/on-demand provider read 建立 run、parent/query 来源链路与 terminal state |
incident correlator |
packages/intelligence/incident |
热 incident 信号/聚类 | M2 信号去重、anchor clustering、IncidentCandidate 身份/correlation;follow-up request 交给 monitoring/acquisition |
ingestion / normalization worker |
packages/intelligence |
热投影 + durable 证据/knowledge | 热接入/diff、durable 证据 commit、解析、去重与 id 实体对齐 |
enrichment worker |
packages/enrichment |
processing result | deterministic、graph、semantic 与 provider-backed enrichment |
index worker |
packages/intelligence |
derived index | document 切块、lexical/vector index、元数据投影 |
apps/worker 使用同一 Python image 启动不同 Celery queue;deployment 可以按 workload 把 I/O collection、语义处理和 indexing 拆成独立工作进程,也可以在开发环境合并运行。业务行为仍由对应 package 持有。
处理主干
调度器和 Source Worker 共用同一 acquisition contract,M2 根据 retention_mode 在入口处分流:
- 调度器从
sources/source_state找出到期来源,创建AcquisitionRun并投递 collection queue。 - Source Worker 执行适配器的
discover/fetch/query,返回带 source/revision/time/hash 的IngestEnvelope。 hot_windowsource 进入HotBugIngress:cheap parse、当前投影、field-level diff 写入 Redis,生成HotNormalizationResult。游标在热记录成功写入并可读取后推进。incident_signalsource 进入IncidentSignalStore:先保存短 TTLSignalItem,再由 Incident Correlator 基于 deterministic strong anchor 更新IncidentCandidate与 watch 状态。semantic similarity 可以作为后续候选辅助,但当前实现不允许它单独触发聚类/晋升。- 热漏洞根据 change/domain priority/access/工作流进入 selective M3 enrichment;IncidentCandidate 根据 source diversity、material change 和 unresolved questions 进入 source follow-up/enrichment。
- 出现 durable 信号时触发 Promotion Gate。Bug 晋升固定当前 provider 版本;Incident 晋升固定支撑时间线/claim 的 source 版本。
durable_managed/durable_promotedsource 从 acquisition 直接进入 Durable Evidence Ingress。raw JSON/HTML/PDF 写产物存储,PostgreSQL 创建 immutableObservation/EvidenceArtifact。 - Durable Normalization 通过 source parser + canonical mapper 写
Object/ExternalIdentifier/Claim/Relation/EvidenceLink;Incident 晋升同时创建SecurityIncident/时间线状态。transaction 提交新的knowledge_revision或incident_revision与发件箱事件。 - M3 对 durable subject 运行 deterministic、graph、semantic 或 provider-backed 处理器。Provider lookup 再次经过 M2,并按自己的保留模式选择热/incident/durable path。
- Durable commit 触发索引器/当前投影 updater;document 切块、lexical/vector index、当前视图和 Experience/洞察 retrieval 投影都属于可重建 derived 状态。
Celery Broker 提供 at-least-once task delivery,PostgreSQL 保存 durable run/发件箱状态,Redis Hot Cache 只保存可淘汰工作状态。热记录的幂等键收敛 feed 重放,durable Observation/Claim/Relation 的幂等键收敛晋升和处理重放。
横切约束
Requirements 的 C1–C3 直接映射到运行边界:
| Constraint | Technical contract | M1–M3 落点 |
|---|---|---|
| C1 证据可追溯 | 热投影/信号可回 provider/source 版本;每个 durable claim/relation/时间线 event 能定位观测、产物 locator 与 processing 版本 | HotBugRecord/SignalItem 版本、Observation、EvidenceArtifact、EvidenceLink、ProcessingRun、knowledge/incident 版本 |
| C2 外部内容不可信 | 外部 payload 永久保留 external_untrusted;模型处理只能生成 typed candidate,source content 没有配置、credential 或 execution 权威 |
HotBugIngress、Incident Correlator、Evidence Ingress、Semantic Processor、ModelProvider 边界 |
| C3 有界执行 | acquisition/processing task 有超时、attempt、terminal state 与幂等键 | AcquisitionRun、ProcessingRun、Celery 重试策略、source 退避 |
C1 的失败表现为候选缺失有效证据 locator;C2 的失败表现为外部内容影响 system config、tool policy 或 credential 边界;C3 的失败表现为 run 无法到达终态。M7 后续直接围绕这三类 failure 建 regression。
技术基线
当前 DESIGN 直接给出第一版实现基线。探针用来验证高风险假设,验证失败后替换具体 provider;模块边界和 data contract 保持稳定。
| Concern | Baseline | 设计理由 |
|---|---|---|
| Backend language | Python 3.12+ | source/API/LLM/CTI 生态集中,和当前 Agent tooling 一致 |
| HTTP API | FastAPI | typed async API;后续 M4–M6 与前端共用 |
| Schema / validation | Pydantic v2 | IngestEnvelope、processor output、API contract 使用同一类型系统 |
| Relational persistence | PostgreSQL 16+ | source state、knowledge、relation、run 来源链路、评测集元数据统一事务语义 |
| ORM / 迁移 | SQLAlchemy 2 + Alembic | 显式 schema 与迁移,测试和生产共享模型 |
| Vector / lexical retrieval | pgvector + PostgreSQL FTS/pg_trgm |
durable 洞察/experience 第一版保持同库;后续可接 VikingDB/OpenSearch/Qdrant provider |
| Experience retrieval | PostgreSQL + pgvector | Experience 作为 versioned policy memory,与 knowledge/证据分表;OpenViking 作为演化管道设计参考 |
| 原始产物 | S3-compatible object storage;本地/CI 使用 MinIO | JSON/HTML/PDF 与 canonical DB 分离,content hash 可复用,生产可换 S3/OSS |
| Background jobs | Celery + dedicated Redis Broker | collection、normalization、enrichment、indexing 分 queue;broker 使用独立实例/namespace 与 noeviction 类策略保护任务状态 |
| 热工作集 | dedicated Redis Cache | bug 工作集 + incident 信号/聚类;业务层持有准入/晋升/watch,TTL/LFU/LRU 负责容量保护 |
| Scheduling | 单实例调度器 + source-level next_due_at |
source cadence 由 registry 决定,避免为每个来源硬编码 cron |
| HTTP client | httpx |
async request、超时、redirect、streaming 和适配器 test 易控制 |
| Content parsing | source mapper + HTML/PDF/plain parser 适配器;当前 PDF 使用 pypdf,HTML/plain 已进入 Managed Content executable path |
parsing 与业务语义分开,原始产物始终可重新处理 |
| LLM integration | 自有 ModelProvider interface + provider 适配器;Pydantic/JSON Schema structured output |
M3 模型调用是 semantic processor,prompt/model/来源链路保持显式 |
| CTI interoperability | STIX 2.1 / TAXII 2.1 适配器,外接 OpenCTI/MISP | 复用标准和成熟生态,同时保留 AI-specific data model |
| Deployment | Docker Compose 作为开发、CI 和比赛部署基线 | API、工作进程、调度器、PostgreSQL、Redis Broker、Redis Hot Cache、MinIO 可一键复现 |
知识内核
第一版采用 PostgreSQL 自有轻量 knowledge kernel + STIX/TAXII interoperability。SecFusionAgent 的核心写路径由 PostgreSQL kernel 持有;OpenCTI/MISP 通过 CTI source、exchange endpoint 与能力 provider 接入。
这个选择来自 01–04 已经固定的数据语义:系统同时管理传统 CTI、repo/release graph、paper/research 洞察、normative requirement/control、Agent/tool/memory relation 和证据版本。把这些对象统一落在项目拥有的 relational kernel,可以让 M2/M3 的来源链路、评测集版本和 AI-specific relation 共用同一 transaction 边界。STIX/TAXII 适配器负责与传统 CTI 生态交换,成熟 IOC/parser/correlation 能力继续通过现有平台或库复用。
关系查询第一版使用 PostgreSQL relation table、索引和 recursive CTE。后续 graph 评测集如果显示 traversal latency 或查询表达力成为瓶颈,再在 KnowledgeRepository 后增加专用 graph provider;canonical knowledge 继续由 PostgreSQL 持有。
Retrieval
检索第一版也收敛在 PostgreSQL:精确 ID/version/package 查询直接走结构化表;document 切块保存 tsvector/pg_trgm 字段与 pgvector embedding;元数据 filter 使用 object/source/risk/version 字段。中文与英文语义检索主要依赖 multilingual embedding,精确 security identifier 与 repo/package/version 由结构化查询承担。
RetrievalPort 屏蔽底层实现。M7 后续发现 lexical recall 或数据规模需要独立 search engine 时,可以增加 OpenSearch/Qdrant 等 provider,证据、knowledge 与评测集 contract 不变。
模型处理
M1–M3 的 control flow 由项目 package 直接持有:调度器、source routing、证据 commit、去重、实体对齐门禁和 enrichment routing 都是确定性逻辑;模型调用通过 ModelProvider 完成非结构化语义抽取。LangChain/LlamaIndex 若用于局部 parser/retriever provider,也服从这些项目级 contract。
语义处理器的运行条件固定为:输入来自已经持久化的 Observation/DocumentProjection;prompt 显式把外部文本标记为 untrusted data;模型拥有的 capability 为 structured generation;输出先进入 Pydantic 候选;候选写入 canonical knowledge 前需要证据 locator 与处理器来源链路。模型 API credential 由工作进程 config 注入,外部证据无法改变 provider、tool 或 credential policy。
数据模型
本地状态分成六组:source/runtime 状态、Redis 热工作集、incident 状态、durable 证据、canonical knowledge、derived retrieval / experience。PostgreSQL 持有 durable 元数据、已晋升 Incident、canonical 状态与当前投影;产物存储持有需要长期保存的 raw body;Redis 热漏洞/incident record 属于可淘汰工作投影,不能成为长期 claim/时间线的唯一权威。
表
| Table / object | 关键字段 | 归属 |
|---|---|---|
sources |
source_id, adapter_type, source_class, authority_scope, access_mode, update_semantics, schedule_policy, retention_mode |
M1 |
source_state |
cursor, last_attempt_at, last_success_at, next_due_at, backoff_until, rate_limit_state |
M1 |
acquisition_runs |
trigger、source、query/cursor、attempt、status、parent run/task | M1/M3 |
observations |
source object 身份、external 版本、published/updated/fetched time、content hash | M2 |
evidence_artifacts |
观测、media type、storage URI、hash、access rights、trust class | M2 |
documents / document_revisions |
stable document 身份、source object、观测、external 版本、parser 名称/版本、元数据;同一 Observation 可对应多个不可变 parser revision,唯一键为 (observation_id, parser_name, parser_version) |
M2 |
objects |
internal ID、object_type、canonical key、typed properties |
M2 |
external_identifiers |
namespace、value、object ID | M2 |
claims |
subject、predicate、value、qualifier、origin、生命周期、processing run | M2/M3 |
relations |
source object、relation type、target object、qualifier、origin、生命周期 | M2/M3 |
evidence_links |
claim/relation、观测/产物、field/page/section/span locator | M2/M3 |
processing_runs |
processor、version、input 版本、model/prompt 版本、status | M2/M3 |
insight_candidates |
related claims/relations、change type、证据成熟度、晋升状态 | M3 |
incidents |
SecurityIncident、生命周期、watch state、current summary、incident 版本 | Incident/M4 |
incident_timeline_events |
incident、event time、event type、claim/证据 refs、supersedes | Incident/M4 |
incident_source_links |
信号/证据 source、original/cited source、corroboration dependency | Incident |
current_projections |
vulnerability/fix/repo/incident current state + upstream 版本 | M2/M3/M4 |
document_chunks |
document/section、text、元数据、embedding、index version | 索引器 |
knowledge_changes |
monotonic 版本、changed IDs、cause run、commit time | M2/M3 |
outbox_events |
domain event、payload、delivery state | transaction handoff |
Managed HTML parser v3 优先选择 .entry-content、.post-content 等正文容器,避免把站点的“相关阅读”卡片误当正文。源内容字节未变化而解析器升级时,M2 保留原 Observation/Artifact 与旧 DocumentRevision,新增 parser revision;当前 lexical、compact-name 与 dense 检索只取文档最新解析版本,已记录的 chunk 引用仍可按原 revision 精确回放。
| investigation_cases | task signature、target objects、goal、initial knowledge 版本、rubric、status | M4/M5 |
| investigation_trajectories | case、step/tool/证据 event、retrieved experience version、outcome、latency/cost | M5/M7 |
| experience_candidates | extracted procedure/failure pattern、scope、supporting trajectory、candidate state | M5/M7 |
| experiences / experience_versions | scope、trigger、recommended action、failure/stop/fallback、status、version | M5/M7 |
| experience_support | experience version ↔ trajectory / evaluation relation | M7 |
热工作集
Redis 保存当前漏洞工作集的可淘汰投影,key 由 provider namespace + 外部 ID构成。record 保存当前版本、published/updated/fetched time、normalized current fields、content hash、热度元数据和处理状态。辅助 sorted set / set 维护 updated_at、access frequency、active 工作流和 pinned object。
bug:{source}:{external_id} current hot record
bug:updated sorted by source updated_at
bug:access access score
bug:active active processing/investigation
bug:pinned protected from eviction
incident:signal:{id} short-lived SignalItem
incident:cluster:{id} IncidentCandidate current state
incident:watch sorted by next_poll_at / priority
Redis 不是 knowledge/incident source of truth。bug record 丢失时从外部 canonical source 恢复;incident 信号过期后从已知 source 或后续 follow-up 重新发现。需要形成 durable claim/relation/时间线时,Promotion Gate 先固定支撑结论的 provider/source 版本。Celery broker 与热缓存使用独立 Redis 实例或独立故障域,cache 淘汰不影响 task delivery。
证据与版本
Durable Observation 表示“某来源在某次版本实际提供的内容”。hot-window record 在晋升前不创建该对象。优先幂等键为 source_id + external_object_id + external_revision;来源缺少版本时使用稳定 locator + content_hash。同一版本重放返回既有观测;mutable page 内容变化产生新观测。
EvidenceArtifact body 以 content_hash 为对象键写入 S3-compatible store。PostgreSQL 保存 storage URI 与 hash。写入顺序是 upload 产物、提交观测/产物元数据、返回 ObservationAck。数据库事务失败可能留下无引用 blob,周期 janitor 根据产物引用清理;产物上传或元数据 commit 失败都不会 ack source 游标。
Canonical knowledge 的每次事务创建单调递增 knowledge_revision。Object/Claim/Relation 保存创建和 supersede/retract 版本;M7 评测集记录使用的 knowledge 版本。knowledge_changes 与 outbox_events 在同一数据库事务写入,后台 dispatcher 再把后续规范化/enrichment/index job 发布到 Celery,避免知识已经提交而下游任务丢失。
Object, Claim, Relation
Object 表示具有稳定身份的实体。当前已落入通用 Knowledge runtime 的 canonical object type 包括 Vulnerability、Repo、Issue、PullRequest、Commit、Release、Package、Product、SoftwareVersion、InternetAsset、Weakness、ExploitArtifact、ResearchWork 与 Document;这些类型已由 NVD/GitHub Advisory/OSV/CVE5/CSAF/FIRST EPSS/asset/research 等确定性或证据门控路径实际使用。NormativeDocument / Requirement / Control 与 Incident 专用对象继续由对应领域模型持有。数据库通过 object_type + properties JSONB 承载稀疏扩展字段,强身份进入 external_identifiers。
Claim 保存 scalar 或 structured literal,例如 CVSS、known-exploited、attack condition、适用性。Relation 使用 versioned vocabulary 连接两个 object,例如 Vulnerability --affects-package→ Package、Vulnerability --fixed-by→ Commit、ResearchWork --discusses-vulnerability→ Vulnerability。version range、time range、role、scope 等 edge-local 条件进入 relation qualifier;进入正式 enrichment P/R 的 canonical relation 还必须满足 registry 冻结的 subject/target shape。
每条 claim/relation 都有 origin = source_asserted | deterministic_derived | semantic_derived 和生命周期。M2/M3 的 accepted 表示写入门禁已通过;M4 后续维护 confirmed fact、conflict 与 unknown。来源冲突表现为同一 predicate 的多条证据支撑的 claim,M2/M3 保留差异。
EvidenceLink
EvidenceLink 是 C1 的数据实现。JSON 来源保存 JSONPath/field;HTML 保存 section + character span;PDF 保存 page + span;GitHub object 保存 API field / comment / diff locator。DocumentProjection 同时保存 clean text 到原产物的 locator mapping,切块/embedding 重建后 citation 仍然能返回原始证据。
索引
document_chunks 属于 derived data。切块保存 source/object/证据 IDs、risk domain、document 版本、chunker 版本、embedding model 版本和 vector。全文/向量命中提供 retrieval 候选,事实引用仍以 EvidenceLink 为准。
M1 情报监测
M1 的 code owner 是 packages/sources 与 packages/monitoring。sources 持有适配器和来源定义,monitoring 持有调度器、游标、health 与 scheduled run。M1 负责 source acquisition 与候选投递;M2 决定身份/correlation。accepted 信号按生命周期分别为热漏洞的 HotNormalizationResult、incident acquisition 的 SignalAccepted、durable source 的 ObservationAck/NormalizationResult;IncidentCandidate 属于 M2 output。
来源注册表
来源静态定义存放在 version-controlled config,并在启动/部署时同步到 sources 表;credential 只保存 secret reference。运行中的游标、health、next due、rate-limit 状态存 PostgreSQL。这样 source 接入既能 code review,又能在运行时观测状态。
SourceDefinition:
source_id
adapter_type
source_class
authority_scope
source_role = signal | telemetry | primary | forensic | authority | reference
source_family / upstream_source
access_mode
update_semantics
discovery_method
time_semantics
identity_semantics
auth_ref
rate_limit_policy
access_rights
retention_mode = hot_window | incident_signal | selective_index | durable_managed | time_bounded
schedule_policy
schema_version
漏洞业务字段进入 M2/M3 knowledge tables。一个 provider 可以注册多个 source,例如 GitHub target repo、GitHub advisory database 与 GitHub research stream 使用不同 schedule/filter,并共用 GitHub 适配器 capability。
适配器契约
class SourceAdapter(Protocol):
async def discover(self, source: SourceDefinition, state: SourceState) -> DiscoveryBatch: ...
async def fetch(
self, source: SourceDefinition, ref: DiscoveredRef,
*, acquisition_run_id: str, trigger: AcquisitionTrigger,
) -> IngestEnvelope: ...
async def query(
self, source: SourceDefinition, spec: QuerySpec,
*, acquisition_run_id: str, trigger: AcquisitionTrigger,
) -> list[IngestEnvelope]: ...
discover 用于 delta/feed/index;fetch 固定一个外部 object 版本;query 服务 M3/M5 的 on-demand lookup。CVE Git、GitHub、OSV/NVD/KEV、RSS/Web、arXiv、normative source 和 Internet asset provider 各自实现适配器,provider-specific schema 和错误停留在适配器内。
第一批适配器复用外部标准与官方接口:CVE 使用 cvelistV5 Git/delta;NVD/OSV/KEV 使用官方 API/feed;GitHub 使用 API/Git;论文使用 arXiv/OpenReview/proceedings index;STIX/TAXII、MISP/OpenCTI source 使用成熟 client/parser。Web page source 只有在缺少结构化接口时进入 crawl path。
调度
调度器以固定 tick 查询 next_due_at <= now() 的 source,创建 AcquisitionRun(trigger=scheduled) 并投递 collection queue。真正 cadence 在每个 source 的 schedule_policy 中计算;NVD、GitHub、CVE、arXiv、vendor blog 等来源独立配置。
discover 返回当前 batch 和 next_cursor。Collection runtime 按 retention_mode 路由:hot_window 进入 HotBugIngress,durable_managed 进入 ManagedDocumentService,selective_index 进入 StructuredIndexService,incident_signal 进入 IncidentSignalIngress。该检查点覆盖的 item 全部 accepted 后提交 next_cursor。中途失败时游标保持旧值,下一轮重放整个检查点,各条路径的幂等约束吸收已经成功的 item。
健康与失败
AcquisitionRun 记录 success/no_change/rate_limited/auth_failed/schema_changed/fetch_failed。HTTP 超时、5xx、rate limit 使用适配器特定的有界重试;认证失败和 schema change 直接进入终态并等待配置或 mapper 修复。一个 source 的失败不会阻塞其他 source queue。
M1/M7 分开记录 provider fetch latency 与 monitoring latency。比赛 monitoring latency 使用 published_at → M2 available_at:热漏洞以 HotNormalizationResult.available_at 为终点,durable source 以 NormalizationResult.committed_at 为终点。这样可以分别定位来源发现、网络获取、热接入和 durable 处理的延迟。
M1 评测契约
config/source-inventory.json 同时承担产品来源清单与 source-category coverage denominator。当前 portfolio 固定为八类:vulnerability / development / academic / vendor / independent / normative / assets / incidents,八类全部计入 category coverage;比赛要求是 ≥7 类。assets 虽然通过 M3 on-demand enrichment side path 获取,但仍是正式数据源类别。类别只有存在 coverage=owned 的 fixed/grouped owner 且 runtime adapter factory 可构造时才计 supported,dynamic resolver、partial ownership 和一次 live probe 成功都不增加类别数。
packages/evaluation/m1_m3.py 分开计算 category_coverage 与 source_delivery_coverage:后者对固定 source/window 冻结 SourceDeliveryKey(source_id, external_object_id, external_revision | content_hash),记录 expected、accepted、missed 与 unexpected,防止动态来源数或额外噪声抬高 coverage。监测 latency sample 只对有可靠 published_at 的记录计算到 M2 available_at/committed_at;无可靠发布时间的记录不进入 latency 数值分母,同时进入 latency_evaluable_coverage 的分母。内部回归报告 p50 / p95 / max / ≤6h pass-rate,固定评测集保存逐样本值;live reachability 只记录环境状态。
M2 证据留存与规范化
M2 由 packages/intelligence 持有,并提供热规范化、incident 信号 staging 与 durable 证据三种入口。高频 canonical bug feed 进入 bounded 热工作集;Incident 信号进入短 TTL 聚类;Managed Content 和已经晋升的 bug/incident 进入 durable Evidence Ingress。三条路径共享 source 身份/来源链路 contract,保留与 write target 不同。
热漏洞写入
retention_mode=hot_window 的 source 把 IngestEnvelope 交给 HotBugIngress。它校验 source/版本/hash,生成当前投影并写 Redis,同时保存 provider 版本、source URL 与更新时间。M2 对热记录执行 cheap 确定性规范化和 field-level diff,产生 HotNormalizationResult;这个结果满足监测“可用记录”的时效计算,但不会自动创建永久 EvidenceArtifact。
热记录触发晋升时,系统优先从仍在 Redis 的 payload 固定当前版本;provider 支持 immutable 版本 lookup 时也可以按版本重取。晋升成功后再创建 durable Observation/EvidenceArtifact,后续 claim/relation 才允许作为 M4/M6 的长期证据。
Incident 信号暂存
retention_mode=incident_signal 的 IngestEnvelope 进入 IncidentSignalStore。M2 保存短 TTL SignalItem,抽取 original/cited source、时间、实体和可验证 anchor,并交给 Incident Correlator 更新聚类。普通转载和弱信号停留在 Redis;聚类达到晋升条件后,由 PromotionService 把选中的 source 版本转成 durable 证据,并创建或更新 SecurityIncident。
Incident 信号 staging 维护“事件正在发生”的上下文;技术结论和时间线事件在证据被晋升后进入 PostgreSQL。
持久证据写入
retention_mode=durable_managed 的 source 和经 Promotion Gate 转换成 durable_promoted 的 item 进入 EvidenceIngress:
acquisition_run_id
trigger = scheduled | on_demand | investigation | promotion
source_id
external_object_id
canonical_url
published_at / updated_at / observed_at
external_revision
media_type
payload / payload_ref
content_hash
request_metadata
idempotency_key
Evidence Ingress 校验 source、时间、hash 与 payload 可读性。managed content 固定正文快照;已晋升 bug 固定本次结论实际消费的 provider 版本;已晋升 incident 固定支撑时间线/claim 的 primary、forensic 或 selected 信号版本。
产物写入 S3-compatible store 后,PostgreSQL transaction 创建 Observation/EvidenceArtifact 元数据与 downstream 发件箱事件。commit 后返回 ObservationAck。Normalization 作为独立 task 读取观测,parser/model 失败不会破坏原始证据,可按处理器版本重新处理。
解析与规范化
每个 source 都先经过 source-specific parser,再进入 canonical mapper。parser 解决“外部字段在哪里”;canonical mapper 解决“这个字段在 SecFusionAgent 表示什么”。相同 mapper schema 服务热与 durable path,但写入目标不同。
热规范化生成当前投影、stable identifier、changed fields 与 priority 信号,写回 Redis;普通 feed record 不创建长期 Object/Claim/Relation。Incident 信号 staging 生成 anchor/聚类/watch 状态;durable 规范化在 PostgreSQL transaction 中完成 object upsert、外部标识符绑定、source claim/relation、证据 link、processing run 与 KnowledgeChange,Incident 晋升同时维护 SecurityIncident、时间线事件与 incident 版本/发件箱。对快照型 provider,同一 source_id + subject + predicate/relation type 的新版本会 supersede 该来源旧当前状态;不同来源的不同值同时保留,交给当前投影暴露 conflict,而不是在 M2/M3 静默裁决。
确定性 mapping 覆盖 CVE/GHSA/NVD/OSV 的 vulnerability/package/version/CWE/CVSS/reference,GitHub repo/issue/PR/commit/release,package/model registry 身份,DOI/arXiv work 身份,以及 normative document 的 issuer/jurisdiction/status/version。HTML/PDF parser 负责 document structure、明确 identifier 和 locator mapping;impact、attack condition、隐式 relation、risk/control mapping 进入 M3 语义处理器。
同一性与去重
热路径使用 provider namespace + 外部 ID/版本收敛重复更新,并保留 cross-reference hint。durable path 进一步处理 cross-source 身份:CVE/GHSA/DOI/repo/package/commit 等强 identifier 直接绑定既有 object;provider 明确 cross-reference 和稳定 normalized key 可以自动绑定。缺少强身份的相似记录保持独立 object,并生成 candidate_same_as 供 M3/analyst 后续判断。
Object merge 保留全部 durable 观测。NVD、GHSA、vendor advisory 和 issue 可以映射到同一个 vulnerability object,各自的证据、时间和 source claim 继续独立存在。
M2 输出
M2 按保留生命周期产生三类稳定输出:
HotNormalizationResult
source_id
external_object_id
external_revision
available_at
changed_fields
current_projection_ref
priority_signals
IncidentSignalResult
signal_id
incident_candidate_id
available_at
material_change
source_role
next_watch_at
NormalizationResult
observation_id
knowledge_revision / incident_revision
committed_at
object_ids
claim_ids
relation_ids
timeline_event_ids
candidate_match_ids
processing_run_id
HotNormalizationResult 驱动 Bug Stream 的 priority/enrichment;IncidentSignalResult 驱动 Incident Watch 的聚类/follow-up;NormalizationResult + KnowledgeChange 与 incident 版本/发件箱驱动 durable M3、当前投影与索引器。Requirements 的 monitoring latency 使用对应生命周期的 available_at/committed_at。
M2 质量契约
M2 的自动 identity merge 只接受强 identifier 或可复现的 deterministic cross-reference。CVE/GHSA/OSV/CNVD/CNNVD、DOI/arXiv、GitHub repo full name、package PURL 或 ecosystem+name、commit SHA 可以作为强标识;名称相似、标题相似和 embedding proximity 只能形成 candidate,不直接合并 object。
每个 accepted claim/relation 必须解析回固定 Observation / Artifact 和 locator。structured mapper 的 locator 要落在支持该字段/关系的 source revision;semantic extraction 额外要求 verbatim quote 是固定 chunk 的真实 substring。M7 将 parser field accuracy、replay suppression、entity-resolution precision/recall、evidence correctness、conflict preservation 分开记录,因此“值正确但引用错误”不会被 M3 P/R 掩盖。
M3 情报富化与关联
M3 由 packages/enrichment 持有,输入可以是 Redis 中的 HotBugRecord/HotNormalizationResult、IncidentCandidate/IncidentSignalResult,也可以是 PostgreSQL 中的 durable object/证据。热漏洞 enrichment 回写当前投影;Incident enrichment 更新 unresolved questions、source follow-up 与晋升状态;需要长期引用时先调用 PromotionService,再写 durable claim/relation/时间线。M3 新增外部材料统一调用 AcquisitionService。
处理器路由
Enrichment Planner 根据 object type、risk domain、source 权威、已有 claim 和信息缺口创建处理器任务。
| Processor | 输入 | 适用任务 |
|---|---|---|
| deterministic | structured knowledge | CVSS/CWE/KEV mapping、version compare、分类体系 mapping、固定 graph rule |
| graph / 产物 | repo/package/artifact relation | issue–PR–commit–release、dependency、SBOM、container/component propagation |
| semantic | 热/durable source content | attack condition、impact、patch/workaround、TTP、risk/control、implicit relation |
| provider-backed | query spec | NVD/OSV/KEV/GHSA refresh、Internet asset intelligence、商业/实时 provider |
Planner 使用 rule/config 决定处理器组合;LLM 接收 Planner 已确定的 semantic extraction task。每个处理器产生 ProcessingRun,输入版本和处理器版本固定后可以独立回归。热对象的处理器结果默认写回 Redis 投影;出现 durable 晋升信号后,处理器等待对应证据/object 进入 PostgreSQL,再提交长期 claim/relation。
提供方回流
provider-backed 处理器调用 AcquisitionService.query(source_id, query_spec, parent_run_id)。Source Adapter 返回的 IngestEnvelope 按 source 保留模式进入热、incident 或 durable M2 path;M3 等对应 normalized 状态后恢复 parent enrichment job。热漏洞或 incident 信号要支撑 durable investigation/answer 时,先经过 Promotion Gate 固定版本。NVD lookup、GitHub object、vendor page、论文、news/forensic follow-up 和 Internet asset query 共享来源链路/去重 contract,同时保留各自保留策略。
Internet asset intelligence 保存 provider、query、filter/fingerprint、query time、host/service result 与观测时间。product/version 到 fingerprint 的 mapping 单独版本化;“可能受影响资产”由具体 provider 观测 + mapping 版本支撑。
语义处理
语义处理器从 DocumentProjection 读取相关 section,并把 source 元数据、object 候选和需要抽取的 schema 一起发送给 Model Provider。外部正文始终位于 data field;system instruction、schema、model 和 token budget 来自代码/config。
模型输出进入候选状态:
candidate claims
candidate relations
entity candidates
evidence locators
processor/model/prompt revision
写入门禁校验 schema、subject/object 身份、证据 locator、处理来源链路与 semantic duplicate。高不确定实体对齐保持候选;有强 identifier 或确定性规则支撑时晋级 accepted relation。模型生成的 citation locator 无法回到 source 产物时,该候选直接失败。
领域处理器
M3 的共享流水线根据 01–04 加载领域处理器:AI Infra 沿 repo/component/release/runtime graph 补 issue、fix PR/commit、affected/fixed version 与 integration;Supply Chain 沿 package/artifact/image/build/distribution relation 计算传播;Model/Data 关联 paper、评测集、attack、mitigation、known bypass 与 residual risk;Agent/Application 关联 context、tool、身份、sandbox、network、memory、side effect 与 incident path;Normative Knowledge 抽取 Requirement/Control/applicability;Research Intelligence 生成 InsightCandidate。
领域处理器扩展 object type、claim predicate 和 relation type,证据、处理来源链路、写入门禁共用同一 kernel。
洞察与索引
paper、vendor report、system/model card、独立研究先作为证据/object 进入 M2。M3 根据 04 的晋升 criteria 生成 InsightCandidate,记录它支持、反驳或扩展的既有 claim、证据成熟度、what changed 与处理版本;source 权威继续由原观测持有。
Knowledge commit 后发出 KnowledgeChange。索引器对新增/变更 document/object 构建切块、元数据和 embedding;旧 index entry 按上游版本失效。M4–M6 可以立即读取 canonical knowledge,semantic retrieval 读取对应 indexed_revision;M7 评测集固定 knowledge/index 版本以保证可复现。
Vocabulary 与富化闭集
M3 的正式 enrichment vocabulary 由 packages/intelligence/knowledge/vocabulary.py 持有,当前版本为 enrichment-v1。term 分为 canonical / source_specific / exploratory 三种 scope;canonical claim/relation 可以固定允许的 subject/target object type 和 benchmarked 标记。Knowledge Writer 使用真实 root object 检查 shape:deterministic/source-asserted 写入未注册 term 或违反 canonical shape 时直接失败;semantic 的未知 term 或非 canonical shape 保留为 exploratory。这样既阻止模型自由字符串悄悄改变 benchmark,也保留开放语义发现。
enrichment-v1 固定十二个 dimension:identity、severity、weakness、product/package、version applicability、fix/remediation、exploit state、exploit likelihood、advisory/reference、asset exposure、research/paper、incident context。Identity 主要服务 M2 normalization diagnostic;repository 内部 graph edge 与开放 research/incident relation 可以属于 canonical vocabulary 但标记 benchmarked=False。provider-native github_* / osv_* / kev_* / cnvd_* / cnnvd_* 与 NVD/CVE 原始字段继续保留,不因存在于 Knowledge 就自动进入比赛 denominator。PoC benchmark 使用 Vulnerability --has-poc→ ExploitArtifact,poc_available 是派生投影;research/paper v1 只评测稳定的 ResearchWork/Document --discusses-vulnerability→ Vulnerability association,更开放的 supports/contradicts/evaluates relation 在 object model 与 gold protocol 冻结前不进入正式 P/R。workaround / mitigation / attack_condition 这类开放文本同样保留为 canonical evidence-backed knowledge,但 v1 标记 benchmarked=False,直到 normalized schema 冻结。release-contains-commit、asset-runs-product、asset-version 等支撑推导的 graph edge 也保持 canonical/non-benchmarked;v1 的 affected-asset 正式输出以 InternetAsset --asset-potentially-affected→ Vulnerability 为 gold,避免把推导中间边重复计入比赛 denominator。
产品/版本适用状态统一为 affected / not_affected / fixed / under_investigation / unknown。统一输出不是挂在 Vulnerability 上的裸 claim,而是 scoped Vulnerability --applicability-status→ Product|Package|SoftwareVersion relation,qualifier 至少包含 state 与 source_semantics,并可附 version range / justification。CVE Record 5.x、OSV、NVD CPE configuration、CSAF/VEX 各自保留 source-specific range/status semantics,由 evaluator 映射到统一状态;GIT range 依赖真实 repo ancestry。query miss、source miss 或版本不可比较都保持 unknown,只有结构化状态、确定性规则或 VEX justification 才能产生 not_affected。
当前代码已经覆盖 CVSS/CWE 与 canonical has-weakness、CVE5/OSV/NVD CPE/CSAF-VEX source-specific applicability、CISA KEV、canonical PoC relation、GitHub Advisory + FIRST EPSS point-in-time facts、GitHub development/fix graph、CNVD/CNNVD identity、AssetObservation、完整 NVD configuration 驱动的 CPE applicability join、exact paper-CVE relation 与 evidence-gated document semantics。统一的是 canonical applicability 输出状态与 relation contract,不是把不同来源的 range/VEX/CPE 规则压成一个字符串比较器。当前 backlog 主要是授权 live asset、更多 paper/incident strong-anchor 与 semantic-provider denominator,以及 Incident→Vulnerability 等尚未进入当前正式闭集的覆盖扩展;闭集冻结不等于 denominator 已经足够大。
M3→M4 semantic handoff 与 M7 enrichment score
storage/read handoff 已由真实 PostgreSQL integration gate 验证。semantic handoff 额外要求 M3 使用同一 vocabulary 描述每个 canonical dimension 当前是 resolved、conflict、unknown 或 missing;M4 后续只能基于这些 gap 规划调查,不能另建一套 enrichment ontology。
M7 的最小 gold 单元由 packages/evaluation/m1_m3.py 中的 EnrichmentFactKey 固定:stable root object key/type、vocabulary revision、dimension、claim/relation kind、predicate/relation type、normalized value/target、target object type、qualifier keys + normalized qualifier 与 temporal scope。gold 自身使用同一 registry 校验 subject/target shape、benchmarked 与 required qualifier。TP 同时要求 tuple、entity/version scope 和 EvidenceRef 正确;错值、错实体/版本、错 relation、将 unknown 推成 not_affected、无证据 accepted fact 计 FP,gold 缺失计 FN。正式比赛报告使用 micro precision/recall,内部同时报告 dimension-macro P/R 与 M2 diagnostics。
benchmark case 固定 world snapshot、source availability、source revision、vocabulary revision 与 evaluator revision。structured-only、multi-source conflict、CVE/OSV/NVD/CSAF applicability、KEV/PoC、time-bounded asset、paper relation、Incident strong-anchor、alias ambiguity 与 wrong-version trap 都需要进入固定样例;开放式 semantic relation 不通过同一 closed-set scorer 强行打分。
端到端路径
下面五条路径覆盖高频漏洞、结构化平台、Managed Content、Incident Watch 与 on-demand enrichment,也直接作为第一轮 integration test / 探针。
CVE / GHSA / NVD
CVE/GHSA/NVD/OSV/KEV 的 delta 首先更新 Redis 热工作集。新发布记录和已有记录的版本变化都进入热路径;M2 做廉价规范化与 field-level diff,M3 只对 target repo match、KEV/PoC/critical 信号、active query/investigation 等高优先级对象继续 enrichment。普通记录在 TTL/LFU 后淘汰,历史 miss 直接从 canonical provider 重取。
Product WORLD 的 Hot 索引按固定、工作流使用、访问和更新排序,/api/v1/world/hot?limit=24&offset=N 每页返回来源记录,并单独报告驻留总量;API 当前限制 offset 不超过 4096。完整 CVE 编号走 /api/v1/world/hot/search,扫描 Redis 当前驻留 payload 的外部 ID 与 projection.cve_id,因此外部编号为 GHSA、但投影关联同一 CVE 的来源记录也能返回。普通文本只过滤已载入页面。两条读取路径都不触发 promotion,也不把 Hot 记录标成 durable Knowledge。对应 Product Web/API 变更:64e93fe、5543be5、cc8fea3。
当某个漏洞进入 target repo graph、M4/M5 调查、M6 citation、source conflict、评测集或 analyst review 时,Promotion Gate 固定当前 provider 版本并写 durable 证据 / canonical knowledge。GitHub issue–PR–commit–release、affected/fixed version 和供应链关系随后长期保留。这样漏洞 feed 的时效性由 bounded 工作集承担,长期数据库只沉淀 SecFusionAgent 真正使用或产生的新知识。
目标仓库 / 供应链
GitHub selective_index 已从 target repo 稳定身份与 metadata/current claim 扩展到 Repo / Issue / PullRequest / Commit / Release 一等对象和显式 reference graph。M3 graph 处理器维护 issue→PR→commit→release 等确定关系,并为 deterministic fix-boundary verification 提供结构化路径;package/container/dependency relation 继续按 source coverage 扩展,OSV、SBOM、registry 或 scanner 结果用于验证产物是否真实包含受影响版本。长 issue、vendor PSIRT 或 patch explanation 按 managed content 保存并交给语义处理器抽取隐式条件。
论文 / 厂商 / 研究洞察
Managed Content 已覆盖 HTML/PDF/plain executable path:外部内容固定 source revision 后进入 Document/DocumentRevision 与 DocumentChunk,切块保留回原版本的 locator;PostgreSQL FTS 提供 lexical index,pgvector 列保存 provider-neutral dense state,semantic processor 要求 proposal 携带可在 chunk 中定位的 verbatim quote,否则拒绝写入。OpenAI-compatible model/embedding adapter 已接入 indexing worker;正式 Product QA 已证明兼容 model provider 可以执行,但 M3 semantic extraction + dense indexing 的 live E2E 仍是独立 workload/denominator,当前 CompetitionReport 不把 Product 模型调用冒充这条路径的验收。OpenReview、正式 proceedings 与更多 vendor/security research source 继续按 source onboarding 扩展;hybrid query planning、fusion/rerank 由 Technical Design 2 与 M7 probe 决定。
安全事件 / 新闻监测
Breaking source 首先生成 SignalItem,Incident Correlator 提取可验证 anchor 并聚类。当前 first batch 已接标准 RSS breaking source,规则抽取 CVE/GHSA/transaction/address;弱标题相似不参与 durable 晋升。source_family/upstream_source 用于折叠转载依赖,多源 corroboration 必须由两个独立 source 支持同一个 strong anchor。受影响项目官方渠道、security vendor 分析、on-chain 证据与 threat-intel follow-up 继续按 05 source plan 接入。
当事件达到晋升条件,M2 固定关键 source 版本,PostgreSQL 创建 SecurityIncident 与 append-only 时间线。M3 持续关联 Vulnerability、Product/Repo、ThreatActor、Address/Transaction、Advisory、Patch/Commit、IOC 和 affected Internet asset;M4 消费时间线和证据链形成 confirmed/conflict/unknown。事件结束后的 postmortem 可以进入 Insight Corpus,整个调查 trajectory 进入 Experience Evolution。
互联网资产
M3 在某个 vulnerability/product/version 需要受影响公网资产时创建 on-demand query。Censys/Shodan/FOFA/ZoomEye 适配器把 query/filter、provider response 和观测时间写入 M2;M3 使用版本/指纹 mapping 生成候选 InternetAsset/ServiceEndpoint relation。relation 保留 query time 和 provider 观测,使资产判断始终带时间边界。
调查经验演化
Knowledge 记录“关于对象已经知道什么”,Experience 记录“遇到某类调查任务时怎样更可靠地获得证据”。Bug 热缓存可以淘汰,大量历史 CVE 可以继续留在外部 canonical source;经过真实调查形成的可复用方法属于 SecFusionAgent 的长期资产,与 Insight Corpus 一样需要版本、来源链路和 evaluation。
Case, Trajectory, Experience
InvestigationCase 定义一次可评价任务,保存 task_signature、target objects、goal、initial knowledge 版本、constraints 和 rubric。Case 可以来自 M5 investigation,也可以来自 M7 评测集重放。
InvestigationTrajectory 保存一次实际执行:读取过哪些 knowledge/experience、调用了哪些 source/tool、观察到哪些证据、尝试过哪些 hypothesis、发生哪些失败和 recovery,以及最终 outcome、latency、tool calls、cost。Trajectory 使用 append-only step/事件记录,原始 transcript 或大体积 tool output 可以进入产物存储,PostgreSQL 保存结构化事件与引用。
Experience 是从多个 trajectory 中抽取的可复用 investigation policy。它不保存某个 CVE 的事实,而保存适用条件与调查动作:
experience_id / version
name
task_signature
scope
trigger_signals
applicable_conditions
recommended_actions
evidence_expectation
failure_modes
stop_conditions
fallback_actions
supporting_trajectories
validation_summary
success_count / failure_count / partial_count
last_validated_at
status = candidate | validated | active | deprecated
supersedes
失败经验是一等对象。例如“PR merged_at 不能直接推出修复发布”会记录 failure pattern、判别条件和替代证据路径;后续 planner 检索到它时可以主动避开已经验证过的错误调查路径。
演化流水线
flowchart LR
Case[Investigation Case]
Retrieve[Retrieve Active Experiences]
Plan[M5 Plan / Investigation]
Traj[Trajectory]
Eval[M7 Outcome Evaluation]
Extract[Experience Extraction]
Candidate[Experience Candidate]
Similar[Retrieve Similar Experience]
Update[Create / Merge / Supersede / Reject]
Replay[Historical Case Replay]
Active[Active Experience]
Case --> Retrieve --> Plan --> Traj --> Eval --> Extract --> Candidate
Candidate --> Similar --> Update --> Replay --> Active
Active --> Retrieve
M5 在规划前根据 task signature、target/risk domain、repo family 和当前证据缺口检索 active experience;retrieved experience 携带版本与适用条件,影响 action proposal,但不能覆盖当前证据。执行过程记录实际使用过的 experience version,使 M7 能统计“使用某条经验以后成功/失败/partial 的 outcome”。
任务结束后,Experience Extractor 从高信息量 trajectory 抽取 procedure、failure pattern、stop condition 或 fallback 候选。系统先用向量/元数据检索相似 experience,再决定 create / merge / supersede / reject。更新结果记录 rationale、supporting trajectory 与版本关系;success/failure/partial 与 last_validated_at 从 M7 evaluation 聚合,供召回排序和 deprecation 使用。OpenViking/RFC 的 trajectory analysis 与 semantic-gradient-style update 可以作为后续 optimizer 参考,第一版使用显式候选 + 重放 evaluation。
Candidate 晋级依赖 M7 evaluation,而不是把 trajectory 抽取结果直接当 active memory。当前 Experience Store 已强制 candidate → validated → active 状态机,并要求 validated 前存在重放/online support;具体多 case activation threshold 仍由 M7 评测集 policy 决定。一个 active experience 在后续 case 中持续失败、适用 repo/provider 发生结构变化或被新证据反驳时进入 superseded/deprecated,新版本激活时旧 active version 自动 deprecated。
归属与安全
M4 持有 Case 当前调查状态与 confirmed/conflict/unknown;M5 持有 Trajectory 和 experience retrieval/use;M7 持有 outcome/rubric/重放 evaluation,并负责 Experience 的 validation 信号。Experience Store 属于 investigation capability,事实证据仍由 M2/M3 knowledge plane 持有。
Experience 是 planning hint / policy memory,没有 source 权威。任何经验产生的调查动作仍需要从当前 source 重新获得证据;最终 claim 继续满足 C1。外部网页、tool output 和 peer-agent message 不能直接写 active Experience,必须经过 trajectory、evaluation 和 versioned update 流水线。
OpenViking 参考
OpenViking 的 Session commit 已经把 cases、trajectories、experiences 作为长期 memory type,并在启用 experiences 时联动完整 Agent Evolution 流水线。其 memory extraction 使用 LLM Extract → Vector Pre-filter → Similar Memory → LLM Dedup Decision → create/merge/delete → write/vectorize;Agent Evolution API 还能按 Experience 查询实际使用它的 Trajectory 和 outcome distribution。这套机制作为 SecFusionAgent Experience Evolution 的直接设计参考。
SecFusionAgent 保留 domain 归属:Case rubric、security 证据来源链路、tool trajectory、knowledge 版本、评测集 result 和 Experience validation 都由本项目数据模型持有。OpenViking 未来可以作为 experience retrieval/memory provider 接入 ExperienceStorePort,但 Experience 的生命周期和评价 contract 由 SecFusionAgent 定义。
SecFusionAgent 长期沉淀四类资产:Knowledge 保存事实与关系,Incident 保存现实事件及其演化,Insight 保存对风险与防御的新认识,Experience 保存怎样更可靠地完成调查。它们可以引用同一证据,归属和生命周期分开。
接口
M1–M3 之间保留少量稳定 port,具体存储和任务框架停留在 provider 层。
SourceAdapter.discover / fetch / query
AcquisitionService.schedule / query
HotBugIngress.accept -> HotNormalizationResult
EvidenceIngress.accept -> ObservationAck
KnowledgeRepository.read / commit -> KnowledgeChange
HotBugCache.get / admit / touch / evict / pin
IncidentSignalStore.admit / cluster / watch / expire
IncidentRepository.append_event / update_view
PromotionService.promote
ArtifactStore.put / get
RetrievalPort.search
ExperienceStore.retrieve / append_candidate / activate / supersede
ModelProvider.generate_structured
EvidenceIngress contract 由 packages/intelligence 持有;packages/sources 产生符合该 contract 的 envelope。KnowledgeRepository 由 intelligence 持有,M3 通过它写 canonical knowledge。AcquisitionService 由 packages/monitoring/acquisition 持有,packages/sources 只持有 source definition、provider contract 与适配器,不反向依赖 runtime 状态。M3/M5 通过 acquisition service 获得新外部证据。依赖方向保持 apps → capability package → lower-level contract/provider;runtime entrypoint 依赖 domain,domain 保持与 apps 解耦。当前 tests/test_architecture_dependencies.py 把 package dependency direction 变成 executable invariant。
可靠性
系统采用 at-least-once execution + 幂等状态转换。Celery Broker Redis 与 Hot Cache Redis 分离:broker 承载任务传输并避免淘汰,cache 承担 bounded 工作集并允许 TTL/LFU 回收。canonical run、durable 证据、knowledge 和 experience version 留在 PostgreSQL;调度器/recovery 工作进程根据 queued/running 超时和发件箱 delivery 状态重发任务。
Durable Observation 写入成功后原始证据可重放;热漏洞 record 丢失或淘汰时从外部 canonical source 恢复;incident 信号过期不会删除已经晋升的 Incident/时间线。Normalization、Enrichment、Indexing 的失败分别记录 ProcessingRun 并独立重试。晋升在 durable conclusion 之前完成,避免最终证据依赖已淘汰 cache。Source failure 按 source 隔离,持续故障通过 M8 observability 进入告警。
Database write 和 downstream task 之间使用 transactional 发件箱:knowledge transaction 同时写领域状态、KnowledgeChange 和 outbox_events;dispatcher 把已提交事件送入 Celery,consumer 使用事件 ID / input 版本作为幂等键。进程在 DB commit 后崩溃时,发件箱仍能恢复下游处理。
仓库映射
第一版代码按当前 repo standard 建立以下责任,对应 capability 开始实现时再落目录。
apps/
├── api/ # FastAPI bootstrap
└── worker/ # Celery worker / scheduler bootstrap
packages/
├── sources/
│ ├── registry/ # SourceDefinition + config loader
│ └── adapters/ # GitHub, NVD, OSV, KEV, arXiv, RSS, asset ...
├── monitoring/
│ ├── acquisition/ # AcquisitionService + on-demand run provenance
│ ├── scheduler/ # due-source + incident follow-up scheduling
│ ├── hot_window.py # hot_window collector
│ ├── managed_content.py # durable_managed collector
│ ├── structured_index.py # selective_index collector
│ └── incident_signal.py # incident_signal collector
├── intelligence/
│ ├── incident/ # SignalItem / IncidentCandidate / clustering / timeline
│ ├── hot_cache/ # Redis hot working set + admission/eviction
│ ├── ingestion/ # durable EvidenceIngress
│ ├── promotion/ # Hot Bug promotion
│ ├── knowledge/ # Object/Claim/Relation contract + evidence-backed writer/read
│ ├── normalization/ # parser + canonical mapper + identity/diff
│ ├── structured/ # structured source normalizer, e.g. GitHub Repo
│ ├── documents/ # managed document parser/chunker/revision
│ ├── projections/ # rebuildable current views
│ ├── storage/ # PostgreSQL models + S3-compatible ArtifactStore provider
│ └── retrieval/ # lexical/dense index state + provider contracts;query planning 属于 M4
├── enrichment/
│ ├── processors/ # provider-backed vulnerability enrichment
│ ├── graph/ # GitHub reference graph + deterministic fix boundary
│ ├── semantic/ # evidence-gated managed-document semantic extraction
│ ├── providers/ # OpenAI-compatible model/embedding adapter
│ └── assets/ # time-bounded Internet asset observation orchestration
├── investigation/
│ ├── cases/ # InvestigationCase / context handoff
│ ├── trajectory/ # append-only investigation trajectory
│ └── experience/ # Experience Store / evolution lifecycle
└── shared/ # config/logging/clock 等业务无关基础能力
数据库迁移归拥有对应表语义的 package,但统一由 Alembic 迁移 history 发布。source 适配器不依赖 monitoring/intelligence;monitoring 组合 source 适配器与 M2 ingestion;intelligence/knowledge 持有 canonical write contract;enrichment 依赖 intelligence/knowledge 与 monitoring/acquisition。这个依赖图保持单向,M1/M2/M3 通过 contract 协作,并由 architecture test 防止反向 import。
实现切片
第一轮实现按可独立验收的纵向切片推进:
- Foundation:Docker Compose 启动 PostgreSQL/pgvector、Redis Broker、Redis Hot Cache、MinIO;建立 FastAPI/工作进程 bootstrap、配置加载、SQLAlchemy/Alembic、
sources/source_state/acquisition_runs/processing_runs/outbox_events。 - Hot bug 切片:实现
cvelistV5/NVD 等 delta、Redis 准入/TTL/LFU、HotNormalizationResult、field-level diff、游标重放与外部缺失 fallback;验证 high-frequency bug 工作集。 - Promotion / canonical knowledge 切片:实现 Promotion Gate、durable Evidence Ingress、Object/ExternalIdentifier/Claim/Relation/EvidenceLink、knowledge 版本与查询 API;用真实 active bug 验证热 → durable 晋升。
- Enrichment 切片:实现 NVD/OSV/KEV/GitHub provider-backed 处理器、deterministic version mapping 与 graph 处理器,再接 Semantic Processor;M3 外部 lookup 继续走 M2 re-entry。
- Incident Watch 切片:接入两个 breaking source、一个 forensic source 和一个 primary/权威 source,完成信号 TTL、cross-source 聚类、adaptive follow-up、晋升、时间线与
current_incident_view。 - Managed content / retrieval 切片:实现 HTML/PDF 投影、证据 locator、切块/embedding 与
RetrievalPort,随后接 arXiv/vendor/research source 和InsightCandidate。 - Current projection 切片:把 vulnerability/fix/repo/incident 当前视图接到
KnowledgeChange/incident.changed,验证 incremental invalidation 与 multi-tier read path。 - Source expansion:增加 target repo、normative source、Internet asset provider;每增加一类 source 同时固定 source role、保留模式、fixture、contract test 与 M7 评测集 case。
- Experience 切片:建立 Case/Trajectory/Experience schema,用真实 AI Infra/Incident 调查 case 记录 trajectory,抽取正/负经验,做 similarity merge 与历史重放;M5/M7 后续复用这套生命周期。
每个切片都能从真实外部来源跑到本地可查询状态;下一个切片复用前一个切片的 contract。
历史 checkpoint(2026-09-26):当时 M3→M4 handoff 已有 executable gate,Foundation、Hot Bug、Promotion/Canonical Knowledge、provider-backed Enrichment、Incident domain、HTML/PDF/plain Managed Content、Current Projection、GitHub development graph、lexical/dense indexing、semantic evidence gate、time-bounded Internet asset observation、S3-compatible ArtifactStore、outbox/Celery replay/idempotency与 Experience storage 接缝均已有代码/tests;真实 PostgreSQL/pgvector/FTS、Redis、Celery和 S3-compatible integration已通过。该 checkpoint 当时记录的 MinIO/provider access、Shodan credential、semantic+dense live E2E、OSV GIT fixed样本与 Incident follow-up 等缺口属于历史推进状态;当前完成度以上文 2026-10-04 状态与正式 benchmark evidence 为准。Task routing、query construction、retrieval fusion/rerank、candidate assembly、Percept construction 与 Investigation State 的 owner 仍保持在 M4 / Technical Design 2。
设计参考
这些系统用于验证架构接缝与生命周期设计,SecFusionAgent 复用机制和接口思想,内部归属仍由 Requirements 与本文决定。
| Reference | 借鉴点 | SecFusionAgent 对应设计 |
|---|---|---|
| Foresight News Timeline | 安全事件作为持续时间线维护,而不是把每条快讯当成独立终点 | IncidentCandidate / 时间线 watch 的产品参考 |
| CertiK Incident Analysis | exploit 事件形成独立 incident analysis,记录机制、损失与后续 | 已晋升 Incident → forensic enrichment / postmortem |
| OpenCTI Automated Import / Analyst Workbench | connector/stream/TAXII/RSS 等统一 ingestion;import 后先进入 workbench,再由 analyst review 进入正式 knowledge | SourceAdapter、candidate/写入门禁、durable 证据与 analyst exception path |
| TheHive / Cortex analyzer workflow | case、observable、analyzer enrichment 和 investigation context 分层 | M4 Case、M5 enrichment/investigation、证据 write-back |
| OpenViking Session / Memory | cases/trajectories/experiences、commit extraction、vector pre-filter、similar-memory 去重/merge |
Experience Evolution 流水线 |
| OpenViking Agent Evolution | 查询 Experience 被哪些 Trajectory 使用,以及 success/failure/partial outcome distribution | M7 对 experience effectiveness 的追踪 |
| VikingDB | collection/index、vector/scalar/hybrid retrieval、update/delete 与索引异步刷新 | RetrievalPort / future vector provider;第一版仍用 pgvector |
| UBASE, ByteDance, 2026 | sustained ingestion 下的 vector indexing、memory/SSD hybrid residency、record-level cache 调节 memory/latency/cost | data temperature、热/冷 tiering 和未来大规模 retrieval 优化参考 |
UBASE 和 VikingDB 面向远大于比赛规模的向量数据;本文借鉴的是 workload-aware residency、index/update separation 和 provider 接缝,不复制其分布式实现。OpenViking 提供通用 memory evolution 范式;SecFusionAgent 增加 security-domain Case rubric、证据来源链路和 M7 重放 validation。
技术评审与探针
Technical Review 需要确认本文的 runtime、storage 和 code 归属能完整承接 Requirements。进入正式实现前执行下列短探针,结果用于验证技术基线:
| 探针 | 实际跑什么 | 判别结果 |
|---|---|---|
| Hot bug lifecycle | CVE/NVD delta:new/update → Redis → diff/enrich → TTL 淘汰 → miss re-fetch → 晋升 | 工作集 bounded;更新时效正确;已晋升证据不依赖 cache |
| Structured source E2E | GitHub target repo:discover → normalize → relation → 重放 | 游标、版本、幂等、发件箱与 source failure 语义成立 |
| Incident Watch | 选一个真实 incident:3+ breaking/forensic/primary source → 聚类 → 时间线 → 晋升 → follow-up | duplicate 不会制造假 corroboration;material change 进入时间线;低价值信号可过期 |
| Managed content E2E | 一篇 PDF + 一篇动态网页:快照 → 投影 → 证据 locator → semantic extraction → embedding | citation 能回原文;parser/model 升级可重算 |
| PostgreSQL knowledge/retrieval | repo/vulnerability/package graph + 文档切块上运行结构化、recursive relation、vector/元数据 query | 当前规模下 latency/recall 支撑 M3/M4;失败时才引入独立 graph/search provider |
| On-demand asset | 一个漏洞/产品映射到一个 asset provider query,保存 query/revision/time,再重放 | 高时效观测与长期 knowledge 边界清楚,provider failure 可恢复 |
| Experience evolution | 5–10 个已知调查 case:trajectory → candidate → merge/create → 重放 → outcome | 正/负经验可追溯;错误经验不会单次成功后直接进入 active |
OpenCTI/MISP interoperability 作为 integration test:导入/导出一组 STIX object 并验证内部 object/relation/证据 mapping。若探针发现某个成熟平台可以直接替换自研 provider,优先替换 provider;Requirements 中的证据、knowledge、risk 与评测集 contract 继续保持。