redact-for-public-disclosure
정보
이 스킬은 방법론과 교육적 가치를 보존하면서 역공학 결과물을 안전하게 편집 및 게시하는 워크플로를 제공합니다. 비공개/공개 저장소 분리, 거부 목록 패턴 매칭, git 로그 유출 방지를 위한 고아 커밋, 미편집 콘텐츠 차단을 위한 CI 게이트 등 기술적 안전장치를 구현합니다. 타사 도구 연구 게시, 업스트림 기여 준비, 공개 참조용 비공개 저장소 아카이빙 시 사용하세요.
빠른 설치
Claude Code
추천npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/redact-for-public-disclosureClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
公開用リダクト
リバースエンジニアリングの研究リポジトリを、プライベートな真の情報源とパブリックな公開用サブセットに分割する。リダクトチェッカ、パターンdeny-list、orphan-commit公開パターンを使用する。方法論は流通させ、具体的な発見はプライベートに留める。
使用する場面
- 統合するクローズドソースのCLIハーネスについての方法論的発見を公開する
- 自身が所有していないプロジェクトにアップストリーム提案またはバグレポートを準備する
- プライベート研究リポジトリを公開参照としてアーカイブする
- 調査ノート(Phase 1-4アーティファクト)を公開ガイドに昇格させる
- 発見が蓄積する前に公開パイプラインを確立し、漏洩リスクが溜まらないようにする
- 下書きが機微な識別子をあやうく出荷しかけたニアミスの後片付け
入力
- 必須: 機密度が混在するコンテンツを持つプライベート研究リポジトリ(真の情報源)
- 必須: リダクト済みコンテンツが公開されるターゲットのパブリックミラー(別リポジトリ、または
public/ワークツリー) - オプション: 公開予定の既存ドラフト
- オプション: バージョン遅延ポリシー(デフォルトは「現行 + 直前1つはプライベート」)
- オプション: 既に機微と判明しているベンダー識別子、フラグプレフィックス、または名前空間のリスト
手順
Step 1: すべての候補事実を分類する
コンテンツを書いたり昇格させたりする前に、各事実を次の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: 事実が分類に抵抗する場合、デフォルトでライブ内部として扱う。バージョン遅延ポリシーに対する明示的なレビュー後にのみ再分類する。
Step 2: バージョン遅延クールオフポリシーを設定する
「現行」と「共有可能」の間に何バージョン挟むかを事前に決める。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: 関係者がクールオフに合意できない場合、最も保守的な提案をデフォルトにする。クールオフは後で短縮できるが、漏洩を取り消すことはできない。
Step 3: deny-listスキャナを構築する
リダクトポリシーの真の情報源である単一の実行可能スクリプト内にパターンを保持する。スクリプトはプライベートリポジトリ(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 にフォールバックする。パターンが広すぎる場合(すべての実行でリークが報告される)、抑制を追加するのではなくソースで狭める。
Step 4: ドラフト作成前にdeny-listを保守する
Phase 1-4の発見がドラフトを通して漏洩し得る場合、ドラフトが書かれる前にスキャナを拡張する。ドラフトは安価である。スキャナに新しいパターンを教えることは永続的である。
ワークフロー:
- 新しい発見がプライベートリポジトリに上陸する(例: 新しく発見されたフラグプレフィックス)。
- 問う: 「これが漏れた場合、スキャナに何を捕捉させたいか?」
tools/check-redaction.shにパターンエントリ(ラベル + 正規表現)を追加する。- 新しいパターンが正当なコンテンツによって既にトリップされないことを確認するため、パブリックミラー全体に対してスキャナを実行する。
- その後にのみ、その領域に触れる公開コンテンツをドラフトする。
これは通常の順序を反転させる: スキャナが最初に更新され、ドラフトが2番目。スキャナは「公開するには機微すぎるもの」の実行可能な仕様になり、ドラフトは誤ってそれを追い越せなくなる。
Expected: tools/check-redaction.sh 内のパターンエントリが、それらに一致し得るパブリックミラーコンテンツより先行している。git log tools/check-redaction.sh は関連ドラフトコミットより先にスキャナ更新が上陸していることを示す。
On failure: スキャナ更新がドラフトに遅れる場合、新しいパターンに対してパブリックミラーを直ちに監査する。リダクトした後、発見されたパターンを説明するノートと共にスキャナ更新をコミットする。
Step 5: プライベート/パブリックファイルセット分割を確立する
パブリックミラーに同期されるファイルの明示的な許可リストを定義する。新規ファイルはデフォルトでプライベート。昇格にはリダクトチェック合格が必要。
# 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: パブリックミラーに出現するが許可リストに欠けているファイルがある場合、リーク事象として扱う — どう到達したかを調査し、削除するかリダクトレビュー後に正式に昇格させる。
Step 6: orphan-commitで公開する
パブリックミラーは、各公開時に再作成される単一の 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ブランチから単一コミットのプルリクエストを開く。プライベート履歴をプッシュすることで拒否を解決してはならない。
Step 7: CIゲートを配線する
パブリック同期ブランチへの各コミットで 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つの設計上の選択:
- スキャナはCI時にプライベートリポジトリから取得されるため、deny-list自体がパブリックリポジトリに存在することはない(パターン自体が機微である — 公開すると読み手に何を探すべきかを正確に伝えてしまう)。
- ジョブはスキャナの終了コードで終わる。ゼロ以外はワークフローをブロックする。
Expected: deny-listされたパターンを持ち込むプッシュはCIで失敗する。公開は上陸しない。メンテナは失敗ラベル(例: LEAK: vendor-prefixed flag)を正規表現自体を見ずに見る。
On failure: プライベートリポジトリのトークンをパブリックCIに付与できない場合、最小漏洩部分のスキャナのみ(ベンダーを特定しない幅広い形状パターン)をパブリックリポジトリに埋め込み、完全なスキャナをプライベートリポジトリからpush前に実行する。
Step 8: 偽陽性を正直に扱う
スキャナが正当なコンテンツでトリップする場合、無視行を追加するよりパターンを狭めることを優先する。ローカルな抑制を持つ幅広いdeny-listは急速に腐敗する — 6か月後には特定の行がなぜ抑制されたかを誰も覚えておらず、次のリークが気づかれずすり抜ける。
決定ツリー:
- 一致が実際に安全か? Step 1を使って再分類する。コンテンツが変装したライブ内部であると判明した場合、リダクトする。スキャナを抑制してはならない。
- パターンが広すぎるか? 安全なコンテンツがもはや一致しないよう正規表現を絞る。絞り込みを動機付けたケースにリンクするコメントで
check-redaction.shに記録する。 - 1と2の両方が失敗した場合のみ — そしてパターンが正当なコンテンツと構造的に絡まりすぎて、それ以上絞れない場合 — 抑制が安全である理由を述べた
# 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の形が悪い。リダクトポリシーレビューを予定し、分類済み事実インベントリからパターンを再構築する。
Step 9: 定期的なリダクトスイープ
すべてのリダクト作業がインシデント駆動であるわけではない。プライベートリポジトリへの最近の追加を再分類し、パブリックミラーに対してスキャナを再実行する定期スイープ(月次が典型的)を行う。ドリフトはインシデント級になる前に自ら捕捉する。
スイープチェックリスト:
- バージョン遅延ポリシーを再読する。経験的な「現行」バージョンが不変であることを確認するか、ポリシーを更新する
- 過去1か月のプライベートリポジトリコミットを監査し、分類されなかった新規発見を探す(Step 1)
- パブリックミラーに対して
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がプライベートリポジトリに存在し、明示的なバージョン遅延クールオフを持つ - すべてのPhase 1-4発見にカテゴリラベルがある(methodology / generic pattern / version-specific / live internal)
- パブリックCIが各プッシュでスキャナを実行する。意図的なテストパターンがビルドを失敗させる
- deny-listスキャナ自体がパブリックリポジトリに存在しない
- 最新の月次スイープログが過去35日以内の日付である
よくある落とし穴
- 「具体化するために一例だけ」。「方法論を地に足を付けるため」に具体的な発見を1つ含めたい誘惑は、最も一般的な漏洩経路である。合成プレースホルダ(例:
acme_widget_v3、widget_handler_42)を使う — 明らかに発明されたもの、決して実際の製品に追跡可能でないもの。 - パブリックリポジトリ上でインプレースに漏洩をスクラブするために
git rebaseまたはgit filter-branchを使う。書き直された履歴を強制プッシュしても、クローンとフォークに痕跡が残る。orphan-commit公開パターンは構造的な修正である。場当たり的な履歴書き換えはそうではない。 - パターン絞り込みの代わりに抑制。20個の抑制を持つスキャナは、有意味なカバレッジを0持つスキャナである。すべての抑制は、コンテキストが薄れるのを待つ将来の漏洩である。
- 失敗ではなく警告するパブリックCI。警告は無視される。CIゲートは公開をブロックしなければならない(ゼロ以外の終了、マージボタンなし)。
- 許可リストドリフト。プライベートリポジトリに追加された新規ファイルが自動的に許可リストに属するわけではない。デフォルト拒否が唯一安全な姿勢である。
- 暗号化をリダクトと勘違いする。機微な識別子をエンコード、ハッシュ、またはrot13して結果を公開することは、依然としてそれを公開している — 元の値は復元可能である。リダクトとは「まったく出現しない」を意味する。
- deny-listを公開する。パターン自体が発見カタログである: 正規表現を見る読み手は、バイナリで何をgrepすべきかを正確に知る。スキャナをプライベートに保ち、そのラベル(例:
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公開パターンはブランチ操作である。安全な実行にはそこに文書化されたブランチ衛生の実践が必要
GitHub 저장소
연관 스킬
llamaguard
기타LlamaGuard는 폭력 및 혐오 발언 등 6가지 안전 범주에서 LLM 입력과 출력을 조정하기 위한 Meta의 70-80억 파라미터 모델입니다. 94-95% 정확도를 제공하며 vLLM, Hugging Face 또는 Amazon SageMaker를 사용해 배포할 수 있습니다. 이 기술을 사용하여 AI 애플리케이션에 콘텐츠 필터링 및 안전 가드레일을 손쉽게 통합하세요.
cost-optimization
기타이 Claude Skill은 리소스 적정화, 태깅 전략, 지출 분석을 통해 개발자들이 클라우드 비용을 최적화할 수 있도록 지원합니다. AWS, Azure, GCP에서 클라우드 비용을 절감하고 비용 거버넌스를 구현하기 위한 프레임워크를 제공합니다. 인프라 비용을 분석하거나, 리소스를 적정화하거나, 예산 제약을 충족해야 할 때 사용하세요.
quantizing-models-bitsandbytes
기타이 스킬은 bitsandbytes를 사용하여 LLM을 8비트 또는 4비트 정밀도로 양자화하며, 최소한의 정확도 손실로 50-75%의 메모리 감소를 달성합니다. 제한된 GPU 메모리에서 더 큰 모델을 실행하거나 추론을 가속화하는 데 이상적이며, INT8, NF4, FP4와 같은 형식을 지원합니다. 이 스킬은 HuggingFace Transformers와 통합되어 QLoRA 학습 및 8비트 옵티마이저를 가능하게 합니다.
dispatching-parallel-agents
기타이 Claude Skill은 3개 이상의 독립적인 문제를 동시에 조사하고 해결하기 위해 다중 에이전트를 배치합니다. 공유 상태나 의존성 없이 해결 가능한 무관련 장애 시나리오에 맞게 설계되었습니다. 핵심 기능은 병렬 문제 해결로, 각 독립 문제 영역마다 하나의 에이전트를 할당하여 효율성을 극대화합니다.
