brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
monitor-binary-version-baselinesEstablish and maintain longitudinal baselines of CLI binary contents across versions. Covers marker selection by category (API / identity / config / telemetry / flag / function), weighted scoring, threshold-based system-presence detection, and per-version baseline records. Use when tracking a feature's lifecycle across releases, when probing for dark-launch…
Independent GitHub snapshot · Automated classification · Original documentation governs
为 CLI 测试台二进制中的特性系统标记建立可比较的、以版本为键的记录,让新增、移除与暗启动能力能够在跨版本间被机械化地检测出来。
grep 只能回答"X 今天在不在",而你真正需要的是"由 X、Y、Z 组成的系统如何在版本间演进"的场景选择能在重新构建中幸存的字符串。挑选稳定、语义上有意义的标识符 — 不要挑选打包器在下个版本就会重命名的压缩名。
推荐的六个类别:
避免:看起来像被压缩过的短标识符(例如 _a1、bX、两个字母后跟数字)、任何一次文本修订就会改变的内联字面量,以及任何匹配打包器自身内部命名惯例的字符串。
预期: 每个候选标记都带有一个类别标签和一段简短的理由说明("出现在面向用户的文档中"、"在前 N 个发布中稳定存在"等)。一次典型的初轮筛选能为每个系统产出 20-50 个标记。
失败时: 如果标记在相邻的小版本之间就消失了,说明目录捕获的是易受重新构建影响的易变字符串,而不是稳定的标识符。删除这些条目;改为采用更长、更具语义锚点的子串。
把标记打包进每个独立演化能力对应的系统表中。一个"系统"是一组连贯的标记,它们的存在/缺失会协同移动,因为它们共享一次特性生命周期(例如,属于某个假想 acme_widget_v3 能力的全部标记)。
分组的意义:逐系统打分可防止交叉污染。某个系统的标记缺失绝不可压制对另一个系统的检测;不相关系统之间的聚合计数也没有信息量。
一个工作目录的形态(伪代码):
catalog:
acme_widget_v3:
markers:
- { id: "acme_widget_v3_init", category: function, weight: 10 }
- { id: "acme.widget.v3.dialog.open", category: telemetry, weight: 5 }
- { id: "ACME_WIDGET_V3_DISABLE", category: flag, weight: 10 }
acme_other_system:
markers:
- ...
预期: 每个系统拥有自己的标记清单;没有任何标记同时出现在两个系统中。添加一个新系统意味着新增一个顶级条目 — 绝不事后在系统之间搬运标记。
失败时: 如果标记难以归入某一个系统(重叠、模糊),说明系统定义太粗了。拆分该系统,或者接受某些标记是"共享底座"并把它们排除在逐系统打分之外。
为每个标记赋予一个权重,反映它的存在单独能在多大程度上确认该系统:
要教授的是这一惯例,而非具体数字。"确诊"与"佐证"之间的落差比具体整数更重要 — 关键在于第 5 步的阈值能区分"单个强信号"与"多个弱信号"。
预期: 每个标记都有一个权重。目录的权重分布偏向佐证性标记(3-5),每个系统只有少量单独即可确诊的标记(10)。
失败时: 如果每个标记都被赋值为 10,打分就失去了分辨率 — 部分存在的发现将不可能被识别。降格那些在多个系统间反复出现、或出现在不相关处理器中的标记。
对扫描过的每个版本,都应记录存在的与缺失的标记,以版本为键。两者都是证据:版本 N 中缺失的某个标记,与版本 N+1 重新引入它时同样具有信息量。
基线形态:
baselines:
"1.4.0":
acme_widget_v3:
present: ["acme_widget_v3_init", "ACME_WIDGET_V3_DISABLE"]
absent: ["acme.widget.v3.dialog.open"]
score: 20
"1.5.0":
acme_widget_v3:
present: ["acme_widget_v3_init", "ACME_WIDGET_V3_DISABLE", "acme.widget.v3.dialog.open"]
absent: []
score: 25
"1.4.1":
_annotation: "never-published; skipped from upstream release timeline"
从未发布的版本要显式加注,而不是默默省略。默默跳过的版本在下一位读者眼里就像数据丢失。
预期: 每个版本对每个被追踪系统都产出一条记录,填充 present、absent、score;如从未发布则填入显式的 _annotation。
失败时: 如果基线扫描在一个先前存在的系统上产出了零标记,在没有确认二进制路径正确、strings 命令有输出、且标记 ID 与目录完全一致之前,不要假定它被移除了。错误的零值会污染纵向记录。
为每个系统定义两道闸门,作用于聚合得分:
full — 高于此分则该系统被视为在本版本中存在且激活partial — 高于此分则该系统被视为已发货但不完整(部分标记存在,但未达 full 阈值)低于 partial = 缺失(或尚未存在,取决于时间推进方向)。
thresholds:
acme_widget_v3:
full: 25
partial: 10
如何选阈值:把 full 设为一次健康安装预期会发出的权重之和;把 partial 设为一个诊断性标记加上一个佐证信号的分数。当你有了多个版本的证据后再重新调校。
预期: 每次扫描对每个系统产出一个带标签的发现:full | partial | absent。partial 发现需要调查 — 它们正是暗启动与移除的候选。
失败时: 如果每个系统在每个版本都报告 partial,说明阈值过于敏感(很可能被设置得比标记总和还高)。对照某个已验证处于激活状态的版本重新校准。
strings -n 8 扫描把 strings 配合最短长度过滤作为抽取原语。-n 8 下限能滤掉多数噪声(短片段、填充、地址表垃圾),同时不丢失有意义的标识符 — 它们几乎总是长于 8 个字符。
strings -n 8 path/to/binary > /tmp/binary-strings.txt
然后对 /tmp/binary-strings.txt 运行目录匹配(任何面向行的匹配器:grep -F -f markers.txt、ripgrep 或一个小脚本都可以)。
注意事项:
-n 4、-n 6)会让输出被二进制垃圾与压缩符号噪声淹没;诊断与佐证的区分会崩塌-n 12+)会漏掉较短的标志位标识符与配置键strings 返回几乎空白的输出,二进制可能需要先做打包抽取(超出本技能范围)预期: 每行一个字符串的输出,通常 1k-100k 行,取决于二进制大小。手工检视前 100 行应能辨认出可识别的标识符。
失败时: 如果输出为空或难以辨认,二进制很可能是被打包、加密、或以 strings 读不懂的字节码格式发货的。停在这里、先在抽取层解决;不要基于一次不可读的扫描记录基线。
当目录中新增系统或标记时,仅对其后的版本进行扫描。过去版本的记录保持原样。
为什么这样做:先前版本的基线是当时扫描到的经验证据,而不是对该过去版本实际内容的当前模型。用事后新发现的标记去回头改写它们,会把"我们现在知道什么"与"我们当时观察到了什么"混为一谈。两者都有用;基线文件里只应保留其中一者。
如果确实需要做一次事后扫描(例如测试某个新标记在版本 N-3 时是否已存在),把它作为独立的附录来记录:
addenda:
"1.4.0":
scan_date: "2026-04-15"
catalog_revision: "v7"
findings:
acme_new_system:
present: ["..."]
原本的 baselines["1.4.0"] 条目保持不动。读者既能看到原始记录,也能看到后来的事后扫描及各自使用的目录修订。
预期: 基线文件只向前单调增长;过去记录只追加、附带可选的附录块。目录修订版本化,使每次扫描都能追溯到它所用的目录状态。
失败时: 如果你感到冲动想要直接编辑某个过去版本的 present 清单,请停下。改为增加一条附录。篡改过去记录会失去检测扫描器回归的能力(后续任何扫描器校验环节的第 8 步都依赖历史记录的不可变性)。
present、absent 与 scorefull 与 partial 两个阈值;发现被相应标注strings -n 8 作为抽取原语(或对非文本二进制使用有文档记载的等价物)_p3a 或 q9X 这样的名字在每次重新构建时都会重命名。即使今天匹配上,明天就是噪声。坚持采用语义上有意义的标识符。_annotation: "never-published"。strings -n 4 当成比 -n 8 更彻底。 更低的下限加噪声的速度比加信号更快。诊断性标记几乎总是 8 个以上字符。security-audit-codebase — 共享的学术纪律;两条流水线都把标记存在当作发现,但下游消费者不同audit-dependency-versions — 把相同的版本追踪严谨性扩展到外部依赖清单;本技能把它应用到二进制工件probe-feature-flag-state — 第 2-3 阶段的后续;消费基线以对标志位推广状态(live / opt-in / dark / removed)进行分类conduct-empirical-wire-capture — 第 4 阶段的后续;用真实测试台流量验证推断出的行为redact-for-public-disclosure — 第 5 阶段的后续;规定哪些发现可以离开私有工作区