英語を学びたい人の**現状・目標・生活の制約**を100問の問診で聞き取り、その人が実際に続けられる**実在の教材**と**1週間の進め方**を名指しで提案するWebアプリ(PWA)。提案して終わりではなく、いつでも相談でき、やったことを記録して「続いている」と分かるところまでを含む。 出発点は「単語を学びたい。だけど単語をやる時間が…家事が忙しい」という一言。これに対して「手が塞がっている時間が長いので耳から入れる形にしましょう。『キクタン』の音声だけを家事中に流し、机に向かえる週2回だけ本を開きます。1回5分・1日2回で1週間56語」と返せることを目標にしている。
実際のアプリを開く ↗💻 本体の公開URLは開くとログイン画面が出ます(特定のお一人にお渡しする前提で、アプリ内に新規登録の導線がありません)。そこで**ログイン不要・架空データのデモ版を別に用意しました**が、まだデプロイしていません(デプロイ待ち)。デモ版のフォルダは `C:\Users\utsus\Desktop\AIの作業場\eigo-coach-demo\apps\web`。手元で見るには、そこで `npm install` → `npm run build` → `npx.cmd next start -p 3414` を実行し http://localhost:3414 を開いてください(**デモ版はDBの接続情報もAIのAPIキーも持っていないので、.env.local は不要です**)。下の画面写真はすべてこのデモ版のものです。
保存場所: C:\Users\utsus\Desktop\AIの作業場\eigo-coach\apps\web
AIに「おすすめの参考書は?」と聞くと、存在しない本のタイトルを自信を持って答える。人に渡すアプリでこれは致命的なので、AIに教材を選ばせない構造にした。
[問診] 全100問。コア24問だけで診断でき、詳細76問は任意
↓
[手持ちの評価] すでに持っている教材で足りるかを先に判定する
↓
[絞り込み] 実在教材だけのDBをタグで検索し、スコア順に並べる
← ルールベース。AIを使わない。決定的で、無料で、一瞬
↓
[AI] 選ばれた教材について「あなたにこれが合う理由」と週プランを執筆
← 教材名は一切生成させない
**教材名・出版社・価格・音声の入手方法は必ずDBの値を画面に出す。**AIが書くのは理由の文章だけ。AI(Gemini)が落ちても、教材の選定はルールだけで完結しているので診断結果は必ず出る。
もう一つの狙いは、提案の根拠を全部見せること。「AIが書いた理由」だけでは、なぜその教材なのかを確かめられない。そこでルールが付けた**点数の内訳(加点・減点)**と、候補から外した教材とその理由を一次情報として画面に出す。除外理由には利用者の回答のどれが根拠になったかを書く —— 「1日に使えるのは10分と答えたのに対し、この教材は1回に最低30分必要だからです」のように。これが読めれば、条件をどう変えれば選択肢が増えるかも分かる。
スマホでホーム画面に追加して、毎日開く前提のアプリ。
最初に問診に答えると、手持ちの教材の評価・買い足す教材・今週の進め方が出る。以降は「今日やること」を見て、終わったら記録を付ける。迷ったら相談画面でAIに聞く。教材を買い足したら手持ちに登録し、再診断すると提案が入れ替わる。
コア24問(5分ほど)を終えた時点で診断でき、詳細はあとから足せる。途中でやめても回答は残る。
以下はデモ版の画面。学習者は架空の「花子さん」(目標: 海外出張の会議についていける / 使える時間: 平日は家事の合間の30分、週末は机に向かって1時間)で、記録も相談履歴もすべて作り物。教材168件だけは実在のもので、絞り込みは本番と同じコードが動いている。
①診断結果の入口。まず「すでに持っている教材で足りるか」を先に見る。

新しく買う話をする前に、手持ちで埋まっている技能・埋まらない技能・使えない場面を並べる。「新しく買う必要はありません」と言えることがこのアプリの価値なので、ここを結果の一番上に置いている。
②選んだ教材と、機械が付けた判定の内訳。

上段の文章は本番ではAIが書く。ただしAIが書いてよいのは理由の文章だけで、教材名・出版社・価格・音声の入手方法はDBの値をそのまま出す。下段はルールが付けた加点・減点の内訳で、順位が決まった理由そのもの。
③候補から外した理由も、利用者の回答に紐づけて出す。

「予算を3,000円までと答えたのに対し、12,000円だからです」のように、どの回答が根拠かを書く。これが読めれば、条件をどう変えれば選択肢が増えるかも分かる。
④1週間の進め方。どの場面でやるかまで決める。

紙の単語帳は「通勤・移動中」、音声だけで進むものは「家事をしながら」に割り振られている。手が塞がる時間・目が使えない時間に、手や目が要る教材を置かない。週7日を埋めず、2日を予備日として空けてある(1日崩れた時点で全部やめてしまうため)。
⑤教材は実在するものだけ。全168件をタグで絞れる。

「手が塞がっていてもOK」「目を使わなくてOK」「無料だけ」「5分から」で絞り込む。AIに一件も生成させていない。
⑥スマホ(基準幅375px)で毎日開く前提の作り。

ホーム画面に追加してアプリのように使える。開いて最初に出るのは「今日やること」と続いている日数だけ。
上部の帯はデモ版だけのもの。本番のアプリには出ない。
公開URLをそのまま見せられないので、ログイン不要・架空データのデモ版を別フォルダ(eigo-coach-demo)に作ってある。本体は読むだけで、1行も書き換えていない。
pg や Supabase のパッケージ自体を package.json から外してある。フラグで止める作りにすると、入れ忘れたときに本物のDBへ繋がる側に倒れるためvoice_required(声出しが必須か)の判定は、勘ではなく対照を取って決めた。当初の判定では「話すための英文法」というタイトルの読む本や、「音読すると効果的」と推奨されているだけのリスニング教材まで誤って true になった(同じ理由の誤検知が25件)。最終的に4条件に絞り、声出しが必須のはずの10件が全てtrue・黙って進められるはずの12件が11件falseになることを実測して確定している