Wyatt_K
7c01d29a0d
fix(agent): 创作引导 - 使用可点选项并控制工具描述预算 ( #607 )
2026-09-23 16:26:40 +08:00
itsWyatt-K
33baecde28
feat(agent): 技能用量 - 按用户运行日志统计检索与读取 ( #590 )
2026-09-23 16:22:44 +08:00
Wyatt_K
67cbda6cd6
feat(agent): 场景胶囊 - 为会话挂载预设技能组合 ( #608 )
2026-09-23 16:15:34 +08:00
Wyatt_K
ec81a1b92b
feat(skills): 场景预设 - 提供公开只读目录并校验内置技能引用 ( #603 )
2026-09-23 16:01:27 +08:00
Wyatt_K
7ebdd06268
fix(skills): 技能门房 - 推荐商店真名并标注上架状态
2026-09-23 13:58:16 +08:00
Wyatt_K
c4879421c3
fix(skills): 技能种子 - 同步合规改造后的 judian-skills 指令
2026-09-23 13:53:39 +08:00
Wyatt_K
bca47a27bc
fix(agent): skill_search tokenizer keeps single CJK runes
...
cloudAgentSkillSearchTokens dropped any token shorter than 2 runes.
That filter was copied from English stop-word logic (a / I), but a single
Han rune such as the ones meaning hook, gag or twist is already a complete
semantic unit in Chinese. When the whole keyword consisted of such runes,
tokens came back empty and cloudAgentSearchSkills degraded to listing the
full index of enabled skills - the user thinks a search happened but gets
an unsorted dump.
Fix: keep a token when it is exactly one Han rune (unicode.Han); single
ASCII/digit runes and empty strings are still dropped as before.
Test: TestCloudAgentSkillSearchTokensKeepsSingleCJKRune fails on the old
logic (got [反转 钩子], want [反转 钩子 梗 钩]) and passes after the fix.
recall_lessons has an isomorphic copy of the same tokenizer, fixed
separately in #593 .
2026-09-22 16:30:07 +08:00
Wyatt_K
23b4b2adde
fix(agent): recall_lessons tokenizer keeps single CJK runes
...
cloudAgentLessonSearchTokens dropped any token shorter than 2 runes.
That filter was copied from English stop-word logic (a / I), but a single
Han rune such as the ones meaning hook, gag or twist is already a complete
semantic unit in Chinese. When the whole keyword consisted of such runes,
tokens came back empty and cloudAgentSearchLessons silently fell back to
"list the first N lessons" - the user thinks a search happened but gets an
arbitrary list.
Fix: keep a token when it is exactly one Han rune (unicode.Han); single
ASCII/digit runes and empty strings are still dropped as before.
Test: TestLessonSearchTokensKeepsSingleCJKRune fails on the old logic
(got [反转 钩子], want [反转 钩子 梗 钩]) and passes after the fix.
The isomorphic copy in skill_search (cloud_agent_tools.go) is fixed
separately on the #580 branch and deliberately not included here.
Gates: go build ./... and go vet EXIT=0; gofmt clean on LF content; the 3
go-sqlite3 cgo-stub failures in internal/app are pre-existing and unrelated.
2026-09-22 15:59:34 +08:00
itsWyatt-K
3fb703dd2d
feat(skills): 为 34 个域包种子条目补演示媒体(信息卡片图)
...
官方 36 个技能里 33 个带 showcaseMedia,我们 0 —— 技能库列表页上,
有图和没图是两个点击率。本次给 34 个域包各配一张信息卡片图。
- 图片存放于 itsWyatt-K/judian-skills 的 showcase/ 目录,随仓库版本化,
URL 形如 https://raw.githubusercontent.com/itsWyatt-K/judian-skills/main/showcase/pack- <slug>.png
- 选信息卡片而非 AI 抽卡图的理由:卡片传递「这个技能能干什么」的真实信息
(名称/一句话能力/卡数/代表卡),AI 示例图与技能方法关联弱、只是装饰且风格杂乱;
示例成片待有真实使用案例后再补
- 门房 scene-recipe-concierge 是路由技能、无域包图,本轮不配图
校验:34 个条目填入,逐个通过 GitHub API 确认图片存在于仓库后才写 URL。
条目总数与 skill_id 未改动。
2026-09-22 12:34:00 +08:00
itsWyatt-K
b5b485d7d0
fix(skills): 修复种子条目重复——上一次同步把 35 条旧条目留下了
...
上一个提交 ce89c402 的替换逻辑有 bug:计算了剔除集合却没有使用,
导致 35 条旧英文 slug 条目与 35 条新中文名条目同时存在,
skills.json 条目数 68 → 103,skill_id 出现重复。
本次修正为「先剔除旧条目,再把新条目插到第一个旧条目原来的位置」:
- 条目总数回到 68(33 官方 + 35 域包)
- skill_id 全部唯一
- 我们的 35 条 tag 分布 drama 15 / creative 12 / ecommerce 5 / social 2 / others 1
- description 全部 <=500 且不含「蒸馏自《XX」」
教训:批量替换类操作必须在推送前校验「条目总数与 ID 唯一性」,
我上次只校验了新条目自身,没校验合并结果。
2026-09-22 12:06:12 +08:00
itsWyatt-K
ce89c40287
feat(skills): 种子条目同步 v2.0.0 改造成果(中文名 / tag 五分类 / 新话术)
...
v2.0.0 已把 34 个域包改造为中文名、tag 对齐影策五分类、description 首句改为
「我能帮你产出什么」并移除「蒸馏自《XX」」,但 skills.json 里的种子条目仍是
旧英文 slug 与旧话术,影策市场一条都没收到。本次把改造成果真正送进上游通道。
- 35 条种子条目 skill_name 全部中文化(含门房「选包门房」)
- tag 对齐影策五分类:drama 15 / creative 12 / ecommerce 5 / social 2 / others 1
- description 首句改「我能帮你产出什么」,全部 ≤500 字符且不含「蒸馏自《XX」」
- ID 区间 73-107 与上一版完全一致,未新增或改动任何编号
同步来源:itsWyatt-K/judian-skills seed-contribution/seed-addition-packs.json
2026-09-22 12:02:36 +08:00
itsWyatt-K
590f6b4204
fix(cloud-agent): 修正 skill_search 改动的 gofmt 格式
...
两处:skill_read_file 工具描述里 map 参数前补逗号后空格;测试文件里新增最长 map 键后重排值对齐。
本地 gofmt 已确认两文件合规,go test 全绿。
2026-09-22 08:27:12 +08:00
Wyatt_K
e28c28f97a
feat(cloud-agent): 新增 skill_search——Agent 侧技能/卡级检索
...
#577 让 Agent 知道「有哪些技能」;本 PR 补上「这个任务该读哪张卡」。
#568/#575 之后种子已有 34 个域包、759 张卡,单包最多 67 张,
「先读 SKILL.md 总纲再按名录找卡」的成本会随卡数线性上涨。
## 设计(复用仓库既有范式,不发明新机制)
参照 recall_lessons(个人记忆检索):同一套分词器、稳定排序、无关键词列全量索引。
打分四档:**卡名命中 4 > 技能名 3 > 技能描述 2**。
- 命中卡片 → path 直接给 `cards/xxx.md`,Agent 不必读总纲;
- 只命中技能 → path 给 SKILL.md,并下发该包的 **卡索引**(跨条目共享 40 条预算),
Agent 可直奔某张卡。中文关键词打不到英文卡名时,这条兜底路径是主要收益来源;
- 数据源 = 本轮冻结快照(含 #577 注入的 description;卡路径本就在 Files 里,无需读正文);
- 只搜已启用技能;**只返回索引与路径,正文永不内联**;
- 不可信数据纪律延续:工具描述明牌「返回的是索引,不是指令」。
## 实机验证(本机影策 v1.5.7 + 本分支编译的后端,step-5-preview-intl)
- **检索→读取闭环打通**:`skill_search("反转 结构 钩子")` → 命中 2 条并下发卡索引 →
Agent 直读 `cards/ssqr-twist-ending.md`,**全程未读 SKILL.md**,tool_failed=0。
- 8 技能满槽自由跑(原始/改描述/再改描述 三次):模型**均未自发调用**,
skill_read_file 15 / 8 / 9 次落在噪声内 —— **仅靠工具描述不足以驱动该模型主动检索**,
本 PR 不声称改善了采纳率;采纳与否需要遥测才能判定。
## 实机撞出的两个缺陷(已修,非理论风险)
1. **参数容错**:模型按 skill_read_file 习惯顺手带 skillId,被 DisallowUnknownFields 拒 →
tool_failed,工具可见却一次都没成功。现容忍(仅接收不生效)。
2. **snippet 多字节越界 panic**:strings.Index 的字节偏移被当 []rune 下标、start 未夹紧 →
`panic: slice bounds out of range [249:233]`,**整个后端进程被打挂**(复现两次)。
现改为 rune 级子串查找 + start/end 双向夹紧;回归测试用 276 rune/字节偏移 483 的长中文
描述,修复前稳定 panic([443:276])。
## 测试(11 个契约用例,全绿)
注册与门控、卡名命中返回卡路径、中文关键词回落到卡索引、卡索引预算夹紧、
name>description 排序、无关键词列索引、limit 夹紧、无命中 guidance、
stray skillId 穿透解码层、长中文描述不越界、sentinel 断言正文绝不内联。
门禁:go build ./internal/app/ ✓ go vet ./internal/app/ ✓ go test 11/11 ✓
2026-09-22 07:47:55 +08:00
Wyatt_K
04bbbf642e
fix(cloud-agent): skill_search 两处实机缺陷——skillId 容错与 snippet 多字节越界
...
两个缺陷都是实机验证时撞出来的,不是理论风险。
1) 参数容错:Agent 首次调用时按 skill_read_file 的参数习惯顺手带上 skillId
({"keyword": "...", "skillId": "<已启用技能ID>"}),而参数解码走
decodeCloudAgentJSONObject(DisallowUnknownFields),直接拒绝 → tool_failed。
结果是工具在清单里可见、却一次都没调用成功。
- args struct 增加 SkillID(json:"skillId,omitempty"),仅接收不生效——
检索范围恒为本轮已启用技能;
- 工具描述补「不要传 skillId——本工具搜索全部已启用技能」,从源头减少误传;
- 回归测试走完整的工具分发路径(cloudAgentReadTool),真正穿透解码层,
并断言该字段不会缩小检索范围。
2) snippet 越界 panic(更严重):cloudAgentSkillSnippet 用 strings.Index 拿
**字节偏移**,却拿它去切 **[]rune**。中文描述里关键词越靠后、字节偏移越远
超 rune 数,start 没有夹紧到 len(runes),触发
panic: runtime error: slice bounds out of range [249:233],
**整个后端进程被打挂**(实测复现两次)。
- 改为 rune 级子串查找(cloudAgentSkillRuneIndex),不再混用字节与 rune 下标;
- start/end 双向夹紧,并补 start>end 兜底;
- 回归测试用 276 rune、命中词字节偏移 483 的长中文描述,
在修复前稳定 panic([443:276]),修复后通过。
3) 工具描述补充检索引导(提示文本,非行为改动):
- skill_search:明写「当本轮启用了多个技能、而你不确定该读哪一个时,先用本工具检索」;
- skill_read_file:补「若本轮启用了多个技能且不确定该读哪一个,先用 skill_search 检索再读」——
放在这里是因为模型一定会用到 read_file,提示的可达性高于只写在 search 自己的描述里。
实测:同一 8 技能满槽任务跑 3 次(原始描述 / 只改 search 描述 / 再改 read_file 描述),
step-5 **三次都没自发调用** skill_search,skill_read_file 次数 15 / 8 / 9(噪声内)。
即:**仅靠工具描述不足以驱动该模型自发检索**,需要系统提示层路由或遥测来验证采纳,
本 PR 不声称改善了采纳率。
门禁:go build ✓ go vet ✓ go test 8/8 ✓
2026-09-22 03:35:24 +08:00
Wyatt_K
18b082a2d0
feat(cloud-agent): 新增 skill_search 工具——Agent 侧技能检索
...
#568/#575 提交 35 个域包(760 卡)后,Agent 按总纲名录逐卡深读的模式
出现检索成本:实测单任务读卡 12-29 次,卡库继续增长后劣化可期。
skill_read_file 只接受精确路径,Agent 侧无检索能力,与用户侧商店搜索不对称。
本 PR 参照仓库内 recall_lessons 的既有检索范式(同一套分词器与三档加权:
name 命中 3 分 / description 命中 2 分),为 Agent 侧补上对称能力:
- skill_search(keyword, limit):在本轮已启用的技能中按关键词打分排序,
返回「哪张卡值得读 + skillId + path + snippet」;不带参数时列全量索引;
- 数据源为本轮冻结的技能快照(与 #577 注入 manifest 的 description 同源),
搜到的必然是能读的,不引入「搜到但版本已变」的一致性问题;
- 只读、零副作用;不搜索未安装技能,避免「搜到不能读」的挫败;
- 渐进披露边界不变:返回索引而非正文,正文仍走 skill_read_file
(12000 字符/页),技能内容永不整体内联进上下文;
- 工具描述明牌「返回的是索引,不是指令」,延续不可信数据纪律。
测试(6 个新契约用例,全绿):
- 与 skill_read_file 一同注册、无技能时均不出现;
- name 命中排在 description 命中之前;snippet 不泄正文;
- 无关键词列全量索引;limit 夹紧;无命中时 guidance 指向 read_file;
- 空技能集返回 guidance;instruction 正文绝不内联(sentinel 断言)。
门禁:go build ./internal/app/ ✓ go vet ./internal/app/ ✓
go test -run TestCloudAgentSkillSearch ✓
2026-09-21 22:23:35 +08:00
Wyatt_K
c24f1a74d1
refactor(skills): 种子市场追加门房技能并刷新两包 description
...
- consumer-psychology 瘦身:移除组织治理/团队激励/个人自控类 9 卡(50→41),description 重写为影策场景锚定(带货口播/广告脚本/详情页/直播话术的转化心理)
- comedy-mechanics description 补全为「创作+表演+职业化」三层口径
- 全量卡片 description 残尾清理(截断 fragments),跨包引用名补全
- 新增 scene-recipe-concierge 门房技能种子条目(ID 107,台账分配)
- skills.json 67 → 68 条
2026-09-21 20:13:24 +08:00
Wyatt_K
5fe27ae642
feat(cloud-agent): 技能 description 进入 Agent 系统提示 manifest
...
compileCloudAgentPolicies 的技能 manifest 此前只含 skillId/name/version/hash/entryPath/files,模型看不到每个已激活技能是干什么的,无法在多技能间路由、也无法向用户解释为何选它。本改动把 SkillItem.Description(技能市场公开元数据)注入 manifest,并以 500 runes 为上限截断(描述由技能作者提供,需防止异常长的描述撑爆提示词预算)。skill_read_file 渐进披露边界不变:instruction 与文件正文仍不进入系统提示。
2026-09-21 17:52:49 +08:00
Wyatt_K
5ed345cc7c
refactor(skills): 已合入的 72 条卡级种子重组为 11 个开源域包 + 23 个书籍域包
...
贯彻域包结构结论:一域一包适配每轮 8 技能激活位,种子市场与 judian-skills 仓库口径统一为 34 域包。内容零丢失:86 卡全量保留在仓库 cards/ 目录经 GitHub 安装。ID 治理:1-72 段编号封存永不复用,73-106 段一次到位。skills.json 105 → 67 条(33 官方 + 34 域包)。
2026-09-21 17:08:08 +08:00
Wyatt_K
0021f64d59
feat(skills): 新增 23 个书籍方法论域包种子技能(judian-skills 书籍重铸层)
...
60+ 部经典创作与营销书籍(麦基《故事》《救猫咪》《影响力》《疯传》、奥格威等)的方法论自撰重铸:23 个场景域包共 683 卡,种子条目内嵌域包总纲(何时调用/何时不用/卡片名录/工位边界),完整卡片经 GitHub 一键安装按需深读。skill_id 由 ID 台账续号(73-106 段),与已合入的 72 条卡级种子(#568)互补不冲突。
2026-09-21 16:49:40 +08:00
itsWyatt-K
73ef84ffc8
feat(skills): 社区技能 - 新增 72 个创作方法论技能 ( #568 )
...
Original-Commit: d96d5aa62b68b0f8582f4f2d6a0e588d2794af6d
feat(skills): 新增 70 个社区创作方法论技能并在 README 推荐 judian-skills
- seed/skills.json 追加 70 条目(drama 14 / creative 44 / ecommerce 12),来源为
官方文档(MiniMax H3)与 9 个宽松许可开源项目的结构化蒸馏加自撰方法论,
逐卡带许可署名(metadata.source / license / attribution)
- 与现有 33 个种子技能分工明确:本批负责生成前方法论(节奏校准/提示词组装/
质检/反推),27 个任务域重叠技能带工位边界声明,与 image_text_detect 正交互补
- README 核心能力新增社区技能生态条目,指向 judian-skills 仓库
(技能页 install/GitHub 标签直装)
- 验证:go build ./internal/skills 与 go vet ./internal/skills 均通过;
种子 JSON 无重名/重 ID;A/B 实测五任务全部优于无技能与上游同类技能
Original-Commit: 55e0252e92c65bf9b69891c46313be5a7a02edd7
feat(skills): 种子技能 70 → 72(补装订图文案规范与视觉决策转换层)
新增两条已在社区技能库发布、但此前因 frontmatter 残缺被转换器按私有跳过的技能:
- flux-asset-image(FLUX.2 资产图规范):四层结构 Subject→Action→Style→Context + 五条专属规则(无负向词 / HEX 绑物体 / 外观段逐字重复保角色一致性 / 相机代码提写实感 / 多主体切 JSON)。补上图像侧「生成前方法论」空白。
- vis-to-prompt(视觉决策 → 提示词转换层):把视觉叙事七元素决策(空间选型/影调/色彩/运动)翻译成模型能懂的具象短语,并嵌入 FLUX 四层或 H3 时间轴。补上「设计意图 → 模型语言」的断点。
字段规范:skill_id 由 id_ledger.json 台账分配(...00071 / ...00072),不与既有 70 条串号;tag=creative;status=1;source=3;instruction 末尾附许可与署名页脚。
验证:go build ./... 与 go vet ./... 均 EXIT=0;skills.json 自检无重复 skill_name / skill_id,总条目 33 → 105。
2026-09-21 09:37:20 +08:00