/** 决策种类(12 类)——覆盖 Agent 生命周期内所有可问责决策 * * v1.3.3 新增 EVOLUTION(进化动作)+ TEAM(团队协作动作): * - EVOLUTION:优化器修改经验层(think.md / knowledge)、Benchmark 评估 accept/reject、 * git snapshot 回滚等——每次必附 evidence 留痕(触发证据链) * - TEAM:团队协作动作(冲突消解裁决、意图广播、反馈放大写入、自动入队等) * * v1.3.4 新增 COMMONS(公地能力动作): * - COMMONS:组织能力公地的发布/调用/评分/退役等动作(L3 能力公地) * evidence 字段记能力名 + 调用结果 + 评分 + 扫描判定。 * 与 ORCHESTRATION(编排委派)/ EVOLUTION(经验层进化)语义区分—— * 公地是能力流转层,既非编排也非进化。 */ export type DecisionKind = 'SPEC_CHANGE' | 'ARTIFACT_EDIT' | 'TOOL_GATE' | 'RULE_TOGGLE' | 'ESCALATE_REPORT' | 'FALLBACK_DEGRADE' | 'CONFIG_CHANGE' | 'KNOWLEDGE_DISTILL' | 'ORCHESTRATION' | 'EVOLUTION' | 'TEAM' | 'COMMONS' | 'COST'; /** * 判断时刻分类(v1.3.6 交付⑮ · decisions.jsonl 完整版 · OpenFDE 启发)。 * * 与 DecisionKind 正交的两个维度: * - kind(DecisionKind)= 可问责决策类型(这是哪一类决策——改规格/触发规则/进化…) * - category(DecisionCategory)= 判断时刻分类(这次选择动作属于哪种——路由/选方案/跳过/重试/升级) * * v1.3.0 的 emitDecision 只在关键节点(HITL / 审计 FAIL)触发;完整版把意图审计 * 扩展到「记全部判断时刻」——Agent 每次做选择(走哪条路 / 选哪个方案 / 为什么跳过 * 某步)都落 category 标注,让决策日志可按判断行为回溯。 * * 可选字段,老日志无此字段不影响查询(向后兼容)。 */ export type DecisionCategory = 'route' | 'select' | 'skip' | 'retry' | 'escalate'; /** 决策发生时刻(7 阶段)——对齐 FORGE loop / 激活链生命周期 */ export type LoopPhase = 'OBSERVE' | 'ELICIT' | 'INDUC' | 'ACT' | 'EVOLVE' | 'DEPLOY' | 'ATTRIBUTION'; /** 决策理由结构 */ export interface DecisionWhy { /** 决策理由文本(写入前经 sanitizeWhy 脱敏) */ text: string; /** 可选的标签(用于 kind-wise back 聚合) */ tags?: string[]; /** 决策置信度 */ confidence?: 'high' | 'med' | 'low'; /** 触发该决策的规则名(TOOL_GATE / RULE_TOGGLE 时通常有值) */ triggeredRule?: string; /** * 路由决策理由链(v1.3.6 交付⑧ 新增——可选字段,不破坏向后兼容)。 * * 路由决策的可解释性不能外包——"为什么这个任务派给了模型 A 而不是 B" * 是审计需求,必须留在约束层。sofagent 只在 model_switch(换模型)和 * route_workflow(入口路由)两个决策点记结构化理由链(借鉴 role-model * Artifacts 构件;实际路由仍由第三方 router 做,此处只记理由)。 */ routeReason?: RouteReason; } /** * 路由决策理由链 schema(v1.3.6 交付⑧)。 * policy = 命中哪类策略;matchedEndpoint = 命中谁(Profiles 对应); * rejectedEndpoints = 被硬性拒绝的(Policy 对应);decisionScore = 决胜分。 */ export interface RouteReason { /** 命中的路由策略类别 */ policy: 'data-sovereignty' | 'cost' | 'latency' | 'capability' | 'preference' | 'default'; /** 命中的 endpoint(Profiles 对应) */ matchedEndpoint?: string; /** 被规则拒绝的 endpoint(Policy 硬性拒绝对应) */ rejectedEndpoints?: string[]; /** 决胜分(Policy 决胜规则对应) */ decisionScore?: number; } /** 决策日志完整条目 schema */ export interface DecisionLogEntry { /** ISO 8601 UTC 时间戳 */ ts: string; /** Agent 标识 */ agentId: string; /** 会话标识 */ sessionId: string; /** 决策种类 */ kind: DecisionKind; /** * 判断时刻分类(v1.3.6 交付⑮ 新增——可选字段,不破坏向后兼容)。 * 与 kind 正交:kind 记「哪类决策」,category 记「哪种选择动作」。 * 老日志无此字段,查询接口按 undefined 处理(不参与 category 过滤)。 */ category?: DecisionCategory; /** 决策发生时刻 */ moment: LoopPhase; /** 决策理由(已脱敏) */ why: DecisionWhy; /** 关联规格引用(如 FDE 交付物中的 spec ref) */ specRef?: string; /** 关联产物引用(文件路径 / commitSha) */ artifactRef?: string; /** 前一条记录的 hash(链完整性校验用) */ prevHash?: string; /** hash 算法版本(2 = 环境指纹) */ hashVersion?: number; /** HMAC-SHA256 签名(有密钥时) */ hmacSig?: string; /** 写入侧签名算法标记('stable' = stableStringify 签名) */ hmacAlgo?: 'stable'; /** ⚠️ 必加——读侧 checkDecisionChainDetailed 靠它区分「真篡改 vs 环境漂移」 */ envFingerprint?: string; /** 决策引擎标识(缺省 'sofagent-audit') */ engine?: string; /** 触发证据链(字符串数组,可空)—— v1.3.3 新增 * * 进化动作(kind=EVOLUTION)必附:记录触发该决策的证据来源 * (如 Benchmark 评分、审计规则命中、git snapshot commit 等)。 * 团队动作(kind=TEAM)可选附。其余 kind 不强制。 * * 格式:字符串数组,每项为一条证据描述(自由文本,如文件路径 / commitSha / 评分值)。 */ evidence?: string[]; } /** * 对 DecisionWhy 做脱敏处理——铁律:先脱敏再签名。 * * 对标 audit-history.ts 的 sanitizeRuleResult()(L57):扫描 why.text 中的 * 密钥模式(REDACTION_PATTERNS:sk- / AKIA / 手机号 / GitHub token), * 命中则替换为脱敏占位。tags 数组同样逐项脱敏(防止标签携带密钥)。 * 若 text 被完全打码为空,保留脱敏占位而非空串(避免链签名输入缺失)。 * * @param why 原始决策理由 * @returns 脱敏后的决策理由(不修改入参) */ export declare function sanitizeWhy(why: DecisionWhy): DecisionWhy; //# sourceMappingURL=decision-schema.d.ts.map