AGENT SKILL

single-source-of-truth

真相源单一律——意图 / 逻辑 / 状态三层都禁止「真相源数量 > 1」,否则必 drift。Use when 设计新模块/新流程时面对一个概念有多处可能维护其状态、值或定义;或排查 drift 类 bug(A 处和 B 处不一致);或重构时合并散点逻辑/共享 worker 创建/状态机生命周期对齐时。

License 许可
MIT
所属仓库
KarryViber/Orb
最近更新
2026-05-14
Stars
★ 66
Forks
8

01 前言 Front Matter

name
single-source-of-truth
provenance
user-authored
description
真相源单一律——意图 / 逻辑 / 状态三层都禁止「真相源数量 > 1」,否则必 drift。Use when 设计新模块/新流程时面对一个概念有多处可能维护其状态、值或定义;或排查 drift 类 bug(A 处和 B 处不一致);或重构时合并散点逻辑/共享 worker 创建/状态机生命周期对齐时。

03 SKILL.md 正文

Single Source of Truth — 真相源单一律

When to Use

  • 设计新模块 / 新流程时一个概念有多处可能维护其值
  • 排查 drift 类 bug(A 处和 B 处不一致 / 状态错乱 / 定义冲突)
  • 重构时考虑合并散点逻辑、共享 worker 创建路径、状态机 touchpoint 对齐
  • 用户问「这个值在哪定义的?」「为什么 A 和 B 不一样?」

核心定律

对任何一个概念,其 source of truth 的数量 = 1。

数量 > 1 → 维护人会 drift,时间会 drift,bug 必至。

三个维度(同模式不同表现)

维度 反模式 来源 fact
用户意图 单歧义词不澄清,在多 turn 里各自假设 fact_53
代码逻辑 worker 创建散点,每处自己 spawn,不抽共享 fact_34
运行时状态 stream lifecycle 6 个 touchpoint 各管各的 arm/clear fact_96

Workflow

  1. 定位 SoT:面对一个概念先问「它的 source of truth 在哪?」
  2. 数 SoT 数量:若 > 1 → 必须处置
  3. 二选一处置:
    • 集中:合并到单一 owner(一个文件 / 一个函数 / 一个 anchor 文件)
    • 派生:保留一个 SoT,其余从它只读派生(不允许独立写)
  4. 禁止各自维护:每个分支自己写自己的 = drift 已发生

典型反例

  • ❌ 用户问 可以 你假设是 A 意图执行;下一个 turn 又来个 可以 假设是 B → 两次假设独立 drift
  • ❌ scheduler 一处 fork worker,cron 又自己 fork,调试时谁也不知道用哪个
  • ❌ stream start 在 A,append 在 B,stop 在 C,error path 在 D 各自 setState → lifecycle 必断
  • ❌ Anchor ts 一处写文件、一处 in-memory 缓存、一处 history 反查 → 三个真相源同时漂

典型正例

  • ✅ Slack daily anchor → data/<topic>-daily-anchor.json 一个文件,所有调用读它
  • ✅ Worker spawn 抽到 scheduler.spawnWorker(),cron / inject / 手动触发都走它
  • ✅ Stream lifecycle 集中到一个 controller 类,6 个 touchpoint 都调它

Gotchas

  • ❌ 「这次先复制一份,以后再统一」——以后没有了,drift 立刻发生
  • ❌ 「我加个缓存做加速」——缓存是派生层但写也走它就变成第二个 SoT
  • ❌ 把「文档」当 SoT,但代码里硬编码值不引用文档——文档腐化必至
  • ⚠️ 派生层必须只读派生;任何能写的派生层都是新 SoT

与其他 skill 的关系

  • state-assumptions-before-acting → 把「我假设 SoT 是 X」显式化让 Karry 拦截
  • terse-intent-classifier → 短指令意图歧义就是「用户意图层 SoT 数量 > 1」的早期检测
  • truth-ladder → 状态汇报阶梯本身就是「状态 SoT 单一律」的具体落地(attempted/observed/confirmed 不允许并存为同一事的真相)

04 同仓库更多 Skills

KarryViber
KarryViber/Orb

webapp-testing

Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.

测试与质量前端开发
★ 66
KarryViber
KarryViber/Orb

vendor-doc-actionability

对外合作文档(交付文档 / POC 文档 / Solution Doc / 提案书)必须为每个「需对方执行」的动作写清具体操作入口(URL / 工单系统 / 脚本路径 / 联系人 + 联系方式 / 步骤编号)。Use when 给客户、vendor、合作方写交付文档、POC 文档、Solution Doc、提案书;或检视已有对外文档是否抽象到无法执行。

★ 66
KarryViber
KarryViber/Orb

vendor-api-param-validation

第三方 API / SDK 集成开工前,强制先列参数 checklist 并对照官方文档逐项验证(名称 / 类型 / 必填 / 默认 / 上限),通过后再编码——不是「写完再调通」。Use when 新接 vendor API/SDK(Slack / LongPort / freee / LLM API 等)、既有集成追加新 endpoint 或新字段、用户说「调通某接口」「接入 X」「集成 X」。

开发工程师后端与接口
★ 66
KarryViber
KarryViber/Orb

truth-ladder

状态放行三层阶梯(attempted / observed / confirmed)—— 汇报任务、API、命令、消息或外部动作状态时强制分层,避免把"动作已发起"误写成"结果已达成"。Use when 准备写「任务已完成」「API 返回成功」「exit code 0」「用户已收到」「ok:true」类状态汇报;或在 cron 报告 / Slack 回报 / project status / receipt 中表达完成度时。

开发工程师
★ 66
KarryViber
KarryViber/Orb

thread-object-realignment

长 thread 切题后的对象重定协议——thread 历史 ≥5 条且检测到切题信号时,回复前必做「用户最后显式问题对象 vs 待发回复对象」一致性校验,不一致则改写或反问。Use when Slack thread 历史 ≥5 条且当前用户消息出现切题信号(主题词突变、问句指向新实体、时间线跳跃、出现「另外」「话说」「回到 X」「换个话题」等切题语,或 ≥3 turn 后用户显式问题对象与最近 assistant 回复对象不同)。

★ 66
KarryViber
KarryViber/Orb

theme-factory

Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.

视觉设计
★ 66