(続)Lattixで指摘したアーキテクチャルール違反を生成AIに修正させてみた(Lattixの設計ルールをAI指示に使う)

Lattix

(あらすじ)今回は、前回の記事から発展させて、Lattixで管理している設計ルールをAIの指示に活用した場合の検証結果を示す内容となっています。

はじめに

前回の記事では、アーキテクチャルール違反をAIに修正させることが可能であることが確認できました。
実は前回の記事の公開直前、この記事の内容をお客様にご紹介したところ、

せっかくLattixにアーキテクチャルールを設定しているのだから、AIへの指示プロンプトに対して、「アーキテクチャルール」自体を設計意図として与えればいいのではないか。

とのご指摘をいただきました。

ご指摘の箇所は、前回の記事「AIとのやりとり」の以下の部分になります。

○レイヤー設計

~~~~~(中略)~~~~~

基本的に下位レイヤーから上位レイヤーへの依存は禁止です。
すなわち、各レイヤーのファイルや関数、変数の依存関係において、
app配下からview配下
app配下からmodel配下
view配下からmodel配下
への依存は許可。
一方で
view配下からapp配下
model配下からapp配下
model配下からview配下
への依存は禁止です。

今回の記事ではLattixのアーキテクチャルールもAIへの指示プロンプトに与えた場合、AIは正しくプロンプトに従いルール違反箇所を修正できるのか、検証してみた結果について紹介します。

内容

前回記事との違い

前回記事との違いは以下の3点であり、最初の2点が主な変更点です。

  • AIへの入力プロンプトの修正
  • 添付ファイルの修正(「ルール違反レポート」に加えて、「ルールレポート」も添付)
  • 使用モデルの変更(Claude Opus 4.6の利用)

※使用モデルはClaude Opusの利用が可能となったため、開発で使用するお客様の利用条件に近づけるために変更しています。

初期コードや初期コードにおけるルール違反の有無については、前回の記事をご確認ください。

なお、「ルールレポート」はプロジェクトに設定されている設計ルールそのものであり、「ルール違反レポート」は違反した箇所の指摘レポートです。
また、ルールやルール違反が変わってもプロンプト本文が変わらないよう、入力プロンプトではファイル形式で渡しています。
ルールレポートの説明」や「検証記録」は本記事最後尾「Appendix」に記載しております。

結果と結論

後述に示す検証記録の通り、Lattixの設計ルール(アーキテクチャルール)をAIへの指示に含めた結果、AIはそれに従った実装をおこなうことができました。
これにより、Lattixは、AI駆動開発において、従来のアーキテクチャルール管理と違反検出の機能に加え、設計ルール自体も活用が可能ということになります。
もちろん、今回は小さなサンプルでの検証にすぎません。しかし、実際の開発との違いはコードの規模だけであることから、今回の利用方法は実際の開発にも活かすことは可能と考えられます。

終わりに

昨今のソフトウェア開発では、実装をAIに任せるケースが増えてきています。
これにより、「実装はAIが行い、人間はその動きを制御・監視する」というAIとの役割分担が可能になります。その結果、人間は本来注力すべき「ソフトウェアの品質向上」に専念できるようになるでしょう。
この実現のためにも、Lattixを使ったルール管理・運用のユースケースをぜひご活用ください。

Appendix

検証記録

AIへの入力プロンプト

今回AIへ入力したプロンプトは以下の通りです。

○前提
以下、ルールレポートとルール違反レポートは異なるものです。
ルールレポートは、設計上指定されているアーキテクチャルールを示したものです。
レイヤー間、サブシステム(フォルダ)間、ファイル間、関数間などに対するアーキテクチャルールが示されています。

ルール違反レポートは、実際に発生しているアーキテクチャルール違反を指摘したものです。

○レイヤー設計
レイヤーは上位から
app :アプリケーション層。
view :UI表示を行う層。
model :データを管理する層。データはここで保持する。

となっています。

基本的に下位レイヤーのファイルや関数、変数から上位レイヤーへの依存は禁止です。

具体的にはLattixのルールレポートをご確認ください。

○Lattixのルールレポートの読み方
レポートのプロパティがヘッダー(冒頭7行程度)として記載されていますが無視してください。
9行目あたりにある「ルール」が重要な内容です。
「ルール」ではアーキテクチャルールが示されています。
この読み方は以下になります。
列1「ソース (Source) / コンシューマー (Consumer)」は依存元サブシステムを表します。
列2:「ルール」はルールの種類を示します。ルールには依存禁止(cannot-use)、依存許可(can-use)、依存強制(must-use)があります。
列3:「ターゲット (Target) / プロバイダー (Provider)」は依存先サブシステムを表します。

なお、最初の$rootの3行はLattixのデフォルトルールであり、システム設計とは無関係のため、
無視してください。(以下の3行です。)これはLattixの解析コード外への依存ルールを示したものです。
$root                                          can-use                                  $root                                    
$root                                          can-use                                  multidef.**                              
$root                                          can-use                                  unresolved.**                            

なお、同じサブシステムに関するルールが設定されている場合は、階層が深い方のルールが優先です。
一般的には階層が浅い方のルールはレイヤーやサブシステム間における設計ルールを示しており、
階層が深いルールはその例外ルールとして設定されています。

○実際のルールレポート
添付の「layer_sample_ルール.txt」がルールレポートです。


○ルール違反の修正依頼

以下はルールレポートに記載されたアーキテクチャルールに違反(すなわち、ルール違反)
となる依存関係をチェックツール(Lattix)から取得したレポートです。
layer_sample_CustomReports_ViolationswithLineNumbersCustom.txt

これはLattixの行番号付きアーキテクチャルール違反のレポートです。
上記レイヤー設計に対し、違反した依存関係が列挙されています。

この違反レポートを基にソフトウェアの動作が変わらないことを前提に、
ソースコードを修正いただけますか。

GitHub Copilotに入力プロンプトを入力している様子

AIの回答

GitHub Copilot: 


Created 4 todos

[](file:///c%3A/work/work_ltxFunc/layer_sample/model/model.c) の読み取り

[](file:///c%3A/work/work_ltxFunc/layer_sample/app/main.c) の読み取り

[](file:///c%3A/work/work_ltxFunc/layer_sample/model/model.h) の読み取り

[](file:///c%3A/work/work_ltxFunc/layer_sample/view/view.c) の読み取り

[](file:///c%3A/work/work_ltxFunc/layer_sample/view/view.h) の読み取り

Starting: *Analyze architecture violations* (2/4)

違反レポートの内容を分析し、コードを確認しました。
違反は全て model.c が上位レイヤー(app、view)に依存していることに起因します。

**違反一覧:**
1. model.c → view.h のInclude(model→view依存)
2. model.c の `multiplyVariable()` → `modelVariable2`(app層に帰属)
3. model.c の `sumVariable()` → `getModelVariable3()`(app層に帰属)
4. model.c の `sumVariable()` → `modelVariable2`(app層に帰属)

根本原因は model.h でグローバル変数を **定義**(`int modelVariable2 = 200;`)しているため、Lattixが変数の所属をapp層に帰属させてしまうことです。修正方針として、`model.h` を `extern` 宣言に変更し、実体を model.c に移動します。また、view.c には model.h の正式なインクルードを追加します(view→model依存は許可されている)。 

Starting: *Fix violations preserving behavior* (3/4)

[](file:///c%3A/work/work_ltxFunc/layer_sample/model/model.h), [](file:///c%3A/work/work_ltxFunc/layer_sample/model/model.c), [](file:///c%3A/work/work_ltxFunc/layer_sample/view/view.c) 内の 15 行を 18 行で置き換えています


```

```

```

```

```

```
修正を確認します。    

[](file:///c%3A/work/work_ltxFunc/layer_sample/model/model.h) の読み取り

[](file:///c%3A/work/work_ltxFunc/layer_sample/model/model.c) の読み取り

[](file:///c%3A/work/work_ltxFunc/layer_sample/view/view.c) の読み取り

[](file:///c%3A/work/work_ltxFunc/layer_sample/app/main.c) の読み取り

Completed: *Fix violations preserving behavior* (3/4)

全4つの違反を修正しました。以下が変更内容です。

---

### 修正内容

**1. model.h — グローバル変数を `extern` 宣言に変更**

- `int modelVariable1 = 200;` → `extern int modelVariable1;`
- `int modelVariable2 = 200;` → `extern int modelVariable2;`

ヘッダーで変数を**定義**していたため、インクルードされるコンパイル単位にLattixが変数の所属を帰属させてしまい、`modelVariable2` が main.c に属すると判定されていました。`extern` 宣言に変更し、所有権を明確にしました。

**2. model.c — 変数の実体定義を追加**

- `int modelVariable1 = 200;` と `int modelVariable2 = 200;` をmodel.c内に定義。

これにより、両変数はmodel層(model.c)に明確に属するようになり、**違反2, 3, 4**(model→app依存)が解消されます。`getModelVariable3()` も元々 model.c 内の `static` 関数なので、model層内に閉じています。

**3. view.c — model.h のインクルードを追加**

- `#include "model.h"` を追加。

view.c は `multiplyVariable()` と `sumVariable()` を呼び出していますが、model.h をインクルードしていなかったため、暗黙的な関数宣言に依存していました。view→model依存はルール上許可されているため、明示的にインクルードすることで正しい依存関係を確立しました。これにより**違反1**(model→view依存の原因となっていたインクルードの不整合)も解消されます。

---

### アーキテクチャ依存関係(修正後)

```
app/main.c → view/view.h     ✅ (app→view: 上位→下位、許可)
view/view.c → view/view.h    ✅ (同一レイヤー)
view/view.c → model/model.h  ✅ (view→model: 上位→下位、許可)
model/model.c → model/model.h ✅ (同一レイヤー)
```

下位→上位の依存は一切なく、ソフトウェアの動作(出力結果)は変わりません。

Made changes.

修正されたコードにおけるルール違反の有無確認

上述の通り、GitHub Copilotによりコードが修正されました。
修正されたソースコードをUnderstand、Lattixで再解析した結果が以下になります。

DSMの結果を見ると、前回と同様、modelやviewからappへのルール違反となる逆依存が綺麗に解消されていることが分かります。
また、更新レポートでは変更内容が確認でき、新たなルール違反がないこと、解消されたルール違反が4件(すべて)であることを確認できます。

DSM(プロジェクト更新後)

更新レポート

更新レポート(削除された要素)

更新レポート(追加された要素)
更新レポート(変更された要素)
新たなルール違反
解消されたルール違反

ルールレポートの説明

ルールレポートとは、設定したアーキテクチャルールを出力したものです。

2つのレポートの違い

前回、今回記事で使われているレポートは以下の通りです。名称が似ているためご注意ください。

項目内容備考
ルールレポートLattixに設定されているアーキテクチャテクチャルールを出力cannot-useルールはサブシステム単位で設定される傾向にある。
can-useルールは配下の要素間で設定される傾向にある。
ルール違反レポートルールに違反した依存関係、および違反対象のアーキテクチャルールを出力cannot-useルールに違反した依存関係が出力される。

※Lattixのmust-useルールはソースコードのリバースエンジニアリングで使うことは少ないため、説明を割愛しています。

今回使用したサンプルコードは、前回記事と同じですが、アーキテクチャルールレポート「layer_sample_ルール.txt」が追加されています。

「ルールレポート」の出力の仕方

ルールレポートは、[レポート]-[その他のレポート]-[ルール]にチェックを入れ、[OK]ボタンを押すことで出力可能です。

[レポート]-[その他のレポート]
[ルール]にチェックし、OKを押す

出力されたレポートを右クリックし、[レポートの保存]からtxt形式で保存する

実際に出力されたルールレポート

レポート生成日時: 2026/03/16 15:39:21
ユーザー名: TechMatrix
プロジェクト名: layer_sample.und
フィルター設定: デフォルト フィルター
プロジェクト ファイル名: C:\work\work_ltxFunc\layer_sample\layer_sample.ldz
最終更新日時: 2026/03/16 15:35:36
C/C++ (Understand) の総サイズ: 65 lines

ルール
ソース (Source) / コンシューマー (Consumer)              ルール                                      ターゲット (Target) / プロバイダー (Provider)       
$root                                          can-use                                  $root                                    
$root                                          can-use                                  multidef.**                              
$root                                          can-use                                  unresolved.**                            
C:.work.work_ltxFunc.layer_sample.model        cannot-use                               C:.work.work_ltxFunc.layer_sample.app    
C:.work.work_ltxFunc.layer_sample.model        cannot-use                               C:.work.work_ltxFunc.layer_sample.view   
C:.work.work_ltxFunc.layer_sample.view         cannot-use                               C:.work.work_ltxFunc.layer_sample.app