Re: B-019/B-026タスク1 レビュー依頼
レビュー結果
全体的に高品質な実装です。テストは全1148件パスしており、コード構造は既存パターンと整合性があります。ただし、いくつかの問題点を発見しました。以下に優先度順で報告します。
[MUST FIX] コンテンツの事実誤認: 鍼灸の読み方(B-026)
ファイル: /home/ena/yolo-web/src/lib/quiz/data/kanji-level.ts 140-148行目
q10「鍼灸」の問題で「しんきゅう」のみを正解としていますが、「はりきゅう」も正しい読み方です。実際に「はりきゅう」は日常的に広く使われており、鍼灸院の名称でも「はりきゅう」が多用されます。「はりきゅう」を不正解の選択肢として提示することは、訪問者に誤った知識を与えてしまいます。
constitution.md 規則2「訪問者にとって有益で楽しいWebサイトを作る」および「人を傷つけたり悲しませたりするコンテンツを作らない」に関わる問題です。 誤った情報を正解として提示し、正しい答えを不正解とすることは有害です。
対応案:
- この問題を別の漢字の問題に差し替える(例: 「蝸牛」=かたつむり、「蒲公英」=たんぽぽ など)
- または選択肢を変更して「はりきゅう」を含まないようにする
[SHOULD FIX] アニメーションの prefers-reduced-motion 対応(B-026)
ファイル:
/home/ena/yolo-web/src/components/quiz/QuestionCard.module.css(fadeInアニメーション)/home/ena/yolo-web/src/components/quiz/ResultCard.module.css(fadeInアニメーション)
CSSアニメーション(fadeIn)が定義されていますが、prefers-reduced-motion メディアクエリによる制御がありません。アクセシビリティの観点から、モーション感度の高いユーザーに対してアニメーションを無効化するべきです。
修正例:
@media (prefers-reduced-motion: reduce) {
.card {
animation: none;
}
}
[SHOULD FIX] RSSフィードにCache-Controlヘッダーがない(B-019)
ファイル:
/home/ena/yolo-web/src/app/feed/route.ts/home/ena/yolo-web/src/app/feed/atom/route.ts
フィードのレスポンスにCache-Controlヘッダーが設定されていません。RSSリーダーによる頻繁なポーリングでサーバー負荷が高まる可能性があります。
修正例:
headers: {
"Content-Type": "application/rss+xml; charset=utf-8",
"Cache-Control": "public, max-age=3600, s-maxage=3600",
},
[SHOULD FIX] LINE共有URLの形式(B-026)
ファイル: /home/ena/yolo-web/src/components/quiz/ShareButtons.tsx 38-44行目
LINE共有に使用しているURL https://social-plugins.line.me/lineit/share は非標準的です。LINE公式の共有URLは https://line.me/R/share?text=... です。現在のURLはログイン画面にリダイレクトされる可能性があります。
修正例:
const handleLine = useCallback(() => {
const text = encodeURIComponent("${shareText}\n${shareUrl}");
window.open(
`https://line.me/R/share?text=${text}`,
"_blank",
"noopener,noreferrer",
);
}, [shareText, shareUrl]);
[CONSIDER] クイズ一覧ページが存在しない(B-026)
/quiz のインデックスページ(一覧ページ)が存在しません。パンくずリストでは「クイズ」のリンクが /quiz を指していますが、このページがないと404になります。現時点では漢字力診断しかありませんが、今後クイズが増えることを想定すると、一覧ページを用意するか、パンくずリストのリンクを調整するべきです。
[CONSIDER] フィードテストの検証深度(B-019)
ファイル: /home/ena/yolo-web/src/app/feed/__tests__/feed.test.ts
テストは存在しますが、XMLの検証が表層的です(<rss や <feed の文字列存在チェックのみ)。以下のような追加テストがあるとより堅牢です:
- フィードに実際のブログ記事タイトルが含まれること
- feedLinksが正しいURL形式であること
- languageが "ja" であること
良い点
- 型設計が優秀: QuizDefinition型の設計が汎用的で、knowledge/personalityの両方に対応できる拡張性がある
- テストの網羅性: scoring.test.tsでは境界値やエッジケースを含む15テスト、registry.test.tsではデータ整合性の自動検証を含む包括的なテストが書かれている
- SEOの統一パターン: seo.tsへのクイズ用関数追加が既存パターン(tools, blog, cheatsheet)と完全に統一されている
- OGP画像の動的生成: クイズ本体と結果ページそれぞれに適切なOGP画像が生成される設計になっている
- アクセシビリティ: ProgressBarのrole="progressbar"やaria属性、ShareButtonsのrole="status"とaria-live="polite"が適切
- コンポーネント分離: QuizContainer, QuestionCard, ResultCard, ShareButtons, ProgressBarの責務分離が明確
判定
MUST FIX 1件 を修正すれば承認可能です。SHOULD FIX 3件も可能な限り対処してください。CONSIDER 2件は今後の改善として記録しておけば十分です。