nav-review-collect
SKILL_942502307 · vv1.1 · Olive 海外运营 · Owner:Olive 基金运营 · 发布于 2026-08-10
调用 51
下载 1
点赞 0
浏览 0
- 简介
- 专用于NAV复核第二阶段的数据采集与证据截图生成,仅收集源数据不生成报告。
- 触发词
- 收集NAV数据,生成NAV截图,准备复核数据
- 分发渠道
- ARK Engine
- 功能测试
- ✅ 通过 · 业务评审:✅ 通过
- 技能包文件
- nav-review-collect/SKILL.md、nav-review-collect/references/payment_log_spec.md、nav-review-collect/references/screenshot_spec.md
使用示例:帮我收集这批NAV复核数据并生成对应截图
SKILL.md 全文
Frontmatter
| name | nav-review-collect |
|---|---|
| description | | |
NAV Review Stage 2 — 数据收集与截图生成
When to Use
- 由
nav-review主调度 skill 在 Stage 2 自动调用 - 用户单独说"收集 NAV 数据"、"生成 NAV 截图"、"准备复核数据"
- 已存在
<target_dir>/.cortex/nav_profile.json
输入
target_dir:基金期间文件夹绝对路径<target_dir>/.cortex/nav_profile.json(来自 nav-review-identify)
输出
<target_dir>/.cortex/
├── nav_data/
│ ├── tb.json # TB 全量
│ ├── sofi.json # 持仓全量(FS Pack)/ ipa.json(IGOWIN)
│ ├── cash_balances.json # 各账户期末余额
│ ├── bank_transactions.json # 整期银行流水(按月分组)
│ ├── nominee_cashflow.json # Nominee 现金账项(按月)
│ ├── investment_movement.json # 投资活动(Capital Call / Distribution / Sub / Red)
│ ├── investment_support.json # 各持仓支持文件信息
│ ├── mmf_reinvestment.json # MMF Reinvestment 跨期数据
│ ├── distribution_je.json # 分配复合分录(按 TranID/Batch ID 分组)
│ ├── prior_cost.json # 上期成本快照
│ ├── prior_mv.json # 上期市值快照
│ ├── payment_log.json # 期内 Payment Log 行
│ └── summary_log.json
└── screenshots/
├── cash/ # Cash Review 用
├── inv_cost/ # Investment Cost Review 用
└── inv_ugl/ # Investment Unrealized G/L Review 用
---
外置规范文件
| 文件 | 内容 | |------|------| |references/screenshot_spec.md | 红框标注代码、高亮可读性规则、IPA 裁剪规范、Investment 类禁止填充规则 |
| references/payment_log_spec.md | Payment Log 行截图、PI 文件截图、Email 证据截图细则 |
Subagent 生成截图时必须先读取对应规范文件并严格遵守。
---
执行流程
Step 0:加载 profile
import json, os target_dir = r"<...>" profile = json.load(open(os.path.join(target_dir, ".cortex", "nav_profile.json"), encoding="utf-8"))
Step 1:并行收集结构化数据(4 个 subagent)
⚠️ Subagent 容错策略:若 subagent 因账户权限失败,立即改为 run_in_terminal + openpyxl/fitz 直接读取。不要重试失败的 subagent。
Subagent A — 当期 TB / 持仓 / 投资活动
输入:profile.key_files.fs_pack 或 profile.key_files.tb_csv + profile.key_files.ipa + profile.key_files.investment_movement
任务:
1. 读取 TB 全量(含 Reporting Period、所有科目余额)→ nav_data/tb.json
2. 读取持仓明细(SOFI 或 IPA)→ nav_data/sofi.json
3. 必须最先读 Investment Movement Summary → nav_data/investment_movement.json,列出期内全部活动
4. 抓出 Cash/Investment/UGL 相关科目余额 → nav_data/cash_balances.json
5. Distribution 复合分录追溯:若 report_system == "Maples-FSPack" 且 TB 中 Investment Distribution-Cost 或 Investment Distribution-UnrealizedGL 当期 Debits/Credits ≠ 0,从 Report/Detailed General Ledger.csv 提取每笔发生额,按 TranID 分组写入 nav_data/distribution_je.json:
- 字段:
tran_id,tran_date,investment,lines[](account, amount),nature - 科目组合推断规则:
- 仅
Distribution-Cost(贷) + Distribution-UnrealizedGL(借) + ChangeinUnrealizedGL(贷)→Non-recallable ROC - 上述 +
Cash in Bank(借)→Recallable Income
Report/I1. JE Report.xlsx,按 Batch ID 分组写入同一 JSON 结构。
Guard clause:若 TB 中 Distribution-Cost 与 Distribution-UnrealizedGL 当期 Debits/Credits 全为 0 → 跳过第 5-6 步,distribution_je.json写[]。
Subagent B — 当期银行对账单(含 Nominee + MMF Reinvestment)
输入:profile.folders.bank_statements[],profile.months_in_scope[] + subsequent_months[]
任务(对每个银行 / 每个月):
1. 多币种账户识别(强制第一步):扫描全 PDF 找到基金本位币账户对应页(通过账户标识符如 788611579-USD 确认)。空账户(余额为 0 的 CNY 等)跳过。
2. 用 fitz 逐页读取目标币种页,提取期末余额、所有交易行 → nav_data/bank_transactions.json
3. Nominee 平台(Ark/Noah):抓 Holdings 与 Cashflow Statement / Transaction Details 页 → nav_data/nominee_cashflow.json。若某月无 cash activity,对应月份写 null + "no_activity": true。
4. 关键词搜索辅助定位:Holdings, Transaction Details, Cashflow, Closing Balance, Reinvestment, Dividend, Subscription, Redemption, Goldman, Liquid
MMF Reinvestment 派生(合并到本 Subagent 末尾):
Guard clause:若从profile.has_mmf == false→mmf_reinvestment.json写{},跳过以下全部。
nominee_cashflow.json 中抽取跨期 reinvestment → nav_data/mmf_reinvestment.json:
- monthly:仅次月(M+1)一期 → 共 1 期(不计入当月,因当月红利在次月首日 Reinvestment 形式入账)
- quarterly:M2 + M3 + M4(季度后一月)→ 共 3 期(不计入季度首月 M1,因 M1 reinvestment 属于上一季度末尾巴)
periods[](month / shares / div_rate / reinvestment_amount / posn / posn_mismatch / source;每个 period 必须带month字段,格式YYYY-MM,供下游 report skill 按月匹配 supporting 截图)total(仅汇总上述"计入"期,不含被排除的 M1 / 当月)- 可选:
excluded_periods[](首月 / 当月数据保留在此字段供审计追溯,但不计入 total)
Subagent C — 当期 Investment 支持文件 + Payment Log
输入:profile.folders.investment[],profile.key_files.payment_log
任务:
1. 对每个持仓文件夹,按优先级寻找 supporting 文件并提取关键信息:
- PDF(CAS / Investor Statement / Capital Call Notice / Distribution Notice)
- .msg / .eml
- XLSX/DOCX/截图
- 非 Investment 文件夹的其他文件
Pw*.txt 取密码,用 pikepdf 解锁后再用 fitz 读取
3. 写入 nav_data/investment_support.json:字段包括 investment, type, source_file, source_priority, ending_balance, net_contributions, net_income, capital_call_total, capital_call_components, distribution_total, page_refs
4. 读取 Payment Log,筛选 From == fund_name 且 Value Date 在期内 → nav_data/payment_log.json
Guard clause:若profile.folders.investment为空或不存在 →investment_support.json写[]。
Subagent D — 上期对比基准
输入:profile.prior_period_dir + profile.prior_period_files.fs_pack / .ipa
任务:
1. 读取上期 TB / SOFI(或 IPA)→ nav_data/prior_cost.json 和 nav_data/prior_mv.json
2. 字段:每个持仓的 Prior Cost / Prior MV / Prior UGL,以及上期 TB 现金余额
Guard clause:若---profile.prior_period_dir为空或不存在 →prior_cost.json/prior_mv.json写{},并在 stdout 警告"上期数据缺失,Cost/UGL 对比将不可用"。
Step 2:并行生成截图(3 个 subagent,分别面向三份报告)
关键原则:截图与报告必须分离。先生成全部 PNG,验证文件存在,再交给 report skill。
截图标注规范:所有 subagent 必须先读取 references/screenshot_spec.md 并严格遵守。
Subagent X — Cash Review 截图 → .cortex/screenshots/cash/
| 文件名模板 | 来源 | 标注内容 |
|------------|------|---------|
| cash_balance_summary.png | Cash Appraisal P.1 或 FS Pack Cash sheet | 各账户期末余额行 |
| bank_<bank>_<month>_p1.png | 银行对账单(本位币账户页) | 期末余额 + 关键交易 |
| bank_<bank>_<month>_subsequent.png | Subsequent 对账单 | 期后交易 |
| nominee_<platform>_<month>_cashflow.png | Ark/Noah monthlyStatement | Cashflow Statement 页 |
| PL_<PN>.png | Payment Log XLSX 渲染 | PN / From / To / Amount / Value Date |
| PI_<PN>.png | PI PDF(P.1/P.3) | 付款指令 + 发票/Contract Note |
| email_<source>.png | .msg / .eml 解析后渲染 | 关键金额 + 日期段落 |
Guard clause:若Payment Log / Email 截图细则:详见profile.has_nominee == false→ 跳过所有nominee_*截图。
references/payment_log_spec.md,必须先读取并严格遵守。
Subagent Y — Investment Cost Review 截图 → .cortex/screenshots/inv_cost/
| 文件名模板 | 来源 | 标注内容 |
|------------|------|---------|
| prior_ipa.png / prior_cost.png | 上期 IPA / SOFI(宽表裁顶部 ~200pt @ 3× zoom,仅红边描线) | Cost 列、报告日期 |
| current_ipa.png / current_cost.png | 当期 IPA / SOFI(同上) | Cost 列、报告日期 |
| investment_movement.png | Investment Movement Summary | 当期所有活动行 |
| capital_call_<n>.png | Capital Call Notice PDF | Component 金额行 |
| distribution_<n>.png | Net Distribution Notice PDF | Total / Recallable / Non-recallable / Tax Withholding |
| ilpa_section_c_<n>.png | ILPA Notice Section C | 各分项金额 + 2.17 列 |
| mmf_holdings_<month>.png | Ark/Noah monthlyStatement Holdings 页 — 个股持仓行 | Closing Market Value、Period end date |
| mmf_reinvestment_<month>.png | Ark monthlyStatement Transaction Details | Reinvestment 行 Shares / Div Rate / Posn |
| nominee_txn_details_<month>.png | Ark monthlyStatement "交易明細 Transaction Details" 页 — 非 Reinvestment 交易行 | 赎回 Redemption / Stock Deposit / Subscription 的 Transaction Amount 金额列(红框 highlight) |
Guard clause:若profile.has_mmf == false→ 跳过所有mmf_*截图。
Guard clause:若investment_movement.json为空 → 跳过investment_movement.png。
MMF Holdings 截图注意:截个股持仓行(JPM/GS individual lines),不得截 Holdings 汇总封面。
Subagent Z — Investment Unrealized G/L Review 截图 → .cortex/screenshots/inv_ugl/
| 文件名模板 | 来源 | 标注内容 |
|------------|------|---------|
| prior_mv.png | 上期 SOFI / IPA | MV / UGL 列 |
| current_mv.png | 当期 SOFI / IPA | MV / UGL 列 |
| mv_support_<inv>.png | 持仓对应 CAS / Investor Statement / monthlyStatement | Ending Balance / MV 字段 |
| mv_support_<mmf_id>.png | MMF 持仓 Ark/Noah monthlyStatement Holdings 页(如 mv_support_goldman.png) | Closing Market Value 行 |
| tb_ugl.png | TB sheet | Unrealized G/L 科目行 |
Guard clause:若prior_mv.json为{}→ 跳过prior_mv.png。
MMF MV Support 强制规则:即使 MMF 持仓没有外部 GP 报告,也必须生成mv_support_<mmf_id>.png(来源 = Ark/Noah monthlyStatement Holdings 页,与 inv_cost 的mmf_holdings_<期末月>.png可复用同一张图)。UGL Review 报告每个 MMF 持仓的 supporting block 必须有 5 张截图(Prior MV p1/p2 + Current MV p1/p2 + MV Support),不允许只有 4 张。
孤儿持仓识别(强制):截图前必须先核对verified_cost.json投资清单。Investment 文件夹下任何 fund 若未在verified_cost.json出现(如已退出但文件夹保留),属于孤儿持仓 → 不为该 fund 生成mv_support_*.png。如果上一期遗留了孤儿截图,记录在 stdout 警告 "孤儿截图:mv_support_<inv>.png(fund 未在 verified_cost 中,UGL 报告将不引用)" 但不删除该截图(保留供审计追溯)
Guard clause:若prior_mv.json为{}→ 跳过prior_mv.png。
MMF MV Support 强制规则:即使 MMF 持仓没有外部 GP 报告,也必须生成mv_support_<mmf_id>.png(来源 = Ark/Noah monthlyStatement Holdings 页,与 inv_cost 的mmf_holdings_<期末月>.png可复用同一张图)。UGL Review 报告每个 MMF 持仓的 supporting block 必须有 5 张截图(Prior MV p1/p2 + Current MV p1/p2 + MV Support),不允许只有 4 张。
孤儿持仓识别(强制):截图前必须先核对---verified_cost.json投资清单。Investment 文件夹下任何 fund 若未在verified_cost.json出现(如已退出但文件夹保留),属于孤儿持仓 → 不为该 fund 生成mv_support_*.png。如果上一期遗留了孤儿截图,记录在 stdout 警告 "孤儿截图:mv_support_<inv>.png(fund 未在 verified_cost 中,UGL 报告将不引用)" 但不删除该截图(保留供审计追溯)。
Step 3:截图文件存在性验证
生成后必须执行:Get-ChildItem -Path "<target_dir>\.cortex\screenshots" -Recurse -Include *.png | Select-Object FullName, Length | Format-Table -AutoSize任何应有但缺失的截图 → 立即用
run_in_terminal 直接生成补齐,不要交回主流程。
---
完成检查表
- [ ]
nav_data/下所有 JSON 已生成(条件性 JSON 在 guard clause 跳过时写空值) - [ ]
screenshots/{cash,inv_cost,inv_ugl}/三个目录均存在且非空 - [ ] 每个银行账户每个月至少一张对账单截图
- [ ] 每个持仓至少一张支持文件截图
- [ ] 截图标注符合
references/screenshot_spec.md(含第 7 节高清内嵌规则和第 8 节数据层级标注规则) - [ ] Payment Log 截图覆盖期内所有匹配 PN(符合
references/payment_log_spec.md) - [ ] 截图分辨率 300 DPI(落盘 PNG);报告生成阶段使用 150 DPI + JPEG quality 85 做高清内嵌
- [ ] 红框标注精确定位到关键数字(使用
page.get_text("words")定位),线宽 3px,不圈整行/大区域 - [ ] 宽表(IPA/SOFI)使用 4× zoom 裁剪渲染,确保小字清晰
关键注意事项
1. 数据全量提取:JSON 中保存原始字段足够丰富,让 report skill 不需要再回去读 PDF/XLSX。 2. Investment 支持文件优先级:PDF > .msg/.eml > 其他 > 非 Investment 文件夹。在investment_support.json 中记录 source_priority。
3. MMF 跨期规则:monthly = 仅次月(1 期);quarterly = M2+M3+M4(3 期),两种频率均不计入首月 / 当月。每个 period 必须带 month: "YYYY-MM" 字段,供下游 report skill 按月匹配 supporting 截图。派生逻辑在 Subagent B 末尾完成。
4. TB 频率影响搜索范围:profile.period_type=monthly → 只读当月;quarterly → 读整季 + 季后一月。
5. 截图脚本与报告脚本分离:本 skill 结束时必须有 PNG 文件落盘,不能依赖临时变量。
6. Subagent 容错:失败立即降级为 run_in_terminal 直接执行,不要重试同一 subagent。
7. 本 skill 不构建 Word、不计算最终结论:只做数据收集和视觉证据准备。校验公式由 report skill 负责。