|
|
@@ -37,11 +37,13 @@ tags: [未来飞马, 智能体技能, 超级技能, 服务级, 案例采集, 案
|
|
|
|
|
|
## 红线(不可协商)
|
|
|
|
|
|
-1. **授权前置**:`authorizationStatus != authorized` 一律不入库、不产生案例对象。默认值是 `pending`,必须显式传 `--authorization authorized`。
|
|
|
+1. **授权前置(已废弃 — 2026-10-12 需求变更)**:授权字段已从案例库删除,**默认全部授权**,不再要求 `authorizationStatus`、不再校验。采集/审核/检索全链路都不看授权。若系统里仍出现授权闸门,属于回退,按「红线 6」处理。
|
|
|
2. **不进公共素材库**:采集只写 `reviewStatus='pending'` + `readyForUse=false`,由负责人用 `caseApprove` 放行后才进检索结果。
|
|
|
3. **不落 PII**:真实 PII 只在本次请求内存中处理。`privacyFindings[].snippet` **本身就是掩码后的**(`138****5678`),不打码不落库。
|
|
|
4. **不伪造结果**:缺 ffmpeg / skill-vision / skill-listen 时,在 `warnings` 里明说,不编造 OCR 或转写内容。
|
|
|
5. **不写凭据**:token 只从环境变量 / 本地配置读,仅内存持有,不落盘、不进日志、不进报告。
|
|
|
+6. **打码仍是红线**:授权放宽 **不等于** 可以放未打码内容。检索侧强制 `maskingStatus ∈ {reviewed, REVIEWED}`,未打码的绝不进结果。
|
|
|
+7. **图片 URL 必须同源**:落库的 `materialAssets[].url` 必须指向**看板同源**路径(`https://app.fmode.cn/dev/<projectId>/…`),不要用 `s3.fmode.cn` —— 后者**无 CORS 头**,前端 `fetch()` 取图必失败(看板的「复制图片」功能依赖同源取图)。采集时用项目内 OBS 路径上传素材,而不是个人空间的 s3 分享链接。
|
|
|
|
|
|
## 鉴权与依赖
|
|
|
|
|
|
@@ -152,9 +154,22 @@ if (report.canSubmit) await runSubmit({ package: report.artifacts.casePackage })
|
|
|
- **字典自进化**:采集到字典里没有的新取值时追加进 `references/tag-dictionary.json`
|
|
|
(`--no-learn` 可关;本技能**只改文件、不自动 push**)。
|
|
|
|
|
|
-## 授权依据(企业微信场景)
|
|
|
+## 授权依据(企业微信场景)— 已废弃
|
|
|
|
|
|
-企微会话里系统提示「**对方默认同意存档会话内容**」时,该截图可作为 `--authorization authorized` 的依据(会话内双方均已收到该告知)。**没有**这行提示的截图/记录一律按 `pending` 处理,不得擅自升为 authorized。授权状态是硬门:未授权 `submit` 必拒。
|
|
|
+**2026-10-12 需求变更:授权字段已删除,默认全部授权。** 本节仅作历史记录保留。
|
|
|
+
|
|
|
+原规则(不再执行):企微会话里系统提示「对方默认同意存档会话内容」时,该截图可作为授权的依据;没有该提示一律按 `pending` 处理。
|
|
|
+
|
|
|
+现在采集不再需要任何授权参数;但**企微「默认同意存档」以外的会话**(如外部微信群截图)仍要注意:授权虽不再是闸门,素材来源合规则仍是运营责任,落库时在 `summary` / `sourceType` 里注明来源(如 `wx-group`),便于事后追溯。
|
|
|
+
|
|
|
+## 采集素材上传:必须落「看板同源」路径
|
|
|
+
|
|
|
+案例检索侧只看 `materialAssets[].url`。**且该 URL 必须能被看板前端 `fetch()` 到**,否则「复制图片」功能会静默失败。两条硬约束:
|
|
|
+
|
|
|
+1. **同源**:`s3.fmode.cn` **不返回 `Access-Control-Allow-Origin`**,跨域 `fetch` / canvas 一律失败(浏览器只报 `Failed to fetch`,无 CORS 报错)。所以素材应上传到**项目自身的 OBS 前缀** `dev/<projectId>/`,通过网关 `https://app.fmode.cn/dev/<projectId>/<file>` 读取(已验证同源可 fetch、可进剪贴板)。
|
|
|
+2. **上传目标 = `dev/<projectId>/`,不加 `browser/` 段**:网关 `/dev/<id>/<file>` 直接映射 OBS `dev/<id>/<file>`。传成 `dev/<id>/browser/<file>` 会让网关回退到 SPA index.html(返回 200 但内容是 HTML)。
|
|
|
+
|
|
|
+旧做法(s3.fmode.cn 分享链接)仍可用于**报告类**交付物,但不要用于需要前端二次读取的案例素材。
|
|
|
|
|
|
## 素材上传(`--upload`,默认开)
|
|
|
|
|
|
@@ -292,4 +307,23 @@ npx --yes skill-case-get@latest install # 用户级 → ~/.claude/skills/ski
|
|
|
- `.docx` / `.pptx` 解包走 python3 标准库,**不要**为此引入 python-docx / python-pptx / 任何 npm 包。
|
|
|
- 本地素材默认**真上传**(`--upload` 开,走 fmode-storage 第 0 级免密钥通道)拿公网 URL;`--no-upload` 才回落到 `--asset-base-url` 派生。两种情况下都**不伪造 URL**,拿不到就留空并在 `warnings` 里说清楚。
|
|
|
- 视频抽帧是均匀取点(默认 6 帧,`--frame-count` 调整);转写走网关按音频时长计费。
|
|
|
-- 枚举统一**小写**(对齐线上:`pending` / `authorized`),展示层再做中文化。
|
|
|
+- 枚举统一**小写**(对齐线上:`pending` / `authorized`),展示层再做中文化。注意:**授权类枚举已随授权字段一起废弃**;案例类型枚举是中文单值(`对外案例`/`买课案例`/`高分案例`/`提分案例`/`录取案例`/`申诉案例`/`内部学习`)。
|
|
|
+
|
|
|
+## 看板侧字段(消费端,容易被采集侧忽略)
|
|
|
+
|
|
|
+- **`caseType`(案例类型,单值中文)**:区分「对外可用」与「销售内部学习」。
|
|
|
+ - 对外:`对外案例` / `买课案例` / `高分案例` / `提分案例` / `录取案例` / `申诉案例`
|
|
|
+ - 内部:`内部学习` —— **默认不出现在检索结果**,与对外案例严格分开(用户明确要求:长截图类素材是给销售内部学习用的)。
|
|
|
+ - 存量回填有据可依:由 `highlightType`(亮点)映射,`录取→录取案例`、`申诉成功→申诉案例`、`提分→提分案例`;**映射不上的留空并交人工定,不凭空猜**。
|
|
|
+- **`followUpScript`(跟进话术)**:看板「复制图片+话术」按钮读这个单值字段,采集时要写进去,否则复制出来只有图没有话术。
|
|
|
+
|
|
|
+## 一键复制图片:浏览器剪贴板的三条硬约束
|
|
|
+
|
|
|
+看板支持销售「复制图片 / 复制图片+话术」直接粘进企业微信。实现时踩过三个坑,**任何批量交付图片的界面都会重现**:
|
|
|
+
|
|
|
+1. **必须用 `ClipboardItem` 写图片,不能用 `writeText`** —— 纯文字通道复制过去只有文字,销售要的是能直接粘的图。
|
|
|
+2. **`clipboard.write()` 必须在用户手势的同步栈里调用**。先 `await fetch(...)` 再 write,临时授权已过期 → `NotAllowedError`。正确姿势:`new ClipboardItem({'image/png': fetchPng(url)})` 传 Promise,write 同步发出。
|
|
|
+3. **Chromium 剪贴板只接受 PNG**:写 `image/jpeg` 抛 `NotAllowedError: Type image/jpeg not supported on write`。所以 `.jpg` 素材必须先经 `createImageBitmap` + `canvas.toBlob('image/png')` 转码(**转码放在 Promise 内部**,不破坏第 2 条)。
|
|
|
+
|
|
|
+验证方法:CDP `Browser.grantPermissions(origin, ['clipboardReadWrite','clipboardSanitizedWrite'])` + `Runtime.evaluate(..., userGesture=True)`,再 `navigator.clipboard.read()` 回读确认 item 的 type 是 `image/png`、size > 0。仅凭 console 无报错不算通过。
|
|
|
+
|