# Changelog 本项目所有值得注意的变更都会记录在此文件。 格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), 版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。 ## [Unreleased] ### Change - **修掉「目录里的方向明明有模型,页面还说没有」**。用户报:目标岗位那几个是不是都有能力模型了, 怎么还提示「还没有能力模型,可以让 AI 生成一份」。原因不是漏改一处 —— `status` 在 `ROLE_CHOICES` 里**又手写了一份**,补模型时只改了 `ROLES`,目录那份还停在 `building` / `beta`。 现在目录里的 `status` 由 `ROLES` **推出来**(有模型 → `preset`,没有 → `building`),一件事只有 一个真相源,自检加了一条断言守着这个规则。同族的两处一起收拾:① 自己填的方向原来**硬写** `beta` 的说明,于是 AI 已经把模型建好、自评都能逐项打分了,那一屏还在说没有模型 —— 改成读 `activeRoleSource`;② `preset` 的说明补上「锚点随版本发布,**未经行业校准**」——「有模型」和 「模型被校准过」是两件事,随版本发布的那 11 份模型自己的 `status` 都是 `draft`,不说出来, 由它推出来的每个分数都会显得权威。**数据侧**:自己填的方向落库的档位由 `beta` 改成 `building` (旧数据里的 `beta` 仍读得懂,`ROLE_STATUS` 留着那一档就是为它) - **段位显示收成一处**:去掉路径带下面那条七段阶梯(和阶段卡、和总目标右上重复了);阶段卡上的段位 牌子**一律按各自段位渲染出颜色**(「这一段该拿什么牌」),不再走「达成才填色」;**当前段位只由 总目标右上那一枚承担**,而「这一段走到哪了」由旁边那枚印章(已走完 / 进行中 / 未开始)承担。 三条信息各归一处,不再互相暗示 - **修掉选中态「边框消失」**:`buttonOn` 是珊瑚实底,而它的边框也是珊瑚色 —— 边和底同色就等于没有 边,用户读到的不是「选中了」而是「点击之后边框消失了」。改成**更深的珊瑚边**,改在令牌上一次 生效,岗位 / 路线 / 选项 / 自评组页签 / 1-5 分按钮五处一起修好 - **总目标卡右上角放当前段位图标,起点是「木牌」**。木牌**不在 `RANKS` 里** —— 七段是与阶段等距 对应的,而木牌是「一段都还没走完」的样子:计划刚开始时你手里就是这块牌子,走完一个阶段换成 黄铜,之后依次升。它摆在层标那一行的最右(珊瑚短线仍跟着「总目标」走,所以 `subhead` 类挂在 内层 span 上,不挂在这一行)。一眼看得到「现在手里是什么牌子、该往哪换」 - **修掉右侧窄栏里被拉成通栏大框的印章**。右栏的卡片是**列**弹性容器,印章又是它的**直接子元素** —— 交叉轴上被拉伸,两枚章(「连续 N 天」与「已完成」)都成了横跨整条窄栏的大方框。左栏没这个问题, 因为那里的印章都在**行**容器里。现在各自包进一行。**发现路径**:右栏一直不在我的截图导出里 (它是另一个座位 `sidebar.right.pane.tab`,不在 Panel 的四页里),所以我一次都没见过它 —— 把右栏也加进导出并自己看过之后才发现的 - **新增三个方向:FDE工程师 / AI测试 / AI交付工程师**,并且它们**一进目录就带着能力模型** —— 不必先让 AI 生成才能逐项自评。三份模型与数据运营同一形状(2 组、各 5 项、权重合计 100、每项 三条 1/3/5 锚点),过的是**同一个**校验器。目录里的状态是 `preset`(有模型就能逐项自评), 而模型自己的 `status` 是 `draft` —— **随版本发布、但不是行业校准过的草稿**,这个区分得活着, 否则由它推出来的每个分数都会显得权威。 **其余七个方向(产品运营 / 用户运营 / Agent 应用开发 / AI产品经理 / 数据分析·商业分析 / 互联网运营·增长 / 全栈工程师)也已补上模型** —— 同一天稍后写的,同样是 `draft`。至此目录里 11 个方向都能直接逐项自评,不必再等 AI 生成 - **右侧「今日」窄栏改用和左侧同一套语言**。它原本是另一套:自己画的两个小方盒(「计划完成 / 连续打卡」)、 自己的字号、自己配的绿色(`#3f9b63` / `#edf6ef` / `#c8dfcc`)、以及一个**原生 checkbox**。现在指标 变成同一套读数(等宽大数字 + 大写间距小标签)+ 一枚「连续 N 天」印章,勾选框换成与左侧相同的 **可填色按钮 + 白勾 + 完成落章**(原生 checkbox 既不能填色也不能盖章,而那一下正是最要紧的反馈), 绿色统一走全站的 `--gw-teal`。自检加了一条断言守着这五件事 - **考核页加一张「考核目录」:阶段 → 节点(阶段里的周),每个节点标出它的考核状态**。这张表回答的是 「什么时候该考核」—— 原先只能从主角区那句话里猜。四种状态全部由已有数据算出来,不另存: **已考**(那一周里有过任一轮考核,轮次带 `day`,落在周的区间里)· **待完成**(正走在这一周)· **待补考**(那一周已经过去却没留下记录)· **未解锁**(还没走到那一段)。阶段自己那一行看的是 **全量轮**(阶段大考),节点看任意轮(小考)—— 大小考的尺子本来就不同。每段的段位章也跟着状态 填色或留空 - **趋势卡的两个概念分开说**:「能力曲线点 N 个」原先和四维图并排,容易被读成同一件事 —— 前者是**能力项**的逐项读数,后者是四维分。现在计数行只说轮次,曲线点挪到下面那句里并写明它是 逐项读数 - **计划每个阶段一枚段位章,七段摆成一条阶梯**:黄铜 → 白银 → 黄金 → 铂金 → 钻石 → 超凡大师 → 王者。 阶段与段位**等距对应**(`rankIndexForPhase`):四个阶段就是 黄铜 / 黄金 / 钻石 / 王者 —— 收在最高 一段,阶梯才是向上的,而且阶段数变了不用改表。段位章是**手画的 SVG 盾牌**(本仓库没有 `dependencies`,图标库引不进来,而这形状很简单):达成的填色、没达成的只留描边,都带名字。 阶段卡上摆在这一步的**最前面**(一眼看到「做完这个阶段能拿到什么」),达成看的是「这个阶段有没有 走完」—— 当前那段没走完,所以它是空心的。总目标卡里再摆**一条完整阶梯**(七个都在):阶段卡上 那一枚是局部读数,这条回答「还差几段」。不摆的话四个阶段只会用到七段里的四段,白银 / 铂金 / 超凡大师永远不会出现。七种颜色是有意压过饱和度的:这条阶梯要有七色才分得出,但它得落在纸底上 - **三处状态文案不再撒谎**(都是从无头浏览器截图里看出来的): ① **计划没开始时不再显示「第 1 天」**。原先四处 `Math.max(1, day)` 会把「还没开始」夹成 「第 1 天」—— 而那是用户在这一页上读到的第一个数字。现在统一走 `dayInfo()`:没开始就写 「N 天后开始」,页头章、读数条、考卷刊头、右侧窄栏四处一致。自检加了一条 `doesNotMatch` 把「不许再夹」钉住,它当场就抓出我漏改的第四处。 ② **今日页的空状态说清原因**。原先指标卡与任务卡各说一遍「今天没有排到天的任务」,而且都没 解释为什么。现在只留一处,并按三种原因给不同的话:还没有计划 / 计划目前只排到周(让 AI 细化 到天)/ 计划里的任务都做完了(该做一次考核)。 ③ **考卷的档位与「这次考的是哪个」对上**。阶段大考针对的是**已走完的那个阶段**,通常不是当前 阶段,而信息栏原先一律写当前阶段。现在由那条阶梯给出 `nextAction.scope`(阶段大考给阶段号与 名字,节点小考给周次),页面直接用 —— 规则只判一次 - **修掉一个会写错数据的日期 bug:`today()` 取的是 UTC 日期**。`new Date().toISOString().slice(0, 10)` 返回的是 UTC 的那一天 —— 对东八区用户,每天 00:00–08:00 这八小时里插件都以为今天是昨天: **凌晨打的卡会记到前一天,连续打卡跟着错**,「今天要做」在那八小时里给的是昨天的任务,考核轮的 日期也整体偏一天。现在按本地年月日拼出来(仍是补零的 ISO 形状)。自检加了一条只读源码的断言: `today()` 里不许再出现 `toISOString`。**发现路径**:无头 Chrome 截图里考卷刊头写着 `2026-09-26`, 而那天已经是 9-27 —— 一个只靠读代码很难注意到的偏移 - **修掉画像页最显眼的一处:确认按钮飘在卡片外**。展开某一步时,表单自带一张卡,而「确认目标岗位, 继续 →」落在**卡外面**右对齐 —— 看着像个孤儿,也不像属于这一步。现在展开态是**一张**卡(标题、 表单、确认按钮都在里面),五个表单的根(四个 `data-anchor` + ⑤ 没有模型时的分支)都从 `S.card` 改成普通列。自检加了一条断言:谁把 `S.card` 加回表单根上,它会响 - **把原型里定下的东西在已有卡片上补齐**(上一轮只落了「新件」,已有那些块还是旧样子): 今日任务行的标识改成独立的珊瑚小签、动作独立成句(原先「T5(2.1)列出这个功能的…」挤在一行, 第一眼落在编号上而不是要做的事上);证据档位从下拉框改成四格分段控件(三档里选一个,本来就该 看见全部选项,还少一次点击);考核自查 16 题改成可折叠(扫一遍标题就知道会被问什么,展开才看到 它属于哪个阶段、考哪一项能力);四个阶段各加一枚状态章(已走完 / 进行中 / 未开始,取自现成的 `metrics.phaseIndex`,计划没开始时整列都是「未开始」);自评加组内进度条。 **顺带修掉一个真 bug**:作品集清单读的是 `item.phase` 与 `item.item` —— 两个字段在数据里根本 不存在,于是四项全都渲染成「(这一项缺说明)」。真实字段是 `name` / `description` / `minimumVersion` / `capability`,现在按卡片网格显示。窄栏里那个档位下拉框保留不动 —— 那儿只有 三百多像素,四格分段会挤成一团 - **考卷分两档:节点小考(定向)与阶段大考(全量)**。两档共用同一个出题函数,**只差排序依据**: 小考按加权缺口(差得多的先考),大考按**高权重项**(阶段大考评的本来就是完整的高权重项集 —— 两档拆成两套实现迟早会分叉)。按真实数据,小考池是 Q2/Q6/Q8/Q10/Q12/Q16,大考池是 Q1/Q2/Q3/Q5–Q11,两档排出的是不同的卷子。**档位不自己判**:页面上那条「该考什么」的阶梯 (`nextActionFor`)已经判过了,页面直接取它给出的 id;卷面顶部有两个可切的档位章,切档时「第几组」 归零(池子换了,原来的窗口号没有意义)。交卷文案里写明本次是「节点小考,coverage 请用定向」还是 「阶段大考,coverage 请用全量」,并把这条约定同时写进工具描述 —— 模型不必自己猜,而猜错的代价是 曲线点该画的不画、不该画的画上(`canonicalReview` 里 `定向` 的曲线点本来就不画线,这是模型定的规矩) - **考核有节奏了:节点小考 + 阶段大考,并修掉那句误报**。此前只有一条判据 ——「计划任务全做完」, 而它是「找不到未完成的任务」:**一道任务都没有时同样找不到**,于是空计划也会被告知「当前计划任务 已完成,做一次考核把成果沉淀下来」。现在判据来自你的真实计划结构(13 个**节点** = 阶段里的周, 每个都带自己的验收标准;4 个**阶段** = 各有交割物),依次三档:某阶段已走完却没有**全量**考核 → 大考;有未完成的任务 → 做任务;本周还没有任何一轮 → **节点小考**;都不成立就返回 `null`(计划还 没开始时正是这一档),页头横幅随之消失 —— 页面认「没有下一步」这种状态,而不是硬编一句给你 - **考核页换成一张杂志版考卷**:点进这一页就有卷子,当场作答,交卷把答案送进当前对话由 AI 打分。 题目不是新数据 —— `plan.selfCheck` 里 16 道自查题每题都挂着能力项编号,考卷按 `metrics.priorities` (加权缺口)取前几项、各自找到挂它的那道题。**没有题的项必须跳过**:自查题覆盖 A1/A2/A3/A5、 B1–B4、C1–C4、D1–D4,而 **A4、B5、B6 没有题** —— 不跳过的话「缺口第 4 位的 A4」会让考卷 静默地少出一道。按你的真实数据抽出来正是 A2/Q2、B2/Q6、B4/Q8 —— 与那次对话里 AI 说的 「重点考察需求拆解、提示词设计、AI质量与安全」对得上。「换一张考卷」是顺次换窗(缺口第 1–3 位 → 第 4–6 位 → 缺口榜走完后接上其余自查题),换回去时草稿还在。版面按杂志来:刊头双线 + 衬线 题号 + 右侧能力项章 + 一行「为什么抽这道」(当前自评 X 分 · 缺口 Y · 权重 Z)+ 虚线作答区。 **打分仍然归 Agent** —— 页面没有评分标准,它只负责收卷并把答案交出去(走已有的「当前对话里的 普通用户回合」通道,不是隐藏的后台 Agent),交卷文案里一并交代了 `growth_save_assessment` 这个收尾动作。考核历史每轮加一枚等级章(优/良 青绿、及格 琥珀、需努力 珊瑚),自评轮没有等级, 不硬盖。已知短板照实写在卷面上:**草稿只在页面上,刷新会丢** - **计划页长出层次:总目标 → 路径 → 能力块**。原来那张卡是一句大字 + 一行灰字说明,信息不分层。 现在:总目标作为**一整句**衬线大字(不去拆它 —— 它是 Agent 写的自由文本,拆它就得猜标点,而 「可面试」这类词只属于某一个方向),下面依次是身份标签(方向 / 路线 / 每天 / 截止,用灰章,不跟 珊瑚色抢)、**路径带**(四个阶段连成一条线,已走完的点填青绿、当前那点填珊瑚并标「你在这」; 状态取自现成的 `metrics.phaseIndex`,不另存状态)、**四块能力**(字母章 + 名称 + 权重 + 自评 进度条 + n/m,当前那组标红;没有能力模型时这一段不出现,而不是显示空壳)。这是「目标里说要 补齐的」落到可度量的地方 - **完成的反馈要看得见(手账那一层落地)**:新增 `Seal`(印章)与 `Readout`(等宽大数字读数)两个 组件。指标卡从一行同重的灰字改成读数条 —— `第几天 / 完成 / 本周完成率 / 距达标线` 四个等宽大数字 配小写间距标签,右侧一枚「连续 N 天」印章。任务行的勾选框换成可填色的按钮(原生 `` 既不能填色也不能盖章),完成时落一枚「已完成」印章并带「盖上去」的动画; 当天全部做完,卡头再落一枚「已全部完成」。印章**只在完成时挂载** —— 挂载才跑动画,所以取消再勾 会重来一次;`prefers-reduced-motion` 下动画整个关掉。契约不变:点击切换、状态走 `aria-checked`、 整行仍是触控目标 - **顺带修掉一处单位错误:`gap` 是加权缺口的比例,原页面却印成「离达标线还差 0.21 分」** —— 那是把 比例当分数。模型里断言的就是 `180/1300` 这种值,所以现在两处(指标卡与自评)都印成「距达标线 21%」 - **视觉系统整体重做:编辑杂志风**(字阶、深度、配色用法)。同一份数据、同一套组件,只换外观: 标题阶拉开(页头 40px 衬线 / 卡片 23px / 分组 17px,一屏只有一个主角),卡片去掉 1px 边框改用 两层极淡投影 + 更大留白(26/28px,圆角 20),灰色降饱和并新增 `--gw-muted-2` 给标签层,新增 青绿 / 琥珀 / 中性灰三个语义色(只在图表与证据档位里用,不新增视觉噪音)。正文栏从 1060px 收到 900px。**顺带补上一个一直缺的东西:按钮和输入框的 hover / focus 反馈** —— 它们没有共同的 class, 所以给页面根挂 `.gw-root` 并把规则作用域化(无作用域的元素选择器会改到宿主应用自己的按钮,那是 本插件一直避免的)。选中的页签改成珊瑚下划线、间距从 6px 拉到 30px - **「计划」页加了执行趋势图**:每周完成率的柱状图,落在总目标那张卡下面 —— 计划页原先只回答 「我打算做什么」,这一半补的是「我实际做得怎样」。数据来自新加的 `metrics.weekRates`(`api.mjs` 按 `model.weekRate` 逐周算好,**只到本周为止**:未来周画上去就是一排 0%,那不是「执行得差」, 是「还没到」)。用柱子而不是折线 —— 每周完成率是离散测量,柱子更准,而且**那一周没排到天的 任务时不画柱子**,缺口得以如实表达,不必把折线断开;0% 仍留一条细柱,因为「排了任务但一项 没做」与「这周没排任务」是两件事,画成一样就等于把缺数据说成了没做完。自检加了一条交叉断言: 最后一根柱子必须与 `metrics.weekRate` 是同一个值 —— 同一个读数不能有两个来源 - **考核页的趋势加了一张四维折线图**:手写 SVG —— 本仓库没有 `dependencies`,图表库根本加不进来。 一条网格、四条线(完成率 / 证据质量 / 作品达标度 / 知识考核,各 0-25)、每轮一个点(悬停给出该轮的 日期与分数),图例把「最新」读数直接标在维度名后面。x 轴用轮次序号而不是日期:同一天可以有两轮, 按日期画会叠在一起;日期标在轴下,轮次多了自动抽稀。**自评轮不进图** —— 它读的是缺口,与这里的 得分量纲不同,混在一张图里会让人以为它们可比。没有考核轮时不出图,只有一轮时明说「再有一次考核, 这些点才连得成线」 - **考核页的「手工登记一次考核成绩」卡片删除**:四维打分是 Agent 的事(`growth_save_assessment`), 页面只读 `history` 与 `curve` —— 这张卡让页面成了第二个打分入口,与这条分工相抵触。它唯一正当的 用途是「AI 没把这一轮落盘时补个分数」,而那个场景已由上面那条收尾契约堵上。删掉它还顺带消掉一个 坑:它原先四维输入初值就是 0、`登记` 也没有 `disabled`,而 `canonicalReview` 只做 0-25 的范围 检查 —— 没看清点一下,就往**只追加**的考核历史里钉进一轮「总分 0(需努力)」,趋势跳崖,页面上 还撤不回来 - **考核的收尾契约补上了 —— 这是「考核内容没同步回考核页」的真正原因**:考核内容只在 `growth_save_assessment` 落盘之后才会出现在页面上,问答本身不逐步落盘(逐题记录写在那一轮的 `report` 里,页面再把 `report` 摊开)。但原先**没有任何一句话告诉过模型「考完必须落盘」**:工具 描述只说了它干什么、怎么打分;`model.mjs` 里底盘有 `TRANSFERABLE_NOTE.proposePrompt`、计划有 自己的提示,唯独考核没有对应的提示。于是模型在对话里一路问下去,页面永远空着。现在契约写在两处: `growth_save_assessment` 描述的开头(工具描述常驻上下文,最靠得住)与计划简报的「考核自查」段。 考核按钮的提示也改说清楚:考核在你的对话里一问一答,**答完才写回**这一页 - **画像四步展开后能点回收起**:展开态原先只有表单和确认按钮,没有任何可点的标题 —— 撑开就收不回去。 现在标题行本身就是开关(右边从「编辑」变成「收起」,整行可点,悬停时亮起来)。点表单正文不会收: 正在填的东西被一次误点折回去,比多点一次「收起」糟得多 - **计划第 1 天的「保存」不再是一个点了没反应的按钮**:日期与库里的值一致时,那次写是空操作,页面上 什么都不变。现在按钮状态从「草稿 vs 库里的值」推出来 —— 一致时显示「已保存」且不可点,改动了才是 可点的「保存」,保存中显示「保存中…」。成功与否由刷新后的 `planStart` 决定,不靠点击记账 - **④ 补上「重新生成候选」按钮**:与 ⑤ 的「重新生成模型」对称 —— 反复发生的动作,所以不带 `done`, 冷却后再可用。原来 ④ 只有「确认『你的条件』时自动生成」这一条路和对话里说一句,页面上没有入口 - **深链现在会自动展开对应那一步**:`nextAction` 指向画像里某一步时,原来只切页签并尝试滚动 —— 而折叠状态下那个锚点不在 DOM 里,滚动直接扑空。现在 Panel 把目标锚点传给 `ProfileFlow`,先展开 对应步骤(route 与 background 都落在 ② 里),再把滚动延后到 160ms 等它渲染完 - **计划页的任务表从 10 列改成每个任务四行**:十个字列排下来每列只剩一百来像素,而「一句话动作 / 完成标准 / 可接受证据」三列装的是整句话 —— `overflowX: auto` 让它技术上合规,但读一个句子要 横向滚。现在每个任务是:标识(珊瑚小签)+ 动作一行;元数据一行小字(引用 / 第几天 / 能力项 / 预计 / 最低版本 / 依赖);完成标准、可接受证据各一行。随着表格消失,`S.table`/`S.th`/`S.td` 三个样式令牌也删了 - **「本读数不含 X 组,和上一轮比时留意口径不同」改成说人话,而且只在真有上一轮时才提对比**: 原句想说的是「缺口只把已打分的组的权重放进分母」,但「本读数」「口径」是内部术语;更要紧的是 **用户还没有上一轮的时候,它也在说「和上一轮比」** —— 那是一句他无法执行的建议。现在拆成两句: 先说口径(「缺口只按已打分的组算:A、B 组还没打分」),只在 `state.history` 超过一轮时才补一句 「不好直接比」d - **⑤ 能力自评改为四组页签,并且先给标准再给选项**:原来 19 项排成一列,「还剩多少」看不见; 而且分数在上面一行、1/3/5 原文在下面一行 —— 要先把分选完,再回头对标准。现在:A/B/C/D 是 四个页签(标签上带 `3/5` 进度),组内每项**先列 1/3/5 三条标准**(选中的那一档高亮),下面 才是打分按钮;一组答满自动切到下一组。打开时落在第一个还没答完的组,而不是永远第一组 - **`anchorText` 删掉**:原先把三条锚点拼成一行,现在内联渲染才能做逐档高亮。自检里那条回归 断言随即抓到了这件事(「定义好了却没人调用」),改写成新契约:锚点来自 `item.anchors`, 且 `anchorText` 不许复活 - **自评不再有自己的「提交自评」按钮**:改由 ④ 的「确认能力自评」提交(先落盘再折叠),按钮文案 带上进度 —— `确认能力自评(已确认 7 / 19 项)`。草稿上提到 `ProfileFlow`,与 ①② 同一套处理。 保存失败不会丢草稿:同步只在 `selfAssessment.date` 变化时触发,而失败的保存不改日期。⑤ 里 只留「离达标线还差 X 分」的读数,它是上一次已提交自评的结果,不是这份草稿的 - **「不知道」改为「拿不准」**:原来的词能被读成「我不知道怎么做」= 我不会,而它实际的意思是 「这一项我判断不了」。差别是实质的 —— 把它当低分点,这一项反而会从加权缺口的分母里消失, 把真实缺口藏起来。产品文档里本来就把它与「没做到」并列。现在标签是「拿不准」,悬停写明 「1/3/5 之间拿不准,或者对这一项不熟悉 —— 两种情况都算」;提示语也直说后果(不进缺口计算、 不会被当成 0 分、随时可以回来补) - **整体字号上调一档,触控目标补到 44px**:全文件原来有 24 处 12px、14 处 13px —— 用户要读的 锚点、摘要、说明都挤在 11-12px。现在 10→11、11→12、12→13、13→14、段落标题 14→16,内边距 同步放宽(否则字变大反而更挤)。另外 `S.button` 的 `minHeight` 从 40px 提到 44px —— `CLAUDE.md` 里定了「触控目标至少 44px」,而它一直没达标 - **能力自评不再被跳过**:能力模型建好后,画像页原来会直接显示「画像齐了,下一步是 90 天计划」, 而自评那一步折叠着、看着无事可做。现在:模型就绪且还没打过分时 ⑤ 自动展开;生成计划的 交接卡改为等自评做完再出现 —— 缺口与补强优先级是打分产出的,而它们决定计划该补哪几项能力 ### Fixed - **生成计划进行中时,计划页仍显示「还没有计划 / 让 AI 生成计划」**:生成计划有两个入口(画像 底部的交接卡、计划页空状态),而 `AskButton` 的「已发送」状态是**每个实例各自的** —— 在画像页 点击的那个,计划页那个实例根本不知道。现在两处都按全局 activity 显示:标题变「AI 正在生成 计划」、按钮变「AI 正在生成计划…」、说明改成「在画像页触发的生成还在跑 —— 完成后这一页会 自动出现计划」。教训:一个动作有多个入口时,「进行中」必须从全局状态推导 - **考核页历史卡片上的 `gap 2.31,已确认 7 项` 改成人话**:`gap` 是内部行话,与 ⑤ 里改掉的那处 同一类,只是漏了这里。现在是「离达标线还差 2.31 分 · 已评 7 项」 - **计划页作品集的兜底不再打印原始 JSON**:`item.item` 缺失时原来会 `JSON.stringify(item)` —— 把内部结构直接给用户看。现在是「(这一项缺说明)」 - **计划页空状态的提示跟着真实状态走**:四项都做完之后,它还写着「完成「画像」里的四项,就能 让 AI 写计划了」;现在齐了会说「画像四项已经齐了 —— 点下面的按钮生成」 - **⑤ 能力自评在有模型时渲染为空**:那一行调用的 `anchorText` **从来就没有定义过** —— 展开 ⑤ 时第一项就抛 `ReferenceError`,整步什么都渲染不出来。这个缺陷在发布出去的那版里就有: `node --check` 与自检都发现不了它,只有真的渲染才会暴露。现在补上定义(把该能力项的 1/3/5 锚点渲染成一行),并加了一条回归断言钉住「有定义、且确实被调用」 - **折叠卡片的标题不可见**:折叠行渲染成 `