人生台账 Skill
版本
v1.7.0
功能描述
将用户的定义生活 Excel 文件自动转化为标准人生台账工作簿,并生成便携式 HTML 深度复盘报告(10 张交互图表,离线可用),可按需部署为可分享链接(需用户确认)。
图表叙事逻辑
第一张图表是盈余累积曲线。这就好比经营企业,老板最关心的就是到底是赚了还是亏了。所以我们把它放在第一位。
第二张图表是基本指标折线图。知道了盈亏之后,再从时间的角度看看,这盈亏是怎么来的,哪天赚的多,哪天亏的多?
第三张图表是积分占比图。知道哪天赚的多哪天亏的少之后,我们再从贡献度看看,哪个板块为得分贡献最大,哪个贡献最小。
第四张图表是24h分布图。从一天24小时的维度看看,我们在哪个时段状态好,挣分多,哪个时段状态差,挣分少,有助于你提炼作息和行为规律。
第五张图表是行为热力图。从一个月31*24小时的维度观察,更精细的反映你的作息和行为规律,并能帮助你排查波动,定位异常,深挖细分差异。
热力图交互约定(v1.7.0):
- X 轴为 24 小时(6h 起排列,每 2 小时标注一次),不显示「上午/下午/晚上/凌晨」等时段分区标签——小时数字本身已足够。
- Y 轴日期标签中,周末自动标橙加粗(颜色来自「月基本指标」里的真实日期 weekday(),每月随数据重算,无需手工维护)。
- 鼠标悬浮:弹信息浮窗 + 十字准星(悬停行/列各画两条 1px 浅灰 #8C99A8 细线,行线延伸到日期标签左侧、列线延伸到小时标签下方),并把对应的日期/小时轴标签加粗加深。不填充底色、不用彩色描边——横向看"这一天24小时",纵向看"同一时段跨整月"。
(曾用 1.5px 蓝色描边框住整行,因视觉噪音过大且把注意力从当前格子拉散,已废弃。)
第六张图表是活动积分排名。当全面了解了你这个月的盈亏、一天不同时段的作息和行为规律、异常点的分布,就可以看看,如果下个月要进步,应该从哪些具体活动入手。
第七张图表是活动散点图。作用和活动积分排名图相似,告诉你应该从哪些活动着手改进,但多了一个频次观察值,间接反映你对这个活动的重视程度。
第八张图表是雷达图。看你是六边形战士还是偏科战神。
第九张图表是试金石。通过调整阈值,反映你在不同条件下能够取得的成就,帮你看清自己的极限、崩塌点和恢复力。
第十张图表是理想VS现实(v1.7.0 新增,放在最后)。这是台账从「记录过去」迈向「规划未来」的闭环:你在定义生活里给每个活动设的「理想」目标,会在这里和实际「现实」得分对比,算出误差率,并给出【达标 / 未达标 / 计划外产出 / 未设目标】四态诊断;顶部还有【规划覆盖率】KPI(已设目标活动数 ÷ 总活动数)。它让你一眼看清:哪些活动严重欠进度、哪些被你低估、哪些精力花在了计划外的地方。
「理想VS现实」表支持三层级联筛选:阴阳按钮(全部 / 阳 / 阴)→ 板块下拉(按板块短名,选项由数据动态生成)→ 状态下拉(未达标 / 达标 / 计划外产出 / 未设目标)。顶部 4 个 KPI 会随筛选范围实时重算,不是固定全量值——例如筛「阴 + 未达标」就能只看超预算的活动,KPI 同步显示该范围内的达标数与覆盖率。
使用场景
- 用户上传定义生活 Excel 文件(含「定义生活·阳·」或「定义生活·阴·」工作表)
- 用户上传人生台账 xlsx 文件(含「月基本指标」「已清洗数据」等台账工作表)
- 用户口头说明意图(如"生成台账"/"深度复盘")+ 附上对应文件
📋 数据字典:「原始数据」/「已清洗数据」列结构(9 列)
两表列结构一致(注意:原始数据表头在 row2,已清洗数据在 row1):
| 列 | 字段 | 说明 |
|---|---|---|
| A | 日期 | |
| B | 时间 | |
| C | 活动 | |
| D | 主题 | 对活动的具体说明(如口播文案的标题、所学技能的名称) |
| E | 所属板块 | |
| F | 耗时 | 单位 min,单元格只填数值 |
| G | 本次积分 | |
| H | 计算依据 | |
| I | 说明 |
两个占位符的语义(重要)
| 字段 | 占位符 | 含义 | 统计时的处理 |
|---|---|---|---|
| 主题 | / |
该活动无细分子主题 | 按主题聚合时过滤掉 / |
| 耗时 | 0 |
该条未记录耗时(不是"耗时为 0 分钟") | 耗时统计(尤其平均值)只算 >0 的记录 |
⚠️ 耗时不过滤 0 会让"计划校准"算错,且错得隐蔽:
> 写文案真实记录 60 min,另有 2 条未记耗时(填 0)
> - 不过滤:(60+0+0)÷3 = 20 min ← 假数字,会让你以为写文案只要 20 分钟
> - 过滤后:60÷1 = 60 min ← 真实基线
字段定位与边界
- 主题、耗时不参与任何可视化图表:不新增图、不改造现有图表(主题/耗时不进任何图)。它们的价值由"按需提问"释放(把原始数据交给 AI 提问)。
- 两个字段非全量:并非每个活动都有主题/耗时记录,因此不具备通用统计意义,只在针对某个活动具体分析时才需要。
- 主题命名由用户自由输入,前后可能不一致(如 obsidian / 学习obsidian / obsidian学习)。用于"当次溯源"可靠;跨记录聚合统计不可靠。AI 做模糊归并时须先摊给用户确认,避免静默误并。
- 耗时主功能是"计划校准"(向前看:知道写文案真实要 5 小时,下次按 5 小时排期),而非评估过去累不累。
- AI 读取已清洗数据时按表头名动态定位(兼容 7 列老台账 / 9 列新台账),不要硬编码列号。
「月板块与活动积分明细」表1:理想 / 现实 / 误差(v1.7.0 新增)
v1.7.0 起,表1 每个活动展开一行,并入三列:
| 列 | 字段 | 说明 |
|---|---|---|
| A | 所属板块 | 板块全名(定义生活·阳·XX / 定义生活·阴·XX) |
| B | 活动 | 活动名 |
| C | 理想 | 来自「定义生活」文件「理想」列(按表头名动态定位,放任意列均可);无则该格留空 |
| D | 现实 | =ABS(SUMIF(已清洗数据!活动列, 本活动, 已清洗数据!本次积分列)),即本月实际累计得分 |
| E | 误差 | 正数恒=达标、负数恒=未达标(阴阳统一)。阳 = 现实 − 理想(多挣即达标,理想200/现实400 → +200 达标);阴 = 理想 − 现实(理想为正数=扣分预算上限,未超预算即达标,理想200/现实120 → +80 达标;现实350 → −150 未达标)。理想为空/0 时该格留空 |
> 「理想」列写在哪:在「定义生活」文件的每个活动工作表里,与「活动 / 得分 / 说明」同一表头行(任意列,脚本按表头名「理想」动态定位)新增一列名为「理想」(不带「积分」、不带「月」)。阳板块填正数=本月目标分;阴板块填正数=扣分预算上限(允许的最大扣分)。缺列则全部活动走三态「未设目标」。
> 明细表整体布局(v1.7.0 修正):四个区之间各隔一个空白列——表1 A:E(所属板块/活动/理想/现实/误差)、表2 G:H(所属板块/积分,F 为空白间隔)、表3 J:K(短名/占比,I 为空白间隔)、表4 M:N(阳短名/占比,L 为空白间隔)。已去除冗余列:表1 原「积分」列(=现实)、表2 原「占比」列、表3 重复「占比」列。表头统一 #FFF2CC 填充;标题「定义生活清单」合并 A1:E1 居中。
四态分类与误差率
> 🔴 误差符号统一语义(v1.7.0 最终约定):正数恒 = 达标,负数恒 = 未达标,阴阳皆然。
> 读表时不需要分阴阳判断方向——看正负号即可。
「已设目标」的定义:理想 ≠ 0 且 理想非空白。 理想留空或填 0 都视为未设目标(脚本无法也不需区分二者)。
| # | 条件 | 状态 | 误差 | 误差率 |
|---|---|---|---|---|
| 1 | 已设目标 · 阳 · 现实 ≥ 理想 |
达标 | 现实 − 理想(≥0) |
误差 / 理想 |
| 2 | 已设目标 · 阳 · 现实 < 理想 |
未达标 | 现实 − 理想(<0) |
误差 / 理想 |
| 3 | 已设目标 · 阴 · 现实 ≤ 理想 |
达标(未超预算) | 理想 − 现实(≥0) |
误差 / 理想 |
| 4 | 已设目标 · 阴 · 现实 > 理想 |
未达标(超预算) | 理想 − 现实(<0) |
误差 / 理想 |
| 5 | 理想空/0 且 现实 > 0 |
计划外产出 | 不计算 | 不计算 |
| 6 | 理想空/0 且 现实 = 0 |
未设目标 | 不计算 | 不计算 |
边界与口径
- 误差恰好 = 0(现实正好等于理想)→ 判 达标(判定用 误差 ≥ 0)。
- 阴板块理想是正数=扣分预算上限,不是负数。理想 200 / 现实 120 → 误差 +80 达标。
- 误差率 = 误差 ÷ 理想;理想为 0 时不做除法(走状态 5/6,误差率留空)。
- Excel 端 E 列公式与可视化端口径完全一致:
=IF(OR(C="",C=0),"",IF(ISNUMBER(SEARCH("·阴·",A)), C−D, D−C))
(理想空/0 → 留空;阴 → 理想−现实;阳 → 现实−理想)
- 可视化脚本自算误差(读 C 理想 + D 现实),不读 E 列公式缓存值,因此不受「改了理想但 Excel 没重算」影响。
排序与 KPI
- 排序:已设目标按误差率升序(越负越严重 → 最该改进在前);未设目标 / 计划外产出(误差率空)一律置后。因误差已统一为「正数=达标」,无需再做阴阳归一。
- 例:某阳活动 理想200/现实80 → 误差 −120、误差率 −60%,排最前。
- 规划覆盖率 = 已设目标活动数 ÷ 总活动数(KPI,衡量规划完整度);4 个 KPI 均随三层级联筛选实时重算。
表格显示规则
| 字段 | 显示 |
|------|------|
| 理想 | 0 或空白 → —(表达"没设目标",比显示 0 更有信息量) |
| 现实 | 0 → 显示 0(真金白银的得分,0 就是 0,不能显示成 — 误导为"无数据");仅真空值 → — |
| 误差 | 空 → — 灰;否则带符号(正数前加 +),达标绿 / 未达标红 |
| 误差率 | 空 → —;否则百分比取整数(四舍五入) |
| 状态色 | 达标 #27AE60 绿 / 未达标 #C62828 红 / 计划外产出 #E8733A 橙 / 未设目标 #999 灰 |
> ⚠️ 已知取舍(用户确认不改):状态 5「计划外产出」不区分阴阳。阴活动若把理想填 0(= 零扣分预算)且现实 > 0,严格说应是"超预算未达标",但当前统一判为"计划外产出"。
> 用户判断:橙色无文字语义说明,不会引发"意外收获"的误联想,影响可忽略。若日后要修,改法为「阴板块 ideal=0 且 real>0 → 未达标」。
🎯 快速上手
安装后,直接上传你的 Excel 文件即可——AI 会自动识别文件类型并执行对应功能,不需要记住任何口令。
如果你想明确意图,也可以说:
- "生成人生台账" + 上传定义生活 Excel → 得到台账 xlsx;如需要深度复盘,继续执行第三步
- "深度复盘" + 上传人生台账 xlsx → 生成本地深度复盘文件;部署为在线链接需用户确认
执行流程
第一步:文件类型检测 + 自动路由
收到 Excel 文件后,不要按用户口头描述决定执行哪个功能。先用 openpyxl 读取文件的工作表名称,按以下规则自动判断:
检测规则
from openpyxl import load_workbook
wb = load_workbook("<文件路径>", data_only=True)
sheet_names = wb.sheetnames
| 条件 | 判定 | 执行 |
|---|---|---|
| 存在以「定义生活·阳·」或「定义生活·阴·」开头的工作表 | 定义生活文件 | → 执行第二步(功能1:生成台账) |
| 存在「月基本指标」「已清洗数据」「原始数据」等工作表 | 人生台账文件 | → 执行第三步(功能2:深度复盘) |
| 以上条件均不满足 | 格式不匹配 | → 提示用户文件格式不对,不要继续执行 |
格式不匹配时的提示
该文件不是定义生活文件也不是人生台账文件,请确认:
- 定义生活文件应包含「定义生活·阳·XX」或「定义生活·阴·XX」工作表
- 人生台账文件应包含「月基本指标」「已清洗数据」等工作表
补充说明
- 如果检测到是定义生活文件,自动执行功能1。完成后询问用户是否需要继续功能2。
- 如果检测到是台账文件,直接执行功能2。
- 不要跳过检测步骤直接执行脚本。
第二步:转化人生台账
执行转化脚本
python "{Skill目录}/scripts/generate_ledger_v6.py" "{定义生活文件绝对路径}"
脚本说明
generate_ledger_v6.py:台账转化脚本,自动从定义生活 Excel 提取数据、按模板生成标准人生台账- 模板已 base64 嵌入脚本,零外部依赖
验证
生成后确认:
1. 输出文件存在:{YYYY}{MM}人生台账.xlsx
2. 工作表顺序正确:备注 → 原始数据 → 已清洗数据 → 月基本指标 → ...
3. 公式无错误(无 #REF!/#DIV/0!/#VALUE!)
第三步:生成可视化深度复盘(部署为链接可选)
用户拿到人生台账后,如果要求'深度复盘'、'可视化'、'生成 HTML'、'看图表',执行此步。
⚠️ 此步包含 2 个子步骤:3.1 必须完成(生成本地可视化文件),3.2 为可选(部署为在线链接,必须经用户确认)。
3.1 执行可视化脚本
python "{Skill目录}/scripts/gen_visual_v5.py" "{人生台账文件的绝对路径}"
脚本会输出:
- {YYYYMM}人生台账_深度复盘_v3.html(与台账同目录)
- dist/index.html(自动创建的部署目录,与台账同目录)
3.2 部署为可分享链接(可选,必须经用户确认)
脚本已自动创建了 dist/ 目录和 index.html。是否部署到公网生成可分享链接,必须询问用户,不得在未经确认的情况下自动上传。
操作步骤:
1. 可视化文件生成后,先向用户展示本地产物 dist/index.html 的预览(用 present_files)。
2. 明确询问:「深度复盘文件已生成。是否需要部署为在线分享链接?(链接将包含您的个人数据,请确认后再发布)」
3. 只有用户明确同意(如回复「是」「好」「发布」「部署」「确认」等),才调用部署工具;否则结束流程,只保留本地文件。
调用部署工具时参数如下:
工具:workbuddy_sites_deploy(或 @发布为应用 skill)
参数:
action: "deploy"
directory: "{台账文件所在目录}/dist"(绝对路径,必须含 index.html)
language: "static"
appName: "YYYYMM人生台账深度复盘"
domainPrefix: "nirvana-ledger-YYYYMM"(ASCII 短 slug,≤32 字符)
userAskedToPublish: true # 仅当用户在本轮回话中明确同意部署时才置 true
> 🟡 注意:userAskedToPublish 只有在用户最新一条消息里明确同意部署时才可设为 true。不要基于更早轮次的同意自动设 true。
调用成功后返回 shareLink(格式如 https://<domainPrefix>.app.workbuddy.host/),在回复中写出完整 URL,并调用 present_files 展示。
> 🔴 如果用户确认部署,必须在文字回复中写出完整分享链接!
>
> 部署成功后,在文字回复中把完整 URL 写出来(例如:「深度复盘已生成,链接:https://xxx.app.workbuddy.host/,可在浏览器中打开查看。」)。同时调用 present_files 展示该 URL。
>
> 不要只依赖 present_files 的预览面板!用户需要能直接复制这个链接。
> ⚠️ 隐私提醒:生成的可分享链接包含您的个人数据,发布前必须获得用户确认,请勿分享给不信任的人。
> 若用户不同意部署,或发布工具不可用(离线/无权限),则用 present_files 展示 dist/index.html 本地文件作为交付。禁止返回 file:/// 本地路径。
技术说明
- Python 3.11+ 环境
- 依赖库:openpyxl(已嵌入模板,无需额外安装)
- 输出文件命名:
{YYYY}{MM}人生台账.xlsx/{YYYYMM}人生台账_深度复盘_v3.html