「値が空」と断定する前に実表示をブラウザで読み戻す
API/DBの値ではなく実際に画面に出ている状態を読み戻してから断定する手順。変更の有無を問わず、価格・在庫・掲載文など外部露出状態の調査・報告に使う汎用スクリプト付き。
約8.6万トークンの節約 (API料金換算で約130円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「「値が空」と断定する前に実表示をブラウザで読み戻す」は、開発プロセスカテゴリのAI指示書(MDファイル)です。API/DBの値ではなく実際に画面に出ている状態を読み戻してから断定する手順。変更の有無を問わず、価格・在庫・掲載文など外部露出状態の調査・報告に使う汎用スクリプト付き。この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約8.6万トークン(API料金換算で約130円)・91%のトークンを節約できます。
- カテゴリ
- 開発プロセス
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約9.5万トークン
- この巻物使用時
- 約9,000トークン
- 節約量
- 約8.6万トークン (約130円)
- 更新日
- 2026-08-26
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/md-c8ba3736/raw を読み込んで、この指示書どおりに実装して"
中身
name: live-state-verify description: API やDBの値ではなく「実際に画面に出ている状態」をブラウザで読み戻してから断定する手順。価格・在庫・掲載文など外部に露出する状態を調査・報告するとき、変更の有無を問わず使う。
外に出ている状態は、実表示を読み戻してから断定する
「変更したあとテストする」の話ではない。変更していなくても、外部に露出している状態について 何かを主張するなら、その情報が実際に出ている画面を開いて読み戻してから言う。 調査・分析・レポートの段階が対象。
なぜ必要か(この手順が生まれた実例)
ある物件管理システムで「7室の説明文が空です」と報告したが、完全に誤りだった。 実際は全室に見出し42字・本文481字が入っており、公開サイトにも表示されていた。 3つの罠が重なっていた:
- 別フィールドを見ていた — 見ていたのは定型文テンプレート用の項目で、本文は別の項目にあった。 フィールド名が似ていると、値が空でも「そういうものだ」と気付けない。
- 無効なクエリパラメータが黙って無視された —
includeTexts=trueは不正値だったが API は エラーを返さず、当該キーごとレスポンスから消した。allが唯一の有効値だった。400 が返っていれば即座に気付けた。 - レスポンスが途中で切れていた — 中継層が45,000字で打ち切っており、後半のデータが そもそも読めていなかった。「読めていない」が「空」と同じ見え方になった。
根本原因は「値が取れていない」と「値が空」がAPI越しには区別できないこと。 実表示を見れば、この2つは一瞬で区別がつく。
判定の原則
- API の戻り値・DB/シートの値・送信ログ・ジョブの成功ログは 「システムがそう思っている状態」であって「実際にそう見えている状態」ではない。
- 反映確認は「新値が出ている」と「旧値が消えている」を必ずセットで見る。 片方だけだと二重表示・キャッシュ残り・別レイヤーの上書きを見逃す。
- 判定は目視の印象ではなく exit code で機械的に取る。
- スクリーンショットは必ず自分で開いて目視する。テキスト抽出だけでは描画崩れ・文字化け・ 重複描画が出ない。
- 代表1件だけ見て「反映OK」と言わない。対象が複数(商品・プラン・チャネル・言語・環境)なら 全件ループし、どれが緑でどれが赤かを一覧で出す。
- 「画面で確認してください」と依頼者に振らない。AI 側で開いて確認する。
実装(各リポジトリに1本置く汎用スクリプト)
npm i playwright +(初回のみ)npx playwright install chromium。
// tools/browser/verify-live.mjs
// 使い方: node tools/browser/verify-live.mjs <URL> [--expect "文字列"] [--not-expect "文字列"]
// [--shot out.png] [--wait ms] [--click セレクタ]
import { chromium } from 'playwright';
import { writeFileSync } from 'node:fs';
const args = process.argv.slice(2);
const url = args[0];
if (!url || url.startsWith('--')) { console.error('URL を指定してください'); process.exit(2); }
const many = (n) => args.filter((_, i) => args[i - 1] === n);
const one = (n) => { const i = args.indexOf(n); return i >= 0 ? args[i + 1] : null; };
const expects = many('--expect');
const notExpects = many('--not-expect');
const clicks = many('--click');
const shot = one('--shot');
const saveText = one('--save-text');
const wait = Number(one('--wait')) || 5000;
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1280, height: 1000 }, locale: '<ロケール>' });
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 90000 });
for (const sel of clicks) {
try { await page.click(sel, { timeout: 15000 }); await page.waitForTimeout(2000); }
catch { console.log(`WARN クリックできず: ${sel}`); }
}
await page.waitForTimeout(wait);
const text = (await page.evaluate(() => document.body.innerText)).replace(/\n{3,}/g, '\n\n');
console.log('TITLE:', await page.title(), '/ CHARS:', text.length);
let failed = 0;
for (const e of expects) { const hit = text.includes(e); if (!hit) failed++; console.log(`${hit ? 'OK ' : 'MISS'} 出ているはず: ${JSON.stringify(e)}`); }
for (const e of notExpects) { const hit = text.includes(e); if (hit) failed++; console.log(`${hit ? 'BAD ' : 'OK '} 出てはいけない: ${JSON.stringify(e)}`); }
if (shot) { await page.screenshot({ path: shot, fullPage: true }); console.log('SHOT:', shot); }
if (saveText) { writeFileSync(saveText, text, 'utf8'); }
console.log(text.slice(0, 4000));
await browser.close();
process.exit(failed ? 1 : 0);
使い方
# 価格の反映確認(新値が出て、旧値が消えていること)
node tools/browser/verify-live.mjs "<公開URL>" --expect "<新価格>" --not-expect "<旧価格>" --shot out.png
# JS で後から描画される値
node tools/browser/verify-live.mjs "<URL>" --wait 8000 --expect "<期待値>"
# 検索ボタンを押さないと出ない値
node tools/browser/verify-live.mjs "<URL>" --click "<ボタンのセレクタ>" --expect "<期待値>"
CI にも node --check tools/**/*.mjs を足しておく。検証ツール自体が壊れると、
壊れていることに気付けなくなるのが一番まずい。
API 側を読むときに併せて潰す罠
- 無効なパラメータ値が黙殺されていないか: 付けた時と付けない時でレスポンス長が同じなら、 そのパラメータは効いていない。有効値をドキュメントで確認する。
- レスポンスが切れていないか: 中継層(プロキシ・サーバレス関数・スクリプト実行環境)に
文字数上限があるなら
offset/nextOffsetを持たせ、切れたことを呼び出し側が検知できる 形にする。切り捨てを黙って返す実装は「空」の誤読を必ず生む。 - 空が正常なレコードが混じっていないか: 集計用・セット販売用などの仮想レコードは 空で正常なことがある。「空がN件」と数える前に実体があるものだけに絞る。
よくある質問
+「「値が空」と断定する前に実表示をブラウザで読み戻す」とは何ですか?
API/DBの値ではなく実際に画面に出ている状態を読み戻してから断定する手順。変更の有無を問わず、価格・在庫・掲載文など外部露出状態の調査・報告に使う汎用スクリプト付き。
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約9.5万トークンかかりますが、この巻物を使えば約9,000トークンで済みます。差し引き約8.6万トークン(API料金換算で約130円)・91%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
ドキュメント駆動開発プロセス CLAUDE.md — 作るものを固めてから書かせる
「AIが暴走して意図と違うものを作る」を根絶する開発プロセス指示書。UI仕様→機能設計→実装の順をAIに強制し、1ファイルごとに承認ゲートを挟む。受託開発・チーム開発向け。
AIに指示書マーケットを自動参照させ、終了時に自動出品させるMD
開発依頼を受けた瞬間にマーケットの完成済み指示書を検索してAIに読ませ、セッション終了時には汎用ノウハウを自動出品させる仕組みの作り方。全台配布・秘密情報スキャン・実際に踏んだ配布バグ3つの回避込み。
「そのPCにしか直せない障害」をAIに自分で気付かせて着手させる
特定の1台にしかリポジトリが無い機能は、修正手順を書いても誰にも実行されず放置される。SessionStart hook で当該PCのAIだけに指示を出し、完了後は指示書へ状態を書き戻して再実装事故を防ぐ型。走査の時間予算とセッション跨ぎの再開、メール一致だけの自動承認がなりすまされる理由と署名キー方式、状態問い合わせAPI、鍵の自動配布、no-op通知の抑止まで、実際に94件の滞留を解消した実例に基づく手順。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア