tr4mpass
Free, open-source iCloud activation lock bypass tool. Remove iCloud lock from iPhone 5s through iPhone 15 Pro (iOS 12-26.1). Fully offline -- no servers, no payments. Supports checkm8 (A5-A11) and ses
メール・SMSを15秒で「本物/フィッシング」と判定し、危険のサインを解説する研修用ブラウザゲーム(TypeScript / Vite)
Translation pending
SecurityGitHub @matan-zOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗本物か、フィッシングか。15秒で判定するトレーニング
メール・SMS を1通ずつ見て「本物」か「フィッシング」かを15秒で判定するブラウザゲームです。判定のあとに、本文のどこが危険のサイン(または本物と判断できる根拠)だったかをハイライト付きで解説します。中小企業の社員研修の冒頭5分や、個人の練習に使うことを想定しています。
登場する企業・団体・ドメインはすべて架空です。リンクは押しても移動しません。
| 出題画面 | 解説画面 |
|---|---|
anzu-shokuhin.co.jp と anzu-syokuhin.co.jp)は上下に並べ、違う文字を強調します。Esc)。一時停止中はタイマーを止め、時間を止めたまま読めないようにメールを隠します。「やめる」では確認のうえ、ここまでの結果を見るか、スタート画面に戻るかを選べます。途中でやめた記録はベストスコアに反映しません。data/denylist.json)に対する照合を、データ検証で全文に対して行っています。<a href> にせず、どこにも遷移しません。外部の画像・スクリプト・フォントも読み込みません(実行時の外部通信はゼロ)。00-0000-0000 型のダミーだけです(これもデータ検証で確認)。vercel.json で設定しています。
default-src 'none' を基本に、同じサイトの JS・CSS・画像だけを許可しています(script-src 'self'、style-src 'self'、img-src 'self')。外部への通信(connect-src 'none')、フォームの送信先(form-action 'none')、<base> の変更(base-uri 'none')、ほかのサイトへの埋め込み(frame-ancestors 'none')は禁止です。ビルドの結果にインラインのスクリプト・<style> はないため、'unsafe-inline' は使っていません。vite preview にも同じヘッダーを付け(vite.config.ts が vercel.json を読み込む)、全画面の操作中に CSP の違反が1件も出ないことと、外部への fetch が実際に止められることを確かめています。dist/)。サーバー処理・ログイン・実行時の AI 呼び出しはありませんnpm install
npm run dev # 開発サーバー
npm run check # 品質ゲート:データ検証 → 型チェック → テスト → ビルド
| コマンド | 内容 |
|---|---|
npm run validate | 問題データの検証(JSON Schema + 意味検証12ルール) |
npm run typecheck | tsc --noEmit |
npm run test | Vitest(242件) |
npm run build | vite build |
npm run smoke | ビルドした画面を headless Chrome で操作するスモークテスト(118項目。Chrome / Chromium が必要。CHROME_PATH で指定可) |
npm run harness-report | logs/harness-events.jsonl をフック別に集計した表を出す |
data/ 問題(22問)・語彙・指標・業種・使用禁止語の JSON
schemas/ JSON Schema(データ構造の正)
scripts/ データ検証・スモークテスト・ハーネス集計
src/engine DOM に依存しない純粋関数(出題・描画・採点・指標・解説の配置など)
src/ui 画面描画
tests/ Vitest
docs/ tasks.md(作業の状態)、ai-dev-log.md(開発ログ)
.claude/ フック・レビュー用サブエージェント・スキル(ハーネス)
このアプリは、Claude Code に実装を任せつつ、エージェントが自分で品質を確かめ、間違いに気づいて直す仕組み(ハーネス)を先に作ってから開発しました。 AIにコードを書かせること自体よりも、「AIの出力をどう検証し、どこで人間が判断するか」を設計することに重点を置いています。
| 仕組み | 内容 |
|---|---|
仕様書兼作業契約(CLAUDE.md) | 仕様・データ構造・安全ルール・禁止事項・完了の定義を明文化。エージェントはここを基準に動く |
| 決定的な検証器 | JSON Schema+意味検証(正解ラベルと本文の手口が一致しているか、実在企業名が混ざっていないか、ハイライトの範囲が重なっていないか等、12ルール)。検証器自体も、ルールごとの違反データでテスト |
| フック(自動実行) | データ編集のたびに検証/コミット前に全チェック/未完了のまま終わろうとしたら全チェック |
| 作成者と審査者の分離 | 問題を作るエージェントとは別に、読み取り専用のレビュー用サブエージェント(問題内容・UX)を用意 |
各タスクは「テストを先に書く → 実装前に失敗を確かめる → 実装 → npm run check → 失敗なら修正」のループで進行。
停止条件を明示:同じ原因で3回直せなければ止まって人間に報告。Stopフックも同一セッション3回で人間に引き継ぐ(無限ループ防止)。
実績(logs/harness-events.jsonl を npm run harness-report で集計。2026-10-18、vercel.json の追加のコミット前の122件):
| フック | pass | fail | blocked | handoff | 計 |
|---|---|---|---|---|---|
| post-edit-validate | 62 | 11 | 0 | 0 | 73 |
| pre-commit-gate | 42 | 0 | 0 | 0 | 42 |
| stop-gate | 7 | 0 | 0 | 0 | 7 |
npm run check を実行して通していたため、ゲートが止める場面はありませんでした(ゲートは最後の安全網という位置づけです)。自動の検証だけでは足りなかった点も、開発ログ(docs/ai-dev-log.md)に記録しています。
hidden 属性を上書きし、「調べる」前から実際のアドレスが見えていた(答えが見える状態)。型チェック・単体テストでは検出できず、ブラウザで実際の描画を確かめるスモークテストを作り直して見つけました。CLAUDE.md に作業ルールとして明文化し、以後はそのルールで作業しています。docs/tasks.md と git に置き、フェーズごとに会話をリセットしても続きから再開できる構成に。docs/ai-dev-log.md にタスクごとに記録(このREADMEの記述の根拠)。| AI(Claude Code)が担当 | 人間(作者)が担当 |
|---|---|
| 実装・テスト作成・問題文の下書き・セルフレビュー | 仕様とハーネスの設計、問題文の最終承認、業種と手口の選定、実機での確認、デプロイ |
レビュー用サブエージェントは、問題データのレビュー(question-reviewer)をデータを作るタスクのたびに、UI のレビュー(ux-reviewer)をフェーズの区切り・デザインのリニューアル・一時停止機能の追加のあとに計5回実行し、指摘は反映するか、理由を付けて docs/tasks.md に保留として記録しました。
問題はAIで下書きしましたが、公開版は検証済みの静的データだけで動きます。教育ツールで正解や解説が間違っていては意味がないため、生成AIの出力は「人間の承認+決定的な検証」を通したものだけを使う設計にしました。APIキー漏えいや、任意の企業を装った文面の生成に悪用されるリスクもありません。
role="dialog"・aria-modal・ラベル)、フォーカスの移動、読み上げ用の領域に入る文言までです。backdrop-filter)の描画の重さは、実機ではまだ確かめていません。また、iOS の「透明度を下げる」設定は CSS の prefers-reduced-transparency に反映されないため、iPhone ではすりガラスのままになります(コントラストはぼかしに頼らずに確かめています)。問題に出てくるドメイン(data/vocab.json の正規・偽装の69件)が、実在の誰かに使われていないかを確かめています。
npm run check-domains(scripts/check-domains.mjs)で、取得できる単位のドメインごとに NS・SOA のレコードを調べました。69件中3件が実際に運用されていたため、別の架空ドメインに差し替えました(account-support.net → acct-support-desk.net、account-verify.net → kouza-kakunin-center.net、system-notice.net → iryo-system-info.net。差し替えた候補も DNS で見つからないことを確認)。差し替え後は69件すべてで NS・SOA が見つかりません。npm run check-domains を実行して確かめ、使われ始めたドメインは差し替えます。この確認は外部の DNS に問い合わせるため、npm run check には含めていません。MIT License(Copyright (c) 2026 matan-z)で公開しています。
このアプリは、フィッシングメールを見分ける力を身につけるための教育目的のアプリです。登場する企業・団体・ドメインはすべて架空で、実在のものとは関係ありません。