# 2026-05-21 工作记忆

## 事件记录

### 1. 口语题目句型知识点改写（刘彦江）
- 多轮 JSON 改写任务，将指定句型知识点嵌入 speaking_qa 题目
- 句型包括：It's ... now / It's bad for your health to ... / We are ... now / We want to catch ... / Please help me ... / I want to buy ... / I only need ... / We must not ... / I will use it to ... / It was ... / It helped a lot to ... / It tastes like ... / I've decided to ...
- 规则：知识点必须是答案，每个问题设计确保回答必然触发目标句型

### 2. 单元挑战听力拖拽题解析补充（刘彦江）
- 涉及 ID：010501, 010601, 010701, 010801, 010901
- 多维表格：App Token `CMHSbUUjka3TrUsaxxEc297ongf`，表 `听力-P7-听力拖拽` (tbly9SvPEa44k3yX)
- 每个 ID 包含 first 和 second 两组（题组1和题组2），两组都需要补充完整解析

### 3. bitable 操作经验教训
- **Shell 转义陷阱再次确认**：jsonData 中包含大量嵌套 JSON，Shell 变量展开会破坏数据。必须用 Python subprocess + curl 直接构造请求体
- **`¥¥` 分隔符与 bitable API 不兼容**：原数据中用 `¥¥` 作为解析分隔符，写入 bitable 后会导致 jsonData 损坏。后续改用 `||` 替代
- **explanation 字段路径**：位于 `questionSet[0].explanation`，而非 section 层级的 `explanation`
- **operate_bitable.sh 限制**：仅适用于简单字段更新，复杂嵌套 JSON 场景不可用

### 4. Python bitable 更新脚本模式
```python
import subprocess, json

# 获取 token
# curl GET records 获取数据
data = json.loads(response)['data']
record = data['items'][0]  # 或 data['item']
fields = record['fields']
jd = json.loads(fields['jsonData'])

# 修改数据
jd['first']['questionSet'][0]['explanation'] = '...'
jd['second']['questionSet'][0]['explanation'] = '...'

# 序列化并更新（注意 ensure_ascii=False）
fields['jsonData'] = json.dumps(jd, ensure_ascii=False)
body = json.dumps({"fields": fields})
subprocess.run(['curl', '-X', 'PUT', url, '-H', f'Authorization: Bearer {token}', ...])
```
- 关键：读取后立即备份原始数据，写完后回读验证完整性

### 5. 解析生成规则
- 每道题的解析需包含：听力原文引用 → 答案对应 → 关键特征 → 冗余排除/语用推理
- first 和 second 的解析需分别定制，不可复制模板
- 干扰抑制类题目：标注冗余信息类型（位置/情绪/动作/大小等）
- 否定纠错类题目：标注否定信号词和身份替换逻辑
- 跨句整合类题目：标注需整合的信息来源和推理路径
### 6. 剧本内嵌 Sheet 组件配置回填（刘彦江）
- 文档：L1-S2-U17-L5 笨蛋坏蛋？（wiki token `U1zEwHZaaie07TkjmOOchurgnIh`）
- 内嵌 Sheet `wMQVyV`，剧本表 265 行 × 9 列（A=类型, B=ID, C=配置整理, D=剧情描述, E=角色名, F=英文台词, G=组件配置, H=知识点, I=编剧台词）
- 共 17 个互动行：对话朗读-配图(6) / 对话朗读(1) / 对话挖空-配图(1) / 对话挖空(4) / 对话选择-配图(1) / 对话选读(2) / 对话组句-配图(1) / 对话组句(1) / 看图说话(1)

#### 组件类型 A 列取值与技能映射（新增类型）
| A列类型 | 对应技能 | 备注 |
|---------|---------|------|
| 对话朗读 / 对话朗读-配图 | dialogue-reading-config | -配图需加图片时机和音频载体 |
| 对话挖空 / 对话挖空-配图 | dialogue-fill-in-blanks-config | 同上 |
| 对话选择 / 对话选择-配图 | dialogue-choose-config | 同上 |
| **对话选读** | dialogue-selective-reading-config | 开放表达，无正确选项，每选项必带反馈 |
| **对话组句** | dialogue-sentence-building-config | 单词排序组句，含答案+辅助信息 |
| **看图说话** | dialogue-image-description-config | 导览配置+对话配置，含Q&A/通过规则/示例对话 |

#### 类型区别关键点
- **对话选择 vs 对话选读**：前者有对错判断（正确选项标注），后者开放表达（无正确选项，每选项均带反馈）
- **对话挖空**：`___` 必需三下划线，选项2-3个，反馈角色非 User
- **对话组句**：选项为独立单词/短语，答案填完整正确句，必须有辅助信息
- **看图说话 v2.0**：结构最复杂，包含导览配置（任务标题/背景/描述/知识）+ 对话配置（角色/背景/Q&A/通过规则/示例对话）
- **-配图后缀**：资源配置需添加 `图片时机：互动内容\n互动反馈\n\n音频载体：Pioneer Band`

#### 写入脚本模式
- G 列写入使用 Python subprocess + curl（避免 shell 转义）
- SST = spreadsheet_token, SID = sheet_id（格式 `SST!G{row}:G{row}`）
- 写入后必须回读验证内容完整性
