🤖 AI運用ルール

mikke

最終更新 2026年08月24日 / 22_AI運用ルール/コマンド集/mikke/mikke.md

/mikke — 参考サイトを「TERASU Lab HP参考サイト集」+「MIKKE」に同時追加

ユーザー入力: $ARGUMENTS

目的: 参考サイトのURLを渡すだけで、①TERASU Labの HP参考サイト集(reference-sites)と ②一般公開ギャラリー MIKKE(mikke.scale-group.co.jp)の両方に1コマンドで追加する。
(背景: Lab→MIKKEのCI自動同期は 2026-07-17 に廃止=MIKKEは手動デプロイが必要。このコマンドがその手動分を毎回セットで実行する)

mikke!の撮影・表示・判定を直したら、このコマンドを都度アップデートする(2026-07-23 大串FB・恒久)。
「今回よくできた」で終わらせず、再現の仕組み側(この.md+tools/)を必ず更新し、更新したことを報告に一言添える
大串から毎回「コマンド更新した?」と聞かせない。撮影ツール(shoot_fullpage.mjs/find_subpages.mjs)を変えたら、
下の「撮影仕様」表と「生成・配信の落とし穴」も同時に直す。関連=mem:feedback_mikke_command_autoupdate

起動時のお約束(毎回・最初にやる)

コマンド定義そのものを最新にしてから始める(2026-07-23 大串指示)。
メンバー全員が同じ最新版で動くための仕組み。~/.claude/commands/*.md は Vault への symlink なので、
Vault を pull すれば全員のコマンドが同時に最新になる

git -C ~/dev/scale-brain pull --ff-only    # ① コマンド定義を最新化(これを忘れると古い手順で動く)
  • ② 最新化したら、この .md を読み直してから着手する(途中でアップデートされていても取りこぼさない)
  • ③ 冒頭で現行ver(下の変更履歴の最上段)を1行で伝える。「ver今何?」と聞かれたら①をやってから答える
  • ④ 作業リポも同様に最新化する(各コマンドの「現在地把握」ステップ)

実行フロー

0. まずURL募集メッセージを返して待つ(コマンド単体で打つ運用)

  • コマンドが打たれたら、最初に必ず次のメッセージだけ返して一旦応答を終える(他の作業を先にやらない):

    追加したい参考サイトのURLをお送りください(複数まとめてOK・改行やスペース区切りで何件でも)

  • URLが送られてきたらステップ1へ。※例外: $ARGUMENTS に最初からURLが入っていた時だけ、聞き直さずそのまま進んでよい。
  • 複数URLは何件でもまとめてOK。ステップ2〜6を全URL分やってから、デプロイ(7)・検証(8)・最終確認(9)はまとめて1回(commit1回・MIKKEデプロイ1回)。

全体の流れ: 0.URL募集 → 1.現在地 → 2.判定(AIが決める) → 3.サムネ自動確定 → 4.登録・ビルド → 4-2.フォントも図鑑へ4-3.構成・動きも分析5.下層デザイン(発掘→撮影→自動検品) → 6.デプロイ → 7.本番検証(機械検品) → 8.最終確認(唯一の停止点) → 9.修正対応 → 10.セクション化の誘導

止まるのは「最後の最終確認」1回だけ(2026-07-22 大串決定・恒久)。
「だいぶ精度が良くなってきたから、途中で止まらず最後にまとめて聞く」方針への転換。
サムネ承認ゲート・判定項目承認ゲートは廃止=AIが一番良い状態で登録し切り、最後に全部まとめて見てもらう
微妙なところがあれば、そこから直す(サムネが微妙ならそこで初めて別案4つを出す)。

1. 現在地把握

2026-07-23 にリポを分離した(大串決定・案B)。作業場所が変わっているので注意。
mikke! = ~/dev/mikkeTERASU Lab = ~/dev/terasu-lab共通部分(参考HPのデータ・撮影画像・撮影ツール)= core/(submodule = scale-group-jp/terasu-web-core)。
参考HPのデータは core にあり、mikke! と Lab の両方がそれを読む=1回登録すれば両方に載る。

cd ~/dev/mikke && git pull --ff-only && git submodule update --init --remote --merge core
cd core && git pull --ff-only && cd ..          # 共通部分を最新に(他の人の追加を取りこぼさない)
~/Obsidian/scripts/ai_session_lock.sh list      # 誰かが同じ対象を触っていないか
  • 他人の未push作業と衝突しそうなら止めて報告。
  • 複数人・複数セッションが同時に走る前提(2026-07-22)。データは「1件=1ファイル」(data/reference-sites/<id>.json)なので
    中身が上書きし合うことは無いが、本番デプロイだけは排他(ステップ6の deploy_mikke.sh がロックを取る)。
    作業前に git pull を必ず通す(集約JSONは全件再生成なのでコンフリクトしやすい。出たら再ビルドで解消してよい)。

AIが一番良い状態まで作り切ってから、最後にまとめて見てもらう。(2026-07-22 大串決定・恒久。旧・途中2ゲート制はここで廃止)
ただし 「AIが適当に決めていい」ではない。止まらないぶん、判定は機械で裏を取る(色はピクセル実測・note字数は自動拒否・撮影は自動検品)。
精度が落ちたと感じたら、ゲートを戻すのではなく機械チェックを増やして直す。

2. サイトを見て判定項目を決める(フィルター精度の要・正確に判定)

MIKKEはフィルターで絞る前提。雰囲気/業種/色の誤登録が最も致命的(大串FB 2026-07-17)。必ずサイトを実際に開いて(Browser paneで表示/スクショ)判定する。curlのHTMLだけで色・雰囲気を推測しない。判定値はすべて build_mikke.py の正規リスト(enum)に準拠=正規外は add_refsite がエラーで弾く。
- --industry(その会社の"実事業"で1つ): SalesNow大業界31分類キー。採用サイトでも事業側で判定(例: メーカー採用→manufacturing、建築設計事務所→construction、Web/広告制作→adcreative、SaaS→it、ウェディング→lifeservice)。有効キーは不正値を渡すとエラーに全一覧が出る。
- --site-type必須・サイト種別8種から1つ・2026-07-20新設): corporateコーポレート(ブランドサイトも含む)/ recruit採用 / serviceサービス・製品 / ecEC・通販 / lpLP / mediaメディア・オウンド / anniversary周年・特設 / portfolioポートフォリオ。迷ったらcorporate
- --mood(デザインの雰囲気14種から1つだけ・複数不可): minimalシンプル・ミニマル / modernスタイリッシュ / naturalナチュラル / monotoneモノトーン(暗いダーク系もここ) / luxuryラグジュアリー / elegantエレガント・上品 / japanese和モダン / colorfulポップ・カラフル / boldボールド・インパクト / retroレトロ・ヴィンテージ / editorial雑誌風レイアウト / illustイラスト・手描き / threed3D・立体 / gradientグラデーション。
- 「パッと見て最初に受ける印象」を1つ選ぶ。2つで迷うなら語彙側の見直しサイン(複数化はしない=色と違い同じ役割の判断が2つになり精度が落ちるため・2026-07-20 大串決定)。
- 安易にmodernを選ばない。かつて37%がmodernに偏って機能していなかった。より具体的に当てはまるものがあればそちらへ。
- --main-color(ベース=画面の支配色/背景基調)--sub-color(アクセント=差し色/見出し・ボタンで目立つ色。最大2色までカンマ区切りred,green。2026-07-20 大串決定): white/black/gray/lightgray/beige/brown/navy/blue/green/yellow/orange/red/pink/purple/colorful から実際の配色を見て選ぶ。ベースとアクセントは必ず別の役割の色。多色基調ならcolorful
- 色は目視で決めない。必ず機械監査を通す(2026-07-20 大串FB「判定方法がまだ精度甘い」。URBAN HOME を画面の92%が緑なのに white/black と登録していた事故):
bash node tools/audit_colors_dom.mjs <slug> # ① DOMから「実際に見えている背景色」を実測 python3 tools/audit_colors_final.py # ② 2方式を突き合わせて高確度のズレだけ出す
1方式だけで判定しない(2026-07-23 大串FB「ベースとアクセントの認識が違うかも」で作り直し)。
・ピクセル方式(audit_colors.py)=サムネの画素を数える。写真の色に引っ張られる
(Will Style は空の写真で blue 98%、でも実際は白基調=登録は正しい。169件中136件が要確認になり使い物にならなかった)
・DOM方式(audit_colors_dom.mjs)=画面の各点で実際に見えている背景色を読む。FV全体が画像だと下地の色しか残らない
外し方の性質が真逆なので、audit_colors_final.py2つが同じ色を指したときだけ信用する(136件→17件に絞れた)。
ベースは面積15%以上あるのが当然。アクセントは小さくてよいが0%なら疑う。数値も鵜呑みにせず実画面と突き合わせる。
実測色がすでにアクセントに入っていたら「ベースとアクセントが入れ替わっている」=入れ替えて直す。
- --note(1〜2文=詳細ページに「どんなサイト?」として出る。36字以内・厳守)/ --id(一意slug)/ --name / --url
- note は36字以内(実装 add_refsite.py の現行上限。2026-08-21 に実測で確認し、この.mdの「66字」表記を是正)。詳細ページの右カラムが340px固定=1行約22字で、3行に収まる上限として決めた値。
超えると add_refsite.py登録を拒否して止まる(目視でなく機械で担保)。書き方の型=「何のサイトか。+デザインの何が参考になるか。」の2文
サイトの meta description をそのまま貼ると必ず溢れる(既存48件がこれで105字に膨らみ、2026-07-22に全件書き直した)。自分の言葉で要約すること。

タグ・一覧の1行(summary)・見どころ(highlights)は 2026-07-22 に廃止(大串決定)。
一覧カードは「社名+色ドット+チップ(業種/サイト種別/雰囲気)」、詳細ページは「どんなサイト?+分類6項目」で構成されており、
どこにも表示されず・似ているサイトの選出にも使われないため、入力そのものをやめた。
= 登録に必要なのは id / name / url / industry / site-type / mood / main-color / sub-color / note / contributor の10項目だけ。

撮影ツール・画像・参考HPデータは全部 core にある(2026-07-23 のリポ分離)。
node tools/... 系は cd ~/dev/mikke/core で実行する。生成とデプロイだけ ~/dev/mikke に戻る。

3. サムネを自動で確定する(一番良い状態をAIが選んで登録・確認は取らない)

一覧・詳細で最初に目に入る画像=mikke!の命。だが毎回4案を見せるのはやめる(2026-07-22 大串決定)。

node tools/shoot_mikke.mjs <slug>     # 自前スクショ(4:3)を撮って mikke-shots/<slug>.jpg に置く
  • 自前スクショが標準。mShots は使わない=後日プレースホルダ(Generating Preview…)に戻る時限爆弾(不良報告9件の原因はすべてこれ)。
  • shoot_mikke.mjs は networkidle待ち→最後までスクロール→画像/動画の読込完了待ち→撮影まで面倒を見る。
  • オープニング演出が長いサイトは --wait=14000。入口ゲート(音楽ON/OFF・ENTER)があるサイトは PRE_ACTIONS にID単位で突破処理を足す。
  • 2026-07-24 に撮影を根治済み(大串FB)。以下はツールが自動でやるので、基本 shoot_mikke.mjs <slug> を打つだけでよい:
  • オープニングの幕を待つ→残れば消すwaitCurtainGone/killCurtain)。ILOLI HAIR 等の .intromask で一覧・詳細が「グレーの箱」になっていたのを根治。
  • 中身が写るまで粘って撮るshootUntilRich)。読み込みが重いFV(CAFE TORTUE は明けるまで30秒超)でも、薄ければ待って撮り直す(最大3回)。
  • ほぼ無地なら保存しない。壊れた画像は本番に出ない(=要確認に載る)。ローディングが特に長いサイトは --wait=20000 等でさらに待たせる。
  • ステップ5でどうせFVを高画質(PC 915×635・等倍2倍)で撮るので、サムネが弱いときはそのFVを流用してよい(撮り直しの二度手間を作らない)。
    切り出しは tools/derive_shot.py が正確にやる(2026-07-24 新設・手打ちの sips はやめる):
    python3 tools/derive_shot.py --fv-from-thumb <id>(一覧サムネ→FV)。
    「サムネは下半分が空なのにFVは中身が詰まっている」サイトは、FVの標準偏差がサムネより明らかに大きい=機械で抽出できる。
  • どうしてもきれいに撮れないサイトは、詳細ページのFVをサムネに流用してよい(2026-07-23 大串決定・恒久)
  • 適用条件=サムネ撮影が採用ゲートに何度も落ちる/崩れが直せないサイトだけ。うまく撮れているサムネは絶対に触らない
    (大串「いま fondesk 以外は一覧のサムネきれいだから、それは変えたくない」)。一括での置き換えは禁止・1サイト単位で判断する
  • 理由: 詳細ページのFV(mikke-shots/full/<id>__top-pc.jpg)は shoot_fullpage.mjs
    スライダー1枚化・重なり解消・採用ゲートまで通した確実に正しい1枚。サムネ側で同じ品質を出せないなら、
    正しい1枚を使い回すのが早くて確実。
  • 手順(2026-07-24 新設ツールで正確に切り出す):
    bash python3 tools/derive_shot.py --fv-from-thumb <id> # 一覧サムネ→詳細FV を作る
  • トップがどうしても撮れない(幕が明けない)サイトは、撮れている下層ページの画像を一覧サムネに使ってよい(2026-07-24 大串決定・恒久):
    bash node tools/shoot_fullpage.mjs <id> # 下層を含め高画質で撮る(例: member ページ) python3 tools/derive_shot.py --thumb-from-page <id> <page-key> # 例: iloli-hair member
    適用条件は上と同じ=自動で何度撮っても中身が写らないサイトだけ。1サイト単位で判断する。
  • 実績: fondesk(キャッチの重なりがサムネ側だけ直せず、詳細FVを流用)/ILOLI HAIR(幕が明けずトップが撮れないので member ページを流用・2026-07-24)。
  • FV由来サムネを使う前に、その __top-pc.jpg がFirewallブロック画面でないか必ず目視(ほたるグループは元FVが「NinjaFirewall」の白画面で、それをサムネにしてしまっていた)。ブロックは時間を置いて撮り直す。
  • 登録前に必ず機械検品を通す(2026-07-24 新設・見落とし防止の要)。目視より先に、まず数字で確かめる:
    bash node tools/audit_shots.mjs <slug> # 一覧サムネ node tools/audit_shots.mjs --full <slug> # 詳細FVも一緒に
    「色◯種/輪郭◯%」で中身の量を測り、ほぼ無地なら⛔で止まる。✅になるまでデプロイに進まない。
  • そのうえで撮れた画像を自分でも見るmikke-shots/<slug>.jpg を Read)。同意バナー・入口ゲート等の写り込みは目視でしか気づけないので併用する。真っ白・単色・幕・バナーが写っていたらその場で撮り直す。大串に判断を投げない。
  • 4:3 厳守(8:7 だと端のロゴ・コピーが欠ける)。mikke-shots/<slug>.jpg が無い状態でデプロイしない
  • 微妙かどうかの判断は最終確認(ステップ8)で大串がする。そこで「微妙」と言われたら、そこで初めて別案4つを出す(ステップ9)。

4. カード生成 → ビルド

cd ~/dev/mikke/core          # ← 参考HPのデータは core にある(mikke!とLabの共通資産)
python3 tools/add_refsite.py --id <slug> --name "<名前>" --url "<URL>" \
  --industry <業種> --site-type <サイト種別> --mood <雰囲気> --main-color <ベース色> --sub-color <アクセント色> \
  --note "<メモ>" --contributor <ogushi|saki|hosokawa>
# ↑  名義ルール(2026-07-23 大串指示・恒久): **追加者は さき / 大串 / 細川 の3名だけ**。
#   `--contributor saki`(さき)/`ogushi`(大串)/`hosokawa`(細川)の**いずれか必須**。
#   **migrated(移行分)や claude という名義は作らない**(過去データ79件は大串へ寄せて統一済み)。
#   ※旧表記「制作部署」は 2026-07-23 に「さき」へ改名(内部idは saki のまま=KV保存済みデータと互換)。
#   ※TERASU Lab では「追加者」「追加日」で絞り込めるようにしてあるので、ここが揺れると絞り込みが割れる。
#
#  2026-07-24 大串指示【二重登録の防止+追加者の合流】
#   **既に登録されているサイトは、もう一度入れない**(実際に niko and… BASE が二重登録され、
#   一覧に同じサイトが2枚出ていた)。add_refsite.py が自動で次のように振る舞う:
#     ・同じサイト × 同じ追加者 → 何もしない(「既に登録済みです」と出て正常終了)
#     ・同じサイト × 別の追加者 → **新しく作らず、既存に追加者を足す**
#       (大串「2人が登録したものだから2人の名前が入るのが自然」)
#     ・URLは表記ゆれ(末尾スラッシュ・www・http/https・大文字小文字)を吸収して同一判定する
#   → 「既に登録済み」と出たら**それで完了**。強引に別idで入れない(--force は別サイトの時だけ)。
#   ※2026-07-24: 追加者の3択と自動特定は **core/tools/contributors.py に共通化**(参考HPもセクションも同じ1本)。
#     名義を増やす/直すときはそこだけ変えれば、/mikke と /section の両方に効く。
#     (それまでは Lab の add_section.py を読む作りで、リポ分離後は **このコマンドが落ちていた**=2026-07-24 修復)
#   ※追加者・追加日を**表示・絞り込みに使うのは TERASU Lab だけ**。mikke! は同じデータを持つが画面には出さない。
python3 build_core.py     # ← core で集約JSONを再生成(必ず先)
cd .. && python3 build_site.py   # ← mikke! を生成(_fs_refsites/)

#  デプロイ前ゲート(2026-07-21 恒久): 自前スクショが無いままprodへ出さない
ls core/mikke-shots/<slug>.jpg || { echo "自前スクショが無い → cd core && node tools/shoot_mikke.mjs <slug> を先に実行"; }
  • 重複ガードで⛔が出たら既登録=報告して停止(--force は大串指示がある時だけ)。

4-2. そのサイトのフォントも図鑑に入れる(2026-07-24 大串指示・毎回やる

大串「良いHPはフォントも良い。/font だけで入れようとみんなしなさそうだから、
/mikke を使ったら自動でフォントが入る機能があれば、フォント集がめっちゃ増えていきそう」。
→ 参考HPを1件足すたびに、そのサイトの書体も拾って図鑑に入れる。聞かずにここまでやる。

cd ~/dev/mikke/core
node tools/detect_fonts.mjs "<URL>" --pretty

フォント検出は「1サイトずつ/背景実行」で回す(2026-07-25 大串FB「みんなフォント一緒なわけもない」で発覚・恒久)。
for ループで複数サイトを一度に検出すると、シェルの2分制限で途中打ち切りになり★を静かに取りこぼす
(実際にこの日、10件を一括ループして★2件=Montserrat/Oswald を落とし、あとで回収した)。
複数サイトのときは detect_fonts を1件ずつ run_in_background で実行し、各サイトの出力(★ or エラー)を必ず最後まで確認する。
重いサイトでタイムアウトしたら個別に再試行(それでもダメなら「フォント未チェック」と報告に明記・黙って0件にしない)。
※ 2026-07-27 に page.gotodomcontentloaded+90秒へ緩めたので、45秒で必ず落ちていた東急/DAL/JT等も拾えるようになった。

判定は「Google Fonts にあるか」ではなく「誰でも使えるか」(2026-07-27 大串FB「フォントは本当にゼロ件?」で根治)。
旧実装は Google Fonts の <link> を書いているかだけで可否を決めていたため、Google Fonts 外の無料フォントを構造的に全部捨てていた
(TSUKASA の主役 Aileron=使用304箇所・SIL OFL商用可なのに「自前配信」として破棄していた)。いま参照するのは次の2つ:
- core/data/font-catalog-google.jsonGoogle Fonts 全1,942件<link> を書いていなくても名前一致で拾う
- core/data/font-catalog-free.jsonGoogle外の無料フォント辞書(Fontshare / Font Squirrel / LINE Seed / OFL系)。
ここに無いだけで捨てないよう、新しく無料と分かったら1件足す(足せば次から★になる)
Adobe Typekit配信のサイトは名前がkit slugで返る(2026-08-24 根治)。zen-kaku-gothic-new のように
ハイフン区切り・小文字で出るため、正式名しか見ていないと Google Fonts にある無料書体でも「判定できず」に落ちる。
famKeys() がハイフン/アンダースコアをスペースに開いて引き直すので通常は自動で拾えるが、判定できずが出たら「それは kit slug ではないか」をまず疑う<head>use.typekit.net があればTypekit配信)。
有料フォントは絶対に辞書へ入れない(モリサワ・フォントワークス・Adobe Fonts有料=誰でも使えない)。

出力の見方:
- ★ が付いたものだけ入れる=「誰でも使えて・実際に使われていて・まだ図鑑に無い」書体
- (図鑑に登録済み) … 既にあるので入れない(/mikke を回すたび同じものが増えないようにしてある)
- (Google Fonts) (fontshare) (fontsquirrel)入手先。★ならそのまま登録してよい
- ⚠ 判定できなかった書体黙って捨てず必ず一覧に出る(2026-07-27 大串指示B)。有料の可能性もあるが、
無料辞書に未登録なだけかもしれない。無料と確認できたら data/font-catalog-free.json に足す
- 何も出なければ「画像で組まれている」等。0件でも止めない(そのまま次へ進む)

過去分の棚卸しは tools/rescan_fonts.mjs(2026-07-27 新設・2026-08-24 に --retry 追加)。
全件走査は回線断でまとめて失敗する。終わったら必ず「走査成功◯件/失敗◯件」を見て、失敗があれば node tools/rescan_fonts.mjs --retry(前回失敗分だけ)を0件に近づくまで繰り返す。それでも通らないサイトは粘らず「フォント未チェック」と報告に明記する。
node tools/rescan_fonts.mjs --jobs=4全登録サイトを再走査し、同じ書体を会社横断でまとめて
tools/_font_rescan.json に出す。そのまま python3 tools/bulk_add_fonts.py で一括登録できる(--dry で下見)。
判定ロジックを変えたら必ず全件を回し直す(初回は312件走査→53書体を回収し、図鑑が 87→165件になった)。

★ が出たら、そのぶんだけ /font の登録コマンドを回す(会社名は参考HPの社名を入れる):

cd ~/dev/mikke/core
python3 tools/add_font.py --id <slug> --name "<正式名>" --cat <cat> \
  --jp "<短い説明>" --tags "<tag1,tag2>" --desc "<用途・雰囲気>" \
  --company "<その参考HPの会社名>" \
  --css "@import url('https://fonts.googleapis.com/css2?family=...&display=swap');\nfont-family: '<正式名>', sans-serif;"
python3 build_core.py && python3 tools/extract_fonts.py
  • --company を必ず付ける(2026-07-24 大串指示)。「どの会社のHPで使われていたか」で
    絞り込める設計にしてあるので、ここが空だと「Googleフォント」に混ざって価値が半減する。
  • cat語彙・登録の詳細は /font と同じ。
    /font 単体で入れる従来の使い方も残っている(大串「今まで通り /font だけで入れる可能性もある」)。
  • 追加したフォントは参考HPと同じデプロイに乗る(この後の 6. で一緒に本番へ出る)。

4-3. 構成と動きも分析して図鑑に紐づける(2026-07-24 大串指示・毎回やる

大串「/mikke で入れたHPの構成を分析してレイアウトに自動で入るようにしたい。
レイアウトは"こういう構成にしよう"と考えられてめっちゃ便利」
「レイアウトが追加できるならアニメーションも追加できるのでは」。
HPもフォントもレイアウトもアニメーションも、/mikke ひとつで一気に溜まるのが狙い。

cd ~/dev/mikke/core
node tools/analyze_layout.mjs <slug> [<slug2> …]
  • 参考HPを実際に開いて、構成(FVの型/ナビの型/グリッド/左右交互/横スクロール)と
    動き(無限ループ・スクロール演出・ホバー効果)を判定し、
    レイアウト/アニメーションのパターンidに対応づけて core/data/layout-analysis.json に貯める。
  • 結果は Lab のレイアウト・アニメーションのカードに 「実例: ◯◯、◯◯ ほか◯件」 として出る
    =「この構成、どのサイトが使ってる?」がその場で辿れる。
  • 判定は自動・確認不要。0件でも止めない(画像で組まれたサイト等)。
  • 全件を取り直したいときは --all(171件で約12分・--jobs=5)。

5. 下層デザイン(新規追加でも必ずセットで撮る・2026-07-22 大串決定・恒久)

トップFVだけで登録を終えない。 詳細ページは「FV+下層デザイン」で1セット。
後追いにすると必ず撮り漏れが出る(実際に159件が未着手のまま溜まった)。登録と同じ流れで撮り切る。

cd ~/dev/mikke/core      # ← 撮影ツールと画像は core にある
node tools/find_subpages.mjs <slug> --write     # ← --write が無いと保存されない(付け忘れ事故あり)
node tools/shoot_fullpage.mjs <slug> --jobs=3   # トップ+下層をPC/SP撮影。末尾で check_fullpage が自動実行される
  • 複数サイトはまとめて渡す<slug1> <slug2> …)。--jobs=3 はサイトをまたいで並列に走るので、
    1件ずつ順番に回すより速い。10件超なら --jobs=4(Macの負荷を見て調整)。
  • 検出結果はそのまま採用してよい(承認ゲートは置かない・2026-07-22 大串決定)。判定は相対パス+リンクテキスト優先で、タグ/カテゴリ一覧は除外済み。
  • 1ページ完結のLPは「同ページ内アンカー」も下層ページになる(2026-07-23 大串指示・恒久)
  • 例) SOURAの集い(星野リゾート)は1枚もので、ナビの「よくある質問」を押すと同じページの下部へスクロールする。
    別URLが無いだけで、利用者が見たいものは他サイトの下層と同じ。→ #faq などをそのまま下層として収録する。
  • 仕組み: find_subpages実ページ(別URL)を全部拾ったあとで、空いている種別だけアンカーで補う
    この順序なので実ページと重複しない。飛び先の要素が実在するかも確認する。
  • 撮影: URLに #faq が付いていれば、shoot_fullpage先頭ではなくその位置へ寄せて1画面撮る。
  • 実績: SOURAの集いは下層0件→2件(サービス・事業 #about / よくある質問 #faq)。
  • アンカーリンクが0本のサイト(ナビがJS制御)でも、find_subpages
    ページ内の id 付きセクション#price #about 等・高さ300px超)を直接見て収録する(SANUの料金体系がこれで拾えた)。
  • 登録URLの階層から出たページは拾わない(2026-07-23 大串承認・恒久)。
    東急リニューアル設計部は /design/ を登録しているのに、下層の「採用」として
    /recruit/(=東急リニューアル本体の採用サイト。別ブランド・別デザイン)を拾っていた。
    収録しているのは「そのサイトのデザイン」なので、別サイトのページが混ざると参考にならない。
    ルート(/)登録のサイトは従来どおり制限なし。
  • ログイン/マイページは除外(デザインの参考にならない・SANUの /member を誤収録していた)。
  • 検出0件なら下層なしで進めてよい(アンカーすら無い1枚もの)。0件を理由に止めない
  • 撮影の検品は自動check_fullpage.mjs が撮影スクリプトの末尾で走る)。要確認が出たらその場で撮り直す(放置してデプロイしない)。
  • 判定内容=単色(読み込み失敗)/全長が短すぎ/PCとSPの縦横比が同じ(モバイル未反映の疑い)/PC・SP片方欠け。
  • 仕上げに画像そのものを検品する(2026-07-24 新設)。撮影ツールの採用ゲートはDOMを推測して動くので、
    遅延読み込みのFVは「中身が出る前に撮れて素通り」することがある。出来上がった画像を見れば確実:
    bash node tools/audit_shots.mjs --full <slug> # 一覧サムネ+詳細FVを、色数と輪郭量で検品
    ⛔(ほぼ無地)が出たら --wait を延ばして撮り直す。それでも撮れないサイトは derive_shot.py(ステップ3の流用ルール)で対応する。
    採用ゲート(2026-07-23 大串承認・恒久)
    撮影の前処理は「サイトがどう組まれているか」を推測して動かしているので、実装が違えば必ずどこかで壊れる
    (実際この日だけで ヘッダー消失/FV単色化/全面白飛び/メニュー展開 の4種類の崩れを出した)。
    壊れないツールを目指すのではなく、崩れた画像を保存しないゲートで担保する
    shoot_fullpage.mjs は撮影直前に実ページを検査し、次を検出したら保存せず要確認に回す
    ①リンク5本以上の浮いたパネルが見えている=メニューが開いている
    ②同じ位置に可視のテキスト/画像が重なっている
    既存の正しい画像は上書きされないので、不合格=現状維持で安全。不採用が出たら原因を直して撮り直す。

  • メニュー写り込みの検品も毎回やる(2026-07-23 大串FB「メニューバーをタップした画面が入っていてデザインの良さが消えている」)。
    check_fullpage.mjs は画像の統計しか見ないので、開いたメニューが写っていても合格してしまう。撮影後に必ず↓を回す。
    bash node tools/scan_menu_leak.mjs <slug> # 引数なし=全サイト走査。結果は tools/_menu_leak.json
    1件でも出たら shoot_fullpage.mjs <slug> --force で撮り直し、0件になるまで繰り返す(放置してデプロイしない)。

  • オープニング演出が長いサイトは --wait=14000 で待ちを延ばす。

撮影仕様(2026-07-22〜23 確定・勝手に変えない)

shoot_fullpage.mjs が撮影前に自動でやること。表の順番どおりに処理する(順序に意味がある)。
| 項目 | 仕様 |
|---|---|
| 画角 | 下層もFVと同じ「1画面ぶん」(PC 915×635 / SP 428×834)。全長は撮らない=スクロールしないので追従ロゴ・メニューの重複が構造的に起きない |
| 画質 | PC/SPとも deviceScaleFactor:2 / JPEG品質90 |
| Cookieバナー | ID/class の部分一致セレクタをCSSで一括適用しない[class*=cookie] が Modernizr の <html class="supports-cookies"> に命中しページ全体が消えた)。画面の半分未満の要素だけ JSで隠す・html/bodyは絶対に触らない |
| オープニング幕 | 全画面の幕(opening/intro/splash/loading/curtain/mask)は消えるまで最大9秒待つ→それでも残れば強制除去(待っても消えないサイトがある) |
| 動画 | PC/SP共通の秒数(最大2.5秒)で固定(0秒だと映像前の単色フレームを撮る) |
| アニメ | ループ演出は0秒で固定/1回きりの演出は終了時刻(endTime)へ飛ばす(0秒固定だとオープニング幕が「降りた瞬間」で止まって真っ白になる) |
| スライダー | 必ず1枚目を撮る(2026-07-23 大串FB・恒久)。「アクティブな1枚」だとPCとSPで読み込みの進み方が違い別のスライドで固定される(グリーンファーム久住=PC鶏舎/SP星空、fondesk=別カット)。1枚目は訪問者が最初に見る絵で決定的なのでPC/SPが必ず一致する。
器の判定は名前ではなく構造=「子が同じ位置に積み重なっているか」(fondeskは ul.tp-Mv_List で swiper/slick/slider のどれにも当たらなかった)。reveal の後にもう一度1枚化する(reveal前は2枚目以降が隠れていて器と判定できない) |
| 同じ見た目の重複 | 「同じタグ・同じクラスが同じ位置に複数見えている」ものは1つに絞る。判定キーに大きさを入れない=文字数の差で高さが 288/283/260px と変わるだけで別物扱いになり素通りする(fondeskで実測) |
| 重なり演出 | 兄弟同士で位置もサイズもほぼ一致して重なるものは1枚に絞る(fondeskのキャッチはSVGが6枚重なっていた)。reveal の後にやる |
| モーダル/キャンペーン | 閉じる(×/close)ボタンを持つ浮いた箱・role=dialog・campaign/banner系は撮影前に除去(Doggie-Doの新規特典ポップアップ対策) |
| 閉じたメニュー | 固定配置で中に opacity:0 の大きな開閉パネルを持つ器は丸ごと隠す(ジュニのハンバーガーメニューが画面端に写り込んでいた)。reveal の前後2回呼ぶ |
| reveal除外 | nav/header配下・aria-expanded=false は触らない(閉じているメニューを開く)/画面をほぼ覆う fixed 要素も対象外(ローディング幕が写る) |
| reveal除外(構造判定・2026-07-23 追加) | 名前頼みをやめて構造で守る。①position:fixed は一切 reveal しない(追従UI=スクロール演出の対象になり得ない)②position:absolute かつリンクを3本以上抱えた透明要素は畳まれたメニューとみなし触らない。※static/relative は除外しない=本文のリンク集(新着一覧など)を隠したままにしないため。
発覚: 東急リニューアル設計部の採用ページがメニューを開いた状態で撮れていた。犯人は <ul id="Menu-Group">(fixed・opacity:0・リンク15本)で、名前に "Menu" が入るのに正規表現が megamenu 等しか見ておらず素通りしていた |
| 重いサイト | FVが90秒で撮り切れず欠けるとサムネ1枚にフォールバック=縦長に見える--limit=240000 で上限を延ばす |
| 待ちが足りず「中身が写らない」 | --wait を疑う前に諦めない(2026-07-27)。GYRE ヨーゼフ・ボイス展は既定3秒/14秒/20秒では全部「色10種・輪郭0.5%」で不採用だったが、待ち25秒にしたら一発できれいに撮れた。重い展示系・映像系は --wait=26000 --limit=120000 を試す。それでも撮れないサイトだけ流用ルール(derive_shot.py)へ |
| ERR_HTTP2_PROTOCOL_ERROR | サイト側のHTTP/2実装と相性が悪くページを開く前に落ちる(BEAMSで実測)。chromium.launch--disable-http2 を付けると回避できる(2026-07-27 に恒久対応済み)。あわせて page.goto の上限は45秒→90秒2026-08-21 まで shoot_fullpage.mjs だけ45秒のまま取り残されていた=宮本金型のようにFV動画が重いサイトはPCだけ毎回タイムアウトして撮れなかった。実装を90秒に是正済み) |
| ヘッドレスを弾くサイト | BEAMS / JINS は実ブラウザなら開けるがヘッドレスだと弾かれる(UA偽装・webdriver隠蔽をしても通らない)。これはサイト側のボット対策なので撮影ツールでは解決できない=手動撮影が必要と割り切る(無限に粘らない) |
| アンカー撮影 | URLに #faq 等が付いていれば、先頭ではなくその位置へ寄せて撮る |
| 一覧サムネがFVでなく途中のセクションになる | 慣性スクロール(Lenis等)のサイトで、遅延読み込み対策の「下まで送って先頭へ戻す」が戻り切っていない。撮るたびに別の場所が撮れるのが目印(うみべのいえは Message→Access と変わった)。2026-08-21 に shoot_mikke.mjsbackToTop() を入れて根治済み=ライブラリのAPIも叩き0になるまで粘る。それでも直らないサイトだけ流用ルールへ |
| 一覧サムネに他社の販促バナーが写る | 隅に貼り付く小さいバナーは、従来の「面積8%以上+画面中央寄り」条件をすり抜ける。GBSメディカルは実測3.1%・右下固定・閉じるボタン非内包・名前が data-opening="fixed-banner"(class/idではなくdata属性の中)だった。2026-08-21 に shoot_mikke.mjsdata-*属性の値まで名前判定するようにして根治。追従CTA(「お問い合わせはこちら」等)は banner/campaign 系の名前を持たないので残る |
| FVだけ白飛びする(--skip-gate でも直らない) | freezeAnim が入場アニメを固定した瞬間=中身が透明のまま焼き付く。一覧サムネは綺麗なのにFVだけ白いのが目印。→ node tools/shoot_fv_plain.mjs <id> [page-key] [--wait=](2026-08-21 新設)でアニメを止めずに素撮りして差し替える。MEGLiA は 26KB→85KB になった。
2026-08-21 追記=症状はFVだけでなく下層にも出る。toft は --skip-gate を付けてもトップ/PRODUCTS/CONTACT のPCが3ページとも中身の薄い画像になり(主役の青いぬいぐるみが消える)、下層も素撮りに切り替えて全部直ったshoot_fv_plain.mjs は page-key を渡せば下層にも使えるので、1ページだけ直して満足せず同じサイトの全ページを見る |
| 白いフォームのページだけPCが撮れない | 2026-08-24 追加の5例目。STAGE Lab の contact は白背景+入力枠だけで「中身が写らない(色34種/輪郭1.8%)」と判定され4回とも不合格=PCだけ欠ける(SPは撮れる=縦長で情報量が多いため)。お問い合わせ・サンクスページのような構造的に薄いページ--skip-gate を付けて撮る |
| 採用ゲート/濃さ判定の誤検知 | --skip-gate(2026-08-16 新設)。既定はON のまま=守りは全サイトに効かせ、実画像で誤検知と確認できた1サイトだけに付ける。
実例 J-CAT: ①右側の縦ナビ7本が常時見えている正規デザインなのに「メニューが開いている」で不合格 ②白背景+細字の極ミニマルで「色15種/輪郭1.5%=中身が写らない」で不合格 → トップが永久に保存できずbuild_mikke.py は PC/SP 両方揃わないとFVブロックごと落とすので詳細ページのFVが0枚になっていた。--skip-gate は両方の判定に効く。
2026-08-21 追加の実例2件=宮本金型製作所(FV左の縦ナビ8本が常時表示の正規デザイン)/toft(ヘッダーの5本ナビが常時表示)。「常時見えているナビ=開いたメニュー」と誤認する型はこれで3・4例目なので、ナビが最初から見えているデザインなら真っ先に --skip-gate を疑ってよい |
| 入場アニメで中身が透明のまま写る | freezeAnim が入場アニメを0秒で固定し、reveal でも戻らないサイトがある(J-CAT の中央コピー+映像)。--wait をいくら延ばしても同じ画像(ファイルサイズが1バイトも変わらないのが目印)。
アニメを止めずに普通に待って撮るのが正解。一覧サムネ(shoot_mikke.mjs)は freeze しないので正しく撮れている=サムネだけ綺麗でFVが白いならこれを疑う。PC 915×635 / SP 428×834・deviceScaleFactor:2 で素撮りして差し替える |

処理の呼び出し順shoot_fullpage.mjs 内)= 動画停止 → アニメ固定 → スライダー1枚化 → モーダル除去 → ノイズ除去 → 閉じメニュー除去 → reveal → 閉じメニュー除去 → 重なり解消 → モーダル除去。
「動きを止める → 隠れを表示に戻す(reveal) → 重なり/器を片付ける」の順。revealを最後にやると止めたものが復活するので必ずこの順。

6. デプロイ(直接prod OK・preview不要/必ず deploy_mikke.sh 経由

wrangler pages deploy を直接叩かない(2026-07-22 大串指示・恒久)。
このコマンドはローカルの生成物で本番を丸ごと置き換えるため、古いローカルのまま出すと
他の人が追加したサイトが本番から消える(実際に9サイト消失→復旧)。人間の注意力ではなく機械で止める。

cd ~/dev/mikke/core
python3 tools/bump_ver.py "今回の変更内容(changelogにそのまま入る)"   # ← ver自動採番(origin/main基準)
git add -A && git commit -m "参考HP集: <名前> を追加(/mikke)" && git push origin main   # ← 共通部分(core)を先に確定
cd .. && git add core && git commit -m "core更新(<名前> 追加)" && git push origin main
bash core/tools/deploy_mikke.sh                                       # ← ロック取得→遅れ検査→backup→build→deploy→本番ver照合

core を push してから mikke! を出す。core(=参考HPのデータ本体)が手元にしか無い状態でデプロイすると、
他の人の追加を巻き込んで本番から消す。2026-07-23 に実際に起こしている(ver169→168へ巻き戻り・復旧済み)。
- tools/bump_ver.pyMIKKE_VERorigin/main の値を見て採番する。手打ちの +1 は禁止
(2人が同時に同じverを名乗ると「ver◯に戻して」が破綻するため)。
origin の方が新しければ エラーで止まる=先に git pull させる。changelog の先頭行も自動で入る。
- tools/deploy_mikke.sh が機械でやること: ①AI作業ロック取得(取れなければ何もせず終了=同時デプロイを物理的に防ぐ)
git fetch して遅れていたらデプロイさせない ③tar.gz backup ④build_core.pybuild_site.py順を固定
wrangler deploy本番の MIKKE-VER を実測して照合(wranglerの成功出力は信じない)⑦ロック解放(落ちても trap で必ず解放)。
- デプロイ後に Vault 31_システム開発部/_SCALE_mikke_バージョン管理表 へ1行追記(ver / 日付 / 内容 / backupファイル名)。

複数メンバー・複数セッションで同時に作業する日(セクション追加デー等)は上の手順が前提。
ロック状況は ~/Obsidian/scripts/ai_session_lock.sh list で見える。「ロックが取れない=待つ」が正解(強制解除しない)。

mikke! は公開ドメインだが preview 免除(2026-07-20 大串FB「プレビュー挟むとスピード感遅くて合わない」)。
立ち上げ直後でPVがほぼ無いため、修正はそのまま本番へ出す。ただし本番実機での確認(ステップ7)は毎回必須

6-2. TERASU Lab にも反映する(ここまでやって「両方に載った」

参考HPのデータは core にあり、mikke! と Lab の両方がそれを読む。ただし Lab は
「どの版の core を使うか」を自分のリポに記録しているので、Lab 側でも core の参照を進めないと反映されない

cd ~/dev/terasu-lab
cd core && git fetch origin && git reset --hard origin/main && cd ..   # 共通部分を最新に
git add core && git commit -m "core更新(<名前> 追加)" && git push origin main
# → GitHub Actions が本番 lab.terasu.scale-group.co.jp へ自動デプロイ(約1分)
  • 反映確認: curl -s "https://lab.terasu.scale-group.co.jp/?f=$(date +%s)" | grep -o 'data-id="[^"]*"' | sort -u | wc -l( この数はローカル _lab_dist/index.html の同じ数え方と一致すれば最新。全登録件数とは一致しない=data-idを持たないカードがあるため、絶対数で判断しない)
  • CIが成功しても本番が古いままのことがある(2026-07-23 に3回発生)。件数が合わなければ
    npx wrangler pages deploy _lab_dist --project-name=lab-terasu --branch=main --commit-dirty=true で上書きする。

### 7. 本番検証(実機必須・wrangler出力を信じない・**全項目バッチリまで確認**)
```bash
# ① Lab 一覧に載ったか( 2026-08-24 是正。旧手順の reference-sites-data.json は
#    いまの Lab には存在せず "Not Found" が返る=**grep は常に0**で、検証しているつもりで何も見ていなかった。
#    現在のLabはデータをHTMLに埋め込む作りなので、一覧HTMLを直接見る)
curl -s "https://lab.terasu.scale-group.co.jp/?f=$(date +%s)" | grep -c "<slug>"
#    件数がローカル生成物と一致するかも見る(ズレ=CI成功でも本番が古い=手動デプロイ)
#    curl -s "https://lab.terasu.scale-group.co.jp/?f=$(date +%s)" | grep -o 'data-id="[^"]*"' | sort -u | wc -l
#    grep -o 'data-id="[^"]*"' ~/dev/terasu-lab/_lab_dist/index.html | sort -u | wc -l
# ② MIKKE一覧に載ったか(0なら site/<slug>/ も確認)
curl -sL https://mikke.scale-group.co.jp/ | grep -c "<slug>"
# ③ MIKKE詳細ページが生きているか(200必須)
curl -sL https://mikke.scale-group.co.jp/site/<slug>/ -o /dev/null -w '%{http_code}\n'
# ④ 詳細ページに全項目が反映されているか(name/業種/サイト種別/雰囲気/ベース・アクセント色/note)
curl -sL https://mikke.scale-group.co.jp/site/<slug>/ | grep -c "どんなサイト"   # 1以上必須
  • どれかが0/欠けたら反映待ち→再確認。それでもダメなら原因調査。

詳細ページの画像検品(2026-07-22 恒久・毎回必須)

撮影画像が本番の詳細ページで実際に表示されているかを機械で見る(撮れている=出ている、ではない。CDNの404キャッシュ等で落ちる)。

node tools/check_detail.mjs <slug> [<slug2> …]   # ← 今回追加したサイトだけに絞れる(引数なし=全件で遅い)

要確認 0 件が合格条件。0件になるまで次(最終確認)へ進まない。

下層カバー率を毎回出す(2026-07-22 追加・溜まりの早期検知)

python3 - <<'PY'
import json,glob
tot=n=pages=0
for f in glob.glob('core/data/reference-sites/*.json'):   # ← データは core
    d=json.load(open(f)); tot+=1
    p=d.get('pages') or []
    if p: n+=1; pages+=len(p)
print(f'下層あり {n}/{tot} サイト({n*100//tot}%)/下層ページ {pages}')
PY
  • カバー率が下がったら未着手が溜まっている合図(下層デザインが159件も未着手で溜まった実例がある)。報告に必ず1行入れる。

サムネ全件検査(2026-07-21 大串指示・恒久・毎回必須)

デプロイ後に 全カードのサムネが本当に写っているかを機械チェックする。目視では取りこぼす。

cd ~/dev/mikke/core && node tools/check_mikke_shots.mjs "https://mikke.scale-group.co.jp/?fresh=$(date +%s)"
# → 合格条件は2つ(2026-07-21 恒久):
#     ① 要確認 0 件      … 今まさに崩れているもの
#     ② mShots依存 0 件  … 今は写っていても後日崩れる予備軍
node tools/shoot_mikke.mjs <id> ...   # → python3 build_core.py → cd .. && python3 build_site.py → deploy_mikke.sh
node tools/shoot_mikke.mjs            # 引数なし=自前スクショが無いものを一括撮影(同時6件・--jobs=N で調整)
node tools/shoot_mikke.mjs <id> --wait=14000   # オープニング演出が長いサイトは待ちを延ばす

機械判定だけでは「写っているか」は確定しない(2026-07-21 実測)。
白背景ミニマルの正常サイトと、オーバーレイを撮ってしまった失敗は、標準偏差・最頻色占有率・
エッジ密度のどれでも分離できない(architects 1.94% vs onceuponatime 1.83%)。
最後は一覧画像で目視する。60件ずつ1枚になるので数秒で判断できる:

node tools/contact_sheet.mjs          # mikke-shots/_sheet/sheet-N.png(全件・6列)

崩れているものだけ shoot_mikke.mjs <id> で撮り直す。入口ゲート(音楽ON/OFF・ENTER等)があるサイトは
shoot_mikke.mjsPRE_ACTIONS にID単位で突破処理を足す。
サムネが出ない原因は基本すべて mShots依存https://s.wordpress.com/mshots/)。
- 「Generating Preview…」=mShotsが未生成のプレースホルダを返している
- 下半分が空 = 遅延読み込み(lazy)のサイトを待たずに撮っている
- 真っ白・単色 = JS描画やオープニングアニメの完了を待てていない

これらは自前スクショ(mikke-shots/<id>.jpg)を置けば local_shot() が優先採用して根治する
tools/shoot_mikke.mjs は networkidle待ち→最後までスクロール→画像/動画の読込完了待ち→撮影、まで面倒を見る。
URLをキャッシュバスター付きで渡すこと(CloudflareのCDNが古いHTMLを返して誤検知する)。
- 「更新項目が全部バッチリか」を毎回ここで突き合わせる(大串FB 2026-07-17・恒久)。Lab側は生成カードjsonと本番data.jsonの全キー一致、MIKKE側は一覧カード(業種/サイト種別/雰囲気/色ドット/サムネ/URL)+詳細ページ(どんなサイト?/業種/サイト種別/雰囲気/ベース・アクセントカラー)まで反映確認。どれか欠けていたら build_mikke.py 等の生成側を直してから完了とする(表示漏れを放置しない)。

8. 【唯一の停止点】最終確認(2026-07-22 大串決定・恒久)

機械検品に合格してから、まとめて1回だけ大串に見てもらう。
検品が通っていないうちに目視を頼まない(機械で分かる不良に大串の時間を使わせない)。
逆に、機械だけで完了にもしない(白基調ミニマルの正常と失敗は数値で分離できないと実測済み)。

合格条件(3つとも0件。1つでも残っていたら直してから依頼する)

node tools/check_fullpage.mjs      # ① 撮影画像の不良     → 要確認 0 件
node tools/check_detail.mjs        # ② 本番の詳細ページ   → 要確認 0 件
node tools/check_mikke_shots.mjs "https://mikke.scale-group.co.jp/?fresh=$(date +%s)"
                                   # ③ 一覧サムネ         → 要確認 0 件・mShots依存 0 件

合格したら、この型で依頼して一旦応答を終える(次の作業を勝手に始めない)。

最終確認は「1行1サイトのコンパクトなテーブル」で出す(2026-07-27 大串FB「この送り方めっちゃいい・コンパクトで見やすい。今後もどの件数でもこの形式でルール化して」)。
1件でも17件でも必ずこの1行テーブル形式。旧・サイトごとの縦長テーブル(1サイト=1表)は廃止(縦に長すぎて見づらい)。
指摘は 「<会社名> の色」「パノラマの雰囲気」 のように会社名+項目で返してもらう。

  • テーブルの列は固定=# / 会社 / 業種 / 種別 / 雰囲気 / ベース・アクセント / リンク
  • リンク列は1セルに [mikke](…) / [Lab](…) の2つを必ず併記(mikke!とLabの両方・片方だけは不可=2026-07-25 大串FB)。Markdownリンクにしてクリックできるように。
  • 冒頭に 件数・両一覧URL・機械検品結果・下層カバー率の3行サマリ。
  • テーブルの下に フォント★/レイアウト/アニメの各ページURL(溜めた分)を必ず載せる。
  • 最後に 修正の返し方の一言セクション化の誘導(ステップ10)。

17件を追加しました。最終確認をお願いします。(← 件数を最初に書く)
一覧: mikke! https://mikke.scale-group.co.jp/ / TERASU Lab https://lab.terasu.scale-group.co.jp/
機械検品は撮影画像・詳細ページとも0件。本番 ver218 反映済み・下層カバー率 331/361(91%)。

# 会社 業種 種別 雰囲気 ベース/アクセント リンク
戸田建設 新卒 construction recruit bold ベージュ/赤・青 mikkeLab
snaq.me foodmaker service natural 白/橙 mikkeLab
…(全件ぶん・1行ずつ)

あわせて溜まったページ
- フォント: ★<書体名>(<由来会社>)… Lab https://lab.terasu.scale-group.co.jp/fonts/ / mikke! https://mikke.scale-group.co.jp/fonts/
- レイアウト: https://lab.terasu.scale-group.co.jp/layout-patterns/ / アニメーション: https://lab.terasu.scale-group.co.jp/animations/

OKならその旨を、直すところは「パノラマの色」のように会社名を添えてお知らせください。

  • 判定で迷った点・つまずいた点(色監査で補正した/トップが撮れずサムネからFV生成した 等)があれば、テーブルの下に「補足」として簡潔に添えてよい(無ければ省略)。
  • 1件だけのときも同じテーブル(1行)で出す=件数によって書式を変えない。

    4-2 フォント・4-3 レイアウト/アニメで「溜めた」ぶんのリンクも最終確認で必ず出す(2026-07-25 大串FB「フォントとかアニメーション、のリンクも送ってくれないと」)。
    サイトを1件足すと HP以外にフォント・レイアウト・アニメも溜まる設計なので、溜めた各ページのURLを併記する:
    - フォント図鑑(★を追加した時): Lab https://lab.terasu.scale-group.co.jp/fonts/ / mikke! https://mikke.scale-group.co.jp/fonts/
    - レイアウト: Lab https://lab.terasu.scale-group.co.jp/layout-patterns/
    - アニメーション: Lab https://lab.terasu.scale-group.co.jp/animations/

9. 修正対応(指摘が来たとき)

  • 「サムネが微妙」→ ここで初めて別案を4つ出す(先に4案を見せない・2026-07-22 大串決定):
    bash bash tools/shoot_candidates.sh <slug> "<URL>" # 候補4枚を4:3で生成(一覧実寸+拡大で並べる)
    → 番号が来たら bash tools/pick_candidate.sh <slug> <選ばれたファイル>
    スクショが送られてきたらそれをそのまま採用(タブ/URLバーが写っていればトリミング)。
    mShots候補が選ばれた場合もmShotsのままにしない(時限爆弾)→ shoot_mikke.mjs で焼き直す。
  • 分類・note の指摘 → 直して build.pybuild_mikke.py → デプロイ → 該当ページを実機で再確認。
  • 下層デザインの指摘 → その場で直す+同じことが起きないようツール側も直す+既存サイトにも横展開(大串の恒久ルール)。
  • 修正後の報告も会社名を明記(「ウィルスタイルの2を直しました」)。

10. セクション化の誘導(2026-07-22 大串指示・恒久)

最終確認でOKが出たら、必ず最後にこれを聞いて終わる:

このなかでセクションに追加したい部分はありますか?
あれば、その部分のスクショか動画を送ってください(どのサイトのどこか分かればOKです)。
そのまま /section で TERASU Lab のセクション集に追加します。

  • 狙い: mikke!に追加したサイトはもう手元にある=セクション数を増やす一番効率の良い入口(大串「これやればセクション数の増加に繋がる」)。
  • URLを送ってもらう必要がないのがこの合流の利点。/section は本来「URL必須」(画像だけのゼロ再現は再現度が出ず廃止)だが、
    mikke!経由なら参考元URLは登録済みなので、大串は箇所を指すスクショ/動画だけ送ればよい。
    → /section 側には --from-mikke <slug>相当の入口として「URLは data/reference-sites/<slug>.jsonurl を使う」と伝える。
  • 送られてこなければ(「無い」と言われたら)そのまま完了。しつこく聞かない
  • /section をゼロから単発で使う従来の入口はそのまま残す(この誘導は追加の入口であって置き換えではない)。

現在の画面仕様(2026-07-20 大串FBで確定・勝手に戻さない)

項目 仕様
サムネ 4:3(8:7だとmShotsが左右を切り落とす)。shoot_candidates.sh も4:3で撮る
表示名 正式名称。落とすのは説明的接尾(〜採用サイト/ブランドサイト等)と括弧補足・「by 〇〇」だけ。法人格(株式会社)は残す。一覧・似ているサイトで共通
NEW 追加から3日以内・会社名の真横・赤文字のみ8px(背景なし)。「TERASU厳選」は廃止
新着ピックアップ枠 廃止(新着は一覧先頭+NEWで足りる=しつこい)
アクセントカラー 最大2色sub_colors配列)。絞り込みは「いずれかに一致」。ベースと同じ色は不可
絞り込み 左サイドバー型。ベースカラー/アクセントカラー/雰囲気/サイト種別/ページの種類/業種6軸(キーワード検索・タグは廃止)。「ページの種類」はサイト種別の直下・9種別を0件でも常に全部表示(該当0は押せない)。選ぶとカードのサムネがその種別のページ画像に差し替わる
絞り込みカラー 円環ドット。ベース/アクセントを横並び。座標は%基準(px焼き込みだとスマホではみ出す)
上部ナビ 3項目探す(お気に入り/ホームページ/配色/フォント・お気に入りが一番上)/運営会社(会社概要/制作実績)/お問い合わせ(受注導線なので畳まない)。▼は付けない
詳細ページ 2カラム(左=FV(PC+スマホ横並び)/右=どんなサイト?と分類6項目)。左FVの下に下層デザインを全幅で置き、その下に共通点の多いサイト。囲みはB案=1px罫線のみ(グレー背景は使わない)・ページ名は罫線の外(押すとその下層ページを別タブで開く・↗付き)・画像に細枠。「ファーストビュー」「下層デザイン」の見出しは置かない。下層同士の縦間隔80px/下層↔共通点セクション128px
共通点の多いサイト 旧「似ているサイト」から改名。縦3×横3の9件グリッド(横スクロール・矢印は廃止)。カードは一覧ページと全く同じもの(色ドット・チップ・ピン留めまで同一)。NEWバッジだけ出さない。採点=ベース6/雰囲気4/アクセント2/業種1/クロス2(大串「ベースカラーの一致が超大事」・タグは不使用)
CTA 「似た雰囲気でHP制作を相談する」(「これをベースに〜」は参考元に失礼なので使わない)
カードの導線 サムネも社名も必ず mikke! の詳細ページへ(2026-07-22 ver149)。ホバーの「サイトへ ↗」オーバーレイは廃止・参考元サイトへは詳細ページ内のURLリンクから。ホバーは画像がわずかに沈む表現
フッター 運営会社・お問い合わせは右端
運営会社/お問い合わせ TERASU HPのミラー。パンくず(TOP - 運営会社)は除去(TERASU本体へ離脱するため)

生成・配信の落とし穴(2026-07-23 実測で判明・毎回ここを疑う)

CSSを直したのに本番で変わらないとき、原因はほぼこの3つ。「デプロイ成功」の出力は当てにしない。

症状 真因 対処
追加したCSSが生成物に無い 複数行で書き、かつ直前と同じセレクタを続けて宣言すると、1つ目のルールが丸ごと落ちる 1行1ルール・セレクタを重複させないgrep -o "…{[^}]*}" _fs_refsites/…/index.html で生成物を必ず確認
ホバーすると文字が消える・沈む ホバー時の color を指定しないと、テンプレ由来の濃茶 #2f2725 を継承して背景と同化(実測 コントラスト比1.21) :hovercolor: var(--text) !important を明示。ver112・ver157 と2度やらかしている
画像1枚だけ表示されない デプロイ直後に ?v=ハッシュ が叩かれるとその404がCDNに焼かれる(実体は200なのに、そのURLだけ404) 慌てて撮り直さない。worker がクエリを外して取得するので数分で自然解消する。curl -o /dev/null -w '%{http_code}' でクエリ有無を比べて切り分ける

deploy_mikke.sh--skip-build を付けるのは、ビルド済みを出し直すときだけ
ver を上げた直後に付けると古い生成物が出て ver 照合で落ちる(2026-07-23 に実際にやらかした)。

オリジナル化チェック(テンプレ由来の残骸・毎回確認)

mikke!は「参考サイトの完全再現テンプレ」から作っているため、放置すると他社の資産が本番で動き続ける
2026-07-20 の監査で実際に混入していたもの(すべて build_shell() が除去済み。テンプレを差し替えたら再確認):

# 本番で残骸ゼロを確認(全部 0 になること)
for w in UA-91882952 analytics.js googlesyndication respond.min.js sankou '<i class="fa'; do
  printf "%-22s %s\n" "$w" "$(curl -s -H 'Cache-Control: no-cache' https://mikke.scale-group.co.jp/ | grep -c "$w")"; done
# 存在しないパスが404を返すか(200だとsoft-404でSEO事故)
curl -s -o /dev/null -w '%{http_code}\n' https://mikke.scale-group.co.jp/zzz-nope.js
  • 他社のGoogle Analytics(UA-91882952-1)=閲覧データが他社プロパティへ飛ぶ
  • 広告網へのdns-prefetch(googlesyndication/doubleclick)
  • 有料フォント(Adobe Typekit avenir-next-world / Font Awesome 6 Pro)と、それ前提の空<i>アイコン
  • CSSコメント(開発メモに元テンプレ名が入り、ソース閲覧で由来が見える)→ strip_css_comments() で除去

関連

  • ※ 旧 /sankouhp(さきの厳選HP集にも入れるコマンド)は 2026-07-20 に廃止。参考サイトの追加は この /mikke に一本化
  • リポ(2026-07-23 分離):
  • mikke! = ~/dev/mikkescale-group-jp/mikke・スタートカード=リポ直下CLAUDE.md)
  • TERASU Lab = ~/dev/terasu-labscale-group-jp/terasu-lab
  • 共通部分 = core/scale-group-jp/terasu-web-core)=参考HPのデータ・撮影画像・撮影ツール・カード/シェル/絞り込み
  • memory: project_mikke / project_terasu_lab

変更履歴(★=大きな変化)

ver 日付 変更内容
v4.2 2026-08-24 全件再走査の後始末を仕組み化(v4.1の修正を全419件に適用した回で判明)。①絵文字フォントを検出から除外Noto Color Emoji が★候補に上がったが、これは絵文字描画用のフォールバックでデザイン書体ではない(図鑑に入れても「この書体いいね」の役に立たない)。Apple Color Emoji / Segoe UI Emoji / Twemoji 等もまとめて GENERIC へ。②rescan_fonts.mjs--retry を新設=走査は実サイトへの通信なので回線が切れるとまとめて失敗する(この日は84件が一斉に落ちた)のに、従来は失敗した slug を記録しておらず「全件やり直す」しかなかった。失敗slugを _font_rescan.json に残し、--retry で前回失敗分だけ回せるようにした(実地で 15件→7件→2件→1件 と収束)。
どうしても走査できないサイトは1件残ってよい(GLANTA GLAMPING=HTMLは0.5秒で返るのに domcontentloaded に90秒到達しない)。粘らず「フォント未チェック」と報告に明記する(黙って0件にしない)。この回の収穫は ★Author(fontshare・高忠商会)1件
v4.1 2026-08-24 Adobe Typekit配信のフォントを構造的に全部捨てていた穴を根治detect_fonts.mjs)。Typekit経由だとブラウザが返す font-family は zen-kaku-gothic-new のような kit slug(ハイフン区切り・小文字) になり、カタログの正式名 Zen Kaku Gothic New と一致せず「判定できず=有料の可能性」に落ちていた。実例=STAGE Lab の主役 Zen Kaku Gothic New(使用293箇所・Google Fontsの無料書体)famKeys()ハイフン/アンダースコア→スペース展開を追加して是正(v3.8 の「〜 Variable」吸収と同じ場所)。判定ロジックを変えたので全419件を再走査
採用ゲート誤検知の実例5件目=白いフォームのお問い合わせページ。STAGE Lab の contact は PC だけ「中身が写らない(色34種/輪郭1.8%)」で4回とも不合格になり PC が欠けた。白背景+フォーム枠だけのページは構造的に濃さが足りないので、SPが撮れているのに PC だけ落ちるなら真っ先に --skip-gate を疑う(J-CAT・宮本金型・toft に続く型)。
デプロイが Failed to upload files で落ちたらファイルを疑う前に回線を見る。wrangler のログ末尾に ConnectTimeoutError(10秒)が出ていれば原因は回線で、アップロード済み分はキャッシュされるので再実行すれば進捗が進む(4471→4619件と進んだ)。この日は一時的に DNS ごと落ち Could not resolve host: github.com も出た。curl -o /dev/null -w '%{http_code}'nslookup で回線を先に確かめる。
ステップ7①の Lab 検証が死んでいたのを是正reference-sites-data.json は現在の Lab には存在せず "Not Found" が返るので grep は常に0。「検証しているつもりで何も見ていない」状態だった。一覧HTMLを直接 grep し、data-id の数がローカル _lab_dist/index.html と一致するかで判定する(一致=最新。全登録件数とは一致しないので絶対数で判断しない)
v4.0 2026-08-23 「同じidを渡すと追加者の合流に入れない」を修正add_refsite.py)。v3.3で「既登録サイトは新しく作らず、別の追加者なら足す」を入れたが、合流の条件が 既存のid != 指定したid になっており、既存と同じidを打つと手前の「⛔ 既に存在します」で止まって合流できなかった。既登録サイトを登録し直すとき同じidを打つのはごく自然なので、URL一致の合流を先に判定し、idの一致は問わないよう是正(id違いの別サイト衝突だけ従来どおり停止)。実例=SHIBUYA STREET LIVE(細川が登録済み→さきを合流)。
判定は「イントロが明ける前のDOM」で決めない。シムディレクトは開いた直後が暗幕(#2B2B2B)で、DOM実測が black/blue を指したが、実際のFVは写真+シェブロン、本文はセクションごとに緑→紫→チャコール→クリームと変わる多色だった。サムネを撮ってから画像を見て決めるか、数カ所スクロールして撮った画面で確かめる(audit_colors_dom は幕やFV写真に引っ張られる)
v3.9 2026-08-21 「PCだけ撮れない」の3つ目の原因=goto45秒を潰した(宮本金型製作所・toft の2件追加で発覚)。①shoot_fullpage.mjspage.goto45秒のまま取り残されていた(この.mdは2026-07-27に「90秒」と書いていたのに実装が追いついていない齟齬)→90秒に是正。FV動画が重いサイトはPCだけ毎回タイムアウトし、build_mikke.py が PC/SP 揃わないとFVを落とすので詳細ページのFVが0枚になっていた ②採用ゲートの誤検知に実例2件を追記(宮本金型=左の縦ナビ8本/toft=ヘッダー5本がどちらも常時表示の正規デザイン)。J-CATから数えて3・4例目=ナビが最初から見えているデザインは真っ先に --skip-gate を疑う素撮り(shoot_fv_plain.mjs)が要るのはFVだけではないことを明記(toftは下層3ページのPCが全部薄く、素撮りで全部直った)
v3.8 2026-08-21 「撮れない」の原因を4つ潰した(うみべのいえ/GBS/MEGLiA の3件追加で発覚)。①shoot_mikke.mjs隅に貼り付く販促バナーを除去(従来は面積8%以上+画面中央寄りしか消せず、GBSの「SPECIAL MOVIE!」は実測3.1%・右下固定・閉じるボタン非内包・名前が data-opening="fixed-banner"data属性の中にあり三重に素通りしていた→data-*属性まで名前判定する)②同shoot_mikke.mjs慣性スクロール(Lenis等)のサイトで先頭に戻り切らずFVが撮れない問題を根治(backToTop() を新設し、ライブラリのAPIも叩いて0になるまで粘る・撮る直前にもう一度呼ぶ。うみべのいえは撮るたび Message→Access と別セクションが撮れていた)③tools/shoot_fv_plain.mjs を新設=v3.7 が「アニメを止めずに素撮りして差し替える」と方針だけ書いて手段が無かったのでツール化(MEGLiAのFVが --skip-gate でも白飛び 26KB→素撮り 85KB)④detect_fonts.mjs「〜 Variable」の表記ゆれを吸収(MEGLiAの Montserrat Variable を「判定できず」に落としていた。font-catalog-free.json に "Inter Variable" 等が個別に足されていたのは同じ穴の場当たり対応)。あわせて note上限をこの.mdの66字→実装どおり36字に是正検品ツールが動かなくなっていた環境の穴core/node_modulesterasu-lab/node_modules のsymlink切れ・pngjs が package.json に無い・413件で check_mikke_shots.mjs が30秒networkidleに到達できず毎回タイムアウト)も修復
v3.7 2026-08-16 撮れないサイトの逃げ道を1本に整理shoot_fullpage.mjs--skip-gate を新設し、採用ゲート(メニュー誤検知)と濃さ判定(極ミニマル誤検知)の両方を明示指定時だけ外せるようにした(既定はON=全サイトの守りは不変)。あわせて 「アニメ固定でFVだけ白くなる」パターンを撮影仕様表に追記(--wait を延ばしてもファイルサイズが変わらないのが目印/アニメを止めずに素撮りして差し替える)。発覚: J-CAT のトップが永久に保存できず、build_mikke.py が PC/SP 両方揃わないとFVブロックごと落とすため詳細ページのFVが0枚だった。「サムネだけ綺麗でFVが白い」ならまずこれを疑う
v3.6 2026-07-27 最終確認を「1行1サイトのコンパクトなテーブル」に統一(大串FB「この送り方めっちゃいい・コンパクトで見やすい。今後もどの件数でもこの形式でルール化して」)。列=# / 会社 / 業種 / 種別 / 雰囲気 / ベース・アクセント / リンク、リンクは1セルに [mikke](…) / [Lab](…) を併記。旧・サイトごとの縦長テーブル(1サイト=1表)は廃止。1件でも17件でも同じ形式。テーブル下にフォント★/レイアウト/アニメのURLと、迷った点の「補足」を添える
v3.5 2026-07-24 構成と動きも自動分析(大串指示)。Step4-3 を新設し analyze_layout.mjs でFVの型・ナビの型・グリッド・左右交互・横スクロールと、無限ループ・スクロール演出・ホバーを判定。レイアウト/アニメーションのカードに 「実例」 として参考HPへのリンクが出る。これで /mikke ひとつで HP・フォント・レイアウト・アニメーションが一気に溜まる(セクションだけは従来どおり最後に聞いて、入れたいものだけ入れる)
v3.4 2026-07-24 参考HPのフォントも自動で図鑑に入れる(大串指示「良いHPはフォントも良い。/mikke を使ったら自動でフォントが入ればフォント集がめっちゃ増える」)。Step4-2 を新設し、core/tools/detect_fonts.mjs で ①Google Fontsの読み込み ②実際に描かれている書体 の両方が指したものだけ抽出。OS標準フォントと登録済みの書体は自動で除外(回すたび同じものが増えない)。--company に参考HPの社名を入れて「どの会社で使われていたか」で絞れるようにする。/font 単体の使い方も従来どおり残る
v3.3 2026-07-24 二重登録を防止+追加者の合流(大串指示)。既に登録済みのサイトは新しく作らず、別の人が登録した時だけ既存に追加者を足す(2人が登録=2人の名前が入る)。URLの表記ゆれ(末尾スラッシュ・www・http/https)も同一と判定。あわせて 重複チェック tools/check_duplicates.py を新設(名前かぶり/コード一致/サムネ一致/同じURL×同じ分類の4観点)
v3.2 2026-07-24 サムネ・FV撮影を根治(大串FB「サムネがちゃんと撮れていない」)。①幕を待つ→残れば消す(waitCurtainGone/killCurtain)②中身が写るまで粘って撮るshootUntilRich・薄ければ待って撮り直し・ほぼ無地なら保存しない)③出来上がった画像を色数と輪郭量で検品する audit_shots.mjs を新設し登録前ゲートに追加④撮れない画像を撮れている画像から作る derive_shot.py(下層→サムネ/サムネ→FV)を新設し、手打ちsipsを置き換え。トップが撮れないサイトは下層ページの画像を一覧サムネに流用してよい(ILOLI HAIR は member ページを流用)。実績: 崩れていた5件を修復し全171件が検品クリア
v3.1 2026-07-24 追加者の3択・自動特定を core/tools/contributors.py に共通化(それまで Lab の add_section.py を読んでおり、リポ分離後は このコマンドが ModuleNotFoundError で落ちていた)。あわせて登録時の表示名を「制作部署」→「さき」に是正。追加者・追加日は Labだけが表示・絞り込みに使う旨を明記
v3.0 2026-07-23 リポ分離に追従(mikke!=~/dev/mikke / 共通=core/)。ビルドは build_core.pybuild_site.py、デプロイは core を先に push してから deploy_mikke.sh6-2「TERASU Lab にも反映」を新設(Lab側でcoreの参照を進めないと載らない)。起動時にコマンド定義を最新化する手順を追加
v2.9 2026-07-23 追加者は「さき/大串/細川」の3名だけに統一(migrated・claude名義は作らない)
v2.8 2026-07-23 サムネが撮れないサイトは詳細ページのFVを流用してよい(1サイト単位・一括置換は禁止)
v2.7 2026-07-23 撮影は必ず1枚目/採用ゲート/下層は登録URLの階層内/色監査は2方式の突き合わせ
v2.6 2026-07-23 メニュー写り込みの再発防止(構造判定+scan_menu_leak.mjs を検品手順に追加)