フリーランスSEの納品検収怪談
- 山崎行政書士事務所
- 1 時間前
- 読了時間: 14分

――山崎行政書士事務所事件簿
山崎行政書士事務所では、夜になると音が増える。
古い複合機が眠れない犬のように唸る。換気扇が遠くの雨みたいに鳴る。そして所長の山崎が、誰も聞いていないのに「もう一杯だけお茶を」と呟く。
その夜は、特に妙だった。
午後十時四十四分。
事務所の照明が一度だけ瞬いた。
さくらが湯飲みを持ったまま固まった。
「先生、今の……」
山崎は真顔で言った。
「怪談の時間だね」
しょうこは契約書をめくりながら言った。
「先生、怖がる前に節電設定を確認してください」
陽翔はノートPCから顔を上げた。
「電気より怖いものがあります」
「何ですか?」
「納品したはずの成果物が、先方のAzure環境から消えた、という相談メールです」
その瞬間、事務所の引き戸が勢いよく開いた。
入ってきたのは、雨に濡れた若い男性だった。黒いリュックを背負い、片手にノートPC、もう片方にコンビニの袋。袋の中からは、なぜか大量のプリンが見えていた。
「すみません、夜分に! 納品物が消えたんです!」
山崎は湯飲みを置いた。
「プリンではなく?」
「プリンは差し入れです! 僕の成果物が、先方のAzure環境で消えたんです!」
男性の名は、成瀬透。
フリーランスSE。業務アプリのAPI連携やクラウド環境の構築を請け負っている。
今回、成瀬は中堅物流会社「東海ロジリンク」から、在庫照会APIの改修と管理画面の追加開発を受託していた。
納期は月曜。納品は金曜夜。月曜朝、先方から届いたメールはこうだった。
納品物がAzure環境に存在しません。納品未了として扱います。検収不能のため、報酬支払は保留します。
成瀬は震える声で言った。
「僕、納品しました。Gitにもあります。ZIPもアップしました。先方の担当者も“見ます”って言ったんです。でも今日、Azure上にないって」
しょうこは椅子を勧めた。
「まず、怒りと恐怖を分けましょう」
「分けられません」
「では、プリンと契約書を分けましょう」
成瀬はコンビニ袋からプリンを出した。
十個あった。
山崎が目を輝かせた。
「これは証拠ですか」
成瀬は真剣に言った。
「いえ、精神安定剤です」
陽翔がノートPCを開いた。
「私はGit、Azure Storage、アクセス権限、ログを確認します」
しょうこは契約書を受け取った。
「私は業務委託契約の納品定義、検収期限、瑕疵対応、再委託条項を見ます」
山崎はプリンを見た。
「私は……」
しょうこが即答した。
「食べるのは検収後です」
山崎は肩を落とした。
「今夜も検収が重い」
1 消えたZIP
成瀬が持ってきた契約書は、薄かった。
薄すぎる契約書には、たいてい重い問題が隠れている。
しょうこは一ページ目をめくった。
業務内容:在庫照会API改修および管理画面追加開発納期:5月10日納品方法:発注者指定のクラウド環境へアップロード検収:発注者が確認する瑕疵対応:必要に応じて対応する再委託:必要に応じて協議する
しょうこは、そこで手を止めた。
「山崎先生」
「はい」
「怪談の入口です」
山崎が頷いた。
「“必要に応じて”が出ましたか」
「出ました。しかも二回」
成瀬は不安そうに聞いた。
「やっぱり、僕が不利ですか」
しょうこは首を振った。
「不利かどうかを決める前に、何が曖昧かを確認します。納品物の定義、納品完了の時点、検収期限、不合格通知の方法、瑕疵対応の範囲、追加作業か無償修正か、再委託先の確認。全部が薄いです」
陽翔は成瀬のPCでGit履歴を確認した。
ブランチ名は、delivery/stock-api-v2。
コミットは17件。最後のコミットメッセージは、
final delivery package and deployment notes
時刻は金曜22時11分。
陽翔は画面を見て言った。
「Git上では、納品パッケージを作った履歴があります。ZIPファイル、手順書、設定サンプル、変更一覧、テスト結果。少なくとも“作っていない”とは言いにくいです」
成瀬は少し息を吐いた。
「よかった……」
「まだです」
陽翔は続けた。
「作ったことと、相手環境へ納品したことは別です」
山崎が言った。
「料理したことと、相手の家に届けたことは別、ということだね」
さくらがプリンを見ながら言った。
「プリンも冷蔵庫に入れるまでが納品です」
しょうこが言った。
「今日は例えが甘いですね」
成瀬はAzureの納品用ストレージへのアップロード記録を見せた。
納品先は、東海ロジリンクが用意したAzure Storageのコンテナ。
inspection-drop
成瀬は金曜22時28分、そこへZIPをアップロードしたという。
ファイル名は、
stock_api_v2_delivery_20260510.zip
だが、今はない。
コンテナは空だった。
さくらが小声で言った。
「消えた……」
複合機が、タイミング悪く小さく唸った。
山崎が言った。
「これは確かに怪談の香りがしますね」
陽翔は冷静に答えた。
「香りではなく、ログを見ます」
2 Azureの夜道
陽翔は、成瀬の権限で見られる範囲を確認した。
成瀬には、納品用コンテナへのアップロード権限だけがあった。読み取りはできる。削除はできない。タグ付け権限はない。管理者権限もない。
「成瀬さんは、このファイルを削除できない設定ですね」
「はい。先方が“納品者は消せないようにしてあるから安心”って」
「安心ではあります。ただ、誰が消せるかを確認しないと、別の意味で不安です」
陽翔は、東海ロジリンクの担当者から送られてきた限定ログを確認した。
そこには、金曜夜の記録があった。
22:28PutBlobファイル名:stock_api_v2_delivery_20260510.zip実行者:成瀬透
22:31GetBlob実行者:vendor-checker-app
22:32SetBlobTags実行者:vendor-checker-appタグ:status=pending
翌日 00:05DeleteBlob実行者:inspection-cleaner-func
成瀬は画面を見て、声を失った。
「消したの、僕じゃない……」
陽翔はうなずいた。
「はい。ログ上は、東海ロジリンク側の自動処理が削除しています」
山崎が眉を上げた。
「検収掃除係?」
「名前からすると、検収前フォルダを掃除するAzure Functionのようです」
さくらが言った。
「夜中に掃除する怪談ですね」
しょうこは契約書を見た。
「問題は、その掃除が契約上どう位置づけられているかです」
陽翔は、もう一つのログを見つけた。
inspection-cleaner-func は、status=pending のまま二時間を超えたファイルを削除する設定だった。
ところが、納品されたZIPに status=accepted を付ける権限は、東海ロジリンクの検収担当だけが持っていた。
成瀬には付けられない。
「つまり、成瀬さんが納品した後、先方の検収担当が二時間以内にタグを変更しなければ、自動削除される仕組みです」
山崎は真顔で言った。
「それは、冷蔵庫に入れて二時間で捨てるプリンみたいなものだね」
さくらが青ざめた。
「恐ろしい仕組みです」
成瀬は震える声で言った。
「でも、そんなルール、聞いていません」
しょうこは契約書を閉じた。
「契約書にもありません」
事務所の空気が、恐怖から別の重さへ変わった。
幽霊ではない。
人間が決めなかったルールが、夜中に動いただけだった。
3 検収担当は誰だったのか
東海ロジリンクの担当者、柏木とのオンライン会議は、翌朝に行われた。
柏木は疲れた顔をしていた。
「当社としては、納品物が見当たらないので検収できません」
しょうこは穏やかに言った。
「納品物が見当たらないことと、納品されなかったことは同じではありません」
柏木は黙った。
陽翔が画面を共有した。
「ログでは、成瀬さんが金曜22時28分に納品ZIPをアップロードしています。22時31分に御社のvendor-checker-appが取得し、22時32分にstatus=pendingタグを付けています。翌日0時5分、御社のinspection-cleaner-funcが削除しています」
柏木の顔色が変わった。
「そんな処理が……」
「社内に確認してください」
数分後、柏木は戻ってきた。
「検収フォルダの自動掃除処理です。古い未承認ファイルを消すためのものです」
しょうこが聞いた。
「成瀬さんには、その二時間ルールを伝えていましたか」
「……いいえ」
「成瀬さんが承認タグを付けられないことは?」
「はい。納品者には付けられません」
「では、誰が承認タグを付ける予定でしたか」
柏木は目を伏せた。
「当社の検収担当です」
「検収担当は、金曜夜に確認できる体制でしたか」
「いえ。週明け確認の予定でした」
沈黙。
山崎が湯飲みを置いた。
「つまり、週明けに見る予定のファイルを、土曜の深夜に自動で捨てる仕組みだったわけですね」
柏木は何も言えなかった。
成瀬は、怒りで声を震わせた。
「僕は、納期に間に合わせるために金曜の夜に上げました。週明け確認だと言われたから、安心していました。それなのに……」
しょうこは成瀬の方を見た。
「その怒りは正当です。ただ、今は事実を整理します」
柏木は小さく言った。
「社内では、再委託先のレビューも必要でした」
しょうこの目が鋭くなった。
「再委託先?」
「検収レビューを、別会社のクラウド監査チームに見てもらう予定でした」
しょうこは契約書を開いた。
「この契約では、再委託について“必要に応じて協議する”とだけあります。成瀬さんに、再委託先の関与、アクセス範囲、秘密保持、検収への関与を説明していましたか」
柏木は首を振った。
「していません」
成瀬は目を見開いた。
「僕のコード、別会社が見る予定だったんですか」
柏木は慌てた。
「レビューだけです。持ち出しではなく……」
しょうこは遮らず、静かに言った。
「説明がなければ、不安になるのは当然です」
山崎が言った。
「検収の怪談は、幽霊ではなく、知らされていない登場人物が増えることで怖くなるんですね」
4 消えた成果物の帰還
それでも、問題が残っていた。
削除されたZIPは、戻せるのか。
陽翔は、バックアップや論理削除の設定を確認するよう柏木に依頼した。
しばらくして、東海ロジリンクのクラウド管理者が会議に参加した。
「Blobの論理削除が有効でした。削除されたファイルは復元できます」
成瀬は椅子に崩れ落ちそうになった。
「戻るんですか」
「はい。ただし、こちらの運用ミスです」
復元されたZIPのハッシュ値は、成瀬のローカル保存分と一致した。
Gitの最終コミットから生成されたZIPとも一致した。
陽翔は言った。
「これで、成果物の同一性を説明できます」
山崎が感心したように言った。
「怪談の死体が、同じ本人だと確認されたわけだ」
しょうこが即座に言った。
「先生、表現が怖すぎます」
復元されたZIPを、今度は新しいコンテナへ移した。
コンテナ名は、
inspection-fixed
自動削除なし。検収担当と成瀬の双方が閲覧可能。成瀬は削除不可。検収担当は検収結果をメモとして残す。検収期限は五営業日。不合格の場合は、具体的な不適合と根拠を通知する。
柏木は、深く頭を下げた。
「成瀬さん、申し訳ありません。納品未了という表現は撤回します」
成瀬はしばらく黙っていた。
「未払いは?」
柏木は言った。
「基本納品分は検収手続を進めます。検収期限を五営業日とし、不合格がない場合は支払処理に進めます」
しょうこはすぐに言った。
「その内容は、メールで残してください」
柏木はうなずいた。
「はい」
山崎がプリンを見た。
「では、そろそろこちらも復元しますか」
さくらが言った。
「冷蔵庫に保全してあります」
陽翔が真顔で言った。
「プリンの保全は完璧です」
5 契約書の空欄にいた幽霊
午後、山崎事務所では、しょうこが契約書修正文案を作った。
成瀬は、その横でプリンを食べながら、少しずつ落ち着きを取り戻していた。
しょうこは、最初に納品定義を直した。
納品物は、別紙納品物一覧に定めるソースコード、実行ファイル、設定ファイル、手順書、テスト結果、変更一覧とする。納品は、発注者指定の保存先にアップロードし、アップロード日時、ファイル名、ハッシュ値、コミットIDを通知した時点で完了する。
次に検収。
発注者は、納品完了日から五営業日以内に検収結果を通知する。不合格とする場合、発注者は、契約仕様に適合しない箇所、確認環境、再現手順、根拠資料を具体的に示す。期間内に通知がない場合、成果物は検収に合格したものとみなす。
瑕疵対応。
無償の瑕疵対応は、契約仕様に適合しない不具合の修正に限る。仕様変更、追加機能、検収環境の変更、発注者環境の設定不備に起因する対応は、別途見積りとする。
再委託。
発注者が検収、レビュー、クラウド監査等を第三者に委託する場合、委託先名、業務範囲、アクセス対象、秘密保持義務、成果物の持出し制限を事前に受注者へ通知する。
クラウド環境。
発注者指定のクラウド環境における保存先、アクセス権限、自動削除、ライフサイクル設定、ログ保存、障害時対応、検収タグ付与責任は、別紙クラウド利用責任表に定める。納品物が発注者環境の設定、権限、削除処理により利用不能となった場合、当該事実のみをもって納品未了とは扱わない。
成瀬は、最後の一文をじっと見た。
「これ、今回のことですね」
しょうこはうなずいた。
「はい。幽霊の正体を書きました」
「検収ルールの不在」
「そうです。ルールがないと、誰かの環境で起きたことが、全部あなたの責任に見えてしまう」
陽翔も補足した。
「技術的には、Git、Storage、アクセス権限、ログで納品事実を追えました。でも、契約に“何を納品とするか”がないと、技術証跡だけでは相手の言葉に押されます」
山崎が言った。
「技術のログと契約の言葉は、両方そろって初めて足跡になるんだね」
成瀬は、プリンのカップを見つめた。
「僕、コードを書けば十分だと思っていました」
しょうこはやさしく言った。
「コードは大事です。でも、フリーランスは、自分の仕事を自分で守る書類も必要です」
成瀬は頷いた。
「次から、納品時にコミットIDとハッシュ値とアップロードログを残します。あと、検収期限も契約に入れます」
山崎は微笑んだ。
「怪談を、手順書に変えましたね」
6 最後の通知
五営業日後。
東海ロジリンクから、成瀬へメールが届いた。
件名は、
在庫照会API改修・管理画面追加開発 検収結果について
本文には、こうあった。
納品物を確認し、検収合格とします。当社Azure環境における自動削除設定により、当初納品物が削除された件について、納品未了との表現を撤回します。支払期日は、契約修正合意に基づき、5月末日とします。再委託レビューおよびクラウド環境責任表については、別途協議ではなく、別紙にて明示します。
成瀬はそのメールを持って、山崎事務所に来た。
今度は雨に濡れていなかった。
差し入れは、プリンではなく、シュークリームだった。
さくらが目を輝かせた。
「これは検収済みですか?」
成瀬は笑った。
「レシート、あります。保存期間は今日中です」
陽翔が言った。
「短すぎます」
しょうこはメールを読んで、少しだけ微笑んだ。
「よかったですね」
成瀬は深く頭を下げた。
「ありがとうございました。納品物が消えた時、本当に幽霊かと思いました。でも、消えていたのは成果物じゃなくて、検収のルールだったんですね」
山崎はシュークリームを手に取った。
「幽霊は、人が決めなかったところに出ます」
陽翔がうなずいた。
「アクセス権限の空白、自動削除の空白、ログ保存の空白」
しょうこが続けた。
「納品定義の空白、検収期限の空白、瑕疵対応の空白、再委託の空白」
さくらが言った。
「冷蔵庫の空白」
全員がさくらを見た。
「シュークリームは冷蔵庫に入れないと消えます」
山崎は真剣に頷いた。
「今日一番わかりやすい検収ルールだね」
事務所に、温かい笑い声が広がった。
納品したはずの成果物は、消えていなかった。
Gitは、作ったことを覚えていた。Azureのログは、アップロードされたことを覚えていた。ストレージの復元機能は、消されたものを戻した。アクセス権限は、誰が何をできたかを語った。
けれど、一番大切だったのは、最後に人間が言葉にしたことだった。
何を納品とするか。いつまでに検収するか。不備があるなら、どう知らせるか。誰がクラウド環境を管理するか。第三者が見るなら、誰がどこまで見るか。自動削除があるなら、誰がタグを付けるか。
怪談の正体は、幽霊ではない。
検収ルールの不在だった。
そして山崎行政書士事務所では、その夜から、新しい格言がホワイトボードに増えた。
納品物は、消える前にログを残す。検収ルールは、揉める前に書いておく。プリンとシュークリームは、冷蔵庫へ。
しょうこは最後の一行を消そうとした。
さくらが止めた。
「これも運用です」
陽翔が頷いた。
「保存先と責任者を明記しましょう」
山崎は、満足そうに言った。
「では、冷蔵庫の検収担当はさくらくんで」
さくらは胸を張った。
「五営業日以内に食べます」
しょうこは赤ペンを持ち上げた。
「それは期限が長すぎます」
また、笑い声が広がった。
静かな夜に、複合機はもう唸らなかった。
怪談は、手順書になったのだ。
実務背景・確認日
確認日:2026年5月13日。
フリーランス・事業者間取引適正化等法について、政府広報オンラインは、発注事業者が業務を委託した場合、直ちに「委託する業務の内容」「報酬の額」「支払期日」などの取引条件を明示する必要があり、書面だけでなくメールやSNSメッセージ等でも明示できると説明しています。作中のしょうこが、納品定義・検収期限・瑕疵対応を契約書に落とし込んだ背景です。
公正取引委員会のフリーランス法特設サイトでは、報酬は給付を受領した日から60日以内に支払う必要があり、支払期日は具体的な日を特定できるよう定めるべきと説明されています。作中の「検収期限が契約書上0日」「支払保留が続く」という緊張感は、この支払期日明確化の実務を踏まえています。
Azure Monitorの診断設定では、リソースログ、プラットフォームメトリック、アクティビティログを収集し、Log Analytics等の宛先に送信できます。Azure Blob Storageのリソースログは、診断設定で収集先へルーティングして初めて保存・照会できるため、作中の陽翔が「ログを見る前にログが残る設定を確認する」とした場面の根拠になります。
Azure Blob Storageのログ表であるStorageBlobLogsには、操作名、対象オブジェクト、要求者、時刻などの列があり、ストレージ上で誰が何をしたかを追う手がかりになります。作中のPutBlob、GetBlob、DeleteBlobの追跡は、このようなログ項目を物語化したものです。
Gitはリポジトリ全体のスナップショットをコミットとして履歴に保存し、コミットのつながりで変更履歴を追える仕組みです。作中の「Gitには成果物の作成履歴が残る」という推理は、成果物の作成時点や変更履歴を確認するための実務的な考え方に基づいています。





コメント