no-fallback-single-source

开发工程

编写、修改或审查接口解析、字段适配、默认值、展示占位及缓存恢复逻辑时使用。依据已确认的数据契约区分合理默认值与无依据回退,避免猜测备用字段、混用展示与业务数据,或将异常伪装成成功结果;不因代码中仅出现空值运算符或异常捕获就触发。

npx skills add bingwu-devkit/skills --skill no-fallback-single-source
下载 ZIP

SKILL.md

按契约取数,按用途兜底#

禁止无依据的回退;允许有明确契约的默认值、协议兼容、业务选择和缓存恢复。先确定值用于最终展示、业务数据、边界解析还是恢复旧结果,再判断兜底是否合法,不仅根据运算符或写法作判断。

使用方式与项目适配#

  • 先读取当前项目适用的协作约定,核对任务相关的数据契约,以及已有展示、日期、校验和错误处理工具的实际行为。具体路径、框架、占位文案与历史实现位置由项目约定提供,本技能不预设。
  • 契约依据包括适用版本的接口文档、服务端实现及明确业务约定。真实响应可辅助核实,但单个样本不能证明字段必需性、全部合法结构或备用字段契约;已有兜底代码和迁移记录也不能单独证明兼容成立。
  • 只处理当前任务或指定范围,不扩大为全仓库清理。已授权的取数清理可以按核实契约替代历史字段优先级,并同步修正受影响的文档。
  • 契约不明确时,检查项目指定的权威来源和相关历史实现。仍无法确认的既有兼容保留并列明,不猜测新分支,不在无关重构中收紧或放宽校验;若缺失信息阻碍当前实现,明确提出需要确认的字段或协议。
  • 优先复用现有工具;没有共享工具时采用符合任务范围的最小实现,不为使用本技能强制增加封装、依赖或配置。

最终展示#

  • 字符串、数字和日期的最终展示优先复用项目已有工具,包括页面文字、表格、只读输入框、提示及无障碍说明。确认工具已处理空值后,不再叠加重复兜底。
  • 空值定义和占位文案遵循项目与字段约定。保留缺失值、空字符串、纯空白字符串、零值和布尔假值的区别;去除空白或将某个值判为空应有业务依据。
  • 按对应接口契约读取展示字段,再处理最终空值,不用多字段链猜测同一个值。有明确业务语义的选择保留其原有真假值或空值判断语义。
  • 日期按已确认的格式、时间戳单位和时区解析,沿用项目对缺失与无效日期的处理。必要的协议转换放在数据边界,不用类型断言绕过类型要求,也不用当前时间冒充缺失或无效的服务时间。
  • 图片、列表空态、加载与失败状态、未知枚举按各自业务规则处理,不套用普通文本占位。

业务数据与默认值#

  • 可编辑表单初始值和草稿、请求参数、数据归一化、数值计算及业务默认配置不使用展示占位工具,不把占位符或面向阅读的日期文本写回业务数据。表单和请求需要的日期序列化遵循其数据协议。
  • 默认值必须有接口或内部模型依据,例如缺少数值用 null、允许省略的集合归一化为空集合。不能仅为方便后续调用而把缺失字段变成零值、空集合或空字符串。
  • 可选字段可以保留缺失;下游有明确要求时再归一化。尤其保留请求中省略字段与显式传入 null 的语义区别。
  • 有明确优先级的业务选择允许保留,例如用户设置覆盖系统默认配置。不要把所有多来源选择都当作猜测,也不要机械替换 || 与 ?? 等语义不同的运算符。

边界解析与兼容#

  • 同一接口读取约定字段,不猜测备用键名。不同接口或协议版本分别识别、校验,再按需要显式适配成统一内部结构;后续从已解析的结果取值。
  • 整体响应回退必须确认每种结构都是合法协议,并分别校验。不能仅因包装字段缺失,就把整个响应认作另一种合法数据。
  • 请求体、事件、数据库记录及配置读取遵循同样原则:必要的解析和归一化在边界完成,不在下游反复尝试未知来源。
  • 必需字段缺失、类型错误或解析失败进入现有错误链路,不转换成空数组、零值、空字符串、当前时间或成功状态。合法空集合正常通过;可选字段按自身契约处理。
  • 复用项目现有的校验与异常传播机制,不要求特定校验库或请求框架,也不因统一内部模型而放松各接口自身的校验。

异常与恢复#

  • 按既有规则保留缓存、草稿或上一次成功结果是合理恢复;只恢复属于当前资源、查询或用户上下文的数据,不把旧结果当作本次请求成功。
  • 恢复旧内容时仍保留项目要求的加载与失败反馈,不用兜底清除错误状态或伪造成功标记。
  • 沿用项目已有错误处理和通知机制;已有统一处理时不重复通知,不直接把技术异常原文作为用户提示。

判断示例#

以下使用 TypeScript 展示判断方式,不要求项目使用该语言或同名工具。

// 允许:模型明确约定 null 表示缺少数值
const value = record.value ?? null

// 允许:业务约定用户配置优先,0 是有效配置值
const limit = userSettings.limit ?? systemDefaults.limit

// 允许:已确认属于当前查询,刷新期间保留上次成功结果
const data = query.data ?? lastSuccessfulData

// 避免:没有契约依据地猜测备用键
const phone = response.phone_number ?? response.phoneNumber ?? null

// 避免:必需字段缺失也被当作正常空列表
const rows = response.rows ?? response.items ?? []

// 避免:未识别和校验合法结构,直接回退到整个响应
const result = response.data ?? response

// 避免:把解析异常变成成功的空结果
try {
  return parseResponse(response)
} catch {
  return []
}

// 避免:把最终展示占位写入业务请求
const payload = { phone: formatForDisplay(form.phone) }

验证与交付#

  • 按改动范围验证有实际风险的分支:合法空结果与必需字段缺失、零值与缺失值、已支持的协议变体与非法结构,以及恢复旧数据时的错误状态。只选择与改动相关的场景,不为纯文档调整增加业务测试。
  • 报告已修改的取值规则、无法确认的契约及真实验证边界,不将样本验证表述为完整契约保证。

FILES · 2