Skip to content

Repository files navigation

junkyard

Junkyard

個人の開発や創作の過程で得た知見のうち、特定のプロジェクトに依存せず、公開してよいものだけを蒸留して置く repository である。 各プロジェクトの成果物を集める場所ではない。

Preserve the lesson, not the source.

目次

ノート

ノート タグ
複数の AI の指摘を多数決で集約しない ai writing review evaluation
「初めて読むつもりで」では初読レビューにならない ai writing review evaluation
AI による文章レビューは「検出、判定、意思決定」の三段階に分ける ai writing review

置くもの

  • 設計、調査、計測、問題分析、レビューから得た、他のプロジェクトでも使える知見
  • AI agent と協働する作業の進め方のうち、再利用できるもの
  • 文章や創作の進め方のうち、再利用できるもの
  • 別の場面でもそのまま使えるチェックリストや手順

置かないもの

  • 特定のプロジェクトの記録(計画書、作業ログ、計測結果そのもの)
  • 勤務先、顧客、取引先の業務に由来する情報(匿名化や一般化をしても置かない)
  • 他人から預かった情報や、非公開のやり取りに由来する情報
  • 認証情報、識別子、個人情報、private なリソースへの参照
  • 元になった repository、パス、commit、文書といった provenance

詳しい基準は PUBLICATION_POLICY.md にある。 agent 向けの指示、skill、チェックリストは、すべてこのポリシーを正本として参照している。

原則

  • Standalone:元の repository や作業の文脈を知らない読者が、その文書だけで理解できる。
  • Generalized:特定のプロジェクトの記録ではなく、他のプロジェクトでも使える知見になっている。
  • Public-safe:第三者が無条件で閲覧しても問題がないことを、積極的に確認できている。

判断に迷うものは公開しない。

When provenance or confidentiality is uncertain, do not extract.

provenance を残さない理由

ノートには、元にした repository、ファイル、commit、組織を書かない。 読者に必要なのは知見が単独で使えるかどうかであり、出どころはその判断の役に立たない。 一方で出どころの記録は、非公開の repository や組織の存在、ローカルの環境を示す手がかりになる。 同じ理由で、公開の可否を repository 名やパスの denylist で判断することもしない(そのルール自体が手がかりを公開してしまう)。

品質の基準

  • 元の文脈がなくても読める
  • 何が分かったかが書いてある
  • 観測の範囲と、どの条件で成り立つかが分かる
  • 別の場面でどう使うかが分かる

雛形は templates/note.md にある。 本文の見出しは例であり、内容に合わせて統合、追加、削除してよい。

構成

.
├── README.md
├── PUBLICATION_POLICY.md       公開の基準(唯一の正本)
├── AGENTS.md                   agent 向けの指示(Codex などが読む)
├── CLAUDE.md                   AGENTS.md の import と Claude Code 固有の補足
├── notes/                      ノート。平らに置き、tags で分類する
├── assets/                     README などで使う画像
├── templates/note.md           ノートの雛形
├── checklists/
│   └── publication-safety.md   公開前レビューの確認項目
├── .agents/skills/             skill の正本
│   ├── junkyard-harvest/       他の repository から知見を抽出する
│   └── junkyard-review/        公開前の敵対的な判定
├── .claude/skills/             .agents/skills への symlink(Claude Code 用)
├── scripts/
│   ├── build_readme.py         README のノート一覧を生成する
│   ├── check.py                静的 safety check
│   └── test_*.py
└── .githooks/
    ├── pre-commit              README の一覧と、commit するファイルを検査する
    ├── pre-merge-commit        conflict のない merge で pre-commit と同じ検査をする
    └── commit-msg              commit message とブランチ名を検査する

ノートは Obsidian の vault のようにディレクトリを分けずに置き、frontmatter の tags で知識の種類ごとに分類する(ai、engineering、writing など)。 一つのノートに複数のタグを付けてよい。 元の repository ごとには分類しない。

使い方

他の repository から知見を集める

agent は junkyard のルートで起動し、source の repository を読めるようにする。 逆に source の repository で起動すると、別のコンテキストで判定させるサブエージェントまで source の中で動き、source のファイルに触れうる。

Claude Code では --add-dir で source を追加する。

claude --add-dir /path/to/source

Codex も junkyard のルートで起動し、source のパスを依頼の中で指定する。 サンドボックスの設定で source を読めない場合は、source の読み取りだけを許可する。

起動したら、source のパスを明示して頼む。

/path/to/source の Markdown を調べて、junkyard に残せそうな知見を抽出して

skill は junkyard の .agents/skills/(Codex)と .claude/skills/(Claude Code)から読み込まれる。 junkyard の場所は、環境変数 JUNKYARD_DIR か、SKILL.md があるディレクトリ(symlink を解決したもの)の 3 階層上として特定する。

junkyard-harvest は次の順に進む。

  1. 対象が本人の個人作業であり、公開用の抽出に使えることをユーザーに確かめる(肯定がなければ中止する)
  2. 文書ごとに分類し、業務や第三者に由来する文書は読み進めない
  3. 残った文書から lesson を選び、drafts/ に新しい文書として書く
  4. 非公開の個人資料から抽出した場合は、別のコンテキストの junkyard-review に source を渡さずに判定させる
  5. 結果を報告する

source repository には何も書き込まない。 PASS または SELF-CHECKED のドラフトを notes/ へ移すのはユーザーの承認後である。 commit はユーザーの明示的な指示がある場合だけ行う。 push はユーザーが行う。

ノートを追加する

ノートを notes/ に追加、変更、削除したら、README の「ノート」の一覧を生成し直す。

python3 scripts/build_readme.py

一覧はスクリプトが書き換えるので、手で編集しない。 各ノートの最初の H1 と tags を、ノートを最後に変更した commit の日時が新しい順に、同じ日時ならファイル名の順に並べる。 まだ commit していないノートは、次の commit に入るものとして先頭に置く。 pre-commit フックは、インデックス上のノートと一覧が合っているかを確かめるので、ノートと README.md は一緒に add する。

公開前にレビューする

非公開の個人資料から抽出した drafts/ の文書は、書いたのとは別のセッションで junkyard-review を実行して判定する。 junkyard-harvest は判定をサブエージェントに任せるが、そのサブエージェントは --add-dir で追加した source の場所を環境の情報として知りうる。 より確実にするには、source を追加せずに junkyard のルートで起動した新しいセッションで判定する。 公開情報だけを根拠にした文書や、非公開資料から抽出せず直接書いた文書は、独立した reviewer を必須としない。 確認項目は checklists/publication-safety.md にある。

静的チェック

python3 scripts/check.py
python3 scripts/check.py drafts/some-note.md

引数を省くと、作業ツリーの tracked と未追跡(ignore 以外)のファイルを検査する。 主に次のものを検出する。

  • ローカルのパス、IP アドレス、MAC アドレス、メールアドレス、電話番号
  • 既知の形式の秘密情報と、認証情報らしい値の代入(token、URL に埋め込まれた認証情報、署名付き URL を含む)
  • Git ホスティングの URL、PR や issue の番号、commit hash、UUID、クラウドの識別子とデプロイ先、組織内のホスト名
  • repository の外や、存在しないファイル(ignore されたファイルを含む)への相対リンク
  • ノートの中の、元の文脈を示す言い回し、HTML コメント、title と tags 以外の frontmatter
  • ファイル名と symlink の参照先に含まれる上のもの、repository の外を指す symlink、submodule、公開しないパス(drafts/、鍵、認証情報のファイルなど)
  • バイナリ。例外は assets/ の下の PNG で、画素と色の情報以外のチャンク(テキスト、Exif、ICC プロファイル、C2PA など)を含まないものだけを置ける。ノートに画像を貼らないのは、スクリーンショットに写り込んだものを機械的に検査できないからである
  • commit message、ブランチ名、author と committer の名前とメールアドレスに含まれる上のもの(--commit-msg)

検出 0 件は安全の証明ではなく、意味的なレビューを補う safety net である。

誤検出で、確認のうえ公開して問題ないものは、同じ行か、抑制コメントだけを書いた直前の行に <!-- junkyard-allow: <rule-id> --> を書いて抑制できる。 抑制はユーザーが確認して書くものであり、agent には書かせない。 そのため drafts/ と repository 外のファイルでは抑制コメントが効かず、それ自体を検出する。 既知の形式の秘密情報、denylist、frontmatter、symlink、バイナリ、公開しないパス、名前に含まれるものは抑制できない。

固有語を止めるためのローカル denylist は、repository の外に置く。 既定の場所は ${XDG_CONFIG_HOME:-~/.config}/junkyard/denylist.txt で、環境変数 JUNKYARD_DENYLIST で変えられる。 一行に一語を書き、大文字と小文字を区別せずに照合する。 re: で始まる行は正規表現として、# で始まる行はコメントとして扱う。 repository の中に置いた denylist は、commit されると固有語をそのまま公開してしまうので、チェッカーは読まずにエラー終了する。 denylist と同じ内容のファイルが repository の中にあれば、それも検出する。

フック

commit の前に、インデックス上の内容(pre-commit)と、commit message とブランチ名(commit-msg)を検査する。 clone した後に一度だけ有効にする。

git config core.hooksPath .githooks

フックに止められたら、--no-verify で回避せず、原因を取り除く。

conflict のない merge では、pre-commit の代わりに pre-merge-commit が同じ検査をする。 rebase と cherry-pick は、これらのフックを呼ばずに commit を作ることがある。 使った後は python3 scripts/check.py と python3 scripts/build_readme.py を実行し、検出がなく、README に差分が出ないことを確かめる。

CI では検査しない。 CI が走るのは push の後、つまり公開した後なので、公開前の gate にならないからである。

最初に push する前に

commit の author と committer のメールアドレスも公開される。 commit-msg フックは、noreply などの一部と、公開してよいと登録したアドレスを除くメールアドレスでの commit を止める。 勤務先のアドレスのような、公開したくないアドレスでうっかり commit しないためである。

GitHub の noreply アドレスを使うか、既に公開しているアドレスを repository ローカルの設定に登録する(この設定は commit されない)。

git config user.email "<id>+<username>@users.noreply.github.com"
git config --add junkyard.publicEmail "<公開してよいアドレス>"

既に公開したくないアドレスで作った commit がある場合は、push する前に author を書き換える。

テスト

python3 -m unittest discover -s scripts

License

ノートと文書は CC BY 4.0、scripts/ と .githooks/ のコードは MIT で提供する。

About

It still sparks joy

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages