Browse Source

fix(parse-direct): 落库补 fitStatus/reviewHint;SKILL 记录字段映射与 PII 排查坑

- fitStatus 是前端真正读的字段(PRD 10-案例推荐策略),案例包为数组、线上为单值 → 取首个写入
- 直写通道对 schema 外字段静默忽略,易漏字段必须提交后回读
- 自动掩码只作用 privacyFindings;title/summary/ocrText/description 需人工逐字段清洗
- 微信群聊截图授权按 pending,需用户明确确认
FmodeAgent 7 hours ago
parent
commit
f9e6c7597a
2 changed files with 19 additions and 0 deletions
  1. 15 0
      SKILL.md
  2. 4 0
      scripts/parse-direct.mjs

+ 15 - 0
SKILL.md

@@ -236,6 +236,14 @@ node scripts/storage-bridge.mjs --file ./img.png --case-slug imperial-aero50006
 
 `complianceBlockers` 非空 → `submit` **拒绝提交**(即使授权通过)。
 
+### 掩码只作用于 privacyFindings —— 别把 PII 漏在别处
+
+自动掩码**只**改 `privacyFindings[].snippet`;`title` / `summary` / `imageText` / `materialAssets[].ocrText|description` 都可能是**原样**文本。而 `title` 默认取 OCR 首行——**微信群名常直接含学员全名**(如「S26 101-ECO414某某某-(7)」),等于把姓名写进标题。
+
+提交前**逐字段**扫一遍这五个位置:`title` / `summary` / `imageText` / `materialAssets[].ocrText` / `materialAssets[].description`,把姓名、顾问昵称、机构名替换成占位(`贾**` / `顾问` / `创*留学`)。复核命令:整包 `json.dumps` 后查关键姓名子串是否为 0。
+
+另外「微信**群聊**截图」不是企微「默认同意存档」会话,图里也没有该告知 → 授权按 `pending` 处理,**必须由用户明确确认**才能 `--authorization authorized`。
+
 ## 归档通道(双通道,自动选择)
 
 `submit` 会**先试云函数,不可达时自动回落 Parse 直写**,两条通道落库字段逐字一致(都只进待审清单):
@@ -252,6 +260,13 @@ node scripts/storage-bridge.mjs --file ./img.png --case-slug imperial-aero50006
 - 服务端特权密钥只从环境变量 `CASE_PARSE_MASTER_KEY` 或 0600 的 `~/.fmode/config/enterprise/current.json` 读取,只进请求头,**不落盘、不打印**。
 - 线上 `CaseAsset` 字段类型:`targetCustomer` / `resultEvidence` / `outcome` / `groupInfo` 是 **Object**(不是字符串),本通道已按此对齐。
 
+### 落库字段映射(易错,改过就回读)
+
+- `fitStatus`(适用跟进状态,见 PRD `10-案例推荐策略.md`)是**前端真正读的字段**(`case-list` / `case-detail` 的 `item.fitStatus`)。案例包里按契约是 `fitStatus[]` **数组**,线上字段是**单值字符串** → 取首个写入。**漏写 = 前端永远显示默认「新进线」、按跟进状态筛选永远不匹配。**
+- 「出分反馈/家长认可/退费保障」类案例对应 **异议处理中 / 沉默待跟进**(不是「已成交」);打标前先查 PRD 策略表,别凭直觉。
+- `reviewHint` 等只读知会字段一并写入。
+- 提交后**必做字段回读**:按 `tenantId + idempotencyKey` 查回该条,逐字段比对(尤其 `reviewStatus` / `readyForUse` / `fitStatus` / `maskingStatus`),**别只看 `submitted:true`**。直写通道对未知字段是静默忽略的(Parse REST 会剥掉 schema 外的列),字段名写错不会报错、只会静默丢。
+
 ## 云函数(部署若挂载了函数运行时)
 
 | 函数 | 用途 |

+ 4 - 0
scripts/parse-direct.mjs

@@ -130,6 +130,10 @@ export function toCaseAssetFields(casePackage, opts = {}) {
     major: String(casePackage.major || ''),
     stage: String(casePackage.stage || ''),
     subject: String(casePackage.subject || ''),
+    // 适用跟进状态(前端 case-list/case-detail 读 item.fitStatus;PRD 10-案例推荐策略)。
+    // 案例包按 contract 用 fitStatus[] 数组,线上字段是单值字符串 → 取首个。
+    fitStatus: list(casePackage.fitStatus)[0] || '',
+    reviewHint: String(casePackage.reviewHint || ''),
     highlightTypes,
     scenarioTags,
     objectionTags,