Claude Codeで電子納品のフォルダ構成をチェックする手順 — 工事の成果品を検査
工事の電子納品で、成果品フォルダの構成・ファイル名・管理ファイルの欠けを検査するスクリプトをClaude Codeに書かせ、指摘を直す手順です。
Claude Codeで電子納品のフォルダ構成をチェックする手順 — 工事の成果品を検査
電子納品の成果品フォルダは、要領が決めたフォルダ名・管理ファイル・ファイル名の規則に合わせて作ります。この規則を表にしてClaude Codeに渡せば、納品フォルダを走査して違反を一覧にするスクリプトを書かせられます。指摘が出たら、同じセッションで直させるところまで回せます。
この記事では国土交通省の「工事完成図書の電子納品等要領」(令和8年2月版)を例に、規約の渡し方、検査スクリプト、実行結果の読み方、直させるときの線引きを順に説明します。写真台帳の作り方は施工写真を仕分けて写真台帳にする手順にあります。ここで扱うのは、写真を含む成果品全体の置き方です。
検査の範囲と、電子納品チェックシステムとの違い
電子納品チェックシステムは、電子成果品の管理ファイル(XML)・ファイル名・フォルダ名が要領に従っているかを確認するシステムです。成果品の中身(報告書やCAD図面の内容)は確認できません。
つまり、自作の検査が肩代わりするのは「提出前の下見」です。本番のチェックシステムを置き換えるものではありません。
役割を分けると次のようになります。
| 確認したいこと | 向いている手段 |
|---|---|
| 要領に沿ったフォルダ構成・ファイル名か | 向いている手段自作スクリプト(下見)と電子納品チェックシステム |
| 管理ファイルの記入項目・XMLの文法 | 向いている手段電子納品チェックシステム |
| 管理ファイルの記述と実ファイルの突き合わせ | 向いている手段電子納品チェックシステム(ファイルの有無確認機能) |
| 成果品の中身の正しさ | 向いている手段人の目(どちらのシステムも見ない) |
要領は契約時期で適用版が分かれます。工事完成図書の電子納品等要領のR8.2版は、令和8年4月1日以降に契約を締結する工事から適用です。それ以前の契約はR5.3版やR4.3版などが対象で、フォルダ名やDTDのバージョンが違う場合があります。検査の前に、手元の工事がどの版かを契約から確かめてください。チェックシステムも要領の改定に合わせて更新され、2026年9月29日に土木版がVer.22.0.0になっています。
要領の構成を表にして規約として渡す
Claude Codeに「電子納品のフォルダを検査して」とだけ頼むと、要領を知らないまま一般的なフォルダ検査を書いてしまいます。先に、検査に使う規則を表にして渡します。R8.2版の本編から、検査に使える部分を抜き出すと次のとおりです。
| 場所 | 置くもの | 命名の規則 |
|---|---|---|
| ルート | 置くものINDEX_C.XMLとINDE_C09.DTD | 命名の規則工事管理ファイルとDTDをセットで電子媒体のルートに置く |
| DRAWINGF | 置くものDRAWINGF.XML、DRAW04.DTD、図面 | 命名の規則図面は001C0XXZ-〜.P21(またはP2Z)の形 |
| REGISTER | 置くものREGISTER.XML、REGIST06.DTD | 命名の規則原本はORGnnn内のREG01_01.XXX 〜 REGnn_mm.XXX |
| BORING | 置くものBORING.XML、BRG0200.DTD | 命名の規則地質ガイドラインに従う |
| OTHRS | 置くものOTHRS.XML、OTHRS05.DTD | 命名の規則原本はORGnnn内。ファイル名8文字以内、拡張子3文字以内 |
| PLAN | 置くものPLAN.XML、PLAN05.DTD | 命名の規則原本はPLA01_01.XXX 〜 PLAnn_mm.XXX |
| MEET | 置くものMEET.XML、MEET05.DTD | 命名の規則情報共有システムで作成するデータ |
| PHOTO | 置くもの写真管理ファイル、PICとDRAのサブフォルダ | 命名の規則写真はPnnnnnnn.JPG、参考図はDnnnnnnn.JPG |
共通の決まりもあります。ファイル名・拡張子・サブフォルダ名は半角英数大文字です。格納するファイルがないフォルダは作らなくて構いません。OTHRSやDRAWINGFに任意のフォルダやファイルを作るときは、Windows予約語(CON、PRN、AUX、NUL、COM1〜COM9、LPT1〜LPT9、CLOCK)を単体の名前にしてはいけません。名前の一部に含む分には問題ありません。
この表をそのままCLAUDE.mdに置きます。工事ごとの版を書いておくと、別の工事のフォルダで別版の規則を持ち込む事故を防げます。
# 電子納品の検査(この工事のルール)
- 適用要領: 工事完成図書の電子納品等要領 R8.2(令和8年4月1日以降契約)
- 検査対象は納品媒体のルート。検査スクリプトは check_deliverable.py
- 規則は上の表のとおり。表にない規則を推測で足さない
- 納品フォルダ(out/)のファイルはスクリプトで直接書き換えない
- 判断に迷う指摘は「要確認」として出し、自動修正しない最後の2行が効きます。「表にない規則を推測で足さない」と書いておけば、Claude Codeが他案件の慣習をチェック項目に混ぜるのを抑えられます。
検査スクリプトを書かせる
規約を渡したら、依頼は具体的にします。
CLAUDE.md の表に沿って、納品媒体のルートを走査する check_deliverable.py を
標準ライブラリだけで書いてください。
- 欠けている管理ファイルとDTDを NG で出す
- ORGnnn 内とPHOTO/PIC, PHOTO/DRA のファイル名規則を検査する
- Windows予約語を単体で使った名前を NG にする
- 表にないルート直下の項目は WARN にする
- NG が1件でもあれば終了コード1Claude Codeが書くスクリプトの形は毎回変わります。参考として、上の依頼に対して妥当な形の一例を載せます。この例は、サンプルの納品フォルダに対して実行して動作を確かめたものです。
#!/usr/bin/env python3
"""電子納品(工事)の成果品フォルダ検査。使い方: python3 check_deliverable.py <媒体ルート>"""
import re, sys
from pathlib import Path
ROOT_FILES = ("INDEX_C.XML", "INDE_C09.DTD")
FOLDERS = { # フォルダ: (管理ファイル, DTD)
"DRAWINGF": ("DRAWINGF.XML", "DRAW04.DTD"),
"REGISTER": ("REGISTER.XML", "REGIST06.DTD"),
"BORING": ("BORING.XML", "BRG0200.DTD"),
"OTHRS": ("OTHRS.XML", "OTHRS05.DTD"),
"PLAN": ("PLAN.XML", "PLAN05.DTD"),
"MEET": ("MEET.XML", "MEET05.DTD"),
}
ORIG_NAME = { # ORGnnn 内のファイル名規則
"REGISTER": re.compile(r"^REG\d{2}_\d{2}\.[0-9A-Z]+$"),
"PLAN": re.compile(r"^PLA\d{2}_\d{2}\.[0-9A-Z]+$"),
"OTHRS": re.compile(r"^[0-9A-Z]{1,8}\.[0-9A-Z]{1,4}$"),
}
ORG_DIR = re.compile(r"^ORG\d{3}$")
RESERVED = {"CON", "PRN", "AUX", "NUL", "CLOCK",
*{f"COM{i}" for i in range(1, 10)}, *{f"LPT{i}" for i in range(1, 10)}}
def check(root: Path):
out = []
def ng(p, msg):
out.append(f"NG {p.relative_to(root)}: {msg}")
for f in ROOT_FILES:
if not (root / f).is_file():
out.append(f"NG {f}: ルートにありません")
for d, (xml, dtd) in FOLDERS.items():
p = root / d
if not p.is_dir():
continue # 格納するファイルが無いフォルダは作らなくてよい
for f in (xml, dtd):
if not (p / f).is_file():
ng(p, f"{f} がありません")
if d not in ORIG_NAME:
continue
for sub in sorted(x for x in p.iterdir() if x.is_dir()):
if not ORG_DIR.match(sub.name):
ng(sub, "サブフォルダ名は ORGnnn(半角英数大文字)")
continue
for f in sorted(sub.iterdir()):
if not ORIG_NAME[d].match(f.name):
ng(f, "ファイル名の規則に合いません")
for sub, pat in (("PIC", r"^P\d{7}\.[0-9A-Z]+$"), ("DRA", r"^D\d{7}\.[0-9A-Z]+$")):
for f in sorted((root / "PHOTO" / sub).glob("*")):
if not re.match(pat, f.name):
ng(f, f"PHOTO/{sub} の命名規則に合いません")
for p in sorted(root.rglob("*")):
if p.stem.upper() in RESERVED:
ng(p, "Windows 予約語を単体で使っています")
known = {*ROOT_FILES, *FOLDERS, "PHOTO", "ICON", "BIMCIM"}
for p in sorted(root.iterdir()):
if p.name not in known:
out.append(f"WARN {p.name}: 規定外(保管管理システムには登録されません)")
return out
if __name__ == "__main__":
r = check(Path(sys.argv[1]))
print("\n".join(r) or "OK")
sys.exit(1 if any(x.startswith("NG") for x in r) else 0)実際の工事に使うときは、次の点を直す余地があります。
- 予約語の検査をOTHRSとDRAWINGFの任意ファイルに絞る(例では全体に掛けている)
- BORING配下のサブフォルダ(DATAやLOGなど)の検査を足す
- MEETとPHOTOの管理ファイルの有無も見る
- 写真だけを納品する媒体はDTDがINDE_C08.DTDの図になっているので、媒体の種類で分ける
実行して出力を読む
検査の対象は、納品用のフォルダを作る前の作業フォルダでも構いません。CLAUDE.mdに書いたとおり、スクリプトは読むだけで書き換えません。
python3 check_deliverable.py out/わざと違反を仕込んだサンプルに実行すると、次のような出力になります。
NG INDE_C09.DTD: ルートにありません
NG OTHRS/ORG001/LONGNAME01.PDF: ファイル名の規則に合いません
NG PLAN/ORG001/plan_final.pdf: ファイル名の規則に合いません
NG PHOTO/PIC/P000002.JPG: PHOTO/PIC の命名規則に合いません
NG OTHRS/ORG001/CON.PDF: Windows 予約語を単体で使っています
WARN MISC: 規定外(保管管理システムには登録されません)読み方のポイントは3つです。
- ルートの欠けは最優先で直します。INDEX_C.XMLとINDE_C09.DTDは組で置くものです
- ファイル名の規則違反は、小文字・桁数・8文字超が主な原因です。plan_final.pdfはPLA01_01.PDFに直します
- WARNは判断が要ります。要領にないフォルダは、チェックシステムで「【注意】」として表示されます
直したあとの再実行では、前の出力から行が減っているかを見ます。plan_final.pdfをPLA02_01.PDFに、P000002.JPGをP0000002.JPGに、CON.PDFをCON1.PDFにそれぞれ直し、INDE_C09.DTDを足して再実行すると、残るのは次の2行です。
NG OTHRS/ORG001/LONGNAME01.PDF: ファイル名の規則に合いません
WARN MISC: 規定外(保管管理システムには登録されません)LONGNAME01.PDFは拡張子を除いて10文字あり、OTHRSの8文字以内を超えています。名前を詰めるのが基本ですが、元の名前に意味がある資料なら、zipにまとめて8文字以内の名前で格納する選択肢もあります。MISCは要領にないフォルダなので、中身をOTHRSのORGnnnに移すか、納品物から外すかを受発注者で決めます。この2つはClaude Codeが決めることではなく、一覧にして人に返させる指摘です。
WARNの扱いは、2023年3月23日の案内が参考になります。チェックシステムは土木Ver18.1.0から、管理ファイルに記載のないフォルダとファイルの有無を調べます。要領にない任意のフォルダを置くと、XMLに記載のないフォルダは保管管理システムに登録されないという趣旨の【注意】が表示されます。エラーではありませんが、オンライン電子納品では発注者の手元に電子媒体が残らないため、登録されないデータは保管されない扱いになります。
保管したいデータが要領の規定によりがたいときは、受発注者で合意したうえで、工事ならOTHRSフォルダに格納します。業務は報告書のオリジナルデータ扱いでREPORT/ORGに入れます。該当のデータはzipに圧縮します。
本物の納品物を使わずにスクリプトを試す
検査スクリプトは、本物の工事データで初めて動かさないほうが安全です。違反を仕込んだ疑似フォルダを先に作らせます。個人名や工事名の入った実データをClaude Codeに見せずに済み、スクリプトが違反を見逃さないことも確かめられます。
mkdir -p d/PLAN/ORG001 d/OTHRS/ORG001 d/PHOTO/PIC d/MISC
touch d/INDEX_C.XML d/PLAN/PLAN.XML d/PLAN/PLAN05.DTD \
d/PLAN/ORG001/plan_final.pdf d/OTHRS/ORG001/CON.PDF \
d/PHOTO/PIC/P000002.JPG d/MISC/x.txt
python3 check_deliverable.py d依頼文は「違反ごとに1件ずつ仕込んだフォルダを作り、期待する指摘の一覧と実行結果を突き合わせて」とします。突き合わせで一致しない行があれば、スクリプト側に見逃しか誤検出があります。期待値はClaude Codeに書かせず、要領の表を見ながら人が決めると、同じ思い違いが両方に入るのを避けられます。
指摘を直させるときの線引き
指摘が出たら、続けてClaude Codeに直させます。ただし、直してよいものと人が判断するものを分けます。
指摘を直す前の確認
- Q名前だけを直せば済む指摘か?答えが中身の判断が要るので人が決める答えがはい
ファイル名の大文字化や連番の付け直しは、名前を変える作業です。管理ファイル(XML)に書かれた名前も一緒に直す必要があるかを確かめます。
- Q管理ファイルの記述と一致しているか?答えがXMLを直すか名前を戻すかを人が決める答えがはい
名前だけ変えると、管理ファイルの記述と実ファイルが食い違います。ファイルの有無はチェックシステムの確認機能で最終的に見ます。
直してよい
直す前後で検査を再実行し、NGが減ったことを出力で確かめます。
直させる範囲は、作業用のコピーに限ります。納品用に確定したフォルダを守るなら、設定で書き込みを止められます。権限の評価順はdenyが先で、denyに一致した操作はallowがあっても止まります。
{
"permissions": {
"allow": ["Bash(python3 check_deliverable.py *)"],
"deny": ["Edit(/out/**)"]
}
}これは .claude/settings.json に置く例です。Edit の規則は、ファイルを編集する組み込みツール全般に掛かります。cat や ls、grep などの読み取り専用コマンドは、もともと許可なしで動くので、検査の実行だけをallowに足せば済みます。
落とし穴
Bash経由の書き換えは Edit の規則で止まらない場合がある
Edit の規則が掛かるのは、ファイルを編集する組み込みツールです。mv や sed -i をBashで実行された場合の扱いは、Bashの規則側で決まります。納品フォルダを確実に守るなら、Bash(mv *) などのdenyも併せて検討します。
まとめ
検査スクリプトが見るのは、名前と置き場所という機械的に決まる部分だけです。それを毎回人の目で数えていた時間が、提出前の下見に置き換わります。成果品の中身と、管理ファイルの記入内容、最終のチェックシステムでの確認は、これまでどおり人と公式のシステムの仕事です。
規約をCLAUDE.mdの表にしておけば、工事が変わっても版の欄を書き換えるだけで同じ検査を使い回せます。要領の改定があったときは、表の該当行から先に更新します。
関連して、マスタの重複と欠落をスクリプトで洗う進め方はJANコードのチェックデジット検算でも同じ型を使っています。書類作成のどこまでを任せるかは施工体制台帳・安全書類の記事で整理しています。