"""结果净化与观察标证(mandate-and-capability-model.md §6)。 能力返回不可信输入:截断体量、去除敏感材料、标注来源与执行条件; 结果以「观察」进入灵台,接纳不等于成为事实/答复/记忆。 """ from __future__ import annotations import json import re from typing import Any MAX_DIGEST_CHARS = 2000 _REDACT = re.compile(r"sk-[a-zA-Z0-9]{8,}|-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----|Bearer\s+[a-zA-Z0-9._-]{12,}") def redact(text: str) -> str: """敏感材料遮蔽(密钥/凭证形态)。""" return _REDACT.sub("[已遮蔽]", text) def digest(value: Any, limit: int = MAX_DIGEST_CHARS) -> str: """净化摘要:脱敏 + 截断(超长以省略号收尾,不落原文全文)。""" text = value if isinstance(value, str) else json.dumps(value, ensure_ascii=False, default=str) text = redact(text) if len(text) > limit: return text[:limit] + "…[截断]" return text def observation( *, capability_name: str, executor_type: str, output_digest: str, trace_id: str | None, decision: str, duration_ms: int, ) -> dict: """观察标证:灵台接纳工具结果的唯一形态(kind=observation,非事实非记忆)。""" return { "kind": "observation", "capability": capability_name, "executor": executor_type, "trace_id": trace_id, "decision": decision, "duration_ms": duration_ms, "output": output_digest, # 认识论声明:观察被接纳不等于成为事实/答复/记忆(分别受认识论/镜树归真/记忆规则约束) "epistemic": "observation_not_fact", }