印刷・PDF化:ブラウザで Cmd + P →「PDFとして保存」。この案内は印刷されません。

トレジャー王国 消費税の見える化システム | 要件定義書 v1.0

案件 第19回 トレジャーハンティング in つるみ「トレジャー王国に行こう!」
開催 2026年11月29日(日)受付 11:30–12:00 / イベント 12:00–16:00(雨天決行)
    神奈川県立東部総合職業技術校(かなテクカレッジ東部)
主催 公益社団法人 鶴見法人会 青年部会 / 協力 鶴見税務署 / 後援 鶴見区役所・鶴見警察署・鶴見消防署
募集 2026年9月1日〜10月15日(★チーム確定は10/15以降。カード印刷はその後)
参加 鶴見区在住または区内小学校在籍の小学生。1チームは保護者1名以上を含む5名以内
主催 公益社団法人 鶴見法人会(協力:鶴見税務署/後援:鶴見区)
版  v1.0(2026-07-31) ※ v0.1(07-30)から全面改訂


0. この文書について

誰のための、何か

これは制作側の文書。先方(鶴見法人会)には配布しない。
判断の理由や採算にかかわる書き方を含むため、そのまま渡すと角が立つ。

読む人この文書で分かること
自分何を決めたか。なぜそう決めたか
技術レビュー(協力エンジニア)なぜこの構成になったか。判断の理由
来年、拡張する人(AIを含む)触ってはいけない前提(→ §1.3)と、なぜそう決めたか(→ §11)

先方にお渡しするもの

内容
制作範囲のご確認(A4 1枚)当日の流れ/作る画面/やること・やらないこと/行わないこと/決めていただきたいこと
御見積書内訳/含まないもの/動作確認の範囲/前提条件/変更の管理
機材の動作条件(別紙)タブレット・カード・NFCに満たしてほしい条件
画面イメージhttps://trehan-preview.pages.dev

合意の記録は、この3点が担う。 本書はその裏づけとして手元に置く。


1. 背景と目的

1.1 なぜこのシステムを作るのか

このイベントの主旨は租税教育である。キャッシュレスはそのための手段にすぎない。

第19回の実行委員長が「キャッシュレスの仕組みを入れたい」と発案したことが起点。
新しい試みとして、下記を実現する。

**体験料を払うと、その中に消費税が含まれていることを、
子どもが「見て」実感できるようにする。**

去年までは、ブース横のボードに大きな丸を描き、体験のたびに受付の人が
「円」と手書きし、最後に全ブースから舞台へ持っていく、という方式だった。
このシステムは、その手書きの置きかえである。 求められている解像度はその水準。

1.2 成功の定義

1.3 やってはいけないこと(★変更禁止)

企画書および打合せで明示された禁止事項。拡張時もこれを外さないこと。

禁止理由
チーム同士を競わせない(順位・ランキングを作らない)「競う」ではなく「みんなでまちを支える」が主旨
一定額に達したら次へ進む、という設計にしない納税額を達成条件にしない
個人別の納税額を強調しない個人を目立たせない
本物の決済処理をしない疑似決済に留める。実際のお金を動かすと資金決済法の領域になり、個人では受けられない案件になる
個人情報を受け取らない(氏名も含む)扱うのはチーム名、または3桁の番号だけ。住所・電話・学校名・学年・写真・保護者の連絡先・保護者や代表者のお名前も受け取らない。チーム名がない場合の代替を「代表者名」にしない(氏名を持った時点で個人情報の管理義務が発生する)
おみくじ等の運要素を入れない企画書に明記。学びと記念性を両立させる

1.4 前提として重要なこと

「極論、単純に紙でタッチしたふりして、紙芝居みたいなので作って、
視覚的に見せて終わり、みたいなのでも成立するっちゃ成立」(先方の発言)

逃げ道が最初から確保されている。 よって過剰な冗長化に費用をかけず、
その分を「ブースの読み取りが確実に動くこと」に寄せる。


2. 関係者と責任範囲

2.1 誰がどこまで持つか

印刷も舞台も鶴見法人会の中の担当で、外部の業者ではない。
したがって境界は「弊方 / 鶴見法人会」の1本だけ。
法人会の中で誰が担うかは法人会の中の話なので、この表では分けない。

項目弊方鶴見法人会
6画面の制作・記録と集計の仕組み●
カード用URL一覧(CSV)の作成・提供●
機材/カードの動作条件の提示(別紙)●
ホスティング先の作成・公開●
実機確認(10月・タブレット1台)●貸出
当日の設営・立ち上げ立ち会い●
タブレット・Wi-Fi・カード・NFCの手配と費用●
カードのデザイン制作●
カードの印刷・NFCへの書き込み●
参加者名簿の管理(個人情報の管理責任者)●
受付・当日運営・スタッフ配置●
画像・イラストの用意●
会場装飾・舞台演出●
会場モニター本体・PC・ケーブル・電源・配線●

窓口が1つで済む。 「印刷屋さんに確認します」で日数が空くことがない反面、
組織が同じぶん責任の所在が曖昧になりやすいので、この表を先に共有しておく。

2.2 境界の明確化(誤解が起きやすい点)

境界弊方の範囲
機材条件を書面で示すところまで。手配・台数・費用・設置は先方。
条件を満たす機材であれば10月に実機で確認する。「保証」とは書かない(照明・カードの汚れ・個体差・ブラウザ更新など、条件を満たしても読めない要因が残る)
NFCURL一覧をCSVで渡すところまで。タグの購入・書き込み・貼付は法人会
会場モニター表示する画面の制作まで。モニター本体・PC・ケーブル・電源・配線は先方。
当日その機器で画面を開くところは弊方
舞台演出連携しない。(「リンクは考えてない」)システム内で完結する
画像先方支給が前提。制作する場合は別途(1点2,000円〜・点数割引・応相談)
集計の正確性想定外の操作(人為的な誤操作・機種違い)による集計のずれは対象外。
先方より「気にしない」との確認を得ている

3. 用語

語意味
トレジャーイベント内の架空通貨。実際のお金ではない
体験料1ブースの職業体験にかかる料金。税抜1,000トレジャー(2026-09-04 先方変更)
消費税体験料の10%。100トレジャー。お支払いは合計1,100トレジャー
チーム参加の単位。子ども3〜4名程度
カードトレジャーパスポート。QR1つとNFCタグ1つを持つ
コードカードに割り当てられたランダムな英数字(例 A7K2M)。チームを識別する
復興率会場モニターに出す、目標額に対する達成度

4. 当日の流れ

#場面起きること関与する画面
011:30–12:00 受付(入国)チーム単位で来場。カードを配布—
112:00 開始イベント開始(16:00まで4時間)—
2ブース到着30ブースのうち好きなところへ—
3体験の前スタッフがタブレットでカードのQRを読むP1
4演出(3〜5秒)1,100トレジャーのうち100が王国のたからばこへP1
5体験職業体験を受ける—
63〜5を繰り返す去年はMAX20ブースを回った子がいた—
7随時会場モニターに総額と復興のようすP2
8随時/帰宅後保護者のスマホでチームの記録P3
9帰宅後〜12/31同じカードから納税証 → 税金図鑑P4 / P5
—常時本部で確認・修正・CSV出力P6

読み取りの想定量(★2026-08-04 先方回答により確定)

約140チーム/1チーム平均3名(保護者1名以上を含む3〜5名で募集)= 参加者は約420名。
ただし読むのはチームごとに1回なので、140が基準。

計算4時間あたり1分あたり1台あたり(30台)
標準140チーム × 平均8ブース約1,120回約4.7回0.16回/分
上振れ140チーム × 20ブース(去年のMAX)約2,800回約11.7回0.4回/分

技術的には依然として軽い。30台に分散するので、1台あたりは5分に1回程度。

★ただし「手入力の一覧」は成立しない。140チームを丸で並べても探せない(→ P1 の手入力を参照)。

納税総額の目安(★2026-09-04 カード単位・1,100トレジャーに変更後)

計算消費税の合計
標準140チーム × 子ども3名 × 8ブース × 100約336,000トレジャー
上振れ140チーム × 子ども3名 × 20ブース × 100約840,000トレジャー

当初(1チーム単位・50トレハン)は約56,000だった。桁が変わる。
会場モニターの目標額を先方に決め直していただく(管理画面から変更可=Q9)。


5. 画面一覧

ID画面使う人端末通信
P1ブース決済演出(待機/演出/完了/2回目/手入力の5状態)ブーススタッフタブレット切れても止まらないこと
P2会場モニター来場者全員TV+PC要(およそ1分ごとに更新)
P3チームページ保護者各自のスマホ要
P4納税証(P3の上部に表示)保護者・子ども各自のスマホ要
P5税金図鑑保護者・子ども各自のスマホほぼ静的
P6本部管理画面本部PC要

★表記のルール(P1は読む人が2種類いる)

誰が読むか表記例
子ども(演出・語りかけ)ひらがな「カードを かざしてください」/「ぜいきん100トレジャーを 王国に おさめました!」/「もう おさめて くれたね!」
スタッフ(操作・状態・指示)漢字「読み取れないとき」/「カード表面の3桁の番号を入力してください」/「未送信 3件」/「通信が途切れています」

子ども向けの部分で漢字を使うときは、ふりがな(ruby)を振る。
「王国」は小1+小2の漢字で、1年生には読めない。ただしチラシが「トレジャー王国」と漢字なので、
ひらがなにすると別物に見える。ふりがなにすれば、見た目を保ったまま読める。
先方が作る税金図鑑の文章にも、こちらでふりがなを振る(scope §02 ⑤に記載)。

同じP1の中に両方ある。「子ども向けだから全部ひらがな」にしない。
スタッフは大人で、操作の指示がひらがなだと、かえって読むのが遅くなる。
P3(保護者)とP6(本部)は漢字。P5 税金図鑑は子どもが読むのでひらがな中心。

画面イメージ → https://trehan-preview.pages.dev


6. 画面ごとの要件

P1 ブース決済演出(★最重要)

5つの状態を1画面で切り替える(待機/演出/完了/2回目/手入力)。別々の画面を作るのではない。

状態内容
待機カメラが常時動作。「カードを かざしてください」。下に「読み取れないとき」ボタン
演出「ピッ!」→ 1,100トレジャー → コインが1,000と100に分かれる → 100が王国のたからばこへ → 「ぜいきん100トレジャーを王国におさめました!」
完了「次の方へ」。5秒で自動的に待機へ戻る
2回目同一チーム×同一ブースの2回目。「もう おさめて くれたね!」+現在の合計。演出は流さない・加算しない
手入力「読み取れないとき」から。カード表面の3桁のカード番号(001〜420)をキーパッドで入力(★2026-09-11修正。チーム番号ではない) → チーム名を大きく表示して確認 → 「この番号で記録」で通常と同じ記録

決めごと

管理画面(P6)でブースを追加・改名でき、その場で設定用QRが画面に出る作りにする。
紙に刷って配る形にすると、刷ったあとの変更に対応できない。当日その場で増えても対応できる。

3桁のカード番号(001〜420)を大きく印刷し、それを打つ。
★2026-09-11修正。当初「チーム番号(001〜140)」と書いていた。
記録はカード単位になったので、手入力もカードを特定しなければならない。
チーム番号を刷ると、打った番号で別チームのカードが見つかり、それらしいチーム名が出る。
現場で誤りに気づけないまま、本来の持ち主のカードが後で弾かれる。
★この行がカード420枚の印刷指示の根拠。先方に出した別紙「動作条件」§02 とも一致させること。
手入力が要るのは「カメラが読めない」ときであり、カードは手元にあるので番号は読める。
番号はURLではないため、推測されても害がない(チームページのコードとは別物)

検証で残ると分かってから、あとで「できます」と足す。先に言って外すのが最悪

会場で送りきれなくても、Wi-Fiのある場所で送信ボタンを押せば反映される(後日でもよい)。
「その場で送れなければ失われる」ではないので、当日に慌てる必要がない

「通信が途切れています。記録は端末に残っています。つながり次第、自動で送信されます。そのまま続けてください」

スタッフが端末を触る理由をなくすのが目的。壊れて見えるから閉じたり再起動したりする。
エラーの赤や警告音は使わない

当日朝に配るブース設定用QRをブースに置いておいてもらえば、それを読むだけで戻せる

未送信の中身(チーム名×時刻)を一覧で見られる。撤収時に「全部送れたか」を確かめるため

P2 会場モニター

P3 チームページ / P4 納税証

カードからの入口は1つ。 QRもNFCも同じURL。

いつ表示
イベント中チーム名・回ったブース・納めた消費税
イベント後一番上に納税証(記録はその下に残る)+「税金図鑑へ」ボタン

P5 税金図鑑

P6 本部管理画面

表記は漢字でよい(内部の人が見る画面。子ども向けのひらがなにしない)。

出すもの
数字消費税合計/読み取り件数/稼働チーム/1チーム平均ブース数
会場モニターの調整実測/調整分/モニター表示/復興率/目標額の変更
ブース別来場数。「来場数順」と「番号順」を切り替えられる。既定は来場数順(★当日は「空いているブースを見つける」ために使うため)。番号順は「◯番ブースはどうか」と聞かれたときに使う
チーム一覧140行あるので検索ボックスが要る(3桁番号 または チーム名で絞り込み)。番号の列を出す(カードに刷る番号と突き合わせるため)。金額の手動修正(+100/−100)/手入力の件数/記録を1件消す
ブース管理ブースの追加・改名・削除。追加すると設定用QRがその場で画面に出る(=ブース情報に締切がない)
チーム管理チームの追加・改名・削除。CSVの一括取り込みも用意する(140件を手で入れない)。★当日参加が発生した場合の受け皿でもある(決定25)。チーム名が未定なら番号のみで登録でき、あとから名前を入れられる(Q26の既定)
表示設定貨幣の単位名(「トレジャー」)を管理画面から変更できる。★先方が「貨幣名称は変わるかもしれない」と回答している(2026-08-04)。コードの直しにするとこちらの作業になり、先方が直前に決めても間に合わなくなる。あわせて体験料(1,000/100)と復興の目標額もここで変える

調整分の扱い(重要)
先方が「少なかったらいっぱい読み込むか」と発言したことへの対応。

会場モニターの表示 = 実測(チーム合計) + 調整分

やらないこと:リアルタイムのブース別ダッシュボード。分析はイベント後にCSVから資料にする。

手入力の件数を出す理由:特定のブースで手入力が続いていたら、その端末のカメラを疑う。当日いちばん役に立つ数字。

ただし、原則として端末は交換しない(★)

手入力はカメラを使わない。手入力で回っているブースは止まっていない。
交換すると、その端末が抱えている未送信データが取り残されるうえ、ブースIDの再設定
(設定用QRの読み直し)も要る。交換したほうが損をする。

状況対応未送信データ
カメラだけ不調交換しない。手入力のまま最後まで走る端末に残り、つながった時点で送られる
電池切れ交換する消えない。localStorageはディスクに保存されるため、充電すれば読み出せて、あとから送信できる(★当初「あきらめる」と書いていたのは誤り)
端末が物理的に壊れた・初期化された交換する取り出せない。あきらめる(発生確率は低い)

あきらめる場面は、実際には非常に狭い。電池切れでも記録は消えないので、
交換した旧端末を充電して送信すればよい(当日中でなくてよい)。
物理破損だけが復元不能で、そのときも先方は数値の厳密さを求めていない(去年までブース横に手書き)。

これは仕組みではなく、当日の手順として伝える。未送信データを新端末へ移す機能は作らない。


7. データ

項目例備考
コードA7K2Mランダム。連番にしない
チーム名あかチーム
ブースIDB12端末に設定
読み取り時刻13:42:07
入力種別QR/手入力手入力の件数を管理画面に出すため
体験料1,000全ブース一律(要確認 Q2)
消費税額100
調整分0チームに紐づかない。別に保持

受け取らないもの:氏名/住所/電話/学校名/学年/写真/保護者の連絡先
→ カードに印刷されている以上のことをシステムに入れない。

制約

UNIQUE (チームコード, ブースID)

アプリで「有無を調べてから書く」形にしない。同時に来ると隙間ができるため、
データベース側の制約で弾き、2件目は静かに無視する。
テストが1ケースで済み、実装も1行で終わる。


8. 非機能要件

分類要件
通信会場の通信を信用しない。読み取りはまず端末のローカルストレージに保存し、そこからサーバー(D1)へ送る。会場全域のWi-Fiカバーは不要
・通常は読み取りのたびに自動で送信を試みる
・失敗したらローカルに溜まり、次の読み取り時にまとめて送る
・保険として画面に「未送信◯件」と手動の送信ボタンを置く(自動再送に頼りきらない)
同時利用端末ごとに独立した記録のため、何台同時でも競合しない。ただし30台の実測試験は行わない
端末別紙「動作条件」による。背面カメラのオートフォーカス必須・同一機種・NFC非搭載またはOFF・自動ロックOFF・10インチ以上
個人情報管理責任者は主催。弊方は委託先。この関係を文字で残す(要確認 Q15)
保存期間12月31日で公開停止、その後データ削除
公開範囲URLを知れば開ける。パスワードは付けない。①非連番 ②noindex ③期限 で守る
落としたときカードには既に名前が印刷されている。ページに載せるのはカードに印刷されている以上のことをしないため、拾った人が新たに知る情報はない
フォールバック万一システムが動かない場合、先方が従来どおり紙で代替できる(去年までブース横のボードに手書きしていた方式)。
弊方で紙の備えは用意しない(運営側の備品であり、担当範囲外)。
用意するのは「いつ切り替えるか」の判断基準だけ:12:20の時点で半分以上のブースで読めていなければ紙へ。先方と事前に合意しておく

9. 技術構成

決定
ホスティングCloudflare Pages(商用OK・無料・帯域無制限)
データCloudflare D1(★2026-09-11変更)
本番のサブドメインtrehan263.pages.dev(決定18で押さえた名前)
★trehan-app.pages.dev は動作確認用。カードのURLには使わない
モックの公開先trehan-preview.pages.dev
専用ドメイン取らない
ソース管理cococrea/trehan(GitHub・プライベート)+ Cloudflare Pages連携。クライアント名が辿れるため必ずプライベート。
★pushはキーチェーンのcococrea認証を強制する(gh は koretsuru でログイン中のため、素のpushは「Repository not found」で失敗する):
git -c credential.https://github.com.helper= -c credential.https://github.com.helper=osxkeychain push origin main
鍵の置き場Cloudflareの環境変数。リポジトリに入れない
D1への接続ブラウザからは直接触れない(D1にURLが無いため)。Pages Functions(app/functions/api/)を必ず通す
★結果としてSupabase案より安全になった:鍵がブラウザに出ず、UNIQUE制約もサーバー側で効く
読み書きの窓口は8つ。管理系(settings PUT/booths POST/adjust/admin)は x-admin-key ヘッダが要る

9.1 引き継ぎ可能性の確保(★本番日が動かないため)

11月29日は動かせない。 制作側が動けなくなった場合に備え、
協力エンジニアがいつでもコードを触れる状態にしておく。

付与理由
GitHub(プライベート)招待するこれだけで実装もデプロイもできる(Pages連携のため、pushすれば反映される)
Cloudflare招待するPages・D1の両方を見られる。★D1はCloudflareアカウントの中なので、Supabaseのような別サービスの招待が不要になった
Cloudflare不要GitHub連携にしておけば、Cloudflareのアカウントに入れなくてもデプロイできる

アクセスは着手時に付与する(引き継ぎが必要になってから招待しても間に合わない)。

あわせて実装開始時に README.md を作る。
CLAUDE.md は「守ること」を書いた文書で、「どう動かすか」が書かれていない。

・ローカルで動かす手順
・デプロイのしかた(push するだけ)
・環境変数の一覧(値は書かない。在り処だけ)
・ファイル構成
・引き継ぐことになったら、まずこれを読む

9.2 RLSの方針

ブラウザから直接つなぐため、anonキーは公開される前提で設計する。

操作許可
読み取り記録の追加許可(ただし §7 のユニーク制約で2件目は弾かれる)
読み取り記録の更新・削除不可(管理画面のみ。別の鍵で行う)
チームページの参照コードを指定した1件のみ。一覧の取得は不可(全チーム分が抜けるのを防ぐ)
集計(総額)参照のみ

割り切っている点:ブース端末のURLを知った人が、書き込みを増やすことは技術的に可能。
ただし個人情報を持たず、金銭も動かず、集計のずれは先方が「気にしない」と明言しているため、
ここに費用をかけない。守るべきものの価値に見合った守り方をする。

QRに入るURLの形

https://trehan263.pages.dev/s/A7K2M

10. スケジュール

★下記は「8月中に受注できた場合」の予定。発注前には着手しない(社内メモ §5)。
動作版 第1版は発注から約2週間。発注が遅れれば動作版 第1版以降も同じだけ後ろにずれ、
11月29日だけが動かないので、削られるのは「直す時間」。
★先方向けの書類にも、この前提を必ず書く(書かないと「9月20日発注でも9月15日動作版 第1版」という矛盾になる)。

★募集期間が 9/1〜10/15 のため、チームが確定するのは 10月15日。
カードの印刷はそれ以降になる(従来の想定より1か月半遅い)。

時期やること
8月上旬見積・制作範囲・動作条件を提出
★8月中ここで発注が取れれば、9月15日の動作版 第1版に余裕をもって臨める(=目標)
★9月20日発注の最終期限。★理由は物理の制約ではなく、動作版 第1版を触っていただいてから直す時間を確保するため。
11月29日は動かせないので、発注が遅れると削られるのは「直す時間」だけになる。
(★当初「実機確認がカード印刷より前だから」としていたが誤り。カードが読めるかはタブレットに依存しない——マット加工・QRの大きさ・コントラストは手持ちのスマホで判定でき、むしろスマホのほうがカメラが良いので「スマホで読めなければカードが悪い」と言える。タブレット固有の問題(固定焦点)はカードの刷り直しではなく機種変更で解決する。発注時期に依存しない確認を、依存する理由として使っていた)
発注→機種決定→レンタル手配→1台借りて確認、で3〜4週間かかる。先方はまだレンタル会社も機種も決めていない(device-specで確認中)。9月30日発注だと実機確認が10月末になり、カード印刷のほうが先に走る。これを過ぎたら受けない
8月中受注 → コード体系の確定 → 動作版 第1版の制作(P1・P6)
8月下旬税金図鑑の「項目名だけ」をいただく(★仮でよい。項目数で画面の並べ方が変わるため、これだけ先に必要)
8月31日発注の目安(ここまでに取れれば9月15日の動作版 第1版に余裕)
9月1日〜10月15日先方:参加チームの募集
9月10日ごろ平崎さんの動作版 第1版のレビュー(★先方に出す前)
9月15日**動作版 第1版を先方に触っていただく**(P1・P6)
9月30日★動作にかかわる要望の締切(動作版 第1版を触ってもらったうえで。「見る前に仕様を固めろ」は無理があるので、動作版 第1版の後ろに置く)/単位名の確定/図鑑の文章・イラスト
9月後半P2〜P5の作り込み
10月いただいた要望をまとめて反映
9月30日★通貨の単位名の確定締切(全画面とカードに入るため。以降は仕様変更)/税金図鑑の文章・イラストをいただく
10月上旬タブレット1台(本番と同一機種)で実機確認
10月15日先方:参加チーム確定
10月中旬平崎さんの完成レビュー
10月20日中身の差し替え(図鑑・イラスト・文言)の締切
10月下旬チーム一覧のCSVを印刷ご担当へ提出(★いつ必要かは先方に伺う)
10月31日完成・請求書送付(★システムが動く状態であって、中身の最終形ではない。図鑑の文章・イラストは10/20締切、以降も11/28まで可能な範囲で反映=無償)
11月上旬カード印刷+NFC書き込み(印刷ご担当)
11月28日(可能なら)前日に会場・機材で通し確認
11月29日本番。10:00〜16:30 終日立ち会い(受付11:30/イベント12:00–16:00)
12月31日公開終了・データ削除

★こちらが握るのはCSVの提出時期だけ。チーム名を刷るなら10月下旬、刷らないなら9月中に出せる(=Q23)。
印刷そのものの段取りは先方の担当範囲(先方の担当者が印刷業)。こちらから納期を心配しない。


11. 決定事項と、その理由(全37件)★来年の拡張時はここを読む

#決定理由
1体験料は税抜1,000+消費税100=1,100トレジャー(★2026-09-11修正)「1,000のうち100」だと10%の計算に合わない(1,000に含まれる消費税は約91)。税務署が協力する租税教育イベントなので数字を合わせる。
★この行は長らく「税抜1,000+消費税100=550」と書かれていた。当初の500+50=550から金額だけ上げて、合計を直し忘れていた。計算が合うようにするための決定の中で計算が合っていないという状態だった。正は 1,100(CLAUDE.md と一致)
2チーム単位で管理。個人名を持たない先方が「個別でやろうとは思っていない」。氏名を持たなければ個人情報の管理義務がほぼ消え、費用とリスクが下がる
3チーム内のカードは1枚ずつ違うコード(★2026-09-04変更。当初は全部同じ)当初は全部同じにしていた(誰が読んでも同じ記録・順番間違いが構造的に起きない・1枚なくしても他から開ける)。
先方要望で「子ども1人につき各ブースで1回」になったため、1枚ずつ別にした。
★失われた利点2つ:①印刷とNFC書き込みの取り違えが構造的に起きない ②1枚なくしても他のカードから同じページが開く。420枚すべてで1枚ずつの照合が必要になる(先方の作業)。ここは先方にお伝えすべき事項
4カード1枚×1ブース=1回(DB制約)★2026-09-04変更(当初は1チーム×1ブース=1回)先方要望により子ども1人につき各ブースで1回。3人チームが8ブースなら24回。モニターの数字が実際の体験回数と一致する。手入力とQRが両方通っても二重にならない
5QRとNFCは同じURL。CSVは1列印刷時の取り違えが起こりえない。企画書にあった保護者用の別QRが不要になる
6QRの中身をURLにするNFC非対応端末(2018年より前のiPhone・安価なAndroid)でもカメラから同じページに行ける。費用ゼロの二重化
7入口は1つ。イベント後は納税証を上に出すカードのコードが1つなので行き先も1つ。かざした瞬間に賞状が見え、タップを増やさない
8オフライン記録+後送「当日Wi-Fiを借りる予定」と聞いたため。当日だけの機材は当日まで状態が分からないので、通信を前提にしない
9タブレット必須。スマホは非常時のみキャッシュレス体験そのものが商品。チラシにも「トレジャーカードでキャッシュレス決済」と載っている
10タブレットのNFCは不要/OFF子どもがカードを画面に押し付けると、端末のNFCが反応して別画面が開き、記録できない
11演出は動画でなくアニメーション30台が毎回サーバーから動画を取ると会場の回線が死ぬ
12「読み取れないとき」の手入力を置くブースのスタッフは持ち場を離れられない。1〜2名で回しているため、本部へ相談に行くとそのブースが止まり、子どもが待つ。カードを忘れた子も救えるので、再発行の仕組みも不要になる
13管理画面に調整分と復興率先方が「少なかったらいっぱい読み込むか」と発言。ただし調整はチームに紐づけない(保護者が見る数字と食い違わせない)
14ブース別来場数を残す19年やってきて数字で見たことがないはず(去年はボードに手書き)。来年の配置・人員・時間割を決められる資料になる
15モニターに順位をつけない企画書の禁止事項(§1.3)
16Cloudflare Pages + D1(★2026-09-11変更。当初はSupabase)Vercel無料は非商用でクライアント案件に使えない。
★当初「一発勝負の案件で初めての道具を使わない」を理由にSupabaseとしたが、「慣れているから」以上の理由がなかった(ゆきさんの指摘)。
D1にした理由は3つ:①同じCloudflareアカウントの中で完結する(引き継ぎ時に招待するサービスが1つ減る)②ブラウザに鍵を出さずに済む(D1は直接つなげないので、必ずサーバー側を通る)③無料枠の中で足りる(当日の読み取りは最大3,360件)。
★代償はPages Functionsを自分で書くこと。8ファイル・半日。この工数を最初に説明していなかった
17専用ドメインを取らない公開は12/31まで。来年はカードを作り直すのでURLが変わってよい。継続性の要件がない
18カードのURLは trehan263.pages.dev/s/XXXXX(本番)。trehan-app は動作確認用QRに入る文字数が増えると模様が細かくなり読み取りにくくなるため、短い名前を押さえた。trehan は既に取得済みだった。
★2026-09-11の検品で、この名前に中身を置いていなかったことが判明した。古い先方確認用プレビューが載ったままで、どのパスを叩いても同じ1枚を返す。そのまま刷っていたら420枚すべてがプレビュー画面に着地していた(チームページも納税証も永久に出ない)。
★このとき一度「カードのURLを trehan-app に寄せる」と直したが、それは誤り(ゆきさんの指摘)。事故の中身は『本番の名前にアプリを置いていなかった』ことなので、直すべきは配置であって、本番の定義ではない。自分の作業ミスに合わせて計画のほうを曲げていた。
★いまは trehan263=本番/trehan-app=動作確認用 と役割を分け、_check-docs.py §19 が「カードのURLに trehan-app が混ざっていないか」を機械で見張る
19会場下見をしない平日の空の会場で電波を測っても当日と別物。カードもタブレットも11月上旬には揃わない。行っても実装が変わらない
20前日に機材が使えるなら前日確認(無償)当日朝が唯一のリハーサルになるリスクを下げられる。こちらの得でもある
21画像は先方支給が前提先方が「デザインにこだわりはない」「チラシベースでいい」と発言。制作する場合は別途
22端末が不調でも、原則として交換しない手入力はカメラを使わないので、手入力で回っているブースは止まっていない。交換すると未送信データが取り残され、ブースIDの再設定も要る。交換のほうが損をする(平崎さんのご指摘から)
23未送信データを新端末へ移す機能を作らない一覧を見られる状態なら、そもそも交換しなくてよい。端末が死んで一覧も見られない場面では、どんな機能も役に立たない。手順で伝えれば足りる
24手入力はキーパッドで、カード表面の3桁のカード番号(001〜420)を打つ(一覧から選ばせない)★2026-09-11修正140チームを丸で並べても探せず、ブースに列ができる。カードは手元にあるので番号は読める。
★当初「3桁のチーム番号」と書いていたが、2026-09-04の変更(子ども1人につき各ブースで1回)で記録がカード単位になったため、手入力もカードを特定しなければならない。チーム番号(001〜140)とカード番号(001〜420)は値域が重なるので、チーム番号を打つと別チームのカードが見つかり、それらしいチーム名が出てしまう。現場で誤りに気づけない。
★カードのおもてに刷るのはカード番号。印刷指示の根拠がこの行なので、ここを間違えると420枚が刷り直しになる
25受付用の画面を作らない先方回答「当日参加は基本的に受け付けない方針」(2026-08-04)。例外が出た場合は管理画面からチームを追加して対応する
26通貨の単位名は管理画面から変える(コードに直書きしない)先方回答「貨幣名称は変わるかもしれません」(2026-08-04)。★当初「コードの1か所で定義」としていたが、それでは変更のたびにこちらの作業になり、先方が直前に決めたときに間に合わない。管理画面に置けば先方だけで完結する。画面の表示だけなら締切がなくなる(カードのご印刷に入るぶんは9月末までに要確定)
27電源は「必須」と書かず、10月の実機確認で実測してから相談するカメラ常時起動は自分たちの設計判断(読み取り開始ボタンを作らない)で、受付11:30〜終了16:00の約4時間半動き続ける。ただし機種が未定のため、足りないかどうかを断定できない。断定できないものを★必須に混ぜると、本当に必須の項目(背面カメラのオートフォーカス・マット加工・NFCオフ)の重みが下がる。10月に1台借りるので、そこで実測して報告する(「保証いたします」を削って実機確認に置き換えたのと同じ形)。なお電池が切れても記録そのものは消えない(ディスクに保存されるため、充電すれば読み出せる)。ただしその端末はその時点でブースから離脱するので、コンセントの有無だけは先に伺っておく
28ブースの一覧に締切を作らない出展事業者の確定は直前になりやすい(19回続く催しで、出展者は毎年入れ替わる)。締切を設けても守られない可能性が高く、守らせるより遅れても壊れない作りにするほうが安い。管理画面から追加でき、設定用QRもその場で出す。当日その場で増えても対応できる
29「集計が欠けない」と約束しない端末が壊れたら、どの記録が消えたか誰にも分からない。復元できないものを「補えます」と書いていた。約束するのは「終了後でも送信できる」と「モニターの合計は調整できる」の2つだけにする
30先方への約束は「確実なもの」だけに絞る記録が失われるのは「通信が切れている」かつ「ページが再読み込みされた」かつ「保存も消えた」の3つ同時で、極めて起きにくい。それでも検証していないこと(終了後の送信)は書かない。確認できてから足せばサービスになるが、先に言って外すと信用を失う。
条件や失敗の説明も scope §02 には書かない。あそこは不具合の判定基準なので、書くほど「何が不具合か」が曖昧になる。運用上の条件(プライベートブラウズを使わない等)はdevice-spec に、実行できる形で置く
31表記は「子ども向け/スタッフ向け」で分けるP1は子どもとスタッフが同じ画面を見る。全部ひらがなにすると、スタッフが操作の指示を読みにくい(大人がひらがなだけの文を読むのは遅い)。演出と語りかけだけひらがな、操作・状態・指示は漢字
32管理画面のチーム一覧に検索を置く140行を目で追うのは無理。手入力画面で「一覧から探せない」と判断したのと同じ問題が、管理画面にもある。3桁番号かチーム名で絞り込む。番号の列も出す(カードと突き合わせるため)
33納期は「システムが動く状態」と定義する法人会は1か月前に全部を固められない(19回続く催しで、出展者も参加チームも直前まで動く)。納期を「全部そろった状態」にすると、先方の遅れがこちらの遅延に見える。
そのためブース名・チーム名・目標額・単位名はすべて管理画面から設定できる作りにし、先方の情報が遅れても納期に影響しない構造にした。図鑑の中身だけは差し替えが要るので、10/20を締切としつつ11/28まで無償で反映すると先に書いておく
34チームの呼び名は、先方がお申し込みで決める(A)★2026-08の先方回答で確定当初はこちらで140件の呼び名を用意する案(C)を推した(先方の手間がゼロで、納税証の記念性が上がるため)。
★先方は「例年、参加申込みの段階でチーム名を募集している」ためAを選ばれた。こちらの都合(手間を減らす)より、先方の既存の運用が優先される典型。
チーム名の一覧を10月15日以降に頂戴し、カード用データに反映する。呼び名に氏名は使わない(個人情報を持たない設計)。管理画面から後で変更できる
35発注の期限を9月20日と先に示すカードの印刷とNFC書き込みは動かせない物理工程。発注が遅れるとそこが破綻する。「いつでもどうぞ」にすると、法人会の意思決定の速度に引きずられてこちらが無理を被る。8月中(推奨・こちらの目標)と9月20日(最終)の2段階で示し、★最終期限だけを書くと組織は期限いっぱいまで使うので、推奨を前に出す。

★当初9月30日としていたが、締切の理由を、実際には依存しない工程に求めていた。「動かせない工程」を探すあまり、物理の制約に見せかけてしまった。本当の理由(直す時間がなくなる)のほうが単純で、しかも正直。締切を決めるときは「動かせない工程」だけでなくその工程の前提条件まで遡る。急かすのではなく「なぜ動かせないか」を書く。★これを過ぎた発注は受けない(社内メモの撤退ラインと同じ性質)
36予定表には「発注日を起点にした前提」を必ず書く発注前に着手しないのに、絶対日付だけの予定表を出すと「9月20日発注でも9月15日動作版 第1版」という矛盾になる。動作版 第1版は発注から約2週間と併記し、遅れたぶんは「直す時間」から削られると示す。★これは相手を急かすためではなく、遅れの結果が誰に返るかを先に共有するため
37要望の締切を「動作版 第1版を触ったあと」に置く当初は「着手前=発注前に仕様を固める」形にしていたが、発注前に仕様を固めさせるのは順序が逆(一般的な受託開発では、仕様の詳細は発注後に詰める)。
しかも画面を見ないと要望は出せない。9月15日に動作版 第1版を出し、触ったうえで9月30日までにまとめてもらう形にした。こちらも1回にまとめて直せるので効率がよい。
★歯止めは別にある:動作の変更=別途見積/見え方の調整=合計3時間まで

12. 未決事項

開発に影響するもの(★これだけ先に決まればよい)

#内容影響
Q23CSVをいつ渡すか・何列にするかこちらの納品物そのもの。チーム名を刷る → 3列を10月下旬。刷らない → 2列を9月中。
★いつ必要かは先方に伺う。「最も早い締切です」とこちらから決めつけない(相手は印刷業でリードタイムは先方のほうが正確)

技術の検証待ち

#内容影響
T1ローカル保存が、当日の4時間+終了後まで残るか平崎さんが試作して検証してくださる。
当日中(4時間)なら問題ないはずだが、実機で確かめる。ブースIDは当日朝にQRで設定する作りなので、前日セットアップには依存していない

数量・段取り(開発の中身は変わらない)

#内容
Q2全ブース一律料金か
Q25通貨の単位名(「トレジャー」から変わる可能性あり。9月末までに確定が必要)
Q9モニターはチーム別も出すか/目標額をいくつにするか
Q14カードの入稿締切
Q20印刷ご担当へ渡すCSVの書式と提出期限
Q13会場のWi-Fi・電波の状況
Q17前日(11/28)に会場と機材を使えるか
Q15個人情報の管理責任者と名簿の受け渡し方法
—ご支給いただくイラストで足りるか(チラシはAI生成で素材データなし。不足分は別途お見積り)
—ブース事業者への事前説明の場があるか

解決済み

Q1(★1,100で確定。当初550としていたが、2026-09-04に先方が体験料を1,000+100へ変更。この行が550のまま残っていた)/Q3・Q4(★カード1枚×1ブース=1回。当初「1チーム×1ブース=1回」で確定していたが、2026-09-04に先方要望で「子ども1人につき各ブースで1回」へ変更=決定4。UNIQUE(card_code, booth_id) の定義そのものなので、ここを古いまま残すと次に読む人が実装を仕様違反と判断する)/Q5(チーム名のみ)/Q26(★チームの呼び名=A:お申し込みで先方が決める。2026-08の先方回答)/Q7(30ブース)/
Q10・Q11(QRとNFCが同じURL)/Q12(12/31で削除)/Q16(印刷時にNFCへ書き込み)/
Q18(舞台と連携しない)/Q19(Cloudflare・専用ドメインなし)/Q22(画像は先方支給)/
**Q6(約140チーム・1チーム平均3名)/Q8(当日参加は受け付けない=受付画面は不要)/
Q24(開催時刻はチラシ(役員会後版)を正とし12:00–16:00。打合せメモの13:00は古い情報)/
税金図鑑の項目リスト(先方は「9月中頃までに決定」。こちらからは「項目名だけ8月下旬・文章とイラストは9月末」とお願いした)** ← いずれも2026-08-04の先方回答で確定


13. リスクと対策

リスク影響対策
会場の通信が詰まるP1が止まる=致命端末内に記録して後送。モバイルルーター持参
安いタブレットでQRが読めない全ブースで止まる動作条件書+10月に本番と同一機種で実機確認
カードが光沢でQRが読めない同上マット指定を入稿前に伝える
URL未確定のまま入稿されるカード全数が使えないURLを持つ。刷り直し不可8月中にホスティング先と名前を確定
子どもがカードを画面に押し付ける端末のNFCが反応して画面が飛ぶタブレットのNFCをOFF
画面が自動ロックするカメラが止まり、スタッフが解除を繰り返す自動ロックをOFF
NFCが家で読めない納税証にたどり着けないQRからも同じページが開く(費用ゼロ)
カード紛失・二重計上モニターに嘘の数字手入力ボタン+管理画面で修正
当日の朝が唯一のリハになる準備不足のまま本番前日に機材が使えるか確認(Q17)
画像制作を無償で背負う工数が膨らむ見積の「含まないもの」に明記
とりまとめ役を無償で背負う11月に破綻窓口を先方に置いてもらう

14. 変更の管理

14.1 3つの区分

種類定義対応
不具合別紙「制作範囲のご確認」§02 に記載した動作と異なる場合(本書 §6 の内容を先方向けに書き出したもの)回数の制限なく無償(本番当日まで)
調整・差し替え記載どおりに動いているが、見え方・文言・素材を変えたい場合
(図鑑の文章・イラスト・文字の大きさ・色・言葉づかい)
合計3時間まで無償。
超過分は1時間 5,500円(税込)
仕様の変更・追加動作や条件が増える場合
(処理を足す・表示項目を増やす・新しい画面)
別途お見積り

14.1-b 先方へは「PDF」で渡す(★URLで渡さない)

scope・estimate・device-spec は PDF にして添付する。
とくに scope は不具合の判定基準なので、URLで渡してはいけない。
URLはこちらがいつでも書き換えられるため、先方が同意した基準が静かに変わる。
それは基準がないのと同じ。

渡し方理由
scope(判定基準)PDF手元で固定される。改変されない
estimatePDF正式書類
device-specPDF見積の別紙
画面イメージURLデモであって基準ではない。更新して見せる前提

★送ったあとに scope を直した場合は、何をどう変えたかを明示して PDF を再送する。
黙って直さない。CHANGELOG.md に記録する。

(trehan-scope.pages.dev は社内・平崎さん用の確認先として残す。先方には渡さない)

14.2 なぜ「不具合」を書面に紐づけるか(★重要)

「不具合」を定義せずに「無償で直します」と書くと、解釈の幅が残る。
「思っていたのと違う」がすべて不具合として持ち込まれ、無償対応が無限に続く。

そこで、不具合の定義を「制作範囲のご確認」§02 に固定する。

§02 に書いてある動作と違う → 不具合(無償)
§02 に書いていない → 調整、または仕様変更

★ 基準は、先方が手元に持っている書面でなければならない。
本書(要件定義書)は先方に配布しないため、これを基準にすると
先方は自分が同意した基準を読めない。 それでは定義がないのと同じ。

そのため §6 の内容を「制作範囲のご確認」§02 に書き出し、そちらを基準とする。
本書 §6 を更新したら、§02 も必ず同時に更新すること。

これは先方を縛るためではなく、両者が同じ基準で話せるようにするためである。
§02 を細かく書いておくほど、双方にとって判断が明確になる。

14.3 なぜ「回数」ではなく「時間」か

「2回まで無償」とすると、1回のなかに100件詰め込まれても1回と数えられてしまう。
実際にかかる手間は件数と量に比例するため、時間で区切るほうが実態に合う。

14.4 締切

なぜ早く聞きたいのか:着手後に前提が変わると、実装と確認をやり直すことになる。
着手前なら費用をかけずに織り込める。同じ要望でも、いただく時期によって費用が変わる。


15. 関連文書

画面イメージ(実際に動きます)https://trehan-preview.pages.dev
制作範囲のご確認(A4 1枚)別紙
御見積書別紙
機材の動作条件別紙
企画書・チラシお預かりしたもの