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).
redact-for-public-disclosure方法論、一般化可能なパターン、および教育的価値を保持しつつ、 リバースエンジニアリングの発見を公開用にリダクトする。プライベート 対パブリックリポジトリの分離、deny-listパターンの保守、`git log` 漏洩を防ぐorphan-commit公開パターン、カテゴリベースのリダクト較正 (方法論/パターン/バージョン発見/内部)、および deny-list された パターンが出現したときにマージをブロックする `check-redaction.sh` 形式のCIゲートを扱う。自身が所有していないCLIハーネスについての 発見を公開する場合、無関係のプロジェクトへのアップストリーム提案 を準備する場合、またはプライベート研究リポジトリを公開参照用に アーカイブする場合に使用する。
Independent GitHub snapshot · Automated classification · Original documentation governs
git log
漏洩を防ぐorphan-commit公開パターン、カテゴリベースのリダクト較正
(方法論/パターン/バージョン発見/内部)、および deny-list された
パターンが出現したときにマージをブロックする check-redaction.sh
形式のCIゲートを扱う。自身が所有していないCLIハーネスについての
発見を公開する場合、無関係のプロジェクトへのアップストリーム提案
を準備する場合、またはプライベート研究リポジトリを公開参照用に
アーカイブする場合に使用する。
license: MIT
allowed-tools: Read Write Edit Bash Grep
metadata:
author: Philipp Thoss
version: "1.0"
domain: investigation
complexity: intermediate
language: multi
tags: redaction, disclosure, deny-list, orphan-commit, ci-gate, research-publishing
locale: ja
source_locale: en
source_commit: f74b59bd
fence_basis_commit: f74b59bd
translator: claude-sonnet-4-6
translation_date: "2026-04-17"リバースエンジニアリングの研究リポジトリを、プライベートな真の情報源とパブリックな公開用サブセットに分割する。リダクトチェッカ、パターンdeny-list、orphan-commit公開パターンを使用する。方法論は流通させ、具体的な発見はプライベートに留める。
public/ ワークツリー)コンテンツを書いたり昇格させたりする前に、各事実を次の4カテゴリのいずれかに分類する。カテゴリが、出荷できるかどうかとその時期を決定する。
| Category | Definition | Shareable? |
|---|---|---|
| methodology | The how of investigation, independent of any specific finding | Always |
| generic pattern | Class-level observations (e.g., "harnesses commonly use a single-prefix flag namespace") | Yes |
| version-specific finding | Concrete observation tied to a specific release (e.g., "in vN.M, the gate defaults off") | Only after the version-lag cool-off |
| live internal | Minified names, byte offsets, dark flag names, current-version gate logic, PRNG/salt constants, internal codenames | Never |
公開レビュー前に、各ドラフトセクション、キャプチャログ、またはノートにカテゴリを注釈する。カテゴリが混在するセクションは分割される — 方法論はきれいに取り出され、残りはプライベートに留まる。
Expected: すべての候補事実にカテゴリラベルがある。パブリックミラー向けのドラフトは方法論と一般パターンのエントリ(およびクールオフを超えたバージョン固有の発見)のみを含む。
On failure: 事実が分類に抵抗する場合、デフォルトでライブ内部として扱う。バージョン遅延ポリシーに対する明示的なレビュー後にのみ再分類する。
「現行」と「共有可能」の間に何バージョン挟むかを事前に決める。2が典型的である: 現行 + 直前1つがプライベートに留まり、それより古いパターンは議論してよい。将来の自分が再導出しなくて済むようにポリシーをプライベートリポジトリに書き込む(例: REDACTION_POLICY.md)。
# Redaction Policy
Version-lag cool-off: **2 releases**.
- Current release (vN): all version-specific findings PRIVATE.
- Previous release (vN-1): all version-specific findings PRIVATE.
- Releases vN-2 and earlier: version-specific findings may move to public draft after Step 5 review.
Source of truth for "current": output of `monitor-binary-version-baselines`.
Owner: <name>. Reviewed quarterly.
「現行」バージョンは経験的(インストールされたバイナリから読み取る)でなければならない。管理的ではない。ポリシーをカレンダーではなくベースラインスキャナ出力に結び付ける。
Expected: 明示的なクールオフとオーナーを持つ REDACTION_POLICY.md がプライベートリポジトリにコミットされている。
On failure: 関係者がクールオフに合意できない場合、最も保守的な提案をデフォルトにする。クールオフは後で短縮できるが、漏洩を取り消すことはできない。
リダクトポリシーの真の情報源である単一の実行可能スクリプト内にパターンを保持する。スクリプトはプライベートリポジトリ(tools/check-redaction.sh)に置き、パブリックミラーに対して実行する。
#!/usr/bin/env bash
set -u
PUBLIC_REPO="${1:-./public}"
LEAKS=0
PATTERNS=(
"minified identifier shape|<regex matching short bundle-style identifiers>"
"vendor-prefixed flag|<regex matching the vendor's flag prefix>"
"PRNG/salt constant|<regex matching the specific constants>"
)
for entry in "${PATTERNS[@]}"; do
desc="${entry%%|*}"
pattern="${entry##*|}"
if rg -q "$pattern" "$PUBLIC_REPO"; then
echo "LEAK: $desc"; LEAKS=$((LEAKS+1))
fi
done
exit $LEAKS
各エントリは人間が読めるラベルと正規表現を持つ。機微な識別子の形状ごとに1エントリ(リテラル文字列ごとではない — 形状はバージョンの変化を生き延びる)。終了コードはリーク数に等しい。クリーンな実行は0で終わる。
Expected: tools/check-redaction.sh ./public-mirror が小さなリポジトリで1秒未満で実行され、何も一致しない場合は0で終了する。
On failure: rg が利用できない場合、grep -rqE にフォールバックする。パターンが広すぎる場合(すべての実行でリークが報告される)、抑制を追加するのではなくソースで狭める。
Phase 1-4の発見がドラフトを通して漏洩し得る場合、ドラフトが書かれる前にスキャナを拡張する。ドラフトは安価である。スキャナに新しいパターンを教えることは永続的である。
ワークフロー:
tools/check-redaction.sh にパターンエントリ(ラベル + 正規表現)を追加する。これは通常の順序を反転させる: スキャナが最初に更新され、ドラフトが2番目。スキャナは「公開するには機微すぎるもの」の実行可能な仕様になり、ドラフトは誤ってそれを追い越せなくなる。
Expected: tools/check-redaction.sh 内のパターンエントリが、それらに一致し得るパブリックミラーコンテンツより先行している。git log tools/check-redaction.sh は関連ドラフトコミットより先にスキャナ更新が上陸していることを示す。
On failure: スキャナ更新がドラフトに遅れる場合、新しいパターンに対してパブリックミラーを直ちに監査する。リダクトした後、発見されたパターンを説明するノートと共にスキャナ更新をコミットする。
パブリックミラーに同期されるファイルの明示的な許可リストを定義する。新規ファイルはデフォルトでプライベート。昇格にはリダクトチェック合格が必要。
# tools/public-allowlist.txt
README.md
LICENSE
guides/methodology-overview.md
guides/category-classification.md
docs/contributing.md
tools/sync-to-public.sh は許可リストを読み、それらのファイルのみをパブリックミラーにコピーし、許可リストが存在しないファイルを参照する場合はゼロ以外で終了する(タイプミスを捕捉する)。
#!/usr/bin/env bash
set -eu
PRIVATE_ROOT="${1:?private repo path required}"
PUBLIC_ROOT="${2:?public mirror path required}"
ALLOWLIST="$PRIVATE_ROOT/tools/public-allowlist.txt"
while IFS= read -r path; do
[ -z "$path" ] && continue
case "$path" in \#*) continue ;; esac
src="$PRIVATE_ROOT/$path"
dst="$PUBLIC_ROOT/$path"
if [ ! -e "$src" ]; then
echo "MISSING: $path"; exit 2
fi
mkdir -p "$(dirname "$dst")"
cp -a "$src" "$dst"
done < "$ALLOWLIST"
昇格には順に3つが必要: ファイルが許可リストに追加される、ファイルがリダクトチェックを通過する、レビュアーがStep 1のカテゴリラベルを確認する。
Expected: パブリックミラーには tools/public-allowlist.txt に列挙されたファイルだけが正確に含まれる。許可リストにないファイルがパブリックミラーに出現することはない。
On failure: パブリックミラーに出現するが許可リストに欠けているファイルがある場合、リーク事象として扱う — どう到達したかを調査し、削除するかリダクトレビュー後に正式に昇格させる。
パブリックミラーは、各公開時に再作成される単一の git commit --orphan をルートとするコミットである。これにより、パブリックリポジトリの git log がリダクト前のドラフトを露呈するのを防ぐ。
# In the public mirror (separate repo or worktree)
cd /path/to/public-mirror
git checkout --orphan publish-tmp
git rm -rf . # Clear the index
# Sync from private using the allow-list
bash /path/to/private/tools/sync-to-public.sh /path/to/private .
git add -A
git commit -m "Publish: <date>"
git branch -D main 2>/dev/null || true
git branch -m main
git push --force origin main
パブリックリポジトリの git log は正確に1つのコミットを示す。以前のドラフトとあらゆるリダクトの反復はプライベートリポジトリの履歴に留まる。パブリックリポジトリ上の git log -p、git reflog、またはブランチ一覧からは、そこにコミットされたことがないため、リダクト前のコンテンツを復元することはできない。
Expected: パブリックミラー上の git log --oneline が公開ごとに単一のコミットを示す。プライベートリポジトリの履歴への参照(親SHA、マージコミット、プライベートリポジトリからのタグ)は出現しない。
On failure: git push --force が拒否される場合(ブランチ保護)、代わりにクリーンなorphanブランチから単一コミットのプルリクエストを開く。プライベート履歴をプッシュすることで拒否を解決してはならない。
パブリック同期ブランチへの各コミットで tools/check-redaction.sh を実行する。失敗したチェックは公開を警告するのではなくブロックする。
# .github/workflows/redaction-check.yml (in the public mirror repo)
name: redaction-check
on:
push:
branches: [main, publish-*]
pull_request:
branches: [main]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install ripgrep
run: sudo apt-get update && sudo apt-get install -y ripgrep
- name: Fetch redaction scanner
env:
GH_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }}
run: |
gh api repos/<org>/<private-repo>/contents/tools/check-redaction.sh \
--jq .content | base64 -d > check-redaction.sh
chmod +x check-redaction.sh
- name: Run scanner
run: ./check-redaction.sh .
ここでの2つの設計上の選択:
Expected: deny-listされたパターンを持ち込むプッシュはCIで失敗する。公開は上陸しない。メンテナは失敗ラベル(例: LEAK: vendor-prefixed flag)を正規表現自体を見ずに見る。
On failure: プライベートリポジトリのトークンをパブリックCIに付与できない場合、最小漏洩部分のスキャナのみ(ベンダーを特定しない幅広い形状パターン)をパブリックリポジトリに埋め込み、完全なスキャナをプライベートリポジトリからpush前に実行する。
スキャナが正当なコンテンツでトリップする場合、無視行を追加するよりパターンを狭めることを優先する。ローカルな抑制を持つ幅広いdeny-listは急速に腐敗する — 6か月後には特定の行がなぜ抑制されたかを誰も覚えておらず、次のリークが気づかれずすり抜ける。
決定ツリー:
check-redaction.sh に記録する。# REASON: コメントを持つ単一行抑制を使用する。コメントに日付を付ける。# Bad — mystery suppression
echo "API endpoint pattern" >> ignore.txt
# Good — narrowed pattern with rationale
# Pattern v2: tightened from `\bgate\(` to `\bgate\(['\"][a-z]+_phase` after
# legitimate `gate(true)` calls in our own SDK examples started matching. 2026-04-15.
PATTERNS+=("vendor flag predicate|\\bgate\\(['\"][a-z]+_phase")
Expected: 各スキャナパターンには絞り込みを説明するインラインコメントが0件または1件ある。抑制がもしあれば、日付と根拠が付いている。
On failure: 抑制が蓄積する(四半期に1件以上)場合、deny-listの形が悪い。リダクトポリシーレビューを予定し、分類済み事実インベントリからパターンを再構築する。
すべてのリダクト作業がインシデント駆動であるわけではない。プライベートリポジトリへの最近の追加を再分類し、パブリックミラーに対してスキャナを再実行する定期スイープ(月次が典型的)を行う。ドリフトはインシデント級になる前に自ら捕捉する。
スイープチェックリスト:
tools/check-redaction.sh を実行する(依然として0で終わるはず)tools/public-allowlist.txt が実際のパブリックミラーファイルセットと一致することを確認するExpected: プライベートリポジトリ内の月次の短いスイープログ(例: sweeps/2026-04.md)にチェックリスト結果と実施した任意のアクションがある。
On failure: スイープが繰り返しスキップされる場合、カレンダーリマインダを自動化する。スイープが同じドリフトを見つけ続ける場合、その上流のワークフローが問題である — ドラフト時に分類がなぜスキップされているかを調査する。
tools/public-allowlist.txt にあるtools/check-redaction.sh ./public-mirror が0で終わるgit log --oneline が公開ごとに単一のorphanコミットを示すREDACTION_POLICY.md がプライベートリポジトリに存在し、明示的なバージョン遅延クールオフを持つacme_widget_v3、widget_handler_42)を使う — 明らかに発明されたもの、決して実際の製品に追跡可能でないもの。git rebase または git filter-branch を使う。書き直された履歴を強制プッシュしても、クローンとフォークに痕跡が残る。orphan-commit公開パターンは構造的な修正である。場当たり的な履歴書き換えはそうではない。LEAK: vendor-prefixed flag)のみをパブリックCIログに出す。monitor-binary-version-baselines — Phase 1。ベースラインがバージョン遅延ポリシーを供給する: 「現行」として数えるのは経験的事実であり、カレンダー上の事実ではないprobe-feature-flag-state — Phase 2-3。ここでの分類発見がカテゴリステップ(Step 1)でリダクトパイプラインに入るconduct-empirical-wire-capture — Phase 4。キャプチャアーティファクト(ワイヤーログ、ペイロードスキーマ)は、公開で参照される前にリダクトが必要security-audit-codebase — 両パイプラインがdeny-list形式のスキャンから恩恵を受ける。このスキルは秘密漏洩ではなく研究公開に特化しているmanage-git-branches — orphan-commit公開パターンはブランチ操作である。安全な実行にはそこに文書化されたブランチ衛生の実践が必要