株式会社ヘンリー エンジニアブログ

株式会社ヘンリーのエンジニアが技術情報を発信します

Claude Codeでドメインエキスパートを育てる ── 解体新書自動生成Pluginの設計と実践

はじめに

株式会社ヘンリーでソフトウェアエンジニアをしているUGAです。

ヘンリーでは電子カルテ・レセコン一体型のクラウドサービス「Henry」を開発しています。

医療ドメインのプロダクト開発では、コードの複雑さだけでなく、その背景にある医療ドメイン知識の複雑さが大きな壁になります。

この記事では、Claude Codeを使ってコードベースから体系的な技術ドキュメント「解体新書」を自動生成するClaudeCodePluginを開発した話を紹介します。単なるドキュメント自動化の話ではなく、ドメインエキスパートAIをチームで育てるというビジョンに基づいた取り組みです。

きっかけ

ヘンリーの開発では、ドメインが複雑であるが故に、日常的にSlackで他のメンバーに質問のメンションを飛ばし、返事を待ち、回答をもらってようやく作業に取りかかるというやり取りが少なくありませんでした。これは聞かれる側も自分のタスクを中断して答える必要があり、双方にとってコストの高いやり取りでした。

コードを直接読みに行くこともできますが、医療ドメインのコードは「何をしているか」は読めても「なぜそうなっているか」が分からないことが多いです。結局、ドメイン知識を持った人に聞くしかない場面に戻ってきます。この状況をどうにかできないかと、ずっと考えていました。

複雑なドメイン開発の難しさ

医療ドメインに限らず複雑なドメイン開発では、以下のような問題があります。

  • 知識の属人化: 「入院フローのことならAさん」「コスト連携ならBさん」と、特定のメンバーに知識が集中する。その人が異動や休暇になると、チームの開発速度が目に見えて落ちる
  • 新メンバーのオンボーディングコスト: コードベースを読んでも全体像が掴めず、既存メンバーへの質問に頼らざるを得ない。
  • 繰り返される一からの調査: 知りたいことだけをClaude Codeでコードベースを都度調査しても、同じ領域を何度も探索することになる。調査結果は個人のコンテキストに留まり、チームの資産にならない

散発的にドキュメントを残したりして対処しようとしても、コードと乖離してしまうことがほとんどです。コードベースと連動した体系的な知識基盤が求められます。

ドメインエキスパートをチームで醸成する

そんな中、同僚がClaude Codeのプロンプトを調整しながら一部機能の技術ドキュメント(後に「解体新書」と呼ぶもの)を作成しているのを見ました。コードベースを体系的に調査し、ドメインモデルやデータフロー、設計判断の背景までまとめたドキュメントです。その成果物を見て、これをチームで育てるのはどうだろうかと考えました。

ただし、個人のプロンプト作業では、品質にもバラつきが出てしまいます。そして何より、特定の人しか生成できないという属人化の問題がそのまま残ります。

そこで、この取り組みをSkill/Plugin化し、誰でも同じ品質のドキュメントを生成・活用・改善できる仕組みにすることにしました。

Pluginの全体構成

今回作成したプラグイン(henry-anatomy-skills)は、Henryプロダクトの各機能領域をコードベースから調査し、体系的にまとめた技術ドキュメント(解体新書)を作成・検索できるようにしたものです。2つのPlugin(search / editor)から構成されています。

ディレクトリ構成

henry-anatomy-skills/
├── .claude-plugin/
│   └── marketplace.json         # マーケットプレース定義
├── plugins/
│   ├── henry-anatomy-search/    # 分析・検索系プラグイン
│   │   ├── .claude-plugin/
│   │   │   └── plugin.json
│   │   ├── docs/                # 解体新書ドキュメント
│   │   │   ├── injection-order-anatomy/
│   │   │   ├── cost-sync-anatomy/
│   │   │   ├── hospitalization-anatomy/
│   │   │   ├── out-of-hospital-anatomy/
│   │   │   └── auto-print-anatomy/
│   │   ├── skills/
│   │   │   └── search-anatomy/
│   │   └── README.md
│   └── henry-anatomy-editor/    # 作成・更新系プラグイン
│       ├── .claude-plugin/
│       │   └── plugin.json
│       ├── skills/
│       │   ├── generate-anatomy/
│       │   └── revise-anatomy/
│       └── README.md
└── README.md

各解体新書の構成

henry-anatomy-skills/plugins/henry-anatomy-search/docs 配下の各解体新書は共通の構成に従います。

{topic}-anatomy/
├── 00-index.md              # 目次・概要・読み方ガイド
├── 01-overview.md           # 全体像
├── 02-xxx.md〜              # 各章
└── appendix/
    ├── glossary.md          # 用語集
    └── important-files.md   # 重要ファイル一覧

なぜドキュメントをpluginに同梱したのか

ドキュメントの置き場所には他にも選択肢がありました。notionやconfluenceのようなドキュメントツールに置く方法、プロダクトのリポジトリに同梱する方法、あるいは専用のドキュメントリポジトリを用意する方法です。

それらではなくpluginへの同梱を選んだのは、解体新書の最大の利用者がclaude codeであるということに基づいています。search-anatomyスキルがドキュメントを検索して回答する際、ファイルがローカルにあればそのまま読めます。外部サービスにドキュメントがあると、api経由での取得が必要になり、レイテンシや認証の問題が生じます。

また、githubでバージョン管理されることで、解体新書の変更履歴がコードと同じワークフローで追跡できます。PRでレビューでき、誰がいつ何を変えたか分かるので透明性が得られます。

Pluginの設計:3つのSkillで回すサイクル

このPluginは、3つのSkillで「生成 → 活用 → 改善」のサイクルを回す設計になっています。

generate-anatomy:コードベースから解体新書を生成

/generate-anatomy 注射オーダー のようにトピック名を指定すると、コードベースを自動で調査し、解体新書を生成します。

内部はマルチエージェント構成で、以下のステップで動作します。

  1. 並列コードベース探索: バックエンド・フロントエンドそれぞれの探索エージェントが並列に起動し、ドメインモデル、DB設計、APIエンドポイント、画面構成などを徹底的に調査する
  2. 章立て計画: 探索結果をもとに章構成を設計し、セルフレビューの後にユーザーの承認を得る
  3. 章ごとの執筆: 計画に沿って各章を順に執筆する
  4. セルフレビュー: 生成後にコードとの整合性・網羅性・一貫性をチェックする

revise-anatomy:フィードバックに基づく修正

/revise-anatomy ADLの説明がない --anatomy cost-sync のように、自然言語のフィードバックで修正を依頼できます。

修正の際にはコードベースと突合し、ドキュメントの記述が実装と合っているかを検証します。フィードバックに基づく修正だけでなく、突合の過程で発見した乖離も合わせて修正するため、ドキュメントの鮮度が自然と保たれます。

search-anatomy:解体新書の横断検索

/search-anatomy 注射オーダー 診療科 のようにキーワードを指定すると、複数の解体新書を横断的に検索し、関連情報を統合して回答します。

ここで重要なのが、読み手の切替機能です。Claude Code の AskUserQuestion を使って、はじめにエンジニア向けなのか、非エンジニア向けなのかを質問するようにしています。エンジニア向けにはコードパスやクラス名を含めた詳細な回答を、非エンジニア向けには概念や業務フローを中心としたわかりやすい回答を返します。

これまでは、どちらかを意識したドキュメントを書かなければなりませんでしたが、AIエージェントを挟むことによって、どちらの読み手にも適した出力になるのが特徴です。

search/editorの2Plugin構成について

このPluginは、検索系(henry-anatomy-search)と編集系(henry-anatomy-editor)の2つのプラグインに分かれています。

理由はシンプルで、editor側はコードベースへのアクセスが必要ですが、search側は解体新書ドキュメントを同梱しているためコードベースが不要です。この分離により、PdMやQAなどのコードベースを持たないメンバーもsearch側だけをインストールしてドメイン知識にアクセスできます。

なお、ヘンリーではPlugin Marketplaceでチーム内に配布する運用が進んでいますが、この仕組みについては別の記事で紹介予定です。

設計で注力したポイント:ドキュメントの構成設計

search-anatomy は質問がある時に使うスキルですが、オンボーディングの時など、そもそもの機能を理解したい時にはまとまった情報を読むことが有用な場合もあります。そこで、生成されたドキュメントは人が読むことも意識して、「構造」をしっかりと設計することを行いました。

Part→章の階層構成

各解体新書は、以下のPartに分かれています。

Part 内容 目的
Part 1: 概要 全体像、登場人物、主要概念 まず大枠を掴む
Part 2: ドメインモデル クラス設計、値オブジェクト、集約 設計の「なぜ」を理解する
Part 3: 主要フロー 業務フローごとの処理の流れ 実装の道筋を掴む
Part 4: DB設計 テーブル構造、リレーション データの持ち方を把握する
Part 5: システム連携 外部システムとの接続 影響範囲を理解する
Part 6: 付録 用語集、重要ファイル一覧 辞書として使う

この構成は、読者が第1章から順に読んでも段階的に理解が深まるように設計しています。新メンバーは最初から通読し、既存メンバーは必要な章だけ参照する、という使い分けが自然にできます。

読者が迷わないための工夫

各章には以下の要素を含めるようにしています。

  • 学習目標: その章で何が分かるようになるか
  • 概念説明 → コード例 → まとめの繰り返し構造
  • Mermaid図: フロー図、状態遷移図、シーケンス図、ER図を適宜配置
  • 比較表: 類似概念の違いを明確化

また、付録の用語集と重要ファイル一覧により、「この用語の意味は?」「このロジックはどのファイルにある?」といった問いにも対応できるようにしています。

ビジョン:ドメインエキスパートAIをチームで育てる

解体新書Pluginの本質は、単にドキュメントを自動生成することではありません。チームでドメインエキスパートAIを育てる基盤を作ることです。

解体新書 = ドメインエキスパートの知識ベース

解体新書をコンテキストとして読み込んだエージェントは、そのドメインの専門家として振る舞えます。例えば「注射オーダー」の解体新書を読み込んだエージェントは、注射オーダーの専門家として以下のようなことができます。

  • 「注射オーダーの実施記録を変更したいが、影響範囲は?」に対して、コスト連携や監査への波及を含めた正確な回答を返す
  • 実装時のコンテキストとして機能し、ドメインの慣例に沿った設計判断を提案する
  • コードレビューで、ドメインロジック上の矛盾を指摘する

コードベースを毎回探索するのとは異なり、体系的に整理された知識に基づいて回答するため、精度と速度の両方が向上します。

非エンジニアも含めた知識の民主化

search-anatomyの「読み手切替」は、この思想を体現した機能です。エンジニアはコードレベルの詳細を確認でき、PdMやQAはビジネスフローレベルで理解を深められる。同じ知識基盤を、それぞれの立場で活用できます。

コードベースを持っていなくてもsearch Pluginさえインストールすれば使えるため、ドメイン知識へのアクセスに技術的な障壁がありません。

育てるサイクル

ドキュメントは一度作って終わりにしません。revise-anatomyでフィードバックを反映し、コードとの突合で乖離を検出し、修正する。このサイクルを回すことで、解体新書は徐々に精度を上げていきます。

実際に、解体新書の内容に不足を見つけたメンバーが自発的にreviseを実行し、改善してくれるケースが生まれています。

とはいえ、現状のサイクルは人の自発性に依存しています。コードは日々変わるので、理想的にはソースコードの変更に連動して解体新書も自動更新されるべきです。現在、GitHub Actionsに組み込んで差分を検知し、影響のある章の更新を自動で走らせる仕組みを検討しています。人手による改善と自動更新の両輪が揃えば、解体新書の鮮度はより安定して維持できるようになるはずです。

そして解体新書の精度向上は、そのままドメインエキスパートAIの進化に直結します。チームのメンバーがフィードバックを通じてドキュメントを改善するたびに、エキスパートAIが賢くなっていく。これは従来のドキュメント管理とは異なる、チーム全体でAIを育てるという新しいアプローチです。

  ┌─────────────┐
  │  generate   │ コードベースから解体新書を生成
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │   search    │ ドメインエキスパートとして活用
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │   revise    │ フィードバックで精度向上
  └──────┬──────┘
         │
         └──────▶ ドメインエキスパートAIの進化

現状の効果と今後

コードから探したり、「あの人に聞かないと分からない」が減った

解体新書の導入前、ドメイン知識を得る手段はコードを読みに行くか、詳しい人に聞くかの大きく2つしかありませんでした。しかもその「詳しい人」は別チームにいることも珍しくなく、「あの仕様どうなってましたっけ」という質問がSlackで飛び交っていました。何度も回答しているだろう質問も中にはあり、申し訳なくなる時もあります。

解体新書の導入後は、それが少しずつ改善されているように思います。まず、エンジニアがコードから探す時間が削減されました。 そして以前なら別チームのメンバーに質問していたような場面でも、解体新書を引けば答えが見つかるようになったので、問い合わせを受ける側の負荷軽減にもつながりました。

さらに嬉しかったのは、QAメンバーからの反応です。「エンジニアに聞かなくても仕様が理解できるようになった」という声をもらいました。コードベースから生成されたドキュメントが、エンジニア以外にも価値を届けられている。これは当初想定していた以上の効果でした。

自発的に広がるアクセスの輪

もうひとつ、作り手として特に嬉しい変化がありました。解体新書をNotionやSlackと連携して、エンジニア以外も含めてもっとアクセスしやすくしよう、という動きがチーム内で自発的に生まれました。ツールは作った人が「使ってください」と言い続けなければ広まらない、というのはよくある話ですが、逆に価値を感じた人が自ら広めてくれるのは、仕組みとしてうまく回り始めたサインだと感じています。

これからやりたいこと

このスキルを利用して動くドメインエキスパートエージェントとして開発フローに組み込むことです。設計レビューで「この変更、〇〇の機能に影響しませんか?」と指摘してくれるエージェント。実装時に「この領域の設計パターンはこうなっています」と教えてくれるエージェント。解体新書という知識基盤があるからこそ実現できる、ドメインを理解したAIとの協働を目指しています。

もうひとつの課題は鮮度の維持です。コードは日々変わっていくので、解体新書も放っておけば陳腐化します。コード変更を検知して、影響のある章の更新を自動で提案する仕組みを作れれば、「ドキュメントがコードに追従し続ける」という、これまで不可能だったことが現実になります。

「ドメインエキスパートAIをチームで育てる」というビジョンは、まだ道半ばです。でも、QAメンバーが仕様を自力で読み解き、チームメイトが自発的に活用の輪を広げてくれているので、そのビジョンはきっと達成できるものだと思います。

おわりに

医療ドメインのように複雑な領域では、ドメイン知識そのものが開発の生産性を左右します。Claude Code Pluginでドメイン知識を体系化し、チームで育て、エンジニアも非エンジニアも活用できる形にする。この取り組みはまだ発展途上ですが、ドメインエキスパートAIをチームで育てるというビジョンに向けて着実に歩みを進めています。

この記事が、複雑なドメインを持つプロダクトの開発に関わる方の参考になれば幸いです。

基幹業務システムはどのようにオンプレからクラウドネイティブに変化してきたのか

株式会社ヘンリー VPoTの戸田です。弊社ではクラウドネイティブ型電子カルテをご提供するうえで、オンプレやクラウドリフト、シングルテナントといったシステム構成とクラウドネイティブ型マルチテナントがどう違うのかを説明する機会が多くあります。都度相手に合わせて内容を調整したご説明をしているのですが、一度基幹業務システムの変化について網羅した説明をすることが今後の役に立つと考え、こちらの記事としてまとめました。

なお筆者が基幹業務システムに関わり始めたのは2000年代後半からで、それよりも古いものには伝聞が入っています。もしお気づきの点があれば @Kengo_TODA までコメントいただくか、はてなブックマークなどでコメントいただければ幸いです。


基幹業務システムはこの30年で大きく姿を変えてきました。

  • メインフレーム(ホストコンピュータ)
  • 拠点内オンプレミス
  • データセンターでの運用代行
  • IaaS上へのクラウドリフト
  • クラウドシフト(クラウドネイティブ化)
  • そして、シングルテナントからマルチテナントへ

本記事では、これらの変化が「なぜ起きたのか」を、技術とビジネスの両面から整理します。またこうした流れは多くの例外を含むものであり、ここに記載していない事例や動きもあると思いますが、ご理解ください。

※本稿ではメインフレームは目的から離れるため割愛します。

1. クライアントサーバー時代(2層構造)

メインフレームから汎用系に移行した段階では、多くの業務システムはいわゆるクライアントサーバー型(クラサバ型)でした。

  • Windows上の実行ファイル(業務アプリ)
  • Oracle Database / IBM Db2 / SQL Server などのデータベース
  • クライアントが直接SQLを発行
flowchart LR
    subgraph 拠点内LAN
        Client[業務クライアント(exe)]
        DB[データベースサーバー]
    end
    Client -->|SQL| DB
    Client -->|SQL| DB
    Client -->|SQL| DB

特徴と制約

  • クライアントとDBが頻繁に通信するため、低遅延なLANが前提。たとえば東京にあるDBに大阪から繋ぐような構成では体験が悪くなる。
  • 低遅延を実現するため、サーバーは業務拠点内に設置されることが多い。
  • 端末ごとのインストール・設定作業が必要。端末数に応じた課金体系であることも多いため、利用者間で端末を共有させる力学が働いた。

この構造では、クライアントとサーバーが物理的に同じ拠点内にあることが前提でした。多拠点利用や在宅勤務といった働き方とは相性がよいとは言えません。またクライアントの管理がクライアントのユーザに委ねられているため、古いクライアントが使われ続ける・データベースに破壊的な変更を入れにくいなどの問題もありました。

2. 三層構造とWebアプリの普及

クラサバ型の制約を緩和するために登場したのが、三層構造(Web三層アーキテクチャ)です。国内のERPでは2006年前後の登場だったと思われます。

flowchart LR
    Client[クライアント(専用アプリ / ブラウザ等)]
    subgraph "サーバー設置拠点(拠点内またはDC)"
        Web[Webアプリケーションサーバー]
        DB[データベース]
    end
    Client -->|HTTP| Web
    Web -->|SQL| DB
    Web -->|SQL| DB
    Web -->|SQL| DB

何が変わったのか?

  • クライアントはHTTPリクエストを送る役割に単純化、人間とのコミュニケーションを担当。
  • DBとの通信をサーバー側に集約することで、通信回数が増える複雑な機能でも高速に動作。
  • 低遅延なネットワークはデータセンター内でのみ求められるように変化。

これにより、クライアントとデータベースが直接通信する必要はなくなり、物理的な距離の制約が緩和されました。これは今日のSaaSと近い構成だと言えます。

ただし三層構造になったからといって、すぐに「ブラウザだけで完結」したわけではありません。2000年代には Java Applet や Silverlightのようなリッチクライアントと呼ばれる技術も試みられていました。これは当時のWeb標準技術だけでは、業務アプリに求められる操作性や表現力が十分でなかったためだと言えます。

その後、

  • HTML5やシングルサインオン技術などの標準化
  • JavaScriptエンジンの実行性能の改善
  • ブラウザやフレームワークの改善、ベストプラクティスの蓄積によるセキュリティの向上
  • Ajaxなど非同期通信の普及

といったWeb技術の成熟により、ブラウザ単体で高度な業務アプリケーションを実装できるようになりました。現在主流となっているHTMLベースのWebアプリは、こうした進化の結果だと言えます。

この段階で、「サーバーは必ずしも拠点内に置く必要はない」という前提が現実味を帯びてきました。ディザスタリカバリの観点からも複数箇所にシステムやデータを散らせられるなら強みになりますし、遠隔地に置けば土地代電気代をオフィスに置くよりは節約できるかもしれません。しかし遠隔地での保守作業が発生し、これを個社で負担するのは難しいものと思われました。

3. データセンターでの運用代行

次の段階は、事業者が実行環境を引き取るモデルです。専用事業者によるデータセンターでの運用代行そのものは大企業を中心に古くから実施されていましたが、サービス事業者が直接運用代行を提供するようになったのは2012年に提供されたCOMPANY on Cloud Managed Service (CCMS)*2や2013年に提供されたSAP HANA Enterprise Cloud*3からでしょう。

flowchart LR
    Client[クライアント(専用アプリ / ブラウザ等)]
    subgraph "サーバー設置拠点(事業者が管理するDC)"
        Web[Webアプリケーションサーバー]
        DB[データベース]
    end
    Client -->|HTTP| Web
    Web -->|SQL| DB
    Web -->|SQL| DB
    Web -->|SQL| DB

この流れをさらに後押ししたのが、従来暗黙の了解としてあった「社内ネットワークは安全である」という前提の限界が見えたことにあります。2014年以降にGoogleが提唱したBeyondCorp*4では、拠点内ネットワークに依存したセキュリティモデルはもはや成立しないこと、そして「出社して社内ネットワークからアクセスする」ことを前提にしたシステム設計自体が時代遅れになりつつあることが示されています。 オンプレミスで拠点内にシステムを置くモデルは物理的な境界を信頼の根拠としていましたが、クラウドサービスの業務利用増加やこれに伴う物理オフィスへの依存低下、リモートワークやモバイル端末の普及、攻撃の高度化などの要因により、その前提が崩れたのです。この流れはこの後のコロナ禍によって加速されることになります。

こうした問題意識は、データセンター移行の合理性を説明するうえでも重要です。物理的な拠点境界ではなく、ユーザーとデバイス単位で信頼を判断する設計へと移行する中で、システムをデータセンター側に集約することは自然な流れだったともいえます。この流れは「所有から利用」とも呼ばれ、ITシステム部門がシステムの面倒を見る役割だけでなく、ITをテコにして業務改革を推し進める役割を深めるきっかけを作りました。

何が変わったのか?

システム構造自体は従来の三層構造のままです。ここでは技術的な革新以上に、ビジネス観点の変化が大きかったと言えるかもしれません。顧客がしたいのはシステムの保守や運用ではなく、そこから得られるアウトカムにこそ関心があるのだということが一般に理解されてきたということです。

筆者はエリヤフ・ゴールドラット博士の著書「チェンジ・ザ・ルール!(原著 Necessary But Not Sufficient)」が好きなのですが、この物語ではまさに運用代行というビジネスモデルが出てきます。これが書かれた2001年前後では大企業を中心とした一部分でのみで運用代行が行われていたようですが、BeyondCorpが出た2014年時点では前述のとおりサービス事業者が手掛けることが基幹業務システムにおいても一般的になっています。実績が認められキャズムを超えて、よりスケールする方法として洗練したタイミングだと言えるでしょうか。

もちろん基幹業務システム事業者から見た場合に、顧客の拠点においてあるシステムよりも自社のインフラで運用されているシステムの方が保守業務とくにハードウェア増強がしやすいという観点もあります。しかしこの時点では基幹業務システムはコードやデータベースに手を加えて(カスタマイズして)使うことが一般的で、システム更新のしやすさという観点ではそこまで大きな飛躍はなかったと考えます。

4. クラウドリフト(IaaS上でのそのまま移行)

これはデータセンターでの運用代行と同時期に進んだものと思われます。2006年に登場したAWS EC2のようにインフラストラクチャを画面やAPIから調達できるIaaSが登場すると、既存システムをそのままパブリッククラウド上に移行する「クラウドリフト」が始まります。ランニングコストではデータセンターに劣ることが多いものの、ハードウェアの納品を待つ必要がない・APIによる自動化の幅が大きかったことは大きな魅力でした。特に検証用環境*5は夜間や祝日は不要となるため、従量課金の恩恵を得やすい環境でした。

その後は2013年にRDSが一般公開されるなど、従来オンプレで動かしていたシステムをEC2, S3, EBS, RDSなどを組み合わせて動かせるようになっていき、爆発的に普及していきます。

flowchart LR
    subgraph AWS
        EC2[EC2上のアプリ]
        RDS[RDS / DB]
    end
    User --> EC2
    EC2 --> RDS

IaaSの利点は、何と言っても既存コードが流用可能なことです。今までのアーキテクチャのまま、小さな初期投資だけでクラウド上にサービスを稼働させられます。オートスケールや分散処理のようなクラウドの潜在的な可能性を引き出すには不十分ですが(Ansibleなどを整理しても実装に手を加えなければ効果が薄い)、システム運用をしなければならないという顧客のペインをスピーディに解消するには十分でした。

5. クラウドシフト(クラウドネイティブ化)

クラウドの強みを活かすにはオートスケールや分散処理を活かすためのアーキテクチャでシステムを組み直す必要があります。状態を持たないサーバ、筐体が壊れたら捨てて新しいものに乗り換える仕組み、負荷に応じて計算機資源を追加・削除する自動化、クラウド事業者が提供するプラットフォームを活用することによる運用責任の縮小などを前提にシステムを組むのです。コンテナの活用もこれに含まれます。こうした変化を受け入れてはじめて、次のようなクラウドの恩恵を享受できるようになります:

  • 計算機資源を想定される最大負荷に合わせて調達するのではなく、都度必要な分だけ支払う従量課金
  • 縦方向(筐体の能力向上)だけでなく、横方向(筐体台数の追加)による柔軟な拡張
  • 複数データセンターでの同時サービス運用による高可用性の実現

サービスの更新におけるサービス停止の必要性が下がったのも特徴で、これにより継続的なデプロイが可能になりました。いままではサービス停止を避けるためにマスタや設定の更新で乗り切っていた機能提供や法対応もより素直な方法で行えるようになり、また脆弱性対応もスムーズに行えるため、サービス事業者側の運用コストも下がったと考えられます。

6. シングルテナントからマルチテナントへ

もうひとつの大きな変化がテナントモデルの変化です。従来は顧客ごとに専用環境を構築しており、これが顧客ごとにデータベースやコードを改修すること(カスタマイズ)を可能としていました。またシステムを止めてメンテナンスをするタイミングも顧客が選べていました。

これらは一見便利ですが、カスタマイズがシステムの更新を難しくし脆弱性を生み出したこと、システムが硬直化することで業務の運用も硬直化してしまうこと、新しい技術が採用しにくく結果的に競争力を失うこと、何よりも運用と更新の手間とコストが高いため情報投資効率が上がらないことが課題になりました。

たとえば基幹業務システムに何らかの不具合が見つかったとします。その際はすべての顧客が使っているバージョンを洗い出し、そのバージョンそれぞれに対するパッチの作成とビルド、出荷物の作成及び評価そしてお客様環境での適用が発生します。シングルテナントのシステムでこのコストが非常に高くつくことはご想像のとおりですし、オンプレミスのシステムであればさらに稼働環境の多様性という問題も出てくることになります。

クラウドネイティブ型かつマルチテナントの基幹業務システムであれば、保守するバージョンを少なく保つこともそれを顧客にデリバリーすることも比較的容易にできます。浮いた工数を製品の機能や運用の改善に充てることで、より本質的な価値を顧客に届けることに注力できると期待できます。

APIによる拡張

マルチテナントが可能になったことは、すなわちカスタマイズ文化を捨てられたことを意味します。ではなぜそれまでは必須だと思われていたカスタマイズをやめられたのでしょうか?その背景にはAPIの普及があります。

ERP界隈では統合型ERPからコンポーザブルERPへの移行と表現されました*6が、サービスに直接手を加えるのではなく、サービスがデータを交換する仕組みを提供することで従来やっていた独自運用を実現できるようになったのです。APIが互換性を維持すれば基幹業務システムの更新とアドオンの更新とは分けて実施ができますから、異なる事業者が提供するシステムを組み合わせて運用を実現することも十分に可能です。

7. 経済合理性の転換

もうひとつ興味深い変化として会計・財務構造の転換があります。

クライアント数に応じたライセンス(クラサバ型)

従来のオンプレミス型、特にクラサバ型では次のような費用感が一般的です。初期投資が大きく、利用者数が増加すると追加ライセンス購入になります

  • サーバー購入(固定資産)
  • CAL(Client Access License)購入
  • 5年程度を前提とした減価償却

特にCALモデルでは、「1ユーザーあたり何ライセンス」という考え方が前提となるため、端末や利用者を柔軟に増やすことが難しい場合がありました。

クラサバ型だった時代にCALが必要とされた背景には、クライアント端末ごとに業者側がメンテナンスコストを負担していたという事情があります。業務アプリはexe形式で配布され、各端末へのインストール、設定、アップデート対応が必要でした。もちろんサポートの負荷も、端末が増えれば増えるほど比例して増加します。そのため「接続する人数分の対価を支払う」という設計は、当時としては合理的でした。

しかしこれは同時に、利用者の利益や利便性と必ずしも一致しないライセンス体系でもありました。利用を広げたい場合でも追加ライセンスの購入や端末設定作業が障壁になり、端末の共有利用を検討することになります。また導入したい端末を見つけてもサービス事業者がサポート外になると言えば採用できません。業務設計の自由度が低い状況だったと言えます。

一方、ブラウザで動作するSaaSでは事情が大きく異なります。ソフトウェアのインストールは不要で、ユーザーはURLにアクセスするだけで利用できます。アップデートもサーバー側で一元管理されます。この構造では、端末ごとに個別メンテナンスコストをかける必要が薄れるため、従来型のCAL的発想は必然性を失っていきました。

サブスクリプションモデル(クラウド時代)

クラウドSaaSでは多くの場合、次のような費用感が一般的です:

  • サーバー購入不要
  • 利用人数など単位の柔軟な増減
  • 月額/年額課金

このモデルだと利用者の判断で端末やアカウントを追加できるようになり、1人1台以上の業務端末を配布することも現実的になります。端末の共有がやめられるとアカウントや業務の運用設計がシンプルにできるため、DX推進にも良い影響があります。

また会計上の柔軟性も利点のひとつです。5年分の前払いが不要になりキャッシュフローが改善することや、減価償却管理が不要になること、管理会計上で費用として処理しやすいことなどは、動きの早くなったビジネスにおいて重要でしょう。

まとめ

業務システムは次のように進化してきました:

  1. クラサバ型(拠点内前提)
  2. 三層Webアーキテクチャ
  3. データセンター運用代行 および クラウドリフト
  4. クラウドシフト(クラウドネイティブ化)
  5. マルチテナント

この進化は複数の技術革新と、ビジネスモデルの変化によって支えられています。システムの保守や運用ではなくアウトカムをこそ顧客に提供するという目的意識を最新技術が支えることで、高い情報投資効率を実現するという構造です。

カスタマイズができない、顧客が具体に関与できないという従来モデルとの違いはありますが、それを乗り越えるための方法もすでに色々と検討され実績があります。むしろカスタマイズという個社ごとの高価な最適化を離れ、アドオンという再利用しやすく安価な方法として業界としての知見やベストプラクティスを蓄積することによって、イノベーションを加速させた面もあるでしょう。

医療情報システムもクラウドネイティブに変化していく

さて医療情報システムを振り返れば、この領域でもクラウドネイティブ化が進んでいくことは弊社note記事でも述べたとおりです。レセプトコンピュータや電子カルテについては既にクラウドネイティブ化が進んでおり、今後は部門システムにおいても同様の方向性を国として目指していることが先月公開された「中小病院向け電子カルテ及びレセプトコンピュータ標準仕様書(基本要件)(案)」でも触れられています:

電子カルテは、マルチテナント方式のクラウド・ネイティブ型とし、併せて部門システムも可能な限りのクラウド化を果たすことにより、システムとの関わり方を「所有」から「共同利用」に切り替え、システムに要するコストを割安にする

その際に他業界の基幹業務システムから医療情報システムが学べることは多くあると思います。今回整理した経緯を眺めたり、また本記事を起点に色々と調べていただければと思います。

なおこれは他業界の基幹業務システムやSaaSを開発してきた開発者が、国の医療に貢献できる機会でもあります。クラウドネイティブ化の酸いも甘いも見てきた方、ご自身やご家族をきっかけに医療に向き合いたいという方、ぜひ弊社を知っていただければと思います。よろしくお願いいたします。

jobs.henry.jp

*1:https://japan.zdnet.com/article/20094181/

*2:https://www.career.works-hi.co.jp/corporate/data/

*3:https://www.publickey1.jp/blog/13/saperpcrmsap_hana_enterprise_cloud.html

*4:Google, "BeyondCorp: A New Approach to Enterprise Security" (USENIX ;login:, 2014) ほか関連論文群 https://research.google/pubs/pub43231/

*5:基幹業務システムではthree-tier landscapeと称して開発・検証用環境も各顧客に用意することがあります

*6:https://note.com/akihirohara/n/n88d2b8299c18

Claude Code Skillsのチーム展開で気づいたSkill管理の課題と対策

株式会社ヘンリーでソフトウェアエンジニアをしているwarabiです。

ヘンリーでは以前から開発にClaude Codeを用いていましたが、最近はSkillの活用などでClaude Codeの性能をもっと引き出そうとする動きが活発になっており、ブログでの発信も増えてきています。

Claude Code を活用した電子カルテの外部連携仕様書メンテナンス自動化の取り組み - 株式会社ヘンリー エンジニアブログ

今回は私が以前に作成したSkillをチームの共有物として管理・展開する際に気付いたSkill管理の課題と対策について話そうと思います。

以前作ったSkillの紹介

起票されたIssueの中身を確認・追加調査をしたうえで実装からPR作成までを全自動で行うOrchestrator型のSkillです。(以降 dev Skillと表現)

dev.henry.jp

このdev Skill作成は元々チームへの展開も前提として考えながら作成を進めていました。

試行錯誤を経て組み立て終わったdev Skill。続いてチーム展開について考えるステップへと進む予定でしたが、ここに1つ問題がありました。

チーム展開の引っかかり

チーム展開をした以降はSkillのメンテナンスも私個人ではなくチームで行う想定でしたが、いざチームへの展開について考ると「このSkill、自分以外の人がメンテするの?」という親心のような気持ちが私の中に生まれていました。

他の人からPRが来ることを想像すると少し抵抗を感じる。通常業務のコード修正とSkill修正で何が違うのか。

この感覚を整理・言語化しないままチームに展開をすると無秩序な管理状態になるかもしれません。そこでチーム展開の作業は一旦手を止め、Skill管理について課題や見落としが無いかを考え直すことにしました。

課題整理

課題1: 変更内容の評価が難しい

通常業務のコード修正であれば既存実装の設計や社内での知見があるため、ある程度正解と呼べるものが導きやすいです。そのため実装者とレビュアーの間で認識も揃えやすく、基本的にApproveまでは進めやすいと言えます。

しかしSkillはまだ設計と言えるほど成熟したパターンが確立できてなく、皆手探りという状況です。指示はどれだけ長い/短い方が良いかの1点だけでもXで日々議論が起きています。

そのためSkillやプロンプトについてはまだ正解といえるものが無く、変更内容への評価は主観に頼らざるを得ないと言えます。通常のコードとは違う部分でApproveのハードルが高い理由がここにあります。

課題2: 何をSkillに行わせたいかが利用者によって変わる

またSkillに何を行わせたいかが人によるという課題もあります。

Aさんが入れたい変更をPRで出したとしても、他の人にとっては入れてほしくない内容かもしれません。Skillに何を行わせるか、チームのSkillを使う人が増えるほど意見の衝突は起きやすくなると考えました。

かといってSkillのオーナーを設けたりSkillの書き方を厳密にしたりすると、Skillの更新が停滞するという別の問題も生まれてしまいます。 これはSkillを活用して働き方を変えようとする今の動きにとって足かせとなってしまいます。

課題3: スキルのポータビリティ

レビューとは別の文脈ですが、Skillを完全にチームの管理とする場合この問題が生まれます。

Skillを使った開発はとても便利で、導入して1ヶ月ですが既にこれなしでの開発は考えられない状態です。

このときSkillを完全にチームのものとして育てていくと、それまで積み立ててきた便利なSkillが環境の変化によって持ち出せなくなるという問題があります。例えば転職や組織異動の際に、日々の開発を支えてきたSkillが使えなくなる状況です。

活用しているSkillは、もはやその人自身の開発能力と言って良いと私は考えています。よく使うSkillの中身はほとんど汎用的なプロンプト設計のノウハウであり、特定の業務ロジックとは異なります。個人の作業効率を高めるための環境構築の一部という性質のものです。キャリアにおけるスキルのポータビリティという観点から、その人の開発能力であるSkillがリセットされる状況はできれば避けたいと考えました。

課題への対策

Skill管理の課題について整理を終えたので、続いてその対策を考えます。 今回は2つの方針を対策として採りました。

対策1: 個人SkillとチームSkill を別で管理する

そもそもSkillの本質は何かを考えると、その中身は汎用的なプロンプト設計のノウハウであり、特定の業務ロジックとは異なります。dotfilesやエディタ設定と同じく、個人の作業効率を高めるための環境構築の一部です。

この前提に立てば、Skillは個人の開発環境として扱うのが自然です。個人の環境を改善していくことが前提であり、そのうえで作られたSkillや知見をチームに還元するという流れです。

そこでチーム展開用のSkillとは別で、個人用のSkillリポジトリを用意する方針を取りました。より正確に表すと、元々個人用に作成したSkillをチームのリポジトリにも展開するというイメージになります。

対策2: チームSkillをStarter Kitと位置づける

Skillのチーム展開を最初に意識した時は、作成したSkillの導入について半ば義務化するような考えを持っていました。チームのSkillを使うことを当たり前にすれば、各自の開発力が高まり会社の生産性も高まると考えてのことです。

そのためSkillのレビューを厳密にするか、意見の衝突をどうするかという問題が生まれましたが、ここで重視したのはSkill作成が活性化する方向に倒すことです。

Skillの作成はヘンリー内でも新しい取り組みで、まだ知見が十分に溜まっていない段階です。この時期にレビューを厳密化してしまうと、Skill作成そのものが停滞しかねません。今は多少の性能低下を許容してでも、Skill作成・変更が活発に行われる状況を優先すべきと考えました。

そこでチームSkillは「Starter Kit」として位置づけることにしました。Skill環境をまだ用意できていない人が、これを入れればとりあえず開発速度を上げられる出発点です。使用は任意とし、変更のハードルも下げる方針を取りました。

そのまま使い続けても問題はありませんが、スキルのポータビリティの観点からも、ゆくゆくは自分のSkillsを育てていく方が望ましいです。管理はチームSkillを活用する人たちで基本的には行います。

ただし「個人Skillを使う自分はチームSkillは無関係」という考えは持つべきではありません。

個人Skillを使う人も、Skill作成の過程で得た学びをチームSkillに反映したり、勉強会で知見を共有したりと、チームへの還元を推奨としています。

個人で得た知見をチームに共有し、お互いの学びを循環させることで全体のAI活用力を底上げする。この「個人で試す → 効果を確認する → チームに還元する」というサイクルを回すことこそが、Starter Kitという位置づけの本質的な狙いです。

個人Skillのセキュリティについて

今回チームSkillsとは別で個人Skillsを持つ対応を取りましたが、このパターンにはセキュリティ上の課題が残ります。

個人リポジトリでSkillを管理する以上、会社の機密情報が外部に漏れないよう注意が必要です。Skillの内容次第では、リポジトリ構造やワークフローの詳細など、機密性の高い情報が含まれる可能性があります。

そのため個人Skillに含めるのは汎用的なプロンプト設計のノウハウに限定しています。「情報収集をしてIssueを更新する」「実装前にテスト方針を立てる」といった、どのプロジェクトでも通用する手順や思考パターンです。社内のAPI仕様、環境固有の設定、業務ロジックに関わる記述は個人Skillには含めず、それらはチームSkill側に閉じる運用としています。

この線引きを守る限り、個人Skillの機密性は一般的な個人の開発環境設定と同程度に収まると考えています。ただし、業務中に試行錯誤する中で境界が曖昧になるリスクはゼロではなく、この点については社内でも議論、整理を行ってきました。

実際に導入してみて

今回考えた課題と対策をもとに、実際にSkillをチームに展開してみました。

嬉しいことにチーム展開したdev Skillがかなり好評で、現状のSkillをそのまま活用してくれているようです。そのため、懸念していた意見の衝突やレビュー負荷といった問題はまだ顕在化していません。

一方で、個人Skillの運用を切り離したことによるメリットは早くも実感しています。

チーム展開後も私自身のSkill改善は止まっていません。個人Skillリポジトリがあることで、試したいアイデアをチームへの影響を気にせず自由に試行できています。もしSkillがチームの管理下にしかなかったら、「この変更、チーム全体にとって有用か?」という判断が毎回必要になり、個人の実験的な改善は確実に停滞していたと思います。

対策で狙っていた還元のサイクルも動き始めています。ただし現時点では、Skillの作成者である私自身が個人Skillの改善をチームSkillに取り込むケースが中心です。他のメンバーが同じサイクルを自然に回せるかはこれからの課題ですが、まずは1人でも実際に回っている事実は、この仕組みの可能性を示せていると考えています。

おわりに

今回Claude Code Skillsのチーム展開を考えるにあたり、Skill管理が持つ課題に向き合い、個人SkillsとチームSkillsを分けて管理する方針を採りました。

個人の実験と改善を止めず、そこで得た知見をチームに還元するサイクルを回すことが、この仕組みの狙いです。

Claude Code を活用した電子カルテの外部連携仕様書メンテナンス自動化の取り組み

この記事では、Claude CodeのSkill(Agent Skill)やCIを活用して、コードベースから外部連携の仕様書を自動生成・更新する仕組みを構築した取り組みを紹介します。

はじめに

こんにちは!ヘンリーで電子カルテ開発チームでエンジニアをしているわくわく(@wakwak3125 / @wakwakjp) です。

最近社内でのAI活用が進んでいており、 https://dev.henry.jp/entry/claude-code-orchestrator のような便利なSkillのおかげで開発自体の速度がぐんぐん上がっています。

一方で、まだまだ人の手で行われている部分が多いのも事実です。今回はその人力で行われていて、抜け漏れのチェックが非常にめんどくさい「仕様書」と呼ばれるもののメンテナンスを Claude Code, Skill, GitHub Actions を使い半自動化する仕組みをご紹介します。

Henryという電子カルテにおける仕様書とは

ここで言う「仕様書」はHenryの内部の仕様を解説したものではありません。ではなにかというと、外部のシステムとの連携に関する仕様書です。

電子カルテという製品は様々な周辺のソフトウェアと接続・連携して病院業務の中核を担います。一例としては、臨床検査システムや調剤システム、予約・問診システム、自動精算機などがあります。

連携がどのように実施されてるかに興味がある人は次の記事を読むと楽しめると思います。

https://dev.henry.jp/entry/2024/12/14/163949

https://note.com/henry_app/n/n29691b917b41

仕様書か管理の難しさ・煩雑さ

外部連携のインターフェイス仕様や連携を必要とされるお客様環境への導入プロセスにおける設定に必要なデータなどはHenryの機能追加などで変わっていきます。冒頭でも書きましたが開発プロセスへのAI活用のおかげでこれまででは考えられないような速度感の開発になりつつある中で

  • 仕様書と実装に齟齬は無いか
  • 仕様書に更新が必要な実装なのか
  • 仕様書に変更がある場合の記載作業と記載内容のレビュー
  • 仕様書の公開作業

といった作業に加えて、連携種類が増えた際の仕様書の追加がされた際のフォーマット・テイストの統一など品質面の調整の工数もかかります。

そこで、変更検知、仕様書作成・レビュー・公開の自動化フローを組みました。

全体像

このシステムは2つのスキルで構成されています。

スキル名 役割 実行タイミング
generate-integration-spec コードベースを探索し、仕様書を生成・更新する 開発者がローカルで手動実行
spec-change-check PRの変更が外部連携仕様に影響するかを検知する PR作成・更新時にCIで自動実行

この2つのスキルが連携することで、「仕様に影響する変更の検知 → 仕様書の更新」という一連のフローを実現しています。

flowchart TD
    A[開発者がPRを作成] --> B[CI: spec-change-check が自動実行]
    B --> C{外部連携仕様に影響あり?}
    C -->|無関係| D[CIパス]
    C -->|影響なし・更新不要| E[PRにコメント + CIパス]
    C -->|影響あり・更新必要| F[PRにコメント + CI失敗]
    F --> G[開発者が /generate-integration-spec を実行]
    G --> H[仕様書が自動生成・更新される]
    H --> I[更新された仕様書をコミット]
    I --> D
    F --> J[手動で仕様書更新 or SpecChangeApproved ラベル付与]
    J --> D

spec-change-check: PRの仕様影響検知スキル

まず、CIで自動実行される検知側のスキルから説明します。

何をするスキルか

PRの差分(diff)を取得し、各連携の設定ファイル(spec-config.md)に定義された検知キーワードと照合することで、その変更が外部連携の仕様に影響するかを判断します。

動作フロー

sequenceDiagram
    participant CI as GitHub Actions
    participant Skill as spec-change-check
    participant GH as GitHub API

    CI->>Skill: PR番号を渡して起動
    Skill->>Skill: spec-config.md をすべて読み取り
    Skill->>GH: gh pr diff でPRの差分を取得
    Skill->>Skill: 検知キーワードと差分を照合
    Skill->>Skill: 変更判断基準に基づき更新要否を判定

    alt 無関係
        Skill->>CI: RESULT:NO_IMPACT
    else 影響なし・更新不要
        Skill->>GH: PRにコメント投稿
        Skill->>CI: RESULT:NO_UPDATE_NEEDED
    else 影響あり・更新必要
        Skill->>GH: PRにコメント投稿(対応方法を案内)
        Skill->>CI: RESULT:UPDATE_REQUIRED(CI失敗)
    end

判定の仕組み

判定は次の3分類に分かれます。

  1. 無関係: NO_IMPACT
    • 検知キーワード(クラス名やパッケージ名など)がPRの差分に含まれない
  2. 影響なし: NO_UPDATE_NEEDED
    • 検知キーワード(クラス名やパッケージ名など)がPRの差分に含まれるが、仕様書への反映の必要が無い
  3. 影響あり: UPDATE_REQUIRED (CI失敗)
    1. 検知キーワード(クラス名やパッケージ名など)がPRの差分に含まれるが、仕様書への反映が必要

例えば、以下のような変更は仕様書更新不要と判定されます。

  • リファクタリングのみ(外部仕様に影響しない内部構造の変更)
  • テストの追加・修正のみ
  • バグ修正(仕様通りに動くようにする修正)

一方、以下は更新必要と判定されます。

  • データ構造・フォーマット・通信仕様の追加・変更
  • 新しい連携先の追加
  • エンティティの構造変更

設定の共有

重要なポイントとして、spec-config.md が**両スキル共通の設定ファイルとして機能しています。検知キーワードや変更判断基準をここに集約することで、検知と生成の整合性が保たれます。

generate-integration-spec: 仕様書生成スキル

こちらが本記事の主役です。コードベースを探索し、その事実に基づいて仕様書を生成・更新します。

使い方

/generate-integration-spec specimen-inspection all
  • 第1引数: 連携種別(例: specimen-inspection
  • 第2引数: 対象の仕様書名(省略時は all
  • -force: 変更検知をスキップして強制生成

オーケストレーション全体像

このスキルの内部では、オーケストレーター(メインのスキル本体)が3つの専門エージェントを順番に起動するマルチエージェント構成を採用しています。

  flowchart TB
      subgraph Orchestrator["オーケストレーター (SKILL.md)"]
          S1["Step 1: 設定読み込み spec-config.md / spec-template.md"]
          S2["Step 2: 変更検知 git diff + .generation-state.json"]
          S3["Step 3: コードベース探索"]
          S4["Step 4: 仕様書生成"]
          S5["Step 5: レビュー"]
          S6["Step 6: 生成状態記録"]
          S7["Step 7: ユーザーへ報告"]
      end

      subgraph Agents["専門エージェント"]
          EA["探索エージェント (explore.md)"]
          GA["生成エージェント (generate.md)"]
          RA["レビューエージェント (review.md)"]
      end

      S1 --> S2 --> S3
      S3 -.->|"Task(Explore)"| EA
      EA -.->|構造化された事実一覧| S3
      S3 --> S4
      S4 -.->|"Task(general-purpose)"| GA
      GA -.->|生成ファイル一覧| S4
      S4 --> S5
      S5 -.->|"Task(general-purpose)"| RA
      RA -.->|"APPROVED / NEEDS_REVISION"| S5
      S5 -->|APPROVED| S6
      S5 -->|"NEEDS_REVISION 最大2回リトライ"| S4
      S6 --> S7

以下、各ステップを詳しく見ていきます。

Step 1: 設定読み込み

2つの設定ファイルを読み取ります。

  • spec-config.md: 連携の概要、検知キーワード、バージョン定義、仕様書構成
  • spec-template.md: 各仕様書のテンプレート(セクション構成や表のフォーマット)

これらのファイルは docs/external-integration/{連携種別}/config/ 配下に配置されており、連携ごとに独立しています。新しい連携種別を追加する場合は、このディレクトリに設定ファイルを追加するだけでスキル本体の変更は不要です。

Step 2: 変更検知

前回の生成時のコミットハッシュを .generation-state.json に記録しており、そこからの差分を git diff で取得します。差分がなければ生成をスキップし、不要な再生成を防ぎます。

{
  "commitHash": "abc1234...",
  "generatedAt": "2026-02-15T10:30:00Z",
  "specs": {
    "v2/overview.md": {
      "commitHash": "abc1234...",
      "generatedAt": "2026-02-15T10:30:00Z"
    }
  }
}

仕様書単位でコミットハッシュを記録しているため、特定の仕様書だけをターゲットにした差分検知も可能です。

Step 3: 探索エージェント

ここからが本スキルの核心部分です。探索エージェントは、コードベースから連携に関する事実を徹底的に収集する専門エージェントです。

flowchart LR
    subgraph Input
        KW[検知キーワード]
        VER[バージョン定義]
    end

    subgraph ExploreAgent["探索エージェント"]
        direction TB
        GrepGlob["Grep / Glob で<br/>キーワード検索"]
        Collect["情報収集"]
        Classify["バージョン分類"]
    end

    subgraph Output["構造化された事実一覧"]
        E1[エンティティ・値オブジェクト]
        E2[リポジトリ]
        E3[サービス・UseCase]
        E4[Enum クラス(全値)]
        E5[GraphQL スキーマ]
        E6[テーブル定義]
        E7[フォーマット実装]
    end

    KW --> GrepGlob
    VER --> Classify
    GrepGlob --> Collect --> Classify --> Output

収集する情報

カテゴリ 収集内容
エンティティ クラス名、パッケージ、主要プロパティ
リポジトリ インターフェースと実装、メソッドシグネチャ
サービス/UseCase クラス名、メソッド、依存関係
Enum 全値を省略せず列挙(値のプロパティ含む)
GraphQL Query/Mutation/Type/Input 定義
テーブル定義 カラム定義、インデックス
ファイルフォーマット 連携ファイルのビルダーやパーサーの実装、フィールド定義

探索エージェントの出力は特別な解釈はせずに、ありのままを出力します。ファイルパスと行番号が必ず含まれ、後続のエージェントがコードを参照できるようになっています。

Step 4: 生成エージェント

生成エージェントは、探索エージェントの出力とテンプレートを組み合わせて仕様書を生成します。

更新の原則

自動生成による更新の問題点として毎回作られる仕様書に小さな表現の差が生まれるというのがあります。これは一定仕方ない部分なので次の仕組みをプロンプトに組み込むことで大幅なテイスト変更などが発生しづらい仕組みにしています。

  • 既存ファイルがある場合は差分更新(変更箇所のみ Edit)
    • 新規ファイルはこの制限を受けない
  • コードから読み取った事実のみを記載
  • 推測が含まれる場合は [要確認] マーカーを付与
    • これを見て人間がレビューをする

生成される成果物(検査システムの例)

docs/external-integration/{連携種別}/
├── config/
│   └── spec-config.md          # 設定(入力)
├── template/
│   └── spec-template.md        # テンプレート(入力)
├── v2/                         # バージョン別ディレクトリ
│   ├── overview.md             # 概要
│   ├── master-data.md          # マスターデータ仕様
│   ├── request-formats.md      # リクエストフォーマット
│   ├── report-formats.md       # 結果報告フォーマット
│   ├── data-flow.md            # データフロー
│   ├── external-spec.md        # 外部公開用仕様書
│   ├── laboratories/           # 連携先別仕様
│   │   ├── lab-a.md
│   │   └── lab-b.md
│   └── sample/                 # CSVサンプル等
└── .generation-state.json      # 生成状態

外部公開用仕様書(external-spec.md)の特別な扱い

external-spec.md は連携先企業や医療機関との打ち合わせで使用する外部向け仕様書です。以下のルールが適用されます。

  • 内部システム名(general-api 等)を含めない
  • 特定の連携先の会社名・システム名を含めない
  • フォーマット名に特定企業名を使わず、技術的特徴で命名する
  • 非技術者にもわかる具体例を併記する
  • 更新履歴テーブルを自動で管理する(版数のインクリメント含む)

Step 5: レビューエージェント

生成された仕様書を、再度コードベースと突合してレビューします。人間のレビュアーと同様に、複数の観点から検証を行います。

flowchart TB
    subgraph Review["レビュー観点(6つ)"]
        R1["正確性<br/>コードとの突合"]
        R2["網羅性<br/>漏れの検出"]
        R3["一貫性<br/>用語の統一"]
        R4["外部公開適切性<br/>内部情報の漏洩チェック"]
        R5["テンプレート準拠<br/>構造の正しさ"]
        R6["[要確認] 検出<br/>マーカーの適切性"]
    end

    Review --> Decision{判定}
    Decision -->|問題なし| Approved["APPROVED<br/>→ Step 6へ"]
    Decision -->|問題あり| NeedsRevision["NEEDS_REVISION<br/>→ 指摘付きで Step 4 へ差し戻し"]

6つのレビュー観点

  1. 正確性: コードと一致するかを実際のコードを検索して突合する
  2. 網羅性: 関連するクラス・メソッド・Enum値が仕様書に漏れなく反映されているか
  3. 一貫性: ドキュメント間で同じ概念に対して異なる用語が使われていないか
  4. 外部公開適切性: 内部実装の詳細(クラス名、パッケージ名等)が外部向け仕様書に漏れていないか
  5. テンプレート準拠: テンプレートで定義された構造に従っているか
  6. [要確認] 検出: 推測に基づく記述に適切にマーカーが付いているか、逆に確認済みの事実に不要なマーカーがないか

リトライ機構

レビューで NEEDS_REVISION が返された場合、指摘事項を生成エージェントにフィードバックし、修正を依頼します。このリトライは最大2回まで行われ、それでも解決しない指摘はユーザーに報告されます。

Step 6-7: 状態記録と報告

生成完了後、.generation-state.json にコミットハッシュとタイムスタンプを記録し、次回の変更検知に備えます。最後にユーザーに生成結果を報告して完了です。

アーキテクチャの設計思想

マルチエージェント構成を選んだ理由

次の観点で、仕様書生成を1つの巨大なプロンプトで行うのではなく、探索・生成・レビューの3つの専門エージェントに分割しました。

  1. コンテキストの分離: 各エージェントが専門領域に集中でき、プロンプトの肥大化を防ぐ
  2. リトライの効率化: レビューで問題が見つかった場合、生成エージェントだけを再実行すれば良い
  3. 並列実行: 探索エージェント内部では、複数のキーワード検索を並列に実行できる
  4. 保守性: 各エージェントのプロンプトは独立したMarkdownファイルとして管理され、個別に改善できる

とはいえ、最初からマルチエージェントで組んだわけでは無くシングルエージェント構成で詰めてからより効率化と堅牢な設計のために途中で分割していきました。

(本当は最初からもう少し設計を詰めてからやるべきだったかなとも思っていますが、まだ初心者なので勘所がわかってない。)

設定ファイル駆動

spec-config.mdspec-template.md を外部設定として分離することで、新しい連携種別を追加する際にスキル本体を一切変更する必要がありません。設定ファイルを追加するだけで、同じオーケストレーションフローが適用されます。

まとめ

generate-integration-spec スキルは、以下の流れで仕様書を自動生成します。

  1. 設定読み込み → 何を探索し、どう仕様書を構成するかを把握
  2. 変更検知 → 不要な再生成を防止
  3. 探索エージェント → コードベースから事実を収集
  4. 生成エージェント → テンプレートに沿って仕様書を生成
  5. レビューエージェント → コードと突合して品質を検証(最大2回リトライ)
  6. 状態記録 → 次回の差分検知に備える

そして spec-change-check スキルがCIでゲートキーパーとして機能し、仕様影響のある変更が仕様書更新なしにマージされることを防ぎます。

この2つのスキルによって、「コードと仕様書が常に同期している」という状態を、開発者に大きな負担をかけることなく維持できるようになりました。

Jagu'e'r データ利活用分科会 #32 Meetup 「複数分科会コラボ企画 ― 各業界のデータ利活用事例スペシャル」で登壇しました

こんにちは、ヘンリーでPMをしているdam(@aki_hiro0038)です。

2026年2月6日、Google Cloud公式ユーザーコミュニティ「Jagu'e'r」のデータ利活用分科会に弊社も参加し、登壇しました。

jaguer.connpass.com

きっかけは私が個人的に所属しているデータ分析系のテックコミュニティで「最近噂になっているヘンリーさん、よかったらJagu'e'rで登壇してみませんか」とお声掛けしてもらったことでした。

ちょうど社内でもデータ分析に力を入れようという動きがあり、組織拡大の中でデータ分析業務や基盤構築を専任で担うメンバーも採用できたタイミングでした。

そこで、ぜひ直近の活動内容を紹介させてほしいと登壇が決まりました。

勉強会の雰囲気

今回は複数分科会コラボ企画ということで、エネルギー分科会から大阪ガスさん、ENEXIA合同会社さん、街づくり分科会から三菱地所株式会社さんが登壇されていました。(ちなみにヘンリーはヘルスケア分科会としての登壇でした。)

コミュニティの方針として、登壇内容は基本コミュニティ内に閉じる考えのため多くは書けませんが、再エネ業界の課題にデータ分析でどう立ち向かっているかというお話や、街(オフィス・商業施設・居住施設など)の価値をどう捉えて向上させていくかなど、どれも興味深いお話ばかりでした。

詳細にご興味のある方は、下記の新規会員登録フォームからぜひコミュニティにご参加ください。

jaguer.jp

また、運営メンバーの高須賀さんより、イベントレポートも公開されておりますので、こちらもご確認ください。

note.com

弊社の登壇内容

弊社からは「カオスな病院のデータにどう立ち向かうか?」というタイトルで、データ分析基盤チームで活躍する吉村が登壇しました。

吉村は異業界から入社したばかりのメンバーですが、退院サマリーなどの書類をデータから自動作成する取り組みや、病院経営を支援するダッシュボードの提案など、データ活用の可能性が医療業界には多くあると感じている点についてお話ししました。

また、それらを実現するために、AI活用も視野に入れた可用性の高いデータ基盤の構築を目指しているが、過去の経緯からデータマートがカオス化してしまっている課題に対して、dbtのYAMLファイルのカラム定義をAIに生成させたり、テーブル構造図をAIに描かせたりと、AIをフル活用して整理を進めているといった具体的な事例も紹介しました。

参加してみて

今回登壇した企業の共通点は、どの会社も「社会インフラ」を構築・維持する事業に取り組んでいることでした。

医療業界以外でも社会の維持にどのような課題があり、どう立ち向かっているのかを直接聞けたのは、大変貴重な機会でした。

また、そうした社会を支えるエンタープライズ企業が並ぶコミュニティに、ヘンリーも一員として参加できたことを嬉しく感じています。

懇親会のご飯もとても美味しかったです

さいごに

ヘンリーでは医療 DX を通じて理想駆動で社会課題解決に取り組むプロダクト開発に興味のある仲間を募集しています!!気になった方は気軽にカジュアル面談へお申し込みください。

jobs.henry.jp

Claude Codeで開発を全自動化する - Orchestrator型Skillの設計と実践

株式会社ヘンリーでソフトウェアエンジニアをしているwarabiです。

ヘンリーは医療業界向けのプロダクトを開発しており、開発メンバーにも難解なドメイン知識が求められます。そのため普段からドメインの理解や深堀りに時間をかけたいところですが、実際は開発業務も進めなければならないため、時間の使い方に悩んでいました。

この課題に向き合うために、普段開発で使っているClaude Code(Anthropic社が提供するCLIベースのAIコーディングアシスタント)をもっとうまく活用し、実装にかける時間を減らして学習に充てる時間を増やせないかと考えました。

それまでのClaudeCodeの使い方と課題

それまでの私のClaude Codeの使い方は、一言で表すとAIとのペアプロです。

AIによるコードの変更をリアルタイムに確認しながらその場で質問もできるため、設計やサービスの理解には役立ちます。

ただ、このやり方だと人間がAIのそばを離れられません。会話のラリーを続けるために生成されたコードをそのつど読む必要があり、別の作業に移りづらい状態でした。

理想の動作を考える

使い方を切り替えるにあたり、まずは普段の業務フローを整理し、自動化できそうな部分を洗い出しました。

開発フローを3フェーズ・7ステップに分解したところ、それまでペアプロで行っていた計画・実装の2ステップに加え、情報収集・PR作成を含む計4ステップを完全に自動化できる可能性があると考えました。

As-Is: 黄色がAIとのペアプロ

To-Be: 緑色をAIで完全自動化

なるべく完走させるために

自動化したい作業がはっきりしたので、次は「どうやってAIに任せるか」を考えます。

ここで活用したのがClaude Code Skillsです。

code.claude.com

Skillsは、Claude Codeに対して特定のタスクの進め方を手順として定義できる仕組みです。

先ほど挙げた「ペアプロから離れられない」という課題の根本は、Claude Codeに一連の作業を任せきれないことにあります。

プロジェクトの前提知識はCLAUDE.md(Claude Codeのプロジェクト設定ファイル)に書けますが、CLAUDE.mdは会話の開始時に常に読み込まれるため、ワークフローのような長い手順まで書くとコンテキストウィンドウを圧迫します。コンテキストが長くなるほど指示が正しく実行されないケースが増えるため、CLAUDE.mdにすべてを詰め込むのは現実的ではありません。

Skillsを使うと、こうしたワークフローを手順書のように定義しつつ必要なときだけ読み込ませることができます。各ステップで何を参照し、どういう判断をし、どんな出力を期待するかを明示しておくことでClaude Codeが一連の流れを人間の介入なしに自走できるようになります。

CLAUDE.mdが「プロジェクトの前提知識」を常に伝えるものだとすれば、Skillsは「作業の進め方」を必要なときだけ渡すものです。ペアプロ型から自動化へ切り替えるにはこのSkillsの活用が適切だと考えました。

オーケストレーター型Skill

Skillsで自動化を実現する方針は固まったので、次は「どのようにSkillを作るか」を考えます。

Skillとはいえ1ファイルに大量の命令を書くと、コンテキストが長くなり指示が正しく実行されない問題が起きます。4ステップすべてを1つのSkillにまとめるのは避けたいところです。

そこで取り入れたのがオーケストレーターという考え方とSubAgent機能(親のAgentから独立したコンテキストで子Agentを実行する仕組み)です。各ステップを独立したSkillとして定義し、呼び出し順だけを管理する親のSkillを用意します。各ステップはSubAgentとして実行されるため親とは別のコンテキストで動作し、ステップごとにコンテキストがリセットされます。

この構成により、各Skillは担当ステップの手順だけを小さなコンテキストで実行できます。ステップ単位での修正や差し替えもしやすくなります。

情報取得Agentや設計Agentは、それぞれの結果を特定のフォルダにファイルとして保存します。AgentはOrchestratorに「処理が完了した」とだけ伝える仕組みです。これによりOrchestratorが調査結果を丸ごと読み込む必要がなくなり、コンテキストの圧迫を防いでいます。

成果物を別のAgentにレビューさせる

オーケストレーターとAgentの組み合わせにより、タスクを与えれば実装完了まで一撃で行えるようになりました。

この時点でSkill構築を完了しても良いのですが、実装の品質をさらに高めるために、Agentの成果物を別のAgentにレビューさせるというアイディアを取り入れました。

エンジニアの普段の開発でも、実装したものはそのまま使わず他者にレビューしてもらいます。この工程をSkillにも流用できると考えました。

親が受け取った成果物をReviewAgentに渡してレビューさせます。問題があればその内容を親に報告し、親が再度Agentに修正を依頼します。

上限回数を設けたうえでこのループを回すことで、レビューを通過するまで品質を高めるようにしました。

最終的なSkill構成

devと名付けたOrchestrator型Skillは最終的に以下のようなフローになりました。

大まかな流れ:

  • ユーザーはdev Skill(Orchestrator)を呼び出し、タスクのIDを渡す
  • タスクの中身を確認・更新したら内容が問題ないかを人間に最終確認
    • 問題なければ後は基本的に全自動で設計・実装・PRまで行う
  • 各ステップには実作業を行うAgentと、レビューを担当するAgentがペアで存在する
    • 作業とレビューを繰り返すことで品質を高める

以前のClaudeCode利用との比較

Skill活用前とSkill活用後でどのような体験の差があるかを整理してみます。

Before
(ペアプロ)
After
(全自動)
感想
作業時間の確保 最終確認にOKを出したら後はVSCodeをバックグラウンドにし、他タスクの情報収集などに時間を充てることができている。
全てではないですが、修正不要でマージできるPRも結構作れている。
開発速度 実担当AgentとレビューAgentを分けたことで全自動でも品質が大きく低下することもない。
実装の理解 ペアプロの頃はリアルタイムに細かな質問もできていたため、時間をかけているぶん実装の理解はペアプロに軍配が上がりました。
ただ、実装完了後のPRレビューはまず作業者である私が行うようにしているので、何も知らないということはなく他者のコードをレビューする時と同等に理解を維持できています。

総括

今回、作業時間を捻出するためにClaude Codeの活用方法を見直しました。

フローの整理、SkillsやAgentの活用、オーケストレーター、フィードバックループ。これらを取り入れたことで使い方を大きく変えることができ、時間の捻出だけでなく開発速度の向上にもつながりました。

まだ日が浅いため今後も調整は必要ですが、一人あたりの作業速度は明らかに向上しており、新しい使い方に切り替えた効果を日々実感しています。

今回Skillの活用によって開発体験は大きく向上しました。このアプローチは実装系業務に限らず、普段の様々な業務にも応用できるはずです。今後もSkillを使った自動化に取り組んでいきたいと考えており、またブログネタが生まれたら投稿しようと思います。

SRE Kaigi 2026 で推しのインフラツールについて聞いてみた

株式会社ヘンリーで SRE をやっている id:nabeop です。

ヘンリーでは SRE Kaigi 2026 でゴールドスポンサーとしてスポンサーブースを出していました。

当日のヘンリーブースの様子

当日は朝からブースにたくさんの方に足を運んでいただき、いろいろなお話ができてとても刺激的な1日を過ごせました。また、SRE Kaigi 2026 の運営スタッフの皆様、素晴らしいカンファレンスをありがとうございました。

今回のヘンリーブースでは会話のきっかけとして、「あなたの推しインフラツールを教えてください!!」というアンケートをしてみました。実はこのアンケートは会期前に社内でも実施していたので、今回は会場での結果と社内での結果をみていきたいと思います。

続きを読む