计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
monitor-binary-version-baselines【效率与协作】CLIバイナリの内容について、バージョン横断の縦断的ベースラインを 確立・維持する。カテゴリ別マーカー選定(API / identity / config / telemetry / flag / function)、重み付けスコアリング、閾値ベースの システム存在検出、バージョン単位のベースライン記録を扱う。リリース をまたいで機能のライフサイクルを追跡する場合、ダークローンチまたは 削除された機能を探索する場合、またはスキャンツール自体が古いバイナリ 上で既知の良好なマーカーを検出し続けることを検証する場合に使用する。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
CLIハーネスバイナリに出現する機能システムマーカーについて、比較可能でバージョンをキーとした記録を構築・維持することにより、リリースをまたいで追加、削除、ダークローンチされた機能を機械的に検出できるようにする。
grep が「Xは今日存在するか」に答えるが、実際には「X、Y、Zで構成されるシステムがバージョン間でどう動いたか」が必要な任意のコンテキストリビルドで生き残る文字列を選ぶ。安定していて意味的に有意な識別子を選ぶ — 次のリリースでバンドラにリネームされるミニファイ済みの名前ではない。
推奨されるカテゴリは6つ:
避けるべきもの: ミニファイされたように見える短い識別子(例: _a1、bX、数字付き2文字の名前)、テキスト改訂で変わってしまうインラインリテラル、バンドラ自身の内部命名規則に一致するもの。
Expected: 各候補マーカーにカテゴリタグと短い正当化の注釈(「ユーザー向けドキュメントに出現」「過去Nリリース安定」など)がある。典型的な初回パスでは1システムあたり20-50マーカーが得られる。
On failure: 連続するマイナーバージョン間でマーカーが消失する場合、カタログは安定した識別子ではなくリビルドで変動する文字列を捕まえている。該当エントリを削除し、より長く意味的にアンカーされた部分文字列に広げる。
独立に進化する能力ごとにシステムテーブル1つにマーカーをまとめる。「システム」とは、機能ライフサイクルを共有するために存在/不在が一緒に動くマーカーの一貫した集合である(例: 仮想の 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:
- ...
Expected: 各システムが自身のマーカーリストを持つ。2つのシステムに同じマーカーが出現することはない。新しいシステムを追加するということは、新しいトップレベルエントリを追加することであり、マーカーをシステム間で後から移動させることではない。
On failure: マーカーを1つのシステムに割り当てるのが難しい(重複、曖昧さ)場合、システムの定義が粗すぎる。システムを分割するか、一部のマーカーは「共有基盤」であると認めてシステム単位のスコアリングから除外する。
各マーカーに、その存在単独でシステムを確認できる度合いを反映する重みを割り当てる:
具体的な数字ではなく慣習を教える。「診断可能」と「補強」の間の差の方が、選ぶ整数の正確さよりも重要である — 肝心なのは、Step 5の閾値が「1つの強いシグナル」と「多くの弱いシグナル」を区別できることである。
Expected: 各マーカーに重みがある。カタログの重み分布は補強マーカー(3-5)に偏り、システムあたり少数の単独診断可能マーカー(10)がある。
On failure: 全マーカーの重みが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"
未公開のバージョンは、黙示的に省略するのではなく、明示的な注釈を付ける。黙って省略されたバージョンは、次の読み手にはデータ欠損のように見える。
Expected: 各バージョンが追跡中のシステムごとに1つのレコードを生成し、present、absent、score が設定されているか、未公開の場合は明示的な _annotation が付いている。
On failure: 以前は存在したシステムに対してベースラインスキャンがマーカー0件を返した場合、バイナリパスが正しかったこと、stringsコマンドが出力を生成したこと、マーカーIDがカタログと完全一致することを確認するまで削除と仮定してはならない。偽のゼロは縦断的記録を汚染する。
システムごとに、集計スコアに適用する2つのゲートを定義する:
full — このバージョンでシステムが存在しアクティブとみなされるスコア以上partial — システムが出荷されているが不完全(一部マーカー存在、ただし full 閾値未満)とみなされるスコア以上partial 未満 = 不在(または進行方向次第では未到達)。
thresholds:
acme_widget_v3:
full: 25
partial: 10
閾値の選択: 健全なインストールが発すると期待する重みの合計を full に設定する。1つの診断マーカーと1つの補強シグナルを partial に設定する。複数バージョンの証拠が揃ってから再チューニングする。
Expected: 各スキャンがシステムごとにラベル付きの発見を生成する: full | partial | absent。partial の発見は調査に値する — それらがダークローンチと削除の候補である。
On failure: 全バージョンで全システムが 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 がほぼ空の出力を返す場合、バイナリはバンドル抽出が先に必要かもしれない(このスキルの範囲外)Expected: バイナリサイズに応じて1k-100k行の1行1文字列の出力。手動検査で最初の100行に認識可能な識別子が見えるはず。
On failure: 出力が空または認識不能な場合、バイナリはおそらくパックされているか、暗号化されているか、strings が読めないバイトコード形式で出荷されている。停止して抽出層で解決する。読めないスキャンからベースラインを記録してはならない。
カタログに新しいシステムやマーカーが追加された場合、前方バージョンのみがそれに対してスキャンされる。過去バージョンのレコードは元のまま残る。
理由: 過去バージョンのベースラインは、当時スキャンされたものの経験的証拠であって、過去バージョンに何が含まれていたかの現時点のモデルではない。新しく発見されたマーカーで遡及的に書き換えると、「今わかっていること」と「当時観測したこと」が混同される。両方とも有用だが、ベースラインファイルに生きるべきは1つだけである。
遡及的スキャンが本当に必要な場合(例: 新しいマーカーがバージョンN-3に存在したかをテストしたい)、別の補遺として記録する:
addenda:
"1.4.0":
scan_date: "2026-04-15"
catalog_revision: "v7"
findings:
acme_new_system:
present: ["..."]
元の baselines["1.4.0"] エントリは手付かずのままである。読み手は元のレコードと、それぞれのカタログリビジョンを持つ後の遡及的スキャンの両方を見ることができる。
Expected: ベースラインファイルは単調に前方に成長し、過去レコードは追加のみで、オプションの補遺ブロックを持つ。各スキャンを使用したカタログ状態に結び付けられるよう、カタログリビジョンがバージョン管理されている。
On failure: 過去バージョンの present リストを直接編集したい衝動に駆られたら、停止する。代わりに補遺を追加する。過去レコードを変更すると、スキャナの回帰を検出する能力が失われる(後のスキャナ検証パスのStep 8は履歴レコードが不変であることに依存している)。
present、absent、score を持つレコードを持つfull と 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 — Phase 2-3のフォローアップ。ベースラインを消費してフラグ展開状態(live / opt-in / dark / removed)を分類するconduct-empirical-wire-capture — Phase 4のフォローアップ。推論された挙動を実際のハーネストラフィックに対して検証するredact-for-public-disclosure — Phase 5のフォローアップ。どの発見がプライベートワークスペースを離れられるかを統制する