Files
ycode/docs/assessment-skills-2026-10-16.md
T

129 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WorkBuddy 技能部分评估与拆解
2026-10-16,仅评估。技能是“市场发现→详情→本地/云端安装管理→输入引用→会话内实际加载/执行”的完整链路,不能用一组静态卡片代替。客户端的 DOM/CSS/SVG、列表状态和大量纯 helper 已有可恢复源码;本地安装器、扫描判定、运行内核和云目录/付费权益还有独立宿主及服务依赖。没有依据把全部技能功能宣称为已完成或已证明可完整等价。
本次只新增审查脚本、评估文档和 `.tmp` 报告;没有改生产、操作原版 runtime、导入/安装/启用/购买技能。原版新增静态采集只使用 REA 根哈希固定的选中文件导出。原版 UI 截图由主上下文通过 REA 采集,本任务只读其已保存结果。历史 CDP 结论不纳入已验证结论。
## 源身份与可复现材料
原版 **WorkBuddy 5.8.2**,安装包根 SHA-256:`035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918`。
| 简称 | REA 来源 | 观察范围 |
| --- | --- | --- |
| R | `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`,`.tmp/rea-runtime-scripts.json` | 339个导出脚本,逐项先验证正文 SHA 再解析,不执行模块初始化 |
| S | `ev_e8faf60b3d22b99ede302f2d0efdfb3145f53f59789d4a345f5892dc13a589a4`,`.tmp/rea-skills-market-selected-20261016.json` | 精确选取 `renderer/assets/skills-market-Cwf-NvXV.js` 与 `skills-market-d_hn_qWB.css`;未读未选中文件内容 |
| L | `ev_e91787b1d4dea651582c6cf12827775b9068b0ee8b80c68ba08d4c1d87d94e90`,`.tmp/rea-expert-runtime-scripts-20261016.json` | 主上下文后续329个加载脚本;全部校验,市场 JS 与 S 的 SHA 相同,证实实际已加载 |
| C | `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`,`.tmp/rea-css-recovered/manifest.json` | 已保存的组件 CSS/token 来源;本任务复验选用文件 SHA |
| V | `ev_c827c8dc7dee0c67c7870f6bf8417b87ec7b4d90d507ecc5dc592b5878579f10`,`.tmp/rea-market-skills-20261016/frame-000.png` | 主上下文原生1336×901技能市场默认画面;已加载内容与当前账号状态,不代表固定目录 |
| VI | `ev_9d8628a28fed60291e628cebaec55537bfb8274d4b6c8f746bffadcbc277d3fb`,`.tmp/rea-installed-skills-static-20261016/workbuddy.png` | 稳定已安装列表:5个市场来源条目、套件badge、开关、搜索与批量管理 |
| VA | `ev_ddef9315aaf0ff534cf02573212e205ba70e5b69dfc1b3dcf555b430920faf22`,`.tmp/rea-add-skill-options-20261016/frame-000.png` | 添加技能菜单:查找技能/上传技能/创建技能;仅打开菜单并关闭 |
V 中可见共享“专家/技能/连接器”顶部导航、搜索技能、已安装(5)、添加技能、三张精选卡、推荐/SkillHub/套件、横向分类和三列列表。卡片名称、图标、推荐位、使用/安装数属于该账号/时刻的数据。`workbuddy.png`/顶层layout是 probe 前状态;本次切换后的市场证据使用 `frame-000.png`,不把两个时点混用。
VI确认已安装页的“来自市场(5)”和混合套件条目;不能把UI计数反推为5个独立SKILL.md目录,源码计数确实合并skills与plugins。V及VA的动作steps全部completed、各自画面帧有效,但neutral-pointer cleanup cancelled使整体probe为failed,故只标**部分动作证据**,不标全场景成功。VI是稳定static采集,未请求probe。未触发find/upload/create,也未选择或扫描任何文件;导入dialog尚未runtime取证。审查脚本复核以上三张PNG的REA artifact SHA。
重要发现:`skills-panel-CvMlV3m8.js` 94,896 B 大部分实际是 Connector/MCP;`SkillsPanel` offset **93769** 仅101字符,返回 Suspense,并懒加载真正的 `skills-market-Cwf-NvXV.js`。只复用这个名字对应文件会遗漏技能市场主体。S 补齐了真实主体,L 随后证实它已加载。
| 文件别名 | 文件 | SHA-256 |
| --- | --- | --- |
| P | `skills-panel-CvMlV3m8.js` | `b30c43c11ec476db639d6be58065d927411845487d34b0ea8e839d1c6eb7a238` |
| M | `skills-market-Cwf-NvXV.js`,148,298 B | `f1434cadabf5ed3762f00fc2a356bc7418b0b4aab27db62dc9fbbe5add6f6dfb` |
| D | `standalone-skill-detail-modal-Bi5X8CZ4.js` | `ee7de2a7123f94110aa01258d3d6b3fcc3ce48f2ec5fd8f91cb3367c817a0f01` |
| X | `contexts-BMeWSUHk.js` | `5f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b` |
| H | `workbuddy-provider-DkH2YFYM.js` | `b588e875c469978f216beec86bdf4b6c33a31c0266f9bf996881b8dbf37b5dc7` |
| I | `installed-skills-entitlement-CcKsu3c9.js` | `760a0b3d0678c3560cfdb03472f4bc30908ca89c8abf2adc001fa301c718129f` |
| G | `paid-skill-registry-ClOa9K12.js` | `6aefb8bcabe5a79aba236b882e0440bc10736c83ef368ce5aea8f483cb7e94af` |
| F | `paid-goods-gate-D3Mx0eHl.js` | `a727b1748c192f51c89f3bc394eb3ac87d0dfa647409871e99e0711e558680da` |
| B | `wb-input-add-B045GnIg.js` | `7842fa4321d5351bf6c822bbd0253e0d6d6e68cc9cfae3f2470b3d493c23daf4` |
| N | `local-skills-memory-Bb3Kqaxi.js` | `5ba6d1b837ef191d8bbef0f4bf21f2ac56b442e101656f0c1e881794a3d6afb8` |
| Q | `skill-scan-result-dialog-CWSA6ZCh.js` | `4a91c1d114d143d4267ba9b283397ba5445905d65c9dea8a8de065de5eee87dd` |
CSS:M配套 `skills-market-d_hn_qWB.css` 51,694 B,SHA `935d55effde68d03b2fbc2529ec94b19a6cd7210d9bc79febd6d115b115f60b6`;详情CSS `7967df52bacb7594f934b32d8d5fb24854dbc8c47d0217d4677c7d7da0655f49`;扫描dialog CSS `0e657f3b531d73590ca9a5d0bd026f8b31f9fecaac7a59bf79bd737c4195fc77`。不应误把 P 的连接器样式当成市场主样式。
执行 `node scripts/audit-skills-reference.mjs`。输出 `.tmp/skills-audit-20261016/report.json`、格式化的市场/详情模块、有限 helper/class/宿主方法。报告保留 source、SHA、import/export边、函数与class方法 offset。下文 offset 是**原始导出字符串的字符位置**,不是格式化文件行号或二进制地址。
## 客户端状态与可恢复范围
| 部分 | 已查证行为与状态 | 源锚点 |
| --- | --- | --- |
| 入口和路由 | 共享市场导航;Market/Installed/SkillDetail/PluginDetail;详情返回原列表视图;`initialLevel1Tab=installed` intent;visible/active生命周期、bootstrap skeleton/error/retry | M `SkillsMarketRouteShell`143580、`SkillsMarketContent`145021;X `MarketUIService`3797944 |
| 市场发现 | 精选/推荐集合、SkillHub、Knot、企业集合、Plugins;分类横滚、更多分类、排序、分页/无限滚动、回顶部;部分源按账号/企业/产品feature显示 | M `DiscoverSection`71985、`CollectionPanel`45127、`SkillhubCategories`38872;X `MarketLayoutService`3746274、`MarketBuiltinService`3665734、`SkillhubService`3788762、`KnotService`3735308 |
| 全源搜索 | 输入200ms debounce,后续300ms调度;按集合/source并行检索,generation丢弃过期结果;pending/fulfilled/rejected、partialFail、失败banner、空结果、loadMore、hideInstalled;多词搜索部分源另试去空格查询并去重 | X `SearchService`3772106(`search`3772496、`fetchAll`3773749);M `SearchResults`138322 |
| 卡片 | 名称/描述/remote头像或fallback、使用/下载/星数、API Key/云/来源标记、安装/已安装/升级/加载/禁用、试用/更多菜单;不同source/插件卡片有不同动作 | M `CardFrame`/`MarketSkillCard`/`MySkillCard`(完整offset见报告);D各纯SVG定义、`resolve*` helpers |
| 我的已安装 | 本地及cloud-only合并、插件分组;中文/英文描述搜索;按置顶/启用/安装时间排序,用户操作中稳定顺序;批量启用/禁用/卸载、失败项、计数、更新提示;启用数>80的可关闭提示;分页每次增加100项 | M `InstalledSection`126083、`InstalledList`114407、`useBatchActions`79059、`usePinnedInstalled`90446;X `InstalledSkillsService`3719062 |
| 详情 | 本地/远程身份与来源归一,描述展开、markdown说明、语言切换与翻译提示、详情内搜索高亮/命中导航、示例、相关案例、开发者/版本/来源/计数/标签、安装/更新/试用、模型调用开关、更多菜单 | D `useSkillDetail`8265、`useSkillDetailOverview`59966、`OverviewSection`65624、`ActionRow`84719、`SkillDetailModal`101233;X `DetailService`3682486 |
| 本地导入 | 文件夹、zip、拖放;SKILL.md/frontmatter元数据、错误/上传/等待/风险/失败/取消、自动安装非高风险选项;Desktop dialog和浏览器文件流是不同分支 | X `useDesktopSkillPick`4394604、`usePersonalSkillImport`4395325、`PersonalSkillImportModal`4393454、`useSkillUpload`4362230;M `SkillImportModal`141312 |
| 安装与更新 | 市场源install/update不同;optimistic开关失败回滚;批量操作部分失败;用户修改过的技能更新前确认覆盖;新装立即upsert并延迟reconcile,toggle后2秒抑制旧列表覆盖;无法只改checkbox就视为完成 | X `InstalledSkillsService.toggleSkill`3723087、`uninstall`3725366、`runUpdateSkill`3730356、`batchUpdate`3731577;D `runUpdateIfAllowed`51856、`useSkillDetailActions`51972 |
| 云同步 | 本地/云/两端presence、cloud UID/version/syncState;上传preflight/配额/覆盖确认、下载确保本地路径、批量进度/失败重试;卸载区分删本地和可选删云端,付费/内置资源有约束 | M `useCloudDownload`、`useCloudUpload`、`useInstalledCloudSync`;D `runSkillUninstallWithCloud`73220、`checkUploadQuotaBeforeUpload`79878;X `getSkillCloudAction`2307304 |
| 扫描 | 预检查与异步查询;pending/safe/risk/black/suspicious、timeout/error/unavailable;风险tags、fileAnalysis、virusName;黑名单/高风险策略;已安装后发现高风险可提示卸载/保留 | X `buildSecurityScanDialogProps`2335743、`AsyncSecurityScanService`2329330;Q `SingleScanResultDialog`及`SkillScanResultDialog` |
| 授权/付费 | requires_api_key是能力标记;商品购买权限按账号/enterprise/type gate;monthly/permanent、未购/已购/过期、购买后安装、续费、退款、退款次数限制;不是单一“已付费”布尔 | D `resolveRequiresApiKey`5067、`useSkillPaidState`7712、`ActionRow`84719、`SkillPaidDetailChip`93591;I `mapMarketSkillPayToPricing`3272;F `shouldRequestSkillPayAssets`215 |
| 输入选择/调用 | +菜单技能列表、搜索/置顶/最近、local/cloud与cwd/Buddy/account scope,运行可用性/购买状态过滤;slash命令合并个人/项目技能与已有命令;选择产生结构化引用,试用可创建新任务或回传office输入 | B `SkillRow`57379;X `useCommand`4181840、`assembleSkillCommandItems`4179893、`useWbSkillProvider`4480437;D `useTrySkill`50768 |
DOM/CSS/SVG和纯归一函数可直接恢复为有限源码模块。UI hooks中的业务策略可保留并换成YCode真实宿主接口;不能直接初始化整个原 bundle,其DI、账号、telemetry、facade、navigation、transport会绑定原产品。卡片远程头像/markdown/使用数/榜单由目录数据提供,不能用假数据填补服务缺失后称1:1。
详情的 `requires_api_key` 只证实显示标记;本次未查证存在通用的“所有技能API Key配置表单/秘密注入协议”。不能把原模型provider的密钥界面直接挪过来当技能授权实现。商品license、组织可见性、执行所需第三方credential、模型调用开关要分别建模。
## 数据、宿主接口和运行链
```mermaid
flowchart LR
Market[市场与详情] --> Catalog[目录与商品权益 facade]
Import[本地导入] --> Check[宿主预检查与扫描]
Check --> Install[真实安装与文件管理]
Install --> Installed[已安装 store 与刷新事件]
Installed --> Picker[输入技能与 slash provider]
Picker --> Link[skill URI 与结构化元信息]
Link --> Session[会话 transport 与可用命令]
Session --> Kernel[实际加载技能的运行内核]
Kernel --> Render[Skill 工具与结果渲染]
Catalog --> Market
Catalog --> Installed
```
**主要数据身份**需要保留 name/displayName/description及多语言、filePath/ref、skillId/slug/canonicalName/cloudUid、source/marketplaceSource/assetType、version/local/cloudVersion、installedAt、userModified、disable/disableModelInvocation/userInvocable、marketInstall presence、icon、requires_api_key、风险结果和付费pricing。不能用name作为所有跨源/跨空间主键:原版有strong identity匹配、来源过滤、cloud-only placeholder、别名和唯一名称fallback。
1. **个人技能 facade**:H offset8654的methodMap明确映射 `list→skillList`、`toggle→skillToggle`、`batchToggle→skillBatchToggle`、`delete→skillDelete`、`getContent→skillContent`、`importFromPath→skillImport`、`installByPath→skillInstallByPath`、`installFromUrl→skillInstallFromUrl`、`querySecurityScan→skillQueryScanResult`、`exportZip→skillExportZip`,另有Buddy技能桶ensure/remove/prune/meta/update。调用参数包含source、folderPath/filePath、cwd/global、excludePluginSkills、securityCheck/appKey/securityVerdict、overrideKeys。不是 renderer 直接读写目录。
2. **市场 facade**:H `createSkillsMarketplaceProxy` offset10086,分 builtin/skillhub/knot/local/marketInstallConfig,各自list/install/categories/detail/search/installedMetas;builtin还有getByIds/getLayout/backfill,knot有tags,marketInstallConfig有ensureLocal/setEnabled/batchSetEnabled/uninstall。企业技能另一个facade。调用点有模板/集合/类别、page/pageSize、enterpriseId、needPayAssets等真实条件。
3. **详情读取**:X `DetailService.loadMarkdown`3683897按source调用personal getContent或市场detail/content;读取取消与选中项竞态有独立处理。H `getBuiltinSkillRoot`458143、`readBuiltinSkillFile`458531调用daemon的明确能力并缓存。renderer导出不能证明底层安装器怎样解析所有辅助文件或执行脚本。
4. **扫描来源**:`skillQueryScanResult`是真宿主判定。X异步扫描按md5去重;初始5秒,×1.5退避最多15秒,总等待120秒,连续fatal unavailable到3次归error;关闭/移除task取消timer。产品配置提供 `skillSecurityAppKey`,另有high-risk install policy读取和变更订阅。实现UI、缓存、轮询可以源码恢复;真实病毒/安全结论依赖对应扫描服务,绝不能把本地“未发现问题”假装成原扫描结果。
5. **权益来源**:I `fetchEntitlementViews`4582向 `/v2/operation-platform/market/skill/get-by-ids`,按100个skill IDs分块;`pay_detail`归一金额分→元,monthly/permanent、latestPaidAt、expiry/refundable/orderId。`market-skills-cache:installed-entitlement`与registry/version更新触发可见性刷新。D购买/续费跳 `/open-pay/skill?assetId=...`,支付成功回调后install或刷新,退款后联动registry;这里只恢复客户状态,不能制造有效商品权益。
6. **已安装缓存和隔离**:X `SkillsInstalledStore`2318706有scope、query、version/ifVersion、TTL默认5分钟、hydrate、inflight复用、invalidate期间拒绝旧写、监听和持久化最多5个query。`useWbSkillProvider`的scope含transport、user/enterprise、cwd、Buddy application/scene/resourceSnapshot。置顶由user storage串行写并迁移legacy key;最近项还有跨Buddy快照/文件路径验证。N local memory开关使用 `CODEBUDDY_LOCAL_SKILLS_MEMORY_ENABLED`,默认true并广播变更;此键本身不能证明完整技能学习算法。
7. **手动调用不等于模型自动调用**:X `isUserInvocableSkill`2305518与 `isSkillModelInvocationDisabled`3716422分开;toggle显示的是 `disableModelInvocation`,并保留 `disable:false`。复刻时不能简单从输入列表删掉所有被关闭自动调用的技能。
8. **引用和实际加载**:X `buildSkillBlock`1667403产生 `skill://<skillId或name>` resource_link,附 type/mentionType=skill、displayText、skillId、可选autoAttached。`parseSkillBlock`4345867;Genie分支 `skillBlockToGenieMarker`4346116有专有 `<supplementary>--intergration ...</supplementary>`,不是所有transport通用文本。H `getAvailableCommands`508810合并产品配置命令、插件命令、workspace projectCommandsList,并使项目同名命令覆盖。X `waitForLocalSkillRuntimeReady`4525570在下载后按session/cwd查询真实命令,200ms开始、倍增最多1秒、默认超时10秒,响应aborted/timeout;只有下载成功不等于会话加载成功。
9. **工具结果与内核边界**:X `SkillToolAdapter`5311343、`SkillRenderer`5311825把真实Skill工具调用展示为技能加载;这是渲染器,不是加载器。实际prompt拼接、SKILL.md/辅助文件读取、权限/脚本执行、内核reload和沙箱行为在daemon/agent一侧,本次renderer证据尚不足以证明全部实现。YCode的 OMP 内核选择需实测是否支持同等显式技能输入、项目/用户优先级、热更新、禁用和工具事件,不能凭模型回复“用了技能”验收。
## 与YCode当前基线的差距
只读搜索 `src`:已有技能相关源词典、输入placeholder/context usage标签、历史 `Skill→use_skill` alias;未发现生产技能目录管理facade、安装/扫描/权益服务或技能市场组件。现有自定义模型、workspace、聊天和通用工具并不自动补齐这些能力。OMP可能有独立原生技能机制,需要核对实际已有RPC/CLI能力,而不是由这些UI词条推断已经接入。
推荐由主上下文按以下九个有界包推进;这是建议顺序,不是在本次评估中修改架构或默认授权安装。
| 包 | 边界与交付 | 验收条件/前置 |
| --- | --- | --- |
| S0 领域与宿主契约 | 独立shared skill domain、main registry/service、preload/API、renderer adapter;身份/source/presence/调用开关/扫描/权益明确区分 | 用自有fixture验证schema、cwd/用户/空间隔离、状态不串;主上下文确定OMP加载能力与存储根 |
| S1 市场与已安装UI外壳 | 有限恢复M的顶部、分类、网格/卡片、骨架、错误/空态、installed和批量UI;保持共享专家/技能/连接器导航 | 固定REA同viewport/state的DOM属性、字体、几何、SVG与截图;真实数据adapter unavailable必须如实error/empty |
| S2 详情 | 恢复D的header/overview/搜索/语言/示例/metrics/菜单/开关与路由返回;复用已有markdown渲染和SourceSelect/Popover等源组件 | 本地和多source详情;长文、搜索命中、loading/race、Esc返回;无源动作不得伪成功 |
| S3 本地导入和管理 | 真实文件夹/zip/SKILL.md元数据、冲突/更新/用户修改确认、启停/删除/export、原子提交/失败回滚;不要与渲染器直接FS耦合 | 独立userData和自有目录fixture;取消无安装、失败无残留、重启保留、跨空间隔离、真实文件读回;具体路径/zip规则先补daemon证据 |
| S4 输入与slash | +技能picker、搜索、置顶/最近、按账户/transport/cwd过滤、结构化skill block、手动与自动调用分离 | 选择引用真正进入发送上下文;切换任务/空间不串;键盘、source过滤、recent排序与实体缺失状态均实测 |
| S5 内核执行 | 对接OMP实际技能发现/显式加载/热更新与工具事件;fallback如需有独立可信实现,不能只拼提示词 | 用自有无副作用SKILL.md和受控模型验证其内容/辅助文件确实参与、只有允许的workspace、启停生效、取消、真实Skill事件及结果;与原运行链另对标 |
| S6 扫描和安装策略 | 恢复原扫描UI/state/轮询/风险地图;接真实扫描backend和策略(如无等价backend,明确 unavailable) | safe/risk/black/suspicious/pending/error/timeout、取消与后台通知;不允许mock结论冒充产品扫描 |
| S7 远程目录、升级与云同步 | 真实目录provider接口,collection/search/detail/install版本关系、企业过滤、cloud-only下载、上传配额/覆盖/失败重试/可选云删除 | 服务授权/资源可用后以真实受控资源验证;禁止硬编码原账号目录或静态下载数冒充在线目录 |
| S8 付费/授权与全状态验收 | 商品/权益真实adapter、已购/过期/续费/退款UI和可见性;最终整链same-state像素/动效回归 | 原商品服务不可复刻为本地假购买;先用明确测试权益验证UI,再在授权可用服务上验流程;完整对标之后才能宣称整个技能部分1:1 |
S1/S2可在S0最小只读接口确定后先推进;S3与S5是真正“技能能用”的本地闭环。S6/S7/S8不是因为本次不安装/购买就从最终目标删掉,而是证据、服务和后续操作范围独立。
## 具体未知与需补的REA证据
- **原版全部状态像素**:目前有V市场、VI稳定installed及VA部分有效的add dropdown帧;仍需import dialog、详情、不同tab/分类/搜索/空错态、窄窗/暗色与动效。静态源码可分析未出现分支,不能把它写为已实际交互验收。
- **installer/daemon实现**:精确安装根、优先级、zip路径规范/链接/大小限制、原子覆盖、manifest/辅助文件、watcher/reload。需要后续REA定位daemon/主进程对应实现或授权自有测试技能的行为取证;本次不直接读取原技能文件夹或执行安装来补结论。
- **扫描等价性**:appKey/服务器判定、病毒引擎/命中与认证、离线/组织策略;客户端poll源码不能还原服务判定。
- **云目录/组织/商品**:真实各source API response/schema/签名下载URL、动态tab、visibility、账户权益、license、支付/退款。客户端facade明确但成功服务未被本任务调用验证。
- **模型调用/内核**:显式技能block在各transport转换、daemon技能tool的加载内容、被禁用后的手动使用、不同session版本同步;原helper等待runtime-ready和实际WorkBuddyAdapter命令合并之间的完整能力链尚需进一步确认。
- **资源**:纯功能SVG可从模块恢复;目录头像、示例图/视频和README内资源需经REA显式资源取证,不能绕过REA直接下载或假造。
## 查证与交接
`node scripts/audit-skills-reference.mjs` **PASS**:R339脚本全SHA、S根身份及两个选中文件SHA、L329加载脚本全SHA、选用CSS SHA、V/VI/VA三张PNG SHA一致;实际市场JS在S/L一致。解析不执行原脚本,生成有限函数/class/host method与完整M/D可读审查副本。V/VA整体failed已保留在报告中,没有改成passed。没有生产变更,故不为这次评估运行生产build或声称技能业务测试通过。
产物:本文件、`scripts/audit-skills-reference.mjs`、`.tmp/skills-audit-20261016/report.json`、`.tmp/rea-skills-market-selected-20261016.json`。下一步由主上下文选择有界实施包,并保持“源码已恢复、真实宿主已接、真实功能已验、同状态像素已验”四种结论分别记录。