feat: 独立词库、三向认词与当日快闪复习

## 独立词库

理解词原先只能跟着课程单元走,学完 A0 十课词汇量只增加约 22 个实词,
不足以解决"记不住单词"。新增一份独立词库 assets/words/wordbank.json
(2748 词,A1–B1),挂进 receptiveWordRegistry 的合成单元 bank-A1/A2/B1,
完全复用理解词已有的状态机,不依赖课程进度,第一天就能用。

数据来源、许可与合成规则记在 tool/words/DATA-NOTE.md:CEFR-J 定等级、
公开词书提供音标、AI 重写全部释义并生成例句、OpenSubtitles 提供口语词频。
词书部分为 CC BY-NC-SA 4.0 且上游权利不明,仅供个人非商用;
若要分发或上架,须替换音标那一列。

## 背单词机制

- 间隔阶梯 1/3/7/15/30/60/120 天,连续答对上一级,答错回第一级。
  原先首次答对后要等 7 天才复习,正是"第二天就忘"的成因。
- 每日新词上限(10 分钟 8 个 / 20 分钟 15 个 / 30 分钟 20 个)。
  阶梯第一级是次日,今天引入的新词就是明天的工作量。
- 新词按口语频率发放,不再按字母序 —— A1 从 a.m./ability 变成 no/not/know/just。
- 三个方向按层级轮转:看词(英→中)→ 听词(音→中)→ 想词(中→英)。
  想词题仍是选择题,不要求产出,理解词定位不变,不进升级分母。
- 单词页独立成 tab,首页今日任务卡下方给一张认词入口卡。

## 用法对照

课程 JSON 增加 usage 字段(when/reply/swap/confuse):一个句型用在什么场合、
对方通常怎么答、还能怎么说、跟哪个学过的句型容易混。
知道 How are you? 的意思,不等于知道它不是用来问名字的。

## 复习流

- 当日快闪(recap)独立成队列,不占复习预算,也不计入积压。
- 只发放当日预算内的量,其余保持到期状态等下次,不悄悄丢弃或改期。
- 答错的项隔几题后回来,而不是立刻重问。

测试 296 通过,flutter analyze 干净。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-20 23:54:17 +09:00
co-authored by Claude Opus 5
parent 1a10ca88e0
commit 6b42b7abc3
52 changed files with 4044 additions and 82 deletions
@@ -77,6 +77,17 @@
"sentence": "I’m Tom.",
"meaning": "我是 Tom。"
}
},
"usage": {
"when": "想让对方知道你叫什么,自我介绍的时候说。",
"reply": "对方通常回一句 Nice to meet you.",
"swap": "My name is Tom. 意思一样,正式一点。",
"confuse": [
{
"id": "A0-P02",
"note": "What's your name? 是问对方,I'm Tom. 是说自己;别人问了你才用这句回答。"
}
]
}
},
{
@@ -95,6 +106,24 @@
"sentence": "What’s your name?",
"meaning": "你叫什么名字?"
}
},
"usage": {
"when": "你想知道对方叫什么名字。",
"reply": "对方会回 I'm Tom. 或 My name is Tom.",
"confuse": [
{
"id": "A0-P01",
"note": "I'm Tom. 是回答,What's your name? 是提问;想知道对方名字才用这句。"
},
{
"id": "A0-P05",
"note": "How are you? 问的是对方今天状态好不好,不是名字;见面先问好,想认识对方才问名字。"
},
{
"id": "A0-P07",
"note": "What's your phone number? 问的是号码;两句都以 What's your 开头,区别全在后面那个词。"
}
]
}
},
{
@@ -112,6 +141,20 @@
"sentence": "Nice to meet you.",
"meaning": "很高兴认识你。"
}
},
"usage": {
"when": "刚认识、知道对方名字之后,说一句客气话。",
"reply": "对方会回 Nice to meet you, too.",
"confuse": [
{
"id": "A0-P01",
"note": "I'm Tom. 是告诉对方你叫什么,Nice to meet you. 是知道名字之后才说的客气话。"
},
{
"id": "A0-P05",
"note": "How are you? 是在问状态,要回答好不好;Nice to meet you. 只是客气话,不用回答。"
}
]
}
}
],
@@ -22,6 +22,20 @@
"sentence": "How do you spell that?",
"meaning": "那个怎么拼写?"
}
},
"usage": {
"when": "听到一个词(多半是名字),但不确定怎么写。",
"reply": "对方会一个字母一个字母念给你听。",
"confuse": [
{
"id": "A0-P02",
"note": "What's your name? 是问对方叫什么,How do you spell that? 是已经听到了名字、只是不知道怎么写。"
},
{
"id": "A0-P20",
"note": "Please say that again. 是没听清、要对方重说;这句是听清了、只是不会写。"
}
]
}
}
],
@@ -75,6 +75,16 @@
"sentence": "How are you?",
"meaning": "你怎么样?"
}
},
"usage": {
"when": "见面打招呼,问对方今天好不好。",
"reply": "对方会回 I'm good. / I'm okay. / I'm tired.",
"confuse": [
{
"id": "A0-P02",
"note": "What's your name? 问的是名字;见面先说 How are you? 打招呼,想认识对方才问名字。"
}
]
}
},
{
@@ -98,6 +108,17 @@
"sentence": "I’m tired today.",
"meaning": "我今天很累。"
}
},
"usage": {
"when": "别人问你 How are you? 的时候,说出你今天的状态。",
"reply": "说完可以反问一句 How are you?",
"swap": "熟悉的人之间也可以只说 Good. 或 Okay.",
"confuse": [
{
"id": "A0-P01",
"note": "I'm Tom. 说的是名字,I'm tired. 说的是状态;I'm 后面放什么,看对方问的是哪一个。"
}
]
}
}
],
@@ -237,6 +237,16 @@
"sentence": "What’s your phone number?",
"meaning": "你的电话号码是多少?"
}
},
"usage": {
"when": "你想记下对方的电话号码。",
"reply": "对方会回 My number is 123.",
"confuse": [
{
"id": "A0-P02",
"note": "What's your name? 问名字,这句问号码;都以 What's your 开头,听清后面的词再答。"
}
]
}
},
{
@@ -255,6 +265,16 @@
"sentence": "My number is one-three-eight.",
"meaning": "我的号码是一三八。"
}
},
"usage": {
"when": "别人问你电话号码的时候,把号码报出来。",
"reply": "对方多半会复述一遍跟你确认。",
"confuse": [
{
"id": "A0-P01",
"note": "I'm Tom. 回答的是名字,My number is 123. 回答的是号码。"
}
]
}
}
],
@@ -93,6 +93,16 @@
"sentence": "What’s this?",
"meaning": "这是什么?"
}
},
"usage": {
"when": "指着身边一样东西,问它叫什么。",
"reply": "对方会回 It's a book.",
"confuse": [
{
"id": "A0-P02",
"note": "What's your name? 问的是人叫什么,What's this? 问的是东西是什么。"
}
]
}
},
{
@@ -118,6 +128,20 @@
"sentence": "It’s a pen.",
"meaning": "这是一支笔。"
}
},
"usage": {
"when": "别人指着一样东西问你那是什么,你来回答。",
"reply": "对方可能接着问 How do you spell that?",
"confuse": [
{
"id": "A0-P09",
"note": "What's this? 是问,It's a book. 是答;别人指着东西问你,才用这句。"
},
{
"id": "A0-P13",
"note": "This is my mother. 是把人介绍给别人,It's a book. 是说这东西是什么。"
}
]
}
}
],
@@ -21,6 +21,16 @@
"sentence": "Where are you from?",
"meaning": "你来自哪里?"
}
},
"usage": {
"when": "想知道对方是哪里人。",
"reply": "对方会回 I'm from China.",
"confuse": [
{
"id": "A0-P02",
"note": "What's your name? 问名字,Where are you from? 问地方;Where 开头的一定是在问地点。"
}
]
}
},
{
@@ -43,6 +53,16 @@
"sentence": "I’m from China.",
"meaning": "我来自中国。"
}
},
"usage": {
"when": "别人问 Where are you from? 的时候,说出你来自哪里。",
"reply": "对方常接一句 Nice to meet you.",
"confuse": [
{
"id": "A0-P01",
"note": "I'm Tom. 是名字,I'm from China. 是地方;from 后面跟的一定是地点。"
}
]
}
}
],
@@ -93,6 +93,16 @@
"sentence": "This is my sister.",
"meaning": "这是我的姐妹。"
}
},
"usage": {
"when": "把身边的家人介绍给别人。",
"reply": "对方会说 Nice to meet you.",
"confuse": [
{
"id": "A0-P01",
"note": "I'm Tom. 介绍的是你自己,This is my mother. 介绍的是别人。"
}
]
}
}
],
@@ -147,6 +147,16 @@
"sentence": "What day is it today?",
"meaning": "今天星期几?"
}
},
"usage": {
"when": "不确定今天星期几,问别人。",
"reply": "对方会回 It's Monday.",
"confuse": [
{
"id": "A0-P16",
"note": "What time is it? 问的是现在几点钟,What day is it today? 问的是今天星期几。"
}
]
}
},
{
@@ -173,6 +183,16 @@
"sentence": "It’s Friday.",
"meaning": "今天星期五。"
}
},
"usage": {
"when": "别人问今天星期几的时候回答。",
"swap": "熟人之间也可以只说 Monday.",
"confuse": [
{
"id": "A0-P17",
"note": "It's Monday. 回答星期,It's three o'clock. 回答钟点;后面跟哪个,看别人问的是什么。"
}
]
}
},
{
@@ -190,6 +210,16 @@
"sentence": "What time is it?",
"meaning": "现在几点?"
}
},
"usage": {
"when": "想知道现在几点钟。",
"reply": "对方会回 It's three o'clock.",
"confuse": [
{
"id": "A0-P14",
"note": "What day is it today? 问的是星期几,这句问的是几点钟。"
}
]
}
},
{
@@ -213,6 +243,15 @@
"sentence": "It’s three o’clock.",
"meaning": "现在三点。"
}
},
"usage": {
"when": "别人问几点的时候,报出整点时间。",
"confuse": [
{
"id": "A0-P15",
"note": "It's Monday. 回答的是星期,It's three o'clock. 回答的是钟点。"
}
]
}
}
],
@@ -130,6 +130,16 @@
"sentence": "I like music.",
"meaning": "我喜欢音乐。"
}
},
"usage": {
"when": "说出你喜欢的一样东西。",
"reply": "对方可能反问一句 Do you like coffee?",
"confuse": [
{
"id": "A0-P19",
"note": "I like tea. 是在说自己,Do you like tea? 才是问对方;问对方要把 Do you 放在最前面。"
}
]
}
},
{
@@ -147,6 +157,16 @@
"sentence": "Do you like coffee?",
"meaning": "你喜欢咖啡吗?"
}
},
"usage": {
"when": "想知道对方喜不喜欢某样东西。",
"reply": "对方会回 Yes. 或 No.",
"confuse": [
{
"id": "A0-P18",
"note": "Do you like tea? 是问对方,I like tea. 是说自己喜欢。"
}
]
}
}
],
@@ -40,6 +40,16 @@
"sentence": "Please say that again.",
"meaning": "请再说一遍。"
}
},
"usage": {
"when": "没听清对方说了什么,请他再说一次。",
"reply": "对方会把刚才的话重说一遍,通常会慢一点。",
"confuse": [
{
"id": "A0-P04",
"note": "How do you spell that? 是听清了但不会写,这句是根本没听清。"
}
]
}
}
],