MCP HubMCP Hub
스킬 목록으로 돌아가기

redact-for-public-disclosure

pjt222
업데이트됨 2 days ago
7 조회
17
2
17
GitHub에서 보기
기타general

정보

이 스킬은 방법론과 교육적 가치를 보존하면서 공개 공개를 위한 리버스 엔지니어링 결과물을 안전하게 편집하는 워크플로우를 제공합니다. 거부 목록 필터링, git 로그 유출 방지를 위한 고아 커밋, 미편집 콘텐츠 차단을 위한 CI 검사와 같은 핵심 패턴을 구현합니다. 타사 도구에 대한 연구를 게시하거나, 업스트림 패치를 준비하거나, 비공개 조사 저장소를 공개 참조 자료로 아카이빙할 때 사용하세요.

빠른 설치

Claude Code

추천
기본
npx skills add pjt222/agent-almanac -a claude-code
플러그인 명령대체
/plugin add https://github.com/pjt222/agent-almanac
Git 클론대체
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/redact-for-public-disclosure

Claude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요

문서

Redactar para Divulgación Pública

Divida un repo de investigación de ingeniería inversa en una fuente de verdad privada y un subconjunto de divulgación pública usando un verificador de redacción, deny-lists de patrones y un patrón de publicación mediante commit huérfano. La metodología viaja; los hallazgos específicos se quedan en privado.

Cuándo usar

  • Publicar hallazgos de metodología sobre un arnés CLI de código cerrado con el que se integra
  • Preparar una propuesta upstream o informe de bug para un proyecto que no posee
  • Archivar un repo privado de investigación como referencia pública
  • Promover notas de investigación (artefactos de Fase 1-4) a una guía pública
  • Establecer un pipeline de publicación antes de que los hallazgos se acumulen de modo que el riesgo de fuga no se atasque
  • Limpiar tras un casi-accidente en el que un borrador casi envió un identificador sensible

Entradas

  • Requerido: Un repo privado de investigación con contenido de sensibilidad mixta (la fuente de verdad)
  • Requerido: Un mirror público de destino (repo separado, o un worktree public/) donde se publicará el contenido redactado
  • Opcional: Un borrador existente agendado para publicación
  • Opcional: Una política de retraso de versión (por defecto "actual + 1 anterior se mantienen privadas")
  • Opcional: Una lista de identificadores del proveedor, prefijos de flag o namespaces ya conocidos como sensibles

Procedimiento

Paso 1: Categorice cada hecho candidato

Antes de escribir o promover cualquier contenido, clasifique cada hecho en una de cuatro categorías. La categoría determina si y cuándo puede enviarse.

CategoríaDefinición¿Compartible?
metodologíaEl cómo de la investigación, independiente de cualquier hallazgo específicoSiempre
patrón genéricoObservaciones a nivel de clase (p. ej., "los arneses suelen usar un namespace de flag con un solo prefijo")
hallazgo específico de versiónObservación concreta ligada a un lanzamiento específico (p. ej., "en vN.M, el gate está off por defecto")Solo tras el enfriamiento del retraso de versión
interno en vivoNombres minificados, offsets de bytes, nombres de flags dark, lógica de gate de la versión actual, constantes de PRNG/sal, nombres en clave internosNunca

Anote cada sección de borrador, log de captura o nota con su categoría antes de revisar para publicación. Una sección que mezcla categorías se divide — la metodología se extrae limpia, el resto se queda en privado.

Expected: Cada hecho candidato tiene una etiqueta de categoría. Los borradores destinados al mirror público contienen solo entradas de metodología y patrón-genérico (más hallazgos específicos de versión más antiguos que el enfriamiento).

On failure: Si un hecho resiste la categorización, trátelo como interno en vivo por defecto. Recategorice solo tras revisión explícita contra la política de retraso de versión.

Paso 2: Fije la política de enfriamiento por retraso de versión

Decida por adelantado cuántas versiones median entre "actual" y "compartible". Dos es típico: la actual + 1 anterior permanecen privadas, los patrones más antiguos pueden discutirse. Escriba la política en el repo privado (p. ej., REDACTION_POLICY.md) para que su yo-futuro no tenga que rederivarla.

# 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.

La versión "actual" debe ser empírica (leída del binario instalado), no administrativa. Ligue la política a la salida del escáner de línea base en lugar de a un calendario.

Expected: Un REDACTION_POLICY.md commiteado en el repo privado con un enfriamiento explícito y un responsable.

On failure: Si los stakeholders no se ponen de acuerdo en el enfriamiento, adopte la propuesta más conservadora. Los enfriamientos se pueden acortar después; recuperar una fuga no se puede.

Paso 3: Construya el escáner de deny-list

Mantenga los patrones en un único script ejecutable que es la fuente de verdad para la política de redacción. El script vive en el repo privado (tools/check-redaction.sh) y se ejecuta contra el mirror público.

#!/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

Cada entrada tiene una etiqueta legible por humanos y una regex. Una entrada por forma de identificador sensible (no por cadena literal — las formas sobreviven al churn de versiones). El código de salida es igual al número de fugas; una ejecución limpia sale con 0.

Expected: tools/check-redaction.sh ./public-mirror se ejecuta en menos de un segundo sobre un repo pequeño y sale con 0 cuando no hay coincidencias.

On failure: Si rg no está disponible, recurra a grep -rqE. Si los patrones son demasiado amplios (cada ejecución reporta fugas), estréchelos en la fuente en lugar de añadir supresiones.

Paso 4: Mantenga la deny-list antes de redactar

Cuando un hallazgo de Fase 1-4 pudiera filtrarse a través de un borrador, extienda el escáner antes de escribir el borrador. Los borradores son baratos; enseñarle al escáner patrones nuevos es duradero.

Flujo de trabajo:

  1. Un hallazgo nuevo aterriza en el repo privado (p. ej., un prefijo de flag recién descubierto).
  2. Pregunte: "Si esto se filtrara, ¿qué querría que el escáner detectara?"
  3. Añada una entrada de patrón a tools/check-redaction.sh (etiqueta + regex).
  4. Ejecute el escáner contra el mirror público completo para confirmar que el patrón nuevo no queda ya activado por contenido legítimo.
  5. Solo entonces, redacte cualquier contenido público que toque el área.

Esto invierte el orden habitual: el escáner se actualiza primero, el borrador después. El escáner se convierte en la especificación ejecutable de "qué es demasiado sensible para publicar", y el borrador no puede adelantarse accidentalmente.

Expected: Las entradas de patrón en tools/check-redaction.sh preceden a cualquier contenido del mirror público que pudiera coincidir con ellas. git log tools/check-redaction.sh muestra actualizaciones del escáner aterrizando antes que los commits de borrador relacionados.

On failure: Si las actualizaciones del escáner van por detrás de los borradores, audite el mirror público contra el nuevo patrón inmediatamente. Redacte, luego commitee la actualización del escáner con una nota explicando el patrón descubierto.

Paso 5: Establezca la división de archivos privados/públicos

Defina una allow-list explícita de archivos que se sincronizan al mirror público. Los archivos nuevos son privados por defecto; la promoción requiere clearance del chequeo de redacción.

# tools/public-allowlist.txt
README.md
LICENSE
guides/methodology-overview.md
guides/category-classification.md
docs/contributing.md

Un tools/sync-to-public.sh lee la allow-list, copia solo esos archivos al mirror público y sale distinto de cero si la allow-list referencia un archivo que no existe (captura typos).

#!/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"

La promoción requiere tres cosas en orden: el archivo se añade a la allow-list, el archivo pasa el chequeo de redacción, y un revisor confirma las etiquetas de categoría del Paso 1.

Expected: El mirror público contiene exactamente los archivos listados en tools/public-allowlist.txt. Ningún archivo aparece en el mirror público que no esté en la allow-list.

On failure: Si un archivo aparece en el mirror público pero falta de la allow-list, trátelo como un evento de fuga — investigue cómo llegó, luego elimínelo o promuévalo formalmente tras revisión de redacción.

Paso 6: Publique mediante commit huérfano

El mirror público es un único commit enraizado con git commit --orphan que se recrea en cada publicación. Esto evita que git log sobre el repo público exponga borradores pre-redacción.

# 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

El git log del repo público muestra exactamente un commit. Los borradores previos y cualquier iteración de redacción permanecen en el historial del repo privado. Ningún git log -p, git reflog o listado de ramas en el repo público puede recuperar contenido pre-redacción porque nunca se commiteó allí.

Expected: git log --oneline en el mirror público muestra un único commit por publicación. No aparecen referencias al historial del repo privado (sin SHAs padre, sin commits de merge, sin tags del repo privado).

On failure: Si git push --force es rechazado (protección de rama), abra un pull request de un solo commit desde una rama huérfana limpia en su lugar. Nunca resuelva un rechazo empujando el historial privado.

Paso 7: Cablee la compuerta de CI

Ejecute tools/check-redaction.sh en cada commit a la rama de sincronización pública. Un chequeo fallido bloquea la publicación, no solo advierte.

# .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 .

Dos decisiones de diseño aquí:

  • El escáner se trae del repo privado en tiempo de CI para que la propia deny-list nunca viva en el repo público (los patrones son en sí mismos sensibles — publicarlos diría al lector exactamente qué buscar).
  • El job sale con el código de salida del escáner; distinto de cero bloquea el workflow.

Expected: Los pushes que introducen un patrón en deny-list fallan el CI; la publicación no aterriza. Los mantenedores ven la etiqueta de fallo (p. ej., LEAK: vendor-prefixed flag) sin ver la regex misma.

On failure: Si el token del repo privado no se puede otorgar al CI público, embeba solo una porción de mínima fuga del escáner en el repo público (patrones de forma amplios que no identifican al proveedor por sí mismos) y ejecute el escáner completo pre-push desde el repo privado.

Paso 8: Maneje los falsos positivos con honestidad

Cuando el escáner se active sobre contenido legítimo, prefiera estrechar el patrón antes que añadir una línea ignorar. Las deny-lists amplias con supresiones locales se pudren rápido — seis meses después nadie recuerda por qué una línea concreta se suprimió, y la siguiente fuga pasa desapercibida.

Árbol de decisión:

  1. ¿La coincidencia es realmente segura? Recategorice usando el Paso 1. Si el contenido resulta ser un interno en vivo disfrazado, redáctelo; no suprima el escáner.
  2. ¿El patrón es demasiado amplio? Ajuste la regex para que el contenido seguro ya no coincida. Documente el ajuste con un comentario en check-redaction.sh enlazando al caso que lo motivó.
  3. Solo si 1 y 2 fallan ambas — y el patrón está estructuralmente demasiado entrelazado con contenido legítimo para estrecharlo más — use una supresión de una sola línea con un comentario # REASON: que declare por qué la supresión es segura. Feche el comentario.
# 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: Cada patrón del escáner tiene cero o un comentario en línea que explica un ajuste. Las supresiones, si existen, llevan fecha y razón.

On failure: Si las supresiones se acumulan (más de una por trimestre), la deny-list está mal dimensionada. Agende una revisión de política de redacción y reconstruya los patrones a partir del inventario de hechos categorizados.

Paso 9: Barridos periódicos de redacción

No todo el trabajo de redacción es impulsado por incidentes. Ejecute un barrido periódico (mensual es lo típico) que recategorice las adiciones más recientes al repo privado y reejecute el escáner contra el mirror público. La deriva se detecta a sí misma antes de volverse de nivel de incidente.

Lista de comprobación del barrido:

  • Relea la política de retraso de versión; confirme que la versión "actual" empírica no ha cambiado o actualice la política
  • Audite el último mes de commits del repo privado en busca de hallazgos recién añadidos que no fueron categorizados (Paso 1)
  • Ejecute tools/check-redaction.sh contra el mirror público (debería seguir saliendo con 0)
  • Revise cualquier patrón del escáner añadido desde el último barrido — ¿alguno demasiado amplio? Ajústelo si es así
  • Si alguna versión ha envejecido más allá del enfriamiento, identifique hallazgos ahora elegibles para promoción
  • Confirme que tools/public-allowlist.txt coincide con el conjunto de archivos real del mirror público

Expected: Un log breve de barrido por mes en el repo privado (p. ej., sweeps/2026-04.md) con los resultados de la lista de comprobación y cualquier acción tomada.

On failure: Si el barrido se omite repetidamente, automatice un recordatorio de calendario. Si el barrido sigue encontrando la misma deriva, el workflow aguas arriba es el problema — investigue por qué se está omitiendo la categorización en el momento del borrador.

Validación

  • Cada archivo en el mirror público está en tools/public-allowlist.txt
  • tools/check-redaction.sh ./public-mirror sale con 0
  • git log --oneline en el mirror público muestra un único commit huérfano por publicación
  • REDACTION_POLICY.md existe en el repo privado con un enfriamiento explícito de retraso de versión
  • Cada hallazgo de Fase 1-4 tiene una etiqueta de categoría (metodología / patrón genérico / específico de versión / interno en vivo)
  • El CI público ejecuta el escáner en cada push; un patrón de prueba deliberado hace fallar la build
  • El propio escáner de deny-list no vive en el repo público
  • El log del último barrido mensual está fechado dentro de los últimos 35 días

Errores comunes

  • "Solo un ejemplo para hacerlo concreto." La tentación de incluir un hallazgo específico "para aterrizar la metodología" es el camino de fuga más común. Use placeholders sintéticos (p. ej., acme_widget_v3, widget_handler_42) — claramente inventados, nunca rastreables a un producto real.
  • Usar git rebase o git filter-branch para borrar una fuga en sitio en el repo público. El force-push de historia reescrita aún deja rastros en clones y forks. El patrón de publicación con commit huérfano es una solución estructural; la reescritura ad-hoc de historia no.
  • Supresiones en lugar de ajuste de patrones. Un escáner con veinte supresiones es un escáner con cero cobertura significativa. Cada supresión es una fuga futura esperando a que el contexto se desvanezca.
  • CI público que advierte en lugar de fallar. Las advertencias se ignoran. La compuerta de CI debe bloquear la publicación (salida distinta de cero, sin botón de merge).
  • Deriva de la allow-list. Los archivos nuevos añadidos al repo privado no pertenecen automáticamente a la allow-list. Default-deny es la única postura segura.
  • Confundir cifrado con redacción. Codificar, hashear o aplicar rot13 a un identificador sensible y publicar el resultado aún lo publica — el original es recuperable. Redactar significa "no aparece en absoluto".
  • Publicar la deny-list. Los patrones mismos son un catálogo de hallazgos: un lector que vea la regex sabe exactamente qué buscar con grep en el binario. Mantenga el escáner privado; solo sus etiquetas (p. ej., LEAK: vendor-prefixed flag) deberían aparecer en los logs de CI público.
  • Tratar el repo privado como un montón de borradores. Es la fuente de verdad para la investigación, no un espacio de pruebas. Aplique el mismo versionado, revisión y disciplina de backup que aplicaría a cualquier artefacto de producción.

Skills relacionadas

  • monitor-binary-version-baselines — Fase 1, las líneas base alimentan la política de retraso de versión: qué cuenta como "actual" es un hecho empírico, no un hecho de calendario
  • probe-feature-flag-state — Fases 2-3, los hallazgos de clasificación de aquí entran al pipeline de redacción en el paso de categoría (Paso 1)
  • conduct-empirical-wire-capture — Fase 4, los artefactos de captura (logs de tráfico, esquemas de payload) necesitan redacción antes de que cualquiera pueda referenciarse públicamente
  • security-audit-codebase — ambos pipelines se benefician del escaneo estilo deny-list; esta skill se especializa para divulgación de investigación más que para fuga de secretos
  • manage-git-branches — el patrón de publicación con commit huérfano es una operación de rama; la ejecución segura requiere las prácticas de higiene de rama documentadas allí

GitHub 저장소

pjt222/agent-almanac
경로: i18n/es/skills/redact-for-public-disclosure
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

연관 스킬

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개 이상의 독립적인 문제를 동시에 조사하고 해결하기 위해 다중 에이전트를 배치합니다. 공유 상태나 의존성 없이 해결 가능한 무관련 장애 시나리오에 맞게 설계되었습니다. 핵심 기능은 병렬 문제 해결로, 각 독립 문제 영역마다 하나의 에이전트를 할당하여 효율성을 극대화합니다.

스킬 보기