パルカワ2

最近はFlutterをやっています

日本語の文書を書く前に読み手を整理させるスキルを作った

Claude Code に仕様書や PR の本文、レビューコメント*1を書かせているが、そのままだと読みにくいことがあった。そこで、日本語の文書を書く前に読み手を整理させる writing-japanese というスキルを作ったので、作った経緯と気をつけたことを書く。

困っていたこと

Claude Code が書く日本語の文書には、次の 2 つの症状があった。

  • 読む順序への配慮がない
    • 用語を定義より先に使っていて、読み進めた先でやっと定義が出てくる
    • 各章が「ほかの章も読んだ」前提で書かれている
  • 読み手に要らない情報を書く
    • 例えば、画面ごとの表示と操作を書いた仕様書(画面仕様書)に、バーコードの読み取りの仕組みの詳細まで書いてくる。同じバーコードを続けて読んだときに無視する時間とか
    • 画面仕様書は QA エンジニアがテスト設計に使うものだが、バーコードの読み取りはアプリ全体で共通の部品なので、この画面のテスト設計には要らない。実際、QA エンジニアからはテスト不要ですよね?と確認があった

原因は、書き手が自分の知っていることを忘れられないことだと思っている。Claude Code はコードと会話の文脈を持ったまま文書を書くので、未定義の用語や共通の部品の詳細があっても、書き手からは不自然に見えない。人間でもよくある話だが、コードを読み込んだ直後に書くエージェントだと特に起きやすいと思う。

作ったもの

ステップは次の 3 つだけ。

  • 読み手整理メモを書く
  • メモを見ながら、執筆規則に従って書く
  • 書き終えたら、メモの「読み手が知らないこと」が説明なしで本文に入っていないか、「書かないこと」が本文に入っていないかを確認する

読み手整理メモは、本文を書く前に作る 6 項目のメモで、文書本体には含めない。

  • 読み手: 誰が読むか
  • 読む目的: 読み手が、この文書を読んで何をするか
  • 読み手が知っていること: 説明なしで使ってよい知識
  • 読み手が知らないこと: 使うなら説明が要る知識
  • 伝えたいこと: 読み終えた読み手に残したいこと。1〜3 文で書く
  • 書かないこと: 読み手の目的に要らない内容

さっきの画面の仕様書だと、メモはこんな感じになる。

## 読み手
QA エンジニア

## 読む目的
テスト設計で、表示条件・状態分岐・操作・例外の抜け漏れを防ぐ

## 読み手が知っていること
店舗業務、アプリの画面と操作

## 読み手が知らないこと
コードの構造、バーコード読み取りなどの基盤、内部の区分値

## 伝えたいこと
この画面がどの条件で何を表示し、どの操作で何が起きるか

## 書かないこと
共通の部品(バーコードの読み取り、処理中の表示など)の動作の詳細。画面上で観察できるものも含む

書き手に読み手の立場を言葉にさせるのが狙い。「書かないこと」に「共通の部品(バーコードの読み取り、処理中の表示など)の動作の詳細」と書いておけば、本文に基盤の詳細を書いてしまっても、最後の確認で気づける。

執筆規則は 4 つだけにした。

  1. 読み手が知らない用語は、初出で定義する。後の章で定義する用語を、先の章で使わない
  2. 各章は、その章だけを読んでも分かるように書く。ほかの章の内容が必要なら、どの章を見ればよいかを書く
  3. 「書かないこと」に当たる内容は、本文に入れない。必要なら、根拠のリンクや参照先に回す
  4. 1 つの文には 1 つの主張を書き、文と文の関係を接続の言葉で示す。「なぜなら」「ただし」「その結果」などで、前の文とどうつながるかを示す

1 と 2 は「読む順序への配慮がない」、3 は「要らない情報を書く」への対策になっている。4 は、関係が分からないまま事柄が並ぶのを防ぐためのもの。

気をつけたこと

  • 規則は、実際に見た症状に効くものだけにした
    • 文章の規則は増やそうと思えばいくらでも増やせるが、多いと個々の規則が守られにくくなると思う
    • 推測は推測と書く、みたいな規則は既に CLAUDE.local.md に書いてあるので、スキルには移していない。ターミナルでの応答にも効いてほしい規則なので、文書を書くときだけ読み込まれるスキルに置くと効く範囲が狭まってしまう
  • 文の長さの基準は置かなかった
    • 「1 文は 80 文字以内」みたいな数値の基準があると、基準を満たすために文を機械的に切ったり言葉を削ったりして、文と文のつながりが消えてかえって読みにくくなる
    • 代わりに規則 4 で、文の長さではなく文と文の関係を示すことを求めている
    • 「不要な接続詞は省くべし」というのが一般的なルールっぽいが、斜め読みするときは接続詞を元に重要なポイントを探すので、接続詞がないと自分は読みにくいと感じる
  • 文書の種類ごとの基準は、呼び出し元のスキルに任せた
    • 今回作成したスキル は仕様書、ADR、PR 本文、レビューコメントのどれにも使う汎用のスキルなので、文書の種類に特有の基準は書かない
    • 例えば画面の仕様書の「共通の部品の動作は、画面上で観察できても書かない」という基準は、画面の仕様書を書くスキルが持って、writing-japanese に渡す
  • 読み手整理をする時に、作業の経緯は読み手の判断を変えるものだけを書くことにした
    • エージェントは「最初に A を試したが失敗したので B にした」みたいな経緯をよく書く。なので最初は経緯を一律に書かないことにするつもりだった
    • ただ、PR テンプレートには「判断と理由」の欄があって、却下した案とその理由を書いてもらっている。経緯を一律に禁じると、ここと食い違ってしまう
    • そこで、却下した案とその理由、誰と合意したかは書く。これで読み手が同じ検討を繰り返さずに済む
    • 一方、試した回数や順序、かかった時間、作業中の失敗とその直し方は書かない。これらは読み手の判断を変えない。

効果を確かめた

効果は、Anthropic の skill-creator というスキルの評価の仕組みで確かめた。同じ指示をスキルありとスキルなしで実行して、別のエージェント(判定役)が判定項目ごとに合否を付けてくれる。

事例は、画面の仕様書、ADR、PR 本文、レビューコメント 2 件の計 5 つ。レビューコメントの 2 件は、リポジトリで実際にあったやり取りを材料にした。判定も LLM がやるので結果がぶれると思い、各事例を 3 回ずつ実行した。

判定項目 スキルあり スキルなし
全体の合格率 98.1% 89.3%
仕様書: 各章を単独で読める 3/3 0/3
PR 本文: 試した回数や作業中の失敗を書かない 3/3 1/3
レビューコメント: 理由と結果の関係を接続の言葉で示す 3/3 0/3
ADR: 各章を単独で読める 1/3 1/3

ADR の「各章を単独で読める」はスキルありでも 3 回中 1 回しか合格しなかったが、ADR は章を単独で読むことが少ないので対応していない。

やめたこと

  • textlint を使うこと
    • Claude Codeがtextlintを通すことを目的に書き換えてしまい、逆に読みにくいと感じることが多々あったので採用をやめた
    • 使い方が悪い説はある。厳しすぎたとか
  • 文体を気にすること
    • 自分は仕事で読む文書においては、目的さえ達成出来ればAIっぽくても良いと思っているのでなんでもよい

エージェントの文書が読みにくいのは、書き手となるClaude Codeが自分の文脈を忘れられないからだと思っていて、規則を増やすより書く前に読み手を言語化したほうが効くと考えて作った。とはいえ、結局は人間の編集は必要で、完全に任せるというのは出来ないなという印象。この文書においても writing-japanese を利用して書き、人間が編集した。

*1: /code-review を利用している

面白く働く

人生において、働く時間というのはかなりの時間を占めていて、どうせ時間使うなら面白く働いた方がお得だと思う。 特に自分の場合、気ままに生きてたら趣味が仕事になり偶然にも面白いと感じることをやってお金をもらえているボーナスタイムという感じなので面白くないならあんまやる意味ないと思ってる。 仕事なので、やりたくないことや面白くないことは一切やらないわけではないが、なるべくやらないでいいように頑張る。(それもまた面白だね)

面白く感じることはその時々で変わっていく。Perlを書くことが一番面白い時もあったし、チームのことを考えることが一番面白い時もあった。その時々で一番に面白いと感じるテーマに沿って活動してるときに面白く働いていると思う。

このテーマは目標とは違っていて、具体的になにかを成し遂げたいみたいなものがない。テーマから具体的な目標が生まれることはあるが、何かを成し遂げられなかったとしてもそのテーマと向き合っていたこと自体に価値がある。(少なくとも自分の人生においては)

テーマの設定は、直近で具体的に何が面白いと思ったかを複数あげて、それぞれ面白さを感じる部分はどこか探して共通項を探していく。

他にも人にこういうことをやってるんですよね〜自分はこう感じてて〜と話すことで言語化されてテーマとして持てる時がある。 1 on 1で最近何をやっているのか話すのは、進捗確認のためではなく、何を面白いと思ってるかとか逆に何を面白いと思えないかを話してテーマを言語化していくためだと自分は思っている。

個人が持つテーマが会社が求めることと合うのが一番いいと思うが、合わないこともある。そうなるとテーマに沿った活動が出来るように会社を説得する、自分のテーマを変える、テーマに沿った活動が出来る会社にいくがあり、自分は最近エンジニアリングマネージャーをやめたタイミングでテーマを変えたりした。

テーマを変えることは悪いことではなく、むしろ気軽に変えていいと思う。このテーマしかやりません!と決めてしまうともっと面白いことに気づきにくくなるので、気軽に変えて違うかったら戻せば良い。

面白く働いていきたいですね

Pebble Time 2を買った

repebble.com

配送するためにはメールに反応する必要があってそれに気づいてなくて遅くなった。結構良い。バンドはかぶれたので変えたけど最高!とまでは思ってないので良い感じのものを探したい。

睡眠を記録出来るようになった。前はiPhoneだけで取れてたのに取れなくなって悲しんでいた。

新しいPebbleを作っているところとRebbleが揉めたりしていて緊張感があったがOSS化して大体解決した模様。

最近の開発 2026-08

前回 最近の開発 - パルカワ2

大枠は変わらないが、ちょっと変わってきたので書く。

  • brainstorming スキルで考えていることを書き出してから進めている
    • grilling スキルと一緒に使うと質問がいい感じになるような気がしているが、気のせいかもしれない
  • 生成されるspecは https://crit.md/ を使ってレビューしている。
    • わからないことや見た感じ微妙だなと思ったところに代替案がないか聞いたりして、良さそうなら対応してもらうという感じ。やり取りは、Round 15くらいまで行くこともあるが、最近はFable 5, Opus 5のおかげか減ってきた
  • specが良さそうなら次に writing-plans スキルで plan を作成してもらい、同じように https://crit.md/ を使ってレビューしている。
    • planを頑張っても実際コードを書き始めると違ったということがあるが、最近はFable 5やOpus 5であればムムッとなることを言わなくなった感じがある
    • あとは、Claude Codeがリポジトリ内のドキュメントを参照してるというのもありそう
  • specとplanが終わったら、コンテキストが50%くらいになっていることもあるので一旦clearして進めたい。handoff スキルを使って引き継ぎ資料を作る
    • 本来handoffスキルで作成する引き継ぎ資料はtmpディレクトリに作成されるが、最近は plan.md, spec.md と同じ場所に置くようにCLAUDE.local.mdに記載している。(後述)
  • clear したあとに handoff.md を読み込ませて実装に進ませる。
    • 実装中は、並列で小さめのタスクのplan, specを作成したりしている。小さめのタスクもplan, specが終わったら using-git-worktrees スキルで作業環境を分けて実装している
  • 実装が終わったら、https://crit.md/ を使ってレビューする
  • crit上で自分のレビューが終わったら、create-pr スキルでDraftの状態+Copilotへのレビューアサインが済んだ状態でプルリクエストが作成される
    • AIが生成したものを人に見せる場合は、自分がすべてを見るぞという気持ちでいるので、自動でオープンにしない
    • オープンするとレビュアーがアサインされて通知がいって目に入るので。
    • Copilot のレビューは、Draftで出来るしレビューの日本語が壁みたいにならないので採用したが、最近レビューで助かることはほぼなくfalse positiveなことをよく言ってくるので使うのをやめようか悩んでいる
  • プルリクエストを作成したら改めて自分でタイトルとdescriptionと変更をレビューする。Copilotのレビューはrespond-to-reviewスキルで対応を検討してもらう
    • レビューの対応は検討はしてもらうが判断までは任せておらず、最終的には人間がヨシと言わないと進まないようにはなっている
    • 変更も見る。GithubのUIで改めて見て見逃しがないか見直す。
  • その他、動作確認含めて「すべてヨシ!」となったらプルリクエストをオープンしてレビューお願いしますと言う

上記のように基本的に既存のスキルを利用していて、既存スキルについてこうしたいなと思ったことは CLAUDE.local.md に書いている。

例えば、自分の頭の中にあるものを実装する気はないがとりあえずspecを先んじて書くとかよくやるんですが、superpowersのディレクトリ構成だとspecとplanの関係がわからなくなったりするので、issuesとしてまとめていて結構気に入っている。現状issuesはリポジトリにコミットはしていないけどコミットしようかなの方向に気持ちが傾きつつある。

他には、planしたことが実装時にうまくいかなかったら deviations.md として記録していて、後から見直せるようにしている。何回も同じこと繰り返している場合は CLAUDE.local.md に書いたりする。

またプルリクエストを分けるのは、自分がレビューする時にデカいと見たつもりなのに見れてないことがあったので、細かく分けるのがいいなとなった。最近Stacked PRという神機能がパブリックになったので愛用している。

- brainstorming / writing-plans の成果物は superpowers 既定の置き場を上書きし、変更単位ごとに 1 ディレクトリへ spec と plan を同居させる
  - spec(brainstorming): `docs/issues/YYYY-MM-DD-<change-summary>/spec.md`
  - plan(writing-plans): 元にした spec と同じ `docs/issues/YYYY-MM-DD-<change-summary>/` に `plan.md` として作成する(新規ディレクトリを切らず、その spec のディレクトリを再利用する)
  - `YYYY-MM-DD` は作成日、`<change-summary>` は変更内容を表す短いスラッグ
  - spec を伴わず plan だけ書く場合は、同形式で新規ディレクトリを作成する
  - spec・plan は git add / git commit を行わない。
  - spec を作成した後(brainstorming)と plan を作成した後(writing-plans)に、それぞれ crit スキルで `crit <対象ファイル>` を実行してレビューを行う
    - スキル既定の「ユーザーに確認を依頼する」レビュー工程(brainstorming の User Review Gate 等)は crit の実行で置き換える
    - crit のレビューが完了(コメントなしで Finish Review され approved になる)するまで次工程(spec なら plan 作成、plan なら実装)へ進まない
    - crit のコメントに対応する前に、必ず `superpowers:receiving-code-review` スキルを呼び出す。各コメントを技術的に検証・評価したうえで、「修正を適用する」か「`crit comment --reply-to` で技術的な根拠を添えて反論する」かを選ぶ。指摘を鵜呑みにして一括適用しない
- plan の実行中に plan の記述と実際が食い違ったら(設計が成立しない・想定外の既存実装・手順の変更・手戻りなど)、対応する前に plan と同じ `docs/issues/YYYY-MM-DD-<change-summary>/` の `deviations.md` に追記する
  - 記録項目: 対象タスク / plan の記述 / 実際どうだったか / 取った対応 / plan 作成時に何を確認していれば防げたか
  - `deviations.md` も git add / git commit を行わない
- `docs/issues/YYYY-MM-DD-<change-summary>/` の作業(spec / plan / 実装)を扱っている最中に handoff スキルを実行した場合、引き継ぎ資料は OS の一時ディレクトリではなく、対象の issues ディレクトリ配下に `handoff.md` として置く
  - 既に `handoff.md` があれば上書き更新する
  - `handoff.md` も git add / git commit を行わない
- plan 時にタスクを作成する時、レビュアーがレビューしやすいようにプルリクエストの作成は、意味のある単位で分割する。
  - プルリクエストを分割する時、 gh-stack スキルを利用して Stacked PRとして作成する
- プルリクエスト作成後は、人間が作業を行うので、そのまま次のタスクは進めず、人間の指示があるまで停止する。

自分は「AIを生産性向上のためではなく品質向上のために利用する」という気持ちでいて、品質を向上させるには実装より手前で潰せるものは極力潰し切るのがよいと思っているので、自分はこのフローが合っている。

最近触ったが合わなかったもの

モバイルアプリの画面をリアーキテクチャする前に仕様書を書き始めた

  • 画面仕様書と呼んでいる
  • リアーキテクチャをするとき「振る舞いは、原則現行通り」となるが、現行通りとはなにかがわからない
  • 自分の場合、とにかくコードを読んで理解するために頑張るわけだが大変。QAEはコードを読めないので、ドキュメントや実際に動作させて調べているらしい
  • 今はClaude Codeがあるし、レガシーの実装から振る舞いを書き出してみるのがいいのではないかとやり始めた
  • Claude Codeで一発で書き出して終わりというわけではなく、1,2時間くらいかけて修正している。人間が1から書くよりは早いかなという印象。あと人間が書いてもAIが書いても100点は取れないなと思っており、間違うことはあるなという前提でいる
  • 実装がそう振る舞っているだけで、意思を持って決めた仕様ではないため仕様と言いたくないという気持ちにはなるが、ユーザーにとってはそんなの知らんがなという話なので、仕様とする!!!とした
  • また、そう振る舞っていることを言語化しただけなので、意図はまったくわからないことが多い。「なぜそういう実装/仕様に?」は全くわからないので、意図負債は残り続けている
  • 最初はレガシーの画面仕様書だけ書いていたが、リアーキテクチャ時にバグを直したり「これはやめよう」と振る舞いを変えたいことがあることに気づいた
  • レガシーの画面仕様書は、as-isだが、to-be も必要になってきたということ
  • ほな、作りましょうということで、レガシーの画面仕様書を元にリアーキテクチャ後の画面仕様書を書き出すようにした
  • レガシーの画面仕様書には元々バグっぽい挙動や変な仕様を書き出す章があり、そこに「リアーキテクチャ時に直す」とかを記載していたので、それを元にto-beな画面仕様書を書き出すようにした
  • to-beの画面仕様書は、リアーキテクチャを行う前に書き出している
  • リアーキテクチャの前に書き出すことで、実装のタイミングで画面仕様書を更新できる。例えば、Golden テストを書いたら画像を貼ったり、リンクを貼れたりするわけですね。
  • このあたりは、すべてスキル化されている。あとはto-beの仕様書と実装を比較するスキルとかも用意した。
  • それぞれレビューややり取りをかなり細かくして、自分が説明可能な成果物が出てくるという感じ。
  • まあ、実装と同じですね
  • これはCritにかなり助けられている

リポジトリ内の技術ドキュメント

元々 .claude/rules/*.md に「ーーーはこうあるべし」を色々書いていたが、superpowersを使ってspecやplanを書いた時に参照されなかったりと微妙だなぁと思えてきた*1ので、やり方を変えることにした。

  • docs/ 配下にドキュメントを書く
  • CLAUDE.md から 「ーーーする時は docs/xxx/xxxx.md を参照すること」と記載

という形に変更した。現状単体テスト、Golden テスト、Widget テストについてしか書いてないが、specやplanやレビューでいい感じなのでこのまま他も揃えていく予定。

目的 → 目指す状態 → やり方の流れで書く

元々rulesを書いた時はAI向けだ!と思っていてなるべく短くしたい気持ちでいて「こうするべし」というやり方しか書いていなかったが、docsに移行するにあたって、「目的」と「目的を満たしている状態」と「どうやってその状態にするのか」を書くようにした。

少なくとも人間は、目的を理解していないと行動を変えにくいだろうし、ドキュメントで書かれてることだけやりました*2となるのもおかしな話なので書くようにした。AIもそうなのかもしれない。

例えば、テストも「なぜGolden テストを書くのか?」を理解出来ていないと意味のないテストやテスト範囲が大きすぎるテストをAIが書いてもレビューで指摘出来ないとかがある。このあたりの認識をチームで揃える必要があるし、自分含め常にアップデートしていく必要があるので言語化しておくの大事そう。

スキルにしない

最初はスキルにしようかと思っていたが、CLAUDE.mdで参照するように言えばいいかと気づいてやめた。

1つのドキュメントの長さ

最初は単体テストに関することが複数あるので、それぞれファイルを小分けにしようと思っていたが、単体テストを書くとき・レビューするときに全部参照してほしいなと思ったので分けずに1つのドキュメントにまとめた。最近は1M Contextとかになっているし、気にしすぎなくて良い気がする。とにかく小さく保て!と言われると小さく保ちたくなるが、早すぎる最適化と思って堪える。

*1:正確にはCLAUDE.local.mdなりで指定すればいいのだろうが、ほなrulesで書く意味ないやんと思ったし、設定するしないがあるのは微妙そう

*2:そんな同僚はいません

最近の開発 2026-05

  • obra/superpowers を使っている
  • brainstormingでぼんやり考えていることを書き出してもらってから進めている
  • 自分の悪いクセでやろうとすることが大きく変更も大きくなりやすいことが多い
  • Claude Codeが賢いので、大雑把に言ったことでも実現出来るが当然やるべきことが多いので変更は大きくなる
  • 変更が大きくなると全ての変更に目を通したつもりが漏れてることがあったりして、理解負債が貯まっていくように感じた
  • なのでまずは分解するためにやろうとしていることを洗い出すというのが自分には向いてそうだった
  • 洗い出したものを眺めて、こう分割して進めようとか考えることが多い。分割するのが決まったらまた改めてbrainstromingから始めることもあるし、writing-plansで範囲指定して実装計画を書き出すこともある
  • specやplanは今のところコミットしていない。おそらく自分しか利用していないので、コミットする価値があるのかよくわかってない