跳到主要内容

横切关注点合订包

本横切包承接架构主文件 §13(故障与降级)/ §18(可观测性)/ §19(演化与版本管理)/ §20(测试体系)中跨多个子系统、跨多个 milestone 的横切要求,把它们从主架构的叙述层落到「工程可直接开干」的契约层。字段权威以 frontmatter schema_sources 列出的 contracts/code-paths.yaml 与架构主文件为准,本包与之不一致时以上游为准。

模板来源:横切包模板。上位整改背景见 Step 11 整改包详细方案 Action II-3。

§0 范围与 milestone 切分

覆盖五类横切。每类先讲「系统要主动提供的韧性 / 可观测能力(正向)」,再讲约束。

关注点主架构对应M0 范围M1+ 演化
韧性策略(超时 / 重试 / 熔断 / 限流)§12 超时 + §13 降级 + §16 限流✅ 超时分层 + 重试 + 限流 Semaphore(M0 必做)熔断器从 30 min 滑窗(M0 简版)升级为状态机式断路器(M1)
可观测性指标体系§18 指标体系✅ 审计 trail + 性能/成本/可靠性核心指标落点(M0 必做)认知质量间接指标聚合(M1+,依赖评估闭环 §21)
Schema migration SOP§19 数据 schema 版本化⏳ 元表 + runner 骨架(M0 建表即用,M0 不触发实际 migration)实际 v1→v2 migration 脚本(M1+ 首次破坏性 schema 变更时)
Contract regression hook§20 测试 + 字段演化矩阵⏳ 接入点预留 + 字段宽紧度基线(M0 标基线)audit_contract_regression.mjs 实施(M1+ 字段收紧时)
CI gate(三检 review gate)§20 CI 集成 + §26 审计点✅ pre-commit + PR 快档(M0 必做)nightly 真档 + 评估测试接入(M1+)

取舍原则:M0 走通骨架够用即停,不预先实现「第一阶段明示不做」的能力(架构 §18/§20 末尾清单:分布式 trace、云端日志聚合、A/B 框架、实时 metric dashboard、fuzzing 等)。接口契约预留,实现不抢答。


§1 韧性策略(超时 / 重试 / 熔断 / 限流)

§1.1 系统主动提供的韧性能力(正向)

FinBayes 本地优先定位要求「比业界默认更高的可用性」(§13)。运行时主动提供四类韧性能力:

  1. 分层超时:每一层(工具 / LLM / Task / TaskGroup / Compactor)有独立超时预算,单层超时不拖垮全链路,超时后保留已完成的部分结果交付用户。
  2. 自适应重试:瞬时故障(限流 / 5xx / 超时)自动重试,不让用户感知一次性抖动。
  3. 熔断隔离:持续失败的 Provider 被主动短路,避免无谓重试放大延迟与成本,并明示用户切换到 fallback。
  4. 背压限流:全局并发受控,本地资源不被无界并发耗尽,超限请求排队而非静默卡顿。

§1.2 超时策略(契约级参数)

承接 §12 超时控制。所有值走配置文件,下表为默认值与契约接口。

层级默认超时配置粒度超时错误码超时后行为
单个工具调用30sper-toolTASK_TIMEOUT(标 source 层)EvidencePacket 标 degraded_reason: timeout,不阻塞其他证据
单个 LLM 调用60sper-task-typeTASK_TIMEOUT(标 llm 层)触发重试链;耗尽后触发降级链
单个 Task(证据 + 综合)120sper-task-typeTASK_TIMEOUTcancel 进行中协程 + 保留部分结果
TaskGroup(用户感知总等待)180s全局TASK_TIMEOUT各子任务收 cancel + 5s grace
Session Context Compactor30s全局TASK_TIMEOUT退化为不压缩 + 截断保留关键 Judgment

契约接口:超时由统一 with_timeout(coro, layer, task_type) 包装器注入;每次超时写审计 trail 字段 timeout_layer + elapsed_ms

§1.3 重试策略(契约级参数)

仅对幂等且瞬时的失败重试。下表为契约级默认。

失败类型是否重试最大次数退避策略备注
限流(429 / rate limit)3指数退避 + 抖动:base=1s, factor=2, jitter=±20%,尊重 Retry-After超次数后降级到 fallback Provider
5xx(服务端错误)2指数退避 base=0.5s, factor=2超次数后熔断计数 +1
超时(网络层)1立即重试一次(换 Provider 端点优先于重试同端点)超次数后触发降级链
鉴权失败(401 / 403)0不重试,启动期已探测;运行期直接降级 + 明示用户重配 key
解析失败(响应 schema 不合法)0parse_error,归一化处理,不重试同一坏响应
用户取消(CancelledError)0取消是意图明示,不是故障

契约接口:重试由 with_retry(coro, policy) 包装器注入,policyproviders.yaml 的 per-provider retry 段读取。每次重试写审计 trail 事件 retry_attempt(attempt_no / reason / backoff_ms)。幂等保证:仅包裹无副作用的读类调用(LLM 推理 / 数据查询);任何写状态的操作不进重试包装器。

§1.4 熔断策略

承接风险登记 T1「Provider 失败率连续 30 min >10% → 自动降级 + 用户通知」。

M0 简版(必做):滑动窗口计数器。每 Provider 维护 30 min 滑窗失败率,连续 >10% 触发「软熔断」——该 Provider 在 fallback 排序中降权,新任务优先走下一 Provider,写审计事件 provider_circuit_soft_open + 用户 banner 提示。

M1+ 演化:升级为三态断路器(closed / open / half-open):

状态进入条件行为退出条件
closed默认 / half-open 探测成功正常调用滑窗失败率 >阈值 → open
open失败率超阈值直接短路不调用,立即走降级链冷却期(默认 60s)后 → half-open
half-openopen 冷却期满放行单个探测请求探测成功 → closed;失败 → open

契约接口CircuitBreaker(provider_id) 暴露 allow() -> bool + record(success: bool);状态变更写审计 trail。M0 仅实现 allow() 的滑窗逻辑,三态机预留接口。约束:熔断只作用于 Provider 层;状态对象写入 / 边界保护等核心路径不熔断。

§1.5 限流(背压)

承接 §12 backpressure + §16 限流处理。

限制项默认值实现配置
同时进行 Task 数5asyncio.Semaphore
单 Task 内并发工具数3asyncio.Semaphore
总 LLM 调用并发(跨 Task)10asyncio.Semaphore
数据 Provider 调用并发20asyncio.Semaphore
per-Provider rate limit各 Provider 配置token bucket / Semaphore✅(providers.yaml

约束:超限请求进 FIFO 队列等待,用户看到「正在排队」而非静默卡顿;排队时长进指标 task_queue_wait_ms


§2 可观测性指标体系(指标清单 + 落点)

§2.1 系统主动提供的可观测能力(正向)

承接 §18 两类可观测对象——认知过程可观测(用户为主:为什么走这个 Provider / 为什么降级 / 这条 Judgment 怎么形成)与系统运行可观测(工程为主:延迟 / 错误率 / 成本 / 负载)。运行时主动:

  1. 每个认知任务生成贯穿全子系统的 task_id,可重建完整因果链;
  2. 每次降级 / 重试 / 熔断 / 边界拒收都写审计 trail,用户可查「为什么这次这样」;
  3. 指标 per-user 独立计算,用户成本与质量自主可见。

§2.2 Trace ID 体系(M0 必做)

承接 §18 trace 体系。每事件至少标 task_id,子调用追加对应 ID。

ID范围M0
session_idSession 生命周期
task_id单次认知请求全链路
tool_call_id单次工具调用
llm_call_id单次 LLM 调用
trace_id跨 session 主动信号链⏳ M4+(主动信号上线时)

§2.3 指标清单 + 落点(contract 表)

下表把 §18 指标体系落到「产生子系统 + 写入落点 + M0 是否必做」。落点统一为审计 trail(认知过程)+ 进程内指标计数器(系统运行),第一阶段不引入 Prometheus / 云端聚合(§18 末尾约束)。

类别指标产生子系统落点M0
性能task_latency_first_screenOutput Pipeline计数器 + 审计
性能task_latency_completeTask Orchestration计数器 + 审计
性能llm_call_latencyProvider Adapter计数器 + 审计
性能tool_call_latencyCapability Registry计数器 + 审计
性能concurrent_tasks / task_queue_wait_msTask Orchestration计数器
成本provider_token_usageProvider Adapter审计(input/output 分列)
成本provider_cost_estimateProvider Adapter审计
成本cache_hit_rateCache 层计数器
可靠性degradation_rate_by_layerProvider Adapter计数器 + 审计
可靠性provider_failure_rateProvider Adapter计数器(喂熔断器)
可靠性retry_count_by_reason韧性包装器计数器 + 审计
可靠性boundary_reject_rateInput Pipeline计数器 + 审计
可靠性state_store_write_failureState Management计数器 + 审计
认知质量self_consistency_divergenceEvidence + Synthesis审计⏳ M1+
认知质量evidence_completenessEvidence + Synthesis审计⏳ M1+
认知质量clarify_rateTask Orchestration计数器⏳ M1+
认知质量user_action_on_candidate_rateState Management计数器⏳ M1+

§2.4 各子系统接入点(logging / audit / metrics)

承接 §18 日志分级(ERROR/WARN/INFO/DEBUG/TRACE)+ 脱敏约束。下表给每子系统的默认接入。

子系统日志级别Audit 事件Metrics 接入
Input PipelineINFO(边界识别 WARN)boundary_event / user_actionboundary_reject_rate
Task OrchestrationINFOtask_event(开始/完成)task_latency_* / concurrent_tasks / clarify_rate
Evidence + SynthesisINFOevidence_event / synthesis_eventself_consistency_divergence / evidence_completeness
State ManagementINFO(写失败 ERROR)state_event(before/after)state_store_write_failure / user_action_on_candidate_rate
Capability RegistryINFOtool_event(注册/调用/退役)tool_call_latency
Provider AdapterINFO(降级 WARN)provider_event / degradation_event / retry_attemptprovider_* / degradation_rate_by_layer / cache_hit_rate

脱敏不变量(全级别强制,M0 必做):日志与审计 trail 不写 API key / Channel token / 任何凭证;边界拒收只标识别类型不含具体字符串;不写完整 LLM 入参出参(仅摘要 + token 数,完整内容仅 TRACE 级 + 用户明示警告);不写完整用户画像(仅摘要 / hash)。


§3 Schema migration SOP

§3.1 系统主动提供的演化能力(正向)

承接 §19 数据 schema 版本化。State Store 升级时主动:启动期自动探测版本差、自动备份、按序运行 migration、失败自动回滚、向用户展示进度(不黑盒)。用户数据主权不因 migration 受损。

§3.2 Migration SOP(M0 建表即用,实际 migration M1+ 触发)

承接 §19 流程图。runtime 启动时执行:

  1. 读元表:读 schema_metadata.schema_version(M0 必做:建表 + 写入 v1 基线)。
  2. 比对:runtime 期望版本 vs DB 版本。
    • = → 正常启动;
    • >(需升级)→ 进 step 3;
    • <(DB 比程序新)→ 拒绝启动 + 提示用户升级 FinBayes 或恢复旧版本。
  3. 强制备份:SQLite 文件复制为 *.bak(含时间戳)。
  4. 按序运行:v1→v2→v3 顺序执行 migration 脚本。
  5. 校验完整性:成功 → COMMIT + 追加 migration_history;失败 → 全量从 bak 恢复(不留中间状态)。
  6. 进度可见:向用户展示「正在 migration(n/total)」。

§3.3 幂等三层保证(契约级,移植自 §19)

migration 脚本单向(只有 up,降级靠 bak 恢复),且必须幂等:

  1. DDL 层幂等:所有 CREATE TABLE / CREATE INDEXIF NOT EXISTSALTER TABLE ADD COLUMN 先查 PRAGMA table_info 跳过已存在列。
  2. 运行时层幂等:runner 启动读 schema_metadata.migration_history(JSON 数组),跳过已记录的 migration 文件名。
  3. 事务层:每脚本单事务执行,失败 ROLLBACK + 不写 history;成功 COMMIT + 追加 history。

§3.4 元表 schema(M0 必做)

State Store 含元表 schema_metadataschema_version / finbayes_version / migrated_at / migration_history(含 from / to / timestamp / 备份位置)。

约束:migration 失败的回滚不可半途;用户能看到进度;migration 不删除用户数据列前必先 deprecated 一个 minor 版本(与接口契约 §19 删字段规则一致)。


§4 Contract regression hook

§4.1 系统主动提供的契约稳定能力(正向)

承接 §19 接口契约 semver + §20 测试 + 里程碑字段宽紧度演化矩阵。系统主动:在字段从 Optional → required 收紧、或接口 major 变更时,自动检出对历史 case / 既有 client 的破坏,阻断「悄悄改语义」。

§4.2 接入点(M0 标基线,M1+ 实施脚本)

接入点内容M0M1+
字段宽紧度基线在字段演化矩阵标 M0 各字段 Optional/required 状态(至少 s1 / mca_bucket.worst_axis / mca_bucket.tag_version / regulation_status✅ 标基线
audit_contract_regression.mjs检出字段收紧时点 vs 矩阵声明不一致 / 未声明的破坏性变更⏳ 接口预留✅ 实施
Pydantic schema diffPR diff 中 contract 字段变更映射到 semver 等级(新增 optional=minor / 删字段或改语义=major)⏳ 预留
contract_version 拒绝逻辑不同 major 返回 INVALID_CONTRACT_VERSION + 支持版本范围✅(运行时已在契约)

§4.3 字段级演化规则(契约级,移植自 §19)

  • 新增 optional 字段 → minor;新增 required / 删字段 / 改语义 / 改类型 → major。
  • 删字段前必须先 deprecated 一个 minor 版本,给升级窗口。
  • 不向已发布接口悄悄改字段语义(即使字段名 / 类型不变)——这是 contract regression hook 的核心拦截目标。
  • 每次 major 升级附升级指南(自动转换工具 + 手动迁移说明)。

约束:字段收紧(Optional→required)必须在演化矩阵声明收紧时点;未声明即收紧 → M1+ 的 audit_contract_regression.mjs 报错阻断。


§5 CI gate(三检 review gate)

§5.1 系统主动提供的质量门能力(正向)

承接 §20 CI 集成 + §26 审计点 + arch-rewrite/ADR-001 三检 review gate + ADR-003 PR review checklist。CI 主动:每次 PR 前快档全跑(业务流转 + 边界回归),nightly 真档跑(真 LLM),release 前完整评估,把战略边界违规挡在主分支外。

§5.2 三档 CI(移植自 §20,标 M0 范围)

触发跑什么M0
每次 PR单元 + 集成 + 端到端快档(Mock LLM)+ 边界测试集 + verify-kb✅(M0 必做,≤15 min)
nightly全部 + 端到端真档(低成本 Provider)+ 评估测试⏳ M1+(≤1 小时)
release 前nightly 全跑 + 完整评估数据集 + 性能基线对比⏳ M1+

边界测试硬约束(M0 必做):CI 跑边界测试集失败 = 阻断 release。战略边界(凭证拒收 / 执行类工具拒绝 / 用户数据隔离 / TLS 不降级 / 本机 socket 限)一旦被绕过影响远大于功能 bug。

§5.3 配套脚本 / hook

承接整改包 IV 已实施部分。

  • scripts/verify-kb.mjs(已存在,治理库内容校验)
  • scripts/audit_cross_section_consistency.mjs(Step 11 IV-1)
  • scripts/audit_p0_decision_touch.mjs(Step 11 IV-2)
  • scripts/audit_contract_regression.mjs(§4,M1+ 实施)
  • scripts/audit_strategy_fidelity.mjs(M1+ 实施)
gateM0内容
pre-commitderive:check + verify:kb(husky,已生效)
CI 严格门⏳ M1+audit:cross-section:strict + audit:p0-touch --base=main

§6 ADR 引用(namespace prefixed)

  • arch-rewrite/ADR-001 工程范式(三检 review gate 来源,accepted)
  • arch-rewrite/ADR-003 工程实施栈与协作(PR review checklist 11 项 + AI 三方互审,accepted)
  • arch-rewrite/ADR-009 Prompt 是代码还是数据(待定,影响 Prompt 版本化落点)

§7 关联资产