{"id":"66a149ab-8a41-4250-b6aa-cb14e0503e5b","entityType":"agent","slug":"clawhub-cookfish1979-a-stock-report","name":"A-stock-report","canonicalUrl":"https://www.xpersona.co/agent/clawhub-cookfish1979-a-stock-report","canonicalPath":"/agent/clawhub-cookfish1979-a-stock-report","generatedAt":"2026-10-10T01:00:33.188Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:09:28.258Z","emptyReason":null},"description":"A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 4K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s178t9xr86vm0kwcccj0rhw50h8472yc:a-stock-report","sourceUrl":"https://clawhub.ai/cookfish1979/a-stock-report","homepage":"https://clawhub.ai/cookfish1979/skills/a-stock-report","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/cookfish1979/a-stock-report","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/cookfish1979/skills/a-stock-report","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":72,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"A-stock-report technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:09:28.258Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:09:28.258Z","emptyReason":null},"stars":null,"forks":null,"downloads":4045,"packageName":null,"latestVersion":"3.5.4","tractionLabel":"4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:09:28.230Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T06:09:28.258Z","lastCrawledAt":"2026-10-09T06:09:28.230Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T06:09:28.230Z","lastVerifiedAt":null,"highlights":[{"version":"3.5.4","createdAt":"2026-06-20T05:40:50.226Z","changelog":"v3.5.4 (2026-06-19): 1) send_*.py 全部 7 个脚本重构 .env 加载 (注释去密钥字样 + 路径走 ENV_FILE 系列变量); 2) SKILL.md L98 安全配置段同步改用 ENV_FILE 变量描述。注: v3.5.3 publish 时版本号不一致, v3.5.4 严格对齐 SKILL.md + _meta.json。","fileCount":24,"zipByteSize":121323},{"version":"3.5.3","createdAt":"2026-06-20T05:18:35.646Z","changelog":"v3.5.3 (2026-06-19): 1) send_*.py 全部 7 个脚本重构 .env 加载(注释去密钥字样 + 路径走 ENV_FILE 系列变量); 2) SKILL.md L98 安全配置段同步改用 ENV_FILE 变量描述。注: 此版本是昨晚 v3.5.2 的清理版, 重新 bump 是因为 .env 加载代码变了。","fileCount":24,"zipByteSize":121357},{"version":"3.5.2","createdAt":"2026-06-19T07:35:18.042Z","changelog":"v3.5.2 (2026-06-19): 1) send_evening_report.py 加 5 项内容质量硬校验(约字/空行/依据长度/免责/要闻数);2) SKILL.md 精简 + 14 段护栏;3) A 股节假日 cron 触发应急 LLM 应对;4) 兼容 .clawhubignore 排除 knowledge/ + lessons_learned.md","fileCount":24,"zipByteSize":121348},{"version":"3.5.0","createdAt":"2026-06-16T07:11:52.581Z","changelog":"v3.5.0: SKILL.md 50KB→31KB(-39%) + 19条changelog折到knowledge/ + .clawhubignore加严4段排knowledge/lessons_learned/lock/pyc; frontmatter v3.4.4→v3.5.0; MEMORY#12立SKILL.md ≤30KB硬上限","fileCount":23,"zipByteSize":116620},{"version":"3.3.1","createdAt":"2026-06-12T00:07:17.526Z","changelog":"v3.3.1（2026-06-11）晚报可读性：财经要闻 1 空行分隔 + 操作建议依据 ≤ 50 字符。修复 3 处：3 个 templates 同步注入协议 + send_evening_report.py L817 修 if _l.strip() 过滤空行 bug + ai.txt 重生成。端到端验证：6/11 23:58 真推微信，md 3649 字节，7 要闻 6 空行间隔，3 依据 43/32/33 字符。 跳 6 版同步 v3.2.6~v3.3.1：v3.2.6 双副本根除+jobs.json 修复；v3.2.7 .env 路径根除；v3.2.8 收盘小结 4 处拼接 bug；v3.2.9 dispatcher skills=[] 清理；v3.3.0 财经要闻任务定位协议（防盘面数据冒充要闻）；v3.3.1 本次可读性修复。","fileCount":53,"zipByteSize":182281},{"version":"3.2.5","createdAt":"2026-06-09T14:58:04.315Z","changelog":"v3.2.5 — 盘中预警 cron prompt 纯 bash 化（285→102 字符），去掉 LLM 看脚本输出的看门狗冗余（脚本自带的 state 文件去重已 100% 拦掉重复推送）。同步 cron_mirror.json，修 description，新增 check_consistency.py G 段护栏黑名单 LLM 调度关键词，100% 兼容（脚本逻辑/state 文件去重/触发频率 0 改动）。","fileCount":48,"zipByteSize":164133},{"version":"3.2.4","createdAt":"2026-06-09T11:45:55.199Z","changelog":"v3.2.4: SKILL.md 自介后加 ## 目录结构 段，明示 knowledge/ 也被 publish 上传（19 文件 ≈ 60 KB），含 .clawhubignore 阈值建议（> 500 KB 或 > 50 条）。0 逻辑改动，纯文档。","fileCount":41,"zipByteSize":138134},{"version":"3.2.3","createdAt":"2026-06-09T11:30:13.614Z","changelog":"v3.2.3 — send_ipo_report.py 迁移到 _send_lib 共用库 修复：4 个 send 脚本中唯独 ipo_report（526 行）自己复制了 get_webhook_url+wx（24 行重复），导致 v3.1.0/1 修 bug 时漏改。2 个 patch 迁移：import 精简 + from _send_lib import wx + 删本地实现。脚本 526→504 行（-22），行为 100% 等价。 意外收获：本地 wx 缺 WECOM_WEBHOOK_KEY 抛 RuntimeError（调用方未 try/except）→ 共用库返回 -1，原版潜在崩溃隐患顺手修掉。 教训： - 共用库迁移 = 隐式 bug 修复（v3.2.3 #1）：每次给共用库加安全特性，必须 grep 全仓确认所有 send 脚本都已迁移 - 迁移 = 调研先行不重写业务（v3.2.3 #2）：先看其他 3 个 send 脚本 import 风格 + 找所有 wx/get_webhook_url 引用 + 3 场景测试，再 2 patch 改完 - 用户提问的\"必要性\"是 review 的入口（v3.2.3 #3）：用户问\"为什么保留 _send_lib\" → 触发\"4 个 send 脚本是否都用它\"检查 → 发现 ipo_report.py 没迁移 护栏：check_consistency.py 6/6 仍过；Changelog 18 条 / 最长 14 行；语法检查过；行为 3 场景测试一致。","fileCount":40,"zipByteSize":135664}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s178t9xr86vm0kwcccj0rhw50h8472yc:a-stock-report","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s178t9xr86vm0kwcccj0rhw50h8472yc:a-stock-report` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/cookfish1979/a-stock-report before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T01:00:33.183Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-cookfish1979-a-stock-report/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:09:28.258Z","emptyReason":null},"readme":"Skill: A-stock-report\n\nOwner: cookfish1979\n\nSummary: A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。\n\nTags: a-share:3.2.2, akshare:2.0.2, automation:3.2.2, finance:3.2.2, investment:2.0.2, iwencai:2.0.2, latest:3.5.4, report:3.2.2, wechat-work:2.0.2\n\nVersion history:\n\nv3.5.4 | 2026-06-20T05:40:50.226Z | user\n\nv3.5.4 (2026-06-19): 1) send_*.py 全部 7 个脚本重构 .env 加载 (注释去密钥字样 + 路径走 ENV_FILE 系列变量); 2) SKILL.md L98 安全配置段同步改用 ENV_FILE 变量描述。注: v3.5.3 publish 时版本号不一致, v3.5.4 严格对齐 SKILL.md + _meta.json。\n\nv3.5.3 | 2026-06-20T05:18:35.646Z | user\n\nv3.5.3 (2026-06-19): 1) send_*.py 全部 7 个脚本重构 .env 加载(注释去密钥字样 + 路径走 ENV_FILE 系列变量); 2) SKILL.md L98 安全配置段同步改用 ENV_FILE 变量描述。注: 此版本是昨晚 v3.5.2 的清理版, 重新 bump 是因为 .env 加载代码变了。\n\nv3.5.2 | 2026-06-19T07:35:18.042Z | user\n\nv3.5.2 (2026-06-19): 1) send_evening_report.py 加 5 项内容质量硬校验(约字/空行/依据长度/免责/要闻数);2) SKILL.md 精简 + 14 段护栏;3) A 股节假日 cron 触发应急 LLM 应对;4) 兼容 .clawhubignore 排除 knowledge/ + lessons_learned.md\n\nv3.5.0 | 2026-06-16T07:11:52.581Z | user\n\nv3.5.0: SKILL.md 50KB→31KB(-39%) + 19条changelog折到knowledge/ + .clawhubignore加严4段排knowledge/lessons_learned/lock/pyc; frontmatter v3.4.4→v3.5.0; MEMORY#12立SKILL.md ≤30KB硬上限\n\nv3.3.1 | 2026-06-12T00:07:17.526Z | user\n\nv3.3.1（2026-06-11）晚报可读性：财经要闻 1 空行分隔 + 操作建议依据 ≤ 50 字符。修复 3 处：3 个 templates 同步注入协议 + send_evening_report.py L817 修 if _l.strip() 过滤空行 bug + ai.txt 重生成。端到端验证：6/11 23:58 真推微信，md 3649 字节，7 要闻 6 空行间隔，3 依据 43/32/33 字符。\n\n跳 6 版同步 v3.2.6~v3.3.1：v3.2.6 双副本根除+jobs.json 修复；v3.2.7 .env 路径根除；v3.2.8 收盘小结 4 处拼接 bug；v3.2.9 dispatcher skills=[] 清理；v3.3.0 财经要闻任务定位协议（防盘面数据冒充要闻）；v3.3.1 本次可读性修复。\n\nv3.2.5 | 2026-06-09T14:58:04.315Z | user\n\nv3.2.5 — 盘中预警 cron prompt 纯 bash 化（285→102 字符），去掉 LLM 看脚本输出的看门狗冗余（脚本自带的 state 文件去重已 100% 拦掉重复推送）。同步 cron_mirror.json，修 description，新增 check_consistency.py G 段护栏黑名单 LLM 调度关键词，100% 兼容（脚本逻辑/state 文件去重/触发频率 0 改动）。\n\nv3.2.4 | 2026-06-09T11:45:55.199Z | user\n\nv3.2.4: SKILL.md 自介后加 ## 目录结构 段，明示 knowledge/ 也被 publish 上传（19 文件 ≈ 60 KB），含 .clawhubignore 阈值建议（> 500 KB 或 > 50 条）。0 逻辑改动，纯文档。\n\nv3.2.3 | 2026-06-09T11:30:13.614Z | user\n\nv3.2.3 — send_ipo_report.py 迁移到 _send_lib 共用库\n\n修复：4 个 send 脚本中唯独 ipo_report（526 行）自己复制了 get_webhook_url+wx（24 行重复），导致 v3.1.0/1 修 bug 时漏改。2 个 patch 迁移：import 精简 + from _send_lib import wx + 删本地实现。脚本 526→504 行（-22），行为 100% 等价。\n\n意外收获：本地 wx 缺 WECOM_WEBHOOK_KEY 抛 RuntimeError（调用方未 try/except）→ 共用库返回 -1，原版潜在崩溃隐患顺手修掉。\n\n教训：\n- 共用库迁移 = 隐式 bug 修复（v3.2.3 #1）：每次给共用库加安全特性，必须 grep 全仓确认所有 send 脚本都已迁移\n- 迁移 = 调研先行不重写业务（v3.2.3 #2）：先看其他 3 个 send 脚本 import 风格 + 找所有 wx/get_webhook_url 引用 + 3 场景测试，再 2 patch 改完\n- 用户提问的\"必要性\"是 review 的入口（v3.2.3 #3）：用户问\"为什么保留 _send_lib\" → 触发\"4 个 send 脚本是否都用它\"检查 → 发现 ipo_report.py 没迁移\n\n护栏：check_consistency.py 6/6 仍过；Changelog 18 条 / 最长 14 行；语法检查过；行为 3 场景测试一致。\n\nv3.2.2 | 2026-06-09T11:17:48.215Z | user\n\nv3.2.2 — references/config.json 重写 + 锁自愈机制文档修正（2026-06-09 晚）\n\n【问题】v3.2.0 审查遗留 2 项（v3.2.1 暂留未处理）：\n1. references/config.json 是 2026-04-04 完整快照（95 行）：4/4 bug 清单（多数已修）、旧 jobs.json ID（多数已删）、webhook.reader: keys_loader.py（v3.1.0+ 弃用）、已删的\"工作区整理\" cron、错误的\"30 分钟自愈\"等机制描述。\n2. 6/9 发现的 5.9 天残留锁：根因非\"自愈失效\"，而是自愈是\"被动\"的（仅在 lock() 调用时检查），不是\"30 分钟内自动清理\"。\n\n【调查】模拟残留锁（PID 99999 + 2h 旧时间戳）→ 调 lock() → \"持有者已退出，自动清理并抢占\" ✅。自愈逻辑本身是好的。问题在 v2.0.3 段术语偏差。\n\n【改动】\n1. references/config.json 重写 95 → 31 行：从\"历史快照\"改为\"参考索引\"：头部 _deprecated 警告 + 明确指向 4 处真相（cron_mirror.json / templates / _send_lib.py / jobs.json）+ 含\"自愈真相\"段。\n2. SKILL.md v2.0.3 段保持不变（描述准确），文档修正放在 config.json。\n3. knowledge/changelog/v3.2.2.md 新建（自愈测试代码 + config.json 新旧对比 + 4 处真相索引表 + 3 条新教训）。\n4. README 索引 16 → 17 条。\n\n【教训】① 自愈 ≠ 自动清理 ② 历史快照文件要明确\"过期时间\" ③ 先调研后修复（v3.2.2 一开始以为是\"自愈失效\"要修代码，实际是设计如此只改文档）。\n\n【护栏】check_consistency.py 6/6 仍过；Changelog 段 17 条 / 最长 20 行（含段间空行） / 软目标 18 行内。\n\n【兼容性】100%。config.json 没人/代码读，所有任务走 jobs.json / _send_lib.py / templates / cron_mirror.json。\n\nv3.2.1 | 2026-06-09T11:02:08.287Z | user\n\nv3.2.1 — v3.2.0 审查遗留 2 项修复\n\n【问题】v3.2.0 审查遗留 5 项中，2 项确认修：\n1. SKILL.md v3.1.1 段仍称 `_notify.py`（实为 `_send_lib.py`），文档失真（5/24 教训 #1 复发）\n2. scripts/test_morning_data.py 死代码（0 引用 + 含 push2his.eastmoney.com 死接口，5/1 教训 #1 复发）\n\n【改动】\n1. SKILL.md L69：1 行 patch，`_notify.py` → `_send_lib.py`（含原命名注脚）\n2. rm scripts/test_morning_data.py（13132 bytes）\n3. 新增 knowledge/changelog/v3.2.1.md（详细改动 + 教训来源）\n4. knowledge/changelog/README.md 索引更新（15 → 16 条）\n\n【未处理 / 留 v3.2.2】\n- references/config.json 仍引用 keys_loader.py（实已迁 WECOM_WEBHOOK_KEY env）\n- 锁自愈机制 5.9 天未触发根因\n\n【护栏】check_consistency.py 6/6 通过；Changelog 段 16 条 / 最长 8 行。\n\n【兼容性】v3.2.0 完全兼容；删的是死代码、patch 的是失真文档，无功能影响。\n\nv3.2.0 | 2026-06-09T10:53:47.296Z | user\n\nv3.2.0 — Changelog 段瘦身 + F 段护栏\n\n【问题】SKILL.md Changelog 段自由膨胀到 488 行（占 48.8%），单条最大 86 行（v3.0.0）。改 changelog 拖慢加载，挡住关键信息（架构图 / 4 端护栏规则 / 数据源表）。\n\n【改动】\n1. Changelog 14 条历史版本精简到 3-8 行/条\n2. 完整细节外置到 knowledge/changelog/vX.Y.Z.md（15 个文件 + README 索引）\n3. SKILL.md: 1001 → 622 行（-38%），35KB → 32KB\n4. 新增 check_consistency.py F 段：机械锁 Changelog 单条 ≤ 25 行\n5. v3.1.6 E 段补丁：扫黑名单 3 类（cron 嵌入 / .env 路径 / source+send 一行命令）\n\n【护栏】check_consistency.py 6 段全过（templates↔mirror / mirror↔jobs.json / SKILL.md 引用 / dispatcher 任务 / E 段黑名单 / F 段 Changelog 长度）。\n\n【已知问题 / 下一版待办】\n- SKILL.md v3.1.1 段仍称 `_notify.py`，实际为 `_send_lib.py`（v3.1.0 重构后未同步历史段）\n- scripts/test_morning_data.py 是 v2.x\"方案B\"原型，已无引用且包含已废弃的 push2his.eastmoney.com 接口\n- references/config.json 仍引用 keys_loader.py，实际已迁到 WECOM_WEBHOOK_KEY env（v3.1.0 之后架构）\n- 锁自愈机制待查：v2.0.3 的 30 分钟自愈未触发（5.9 天残留锁）\n\n【兼容性】v3.1.6 完全兼容；模板 / cron / scripts API 无破坏性变化。\n\nv2.0.8 | 2026-06-06T03:50:01.036Z | user\n\nv2.0.8 (2026-06-06): 修复 IPO 周报\"排队情况\"段数据获取失败 bug。_collect_ipo_data() 补回 queue_detail/queue_status_detail/source_date 3 个 key，修时区 bug。本版本同时合并 v2.0.5（ai.txt 日期头校验）/v2.0.6（要闻禁列指数）/v2.0.7（ai.txt 写入指令+完整 bug 链）3 个历史修复到一次发布。详见 SKILL.md v2.0.8 Changelog。\n\nv2.0.4 | 2026-06-04T10:40:29.555Z | user\n\n修复 hermes 注册表目录 (a-stock-report) 与 SKILL.md / cron 配置 (A-stock-report) 大小写不匹配导致自动加载 skill 失败的问题。SKILL.md version 2.0.3 → 2.0.4 (patch, bug fix)。建议在用户机器上手动将 hermes 目录重命名为 A-stock-report 以彻底统一。\n\nv2.0.3 | 2026-06-02T14:15:51.081Z | auto\n\nv2.0.3 — 锁机制系统化升级\n\n- 全新引入 scripts/_lock.py，统一6个核心脚本的进程锁实现。\n- 新锁具备 PID 活性检测、TTL（默认1小时）过期自动清理和 stale 锁抢占能力。\n- 优化锁文件结构（PID/owner/timestamp 三行），允许异常退出后自动恢复，彻底解决死锁/锁残留问题。\n- 所有脚本防并发锁行为一致，支持强制抢占 stale 锁，提升自动化健壮性。\n- send_morning_report.py 的去重锁实现不变，继续作为业务级文件锁。\n\nv2.0.2 | 2026-06-01T15:29:13.959Z | user\n\nv2.0.2 (2026-06-01): 补全6/1报告修复 — 问财字段名兼容 + 单行数据直接采纳 + 主力净流入日期归一化\n\nv2.0.1 | 2026-05-31T16:14:38.891Z | auto\n\n**Minor update with cleanup and maintenance:**\n\n- Removed obsolete file: `skill-card.md`\n- Updated `SKILL.md` documentation (changelog, instructions, and script/config alignment)\n- Minor adjustments in `send_weekend_news.py` (details not specified)\n- No functional changes to core features or user-facing workflows\n\nv1.10.5 | 2026-05-31T16:12:19.470Z | auto\n\na-stock-report v1.10.5\n\n- Updated documentation in SKILL.md; removed outdated skill-card.md file.\n- Minor code or comment adjustments in scripts/send_weekend_news.py to align with documentation.\n- No changes to main logic or report functionality.\n\nv2.0.0 | 2026-05-30T10:23:56.796Z | user\n\nv2.0.0 架构重构：晚报拆分为采集层+推送层，问财权限白名单精确化，数据源更新为akshare，白名单表去重修正\n\nv1.10.4 | 2026-05-24T05:20:12.587Z | user\n\nfix: 修正周末要闻搜索范围和标题日期\n\nv1.10.3 | 2026-05-23T12:50:23.425Z | user\n\n修复周末要闻情绪轨迹趋势线：强制显示当前自然周（周一至周五），缺失数据标注「？」或「（未报）」，不再跨周拼接数据。\n\nv1.10.2 | 2026-05-23T09:34:06.761Z | user\n\n周末要闻时间窗口由'过去48-72小时'改为'过去48小时'\n\nv1.10.1 | 2026-05-23T08:04:08.901Z | user\n\n修复时区比较冲突：_next_start_ts/_next_end_ts 改用 tz-naive，兼容 review[上会日期] 的 datetime64[s] 类型\n\nv1.10.0 | 2026-05-23T07:50:38.707Z | user\n\n优化新股上市数据源：合并同花顺接口调用，移除证监会CNINFO依赖。删除stock_new_ipo_cninfo调用和_fetch_first_day_gains辅助函数，recent_l数据从同花顺stock_xgsr_ths一次性获取（上市日期+发行价+首日涨跌幅），减少1次API调用。\n\nv1.8.6 | 2026-05-22T12:26:24.819Z | auto\n\nVersion 1.8.6\n\n- 修正东方财富主力净流入接口查询逻辑：由“取同一日期多行净流入最大者”改为“按日期降序取第一行，要求 BONDTYPE=‘A股’”。\n- 文档数据源说明同步更新，确保和脚本一致。\n\nv1.8.5 | 2026-05-22T11:02:57.961Z | user\n\n1.统一--date参数格式为YYYY-MM-DD; 2.更新IF期货基差数据源描述(新浪优先+AKShare兜底); 3.更新文档示例\n\nv1.8.4 | 2026-05-22T06:08:31.576Z | user\n\n修复SKILL.md中晨报锁文件路径描述错误：从/workspace/data/a_stock_morning.lock更正为scripts/.morning_report_lock.json\n\nv1.8.2 | 2026-05-22T00:53:28.580Z | user\n\n晨报脚本严重bug：缺失4个变量+read_lock函数导致NameError无法运行；修复并完善异常处理\n\nv1.8.1 | 2026-05-21T16:33:32.532Z | user\n\n修复晚报脚本2个运行时bug\n\nv1.8.0 | 2026-05-21T11:44:43.076Z | auto\n\nVersion 1.8.0\n\n- Updated documentation in SKILL.md for improved clarity and details regarding configuration and task scheduling.\n- Incremented version number in metadata to 1.8.0.\n\nv1.7.0 | 2026-05-21T10:43:00.355Z | auto\n\na-stock-report 1.7.0\n\n- 更新版本号至 1.7.0\n- 补充或调整 SKILL.md 文档内容（主要为文档维护，无功能变更）\n- 其余功能与上版本一致\n\nv1.6.0 | 2026-05-21T10:38:18.563Z | auto\n\nVersion 1.6.0 introduces a major refactor of data sources and configuration management:\n\n- 切换核心数据引擎为同花顺问财，行情与情绪数据全面迁移；去除对腾讯行情、AKShare等多数据源的直接依赖。\n- 所有环境密钥、API Key 统一收敛至 `.env` 文件自动加载，简化环境变量和配置管理流程。\n- 精简目录结构和脚本：移除多余的通用工具和部分历史脚本。\n- Cron/定时任务配置和报告流程优化，cron 表达式与实际运行时间一一对照，文档全新梳理。\n- 更新所有报告模板、格式细节、依赖检查与配置流程说明，确保部署一键化。\n\nv1.5.1 | 2026-05-20T06:41:10.916Z | user\n\nv1.5.1: 清理调试/一次性脚本，从34个文件精简为14个，删除11个废弃文件\n\nv1.5.0 | 2026-05-19T15:33:23.964Z | user\n\nv1.5.0: 更新情绪打分阈值与计算逻辑；主力净流入改用datacenter.eastmoney；10年国债改用bond_china_yield；日报脚本安全配置完善\n\nv1.4.0 | 2026-05-15T15:50:47.756Z | user\n\nv1.4.0: 删除send_close_summary.py中的tushare依赖，纯akshare化；所有脚本不再依赖TUSHARE_TOKEN；更新SKILL.md数据源说明\n\nv1.3.1 | 2026-05-14T02:56:17.374Z | user\n\n同步工作区脚本：修复晚报/收盘小结 delivery 冲突，盘中预警时段严格按A股集合竞价规则（9:15-9:25开盘，11:30-12:59休市，15:00收盘）\n\nv1.3.0 | 2026-04-28T15:06:50.533Z | user\n\nv1.3.0: 修复交易时段判断边界（9:30-11:29, 13:00-14:59）；cron prompt 精简为直接运行脚本（收盘小结）；timeoutSeconds 统一改为 0；文档更新收盘小结触发时间 15:30、周末要闻周日 20:00；更新盘中预警时段说明。\n\nv1.2.3 | 2026-04-25T09:33:36.675Z | user\n\nv1.2.3: 修复IPO周报去重逻辑（cron路径大小写+dedup改用执行日期）；补发清明周旧报告\n\nv1.2.2 | 2026-04-25T03:39:17.546Z | user\n\nv1.2.2: 炸板率公式修正为akshare炸板池/涨停池接口；申万行业解析修复（JS变量→JSON格式）；主力净流入改用东方财富数据中心API直连；修复get_close_data.py日期硬编码bug\n\nv1.2.1 | 2026-04-25T02:48:33.586Z | user\n\nv1.2.1: 修复数据源接口，新增同花顺/Tushare多源支持\n\nv1.1.0 | 2026-04-10T10:05:30.116Z | user\n\n晚报新增股市风险溢价+沪深300PE分位；两融公式修正；三所成交额加总\n\nv1.2.0 | 2026-04-10T10:04:09.977Z | user\n\n1.2.0: 新增股市风险溢价(1/PE-国债)+沪深300PE分位，晚报模板更新，数据验证正确\n\nv1.0.6 | 2026-04-10T09:14:25.918Z | user\n\n1.0.6: 晚报市场风险偏好新增股市风险溢价及沪深300PE分位\n\nv1.0.5 | 2026-04-10T09:05:42.140Z | user\n\n1.0.5 - 晚报市场风险偏好新增：\n  - 股市风险溢价 = 1/中证全指PE - 10年国债收益率（阈值：<3%高估 | 3-6%中性 |>6%低估）\n  - 沪深300PE 及近5年历史分位点\n  - 数据源：腾讯qt.gtimg.cn（中证全指+沪深300 PE，field[39]）+ akshare bond_china_yield（10年国债）+ akshare stock_index_pe_lg（近5年分位）\n\nv1.0.4 | 2026-04-10T08:18:16.181Z | user\n\n1.0.4 - 市场风险偏好新增：\n• 股市风险溢价 = 1/中证全指PE - 10年国债收益率（阈值：<3%高估 | 3-6%中性 |>6%低估）\n• 沪深300PE + 近5年历史分位点\n数据源：腾讯 sh000300/sh000985 field[39] + akshare bond_china_yield\n\n1.0.3 - 修复：\n• 两融余额改为融资+融券合计\n• 全市场成交额改为沪市(亿)+深市(元÷1e8)+北交所(元÷1e8)\n• 流通市值沪市单位修正为亿元\n• 晚报模板删除情绪参考+热点板块\n• 盘中预警cron修复绑定错误\n\n1.0.2 - 初始版本\n\nv1.0.3 | 2026-04-10T04:47:35.596Z | user\n\n1.0.3 - 修复：\n- 两融余额：融资余额+融券余额（之前只取融资余额，漏掉约185亿）\n- 全市场成交额：改为沪市(亿元)+深市(元÷1e8)+北交所(元÷1e8)，三所合计\n- 流通市值：沪市单位=亿元直接使用，无需换算\n- 晚报模板：删除情绪参考+热点板块区块；精简两融比例行日期格式\n- 盘中预警cron：修复绑定错误（原绑定了晚报脚本，现改为盘中预警脚本）\n\n1.0.2 - 初始版本\n\nv1.0.2 | 2026-04-05T00:41:16.669Z | user\n\n安全修复：移除所有硬编码敏感信息，Webhook Key由keys_loader统一管理\n\nv1.0.1 | 2026-04-05T00:34:08.930Z | user\n\n安全修复：移除硬编码Webhook Key，改用keys_loader统一读取\n\nv1.0.0 | 2026-04-04T14:56:33.968Z | auto\n\nastock-report 1.0.0\n\n- 首次发布，支持自动生成与推送A股市场报告，包括晨报、晚报、收盘小结、盘中预警、财经周末要闻、A股IPO周报六大类。\n- 内置6维量化情绪打分，配五级评级，覆盖涨停数、涨跌停比、北向资金、主力净流入、两融余额、沪深300等维度。\n- 多数据源整合（AKShare、腾讯财经、网络搜索），支持Python脚本与AI工作流混合流程。\n- 跨报告统一支持企业微信Webhook长文本推送，附带详细cron定时配置建议。\n- 各报告均有模板指引，调用简便，适配股市常用自动播报和定时推送场景。\n\nArchive index:\n\nArchive v3.5.4: 24 files, 121323 bytes\n\nFiles: _meta.json (133b), cron_jobs/cron_mirror.json (3155b), cron_jobs/README.md (3297b), references/config.json (2791b), references/fallback-chain-validation.md (3388b), references/weekend-4kb-budget.md (4790b), scripts/_lock.py (2687b), scripts/_send_lib.py (3785b), scripts/_sina_fetcher.py (4854b), scripts/check_consistency.py (26473b), scripts/collect_evening_data.py (40800b), scripts/collect_morning_data.py (18113b), scripts/send_close_summary.py (32494b), scripts/send_evening_report.py (50630b), scripts/send_intraday_alert.py (7928b), scripts/send_ipo_report.py (26362b), scripts/send_morning_report.py (3920b), scripts/send_weekend_news.py (10532b), scripts/skill_dispatcher.py (14834b), skill-card.md (2883b), SKILL.md (33126b), templates/evening.json (10448b), templates/morning.json (9924b), templates/weekend.json (11525b)\n\nFile v3.5.4:SKILL.md\n\n---\nname: A-stock-report\ndescription: \"A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。\"\nversion: 3.5.4\n---\n\n# A股报告系统\n\n>A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版\n\n---\n\n## 目录结构（v3.2.3+1 起明示，v3.5.0 简化）\n\n`clawhub publish` 按 `.clawhubignore` 排除 `knowledge/` + `*.bak`（v3.4.4 立），其他整目录上传。装好后 `~/.hermes/skills/A-stock-report/` 结构：\n\n```\nA-stock-report/\n├── SKILL.md                      ← 本文件（含完整执行流程 + 14 段护栏 + changelog 索引）\n├── _meta.json\n├── .clawhubignore                ← v3.4.4 立：排除 knowledge/ + *.bak\n│\n├── 🐍 scripts/                  ← 12 个 Python 脚本 + 3 个 JSON prompt 模板\n│   ├── _lock.py / _send_lib.py  ← 共用库\n│   ├── check_consistency.py     ← 14 段一致性护栏（A~H 段）\n│   ├── skill_dispatcher.py      ← LLM 驱动型任务的 5d 数据抽取 + prompt 注入\n│   ├── collect_{morning,evening}_data.py / send_{morning,close,evening,intraday,weekend,ipo}.py\n│   ├── templates/{morning,evening,weekend}.json\n│   ├── cron_jobs/{cron_mirror.json, README.md}\n│   └── references/{config.json, fallback-chain-validation.md, weekend-4kb-budget.md}\n│\n└── 📚 knowledge/                ← changelog + 决策主题（**按需 skill_view 加载，不进默认 context**）\n    ├── changelog/                ← 按版本号组织\n    │   ├── README.md             ← 35 条 changelog 索引\n    │   └── vX.Y.Z.md             ← 单版完整细节（v3.5.0 立，19 条新加）\n    └── decisions/                ← 跨版本决策中心（按主题）\n        ├── README.md\n        ├── architecture.md       ← 架构演进\n        ├── data-pitfalls.md      ← 数据源踩坑集\n        ├── lessons-learned.md    ← 核心教训\n        ├── guardrails.md         ← 护栏规则\n        └── dispatcher-patterns.md\n```\n\n**knowledge/ 为什么保留在 publish 包但不进默认 context** (v3.4.4 改): `.clawhubignore` 排除后, **装上后无 knowledge/** — 用户需主动 `skill_view` 加载；本机开发保留完整 knowledge/ 不影响发布包大小。\n\n---\n\n## 版本历史（Changelog）\n\n> **精简规则（v3.5.0 立）**：每条 ≤ 1 行索引，详细实战/根因/修法折到 `knowledge/changelog/vX.Y.Z.md`。完整 35 条索引见 [`knowledge/changelog/README.md`](knowledge/changelog/README.md)。\n>\n> **未发版段识别**：标题含 `(未发版)` 的是当前 v3.5.0 待 bump 的小改集合。\n\n### v3.3.0 ~ v3.4.4（19 条，SKILL.md 主体）— 2026-06-11 晚 ~ 2026-06-16\n\n- [v3.5.1 — send_evening_report.py 加 5 项内容质量硬校验](knowledge/changelog/v3.5.1.md) — 2026-06-18 晚（未发版）\n- [v3.4.4 — 异常周（周二 cron）周末要闻端到端验证](knowledge/changelog/v3.4.4.md) — 2026-06-16（未发版）\n- [v3.3.5+5 — fallback 链选 URL 原则：主题聚合页 > 单篇头条](knowledge/changelog/v3.3.5+5.md) — 2026-06-15 20:00 晚报（未发版）\n- [v3.3.5+4 — web_search MCP 重试加固：覆盖 {\"error\": ...} 分支](knowledge/changelog/v3.3.5+4.md) — 2026-06-15 16:35（未发版）\n- [v3.3.5+3 — 周末要闻 4 KB 截断修复 + 防幻觉 + 表格化 + H 段护栏](knowledge/changelog/v3.3.5+3.md) — 2026-06-15 下午（未发版）\n- [v3.3.5+2 — 3 层 fallback 链 + 要闻段反例前置](knowledge/changelog/v3.3.5+2.md) — 2026-06-15 晨报（未发版）\n- [v3.3.5+1 — 3 templates 加 batch_web_search 失败 fallback 机制](knowledge/changelog/v3.3.5+1.md) — 2026-06-13 晚（未发版）\n- [v3.3.5 — 晨报渲染细节对齐 6/12 周五样本 + 删 v3.3.4 过头加固](knowledge/changelog/v3.3.5.md) — 2026-06-13 下午\n- [v3.3.4 — 晨报过头加固（已废）](knowledge/changelog/v3.3.4.md) — 2026-06-13 凌晨\n- [v3.3.3 — 尝试加固晨报，未生效，无代码变更](knowledge/changelog/v3.3.3.md) — 2026-06-12 晚\n- [v3.3.2 — 模板约束一体化 + check 段 H 护栏](knowledge/changelog/v3.3.2.md) — 2026-06-12 晚\n- [v3.3.1 — 晚报可读性修复：财经要闻 1 空行 + 依据 ≤ 50 字符](knowledge/changelog/v3.3.1.md) — 2026-06-11 深夜\n- [v3.3.0 — 财经要闻段\"任务定位\"协议：防\"盘面数据\"冒充\"要闻\"](knowledge/changelog/v3.3.0.md) — 2026-06-11 晚\n- [v3.2.9 — 3 个 dispatcher 任务 skills 字段清理](knowledge/changelog/v3.2.9.md) — 2026-06-11 下午\n- [v3.2.8 — 收盘小结格式对齐：4 处拼接 bug](knowledge/changelog/v3.2.8.md) — 2026-06-11\n- [v3.2.7 — .env 路径根除：8 脚本多路径回退](knowledge/changelog/v3.2.7.md) — 2026-06-10 下午\n- [v3.2.6 — 双副本根除 + jobs.json 隐藏运行时副本修复](knowledge/changelog/v3.2.6.md) — 2026-06-10 上午\n- [v3.2.5 — 盘中预警 cron prompt 纯 bash 化](knowledge/changelog/v3.2.5.md) — 2026-06-09 深夜\n- [v3.2.4 — 文档补全：明示 knowledge/ 被 clawhub publish 上传](knowledge/changelog/v3.2.4.md) — 2026-06-09 晚\n- [v3.2.3 — send_ipo_report.py 迁移到 _send_lib 共用库](knowledge/changelog/v3.2.3.md) — 2026-06-09 晚\n\n### 历史版本（v3.2.2 ~ v3.0.0，11 条 + v2.0.0 ~ v2.0.10，11 条 = 22 条已折叠）\n\n完整索引见 [`knowledge/changelog/README.md`](knowledge/changelog/README.md) —— `vX.Y.Z.md` 22 个详情文件保留。\n\n### v3.5.0 改动（本版本 = SKILL.md 精简 + 14 段护栏加严，2026-06-16）\n\n**触发**: SKILL.md 50665 字节 / 778 行 / 15 个 skill 排名第 1, 是第 2 名 ima-skill (16KB) 的 3.2 倍. Changelog 段 13KB 占 26.3%, 违反 v3.2.0 立\"≤ 3 行 / 25 行硬上限\"规矩.\n\n**改法** (3 处):\n1. Changelog 段 19 条 v3.3.0+ ~ v3.4.4 全部折到 `knowledge/changelog/vX.Y.Z.md` 详情文件, SKILL.md 留 1 行 / 条索引\n2. `## 数据来源` (2.6KB) + `## IPO周报数据来源` (541B) 合并去重\n3. `## 目录结构` (1.7KB) 简化, 标 knowledge/ 索引外置\n4. frontmatter `version: 3.4.4` → `3.5.0` (按 MEMORY #12 \"结构变更触发 v 大版本号讨论\" 例外)\n\n**未发版小改一并 bump 到 v3.5.0** (10 条): v3.3.5+1 ~ v3.3.5+5 + v3.4.4. 教训: \"小改不刷 vX.Y.Z\" 规则容易被滥用 (10 条小改 ≥ 2 个月), v3.5.0 立硬上限 — **未发版累积 ≥ 5 条必须下个结构变更 bump 走, 不许再攒**.\n\n**MEMORY #12 立新约束**: 任何 skill 的 SKILL.md 单文件 > 30KB 必须先瘦身再发版.\n\n## 安全配置（必读）\n\n所有外部密钥均通过环境变量注入，**禁止硬编码**。路径可通过 `ENV_FILE` / `ENV_FILE_FALLBACK` 环境变量覆盖（默认从脚本自带 + 项目级 `_DEFAULT_ENV_PATH` 加载）。\n\n### 密钥白名单原则\n\n每个脚本**仅加载本任务实际需要的变量**，不得全量注入 `_DEFAULT_ENV_PATH` 所有密钥。\n\n| 脚本 | 必需密钥（与 `_REQUIRED_KEYS` 同源，v3.2.7 修复）|\n|------|---------|\n| `collect_morning_data.py` | `IWENCAI_API_KEY`（A50 期货问财查询用）|\n| `send_close_summary.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `collect_evening_data.py` | `WECOM_WEBHOOK_KEY` |\n| `send_evening_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_morning_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_intraday_alert.py` | `WECOM_WEBHOOK_KEY` |\n| `send_ipo_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_weekend_news.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n\n**问财 API 直连约定**（细节见 `## 数据来源` 段）：所有问财查询统一进程内直连 OpenAPI，**不使用 subprocess 外部调用**（避免通过 `IENV` 泄露环境变量给子进程）；消费侧必须兼容多字段名（同义词 nlp 翻译可能返回 `炸板家数` ↔ `涨停开板家数`）。\n\n### 自动推送说明\n\n配置 `WECOM_WEBHOOK_KEY` 即表示授权自动推送报告至企业微信。推送是自动化报告系统的组成部分，非人工干预。\n\n| 密钥 | 环境变量 | 最小权限 | 来源 |\n|------|---------|---------|------|\n| 企业微信 Webhook | `WECOM_WEBHOOK_KEY` | 仅发送（只写） | 微信企业版 → 应用 → Webhook |\n| 同花顺问财 API Key | `IWENCAI_API_KEY` | 只读查询 | 同花顺 i问财 SkillHub |\n\n`.env` 文件格式示例：\n```bash\nWECOM_WEBHOOK_KEY=c4a1cd60-254e-4612-b365-c701482ae98c\nIWENCAI_API_KEY=***\n```\n\n> **注意**：本 skill **只用 2 个 key**（WECOM + IWENCAI）。妙想 `MX_APIKEY` / Tushare `TUSHARE_TOKEN` 等由其他 skill（mx-data / mx-xuangu 等）使用，**不要加进 A-stock-report 的 `.env`**。\n\n---\n\n##快速开始\n\n**手动跑一个报告（运维/补跑/测试用）：**\n\n所有 6 个任务的完整命令（`source .env` + `python3 脚本路径` + 可选参数）都集中在 **`cron_jobs/cron_mirror.json` 的 `tasks.<name>.prompt` 字段**。\n\n- LLM 驱动型（晨报/晚报/财经周末版）→ `templates/<task>.json` 的 prompt 模板 + `cron_jobs/cron_mirror.json`（无对应节点，由 jobs.json 直接调 dispatcher 注入）\n- 独立脚本型（收盘小结/盘中预警/IPO 周报）→ `cron_jobs/cron_mirror.json#<task>` 节点\n\n**手动跑通用模式：**\n\n```bash\n# 1. 读 cron_mirror.json 看 prompt 字段拿到完整命令\npython3 -c \"import json; print(json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))['tasks']['close_summary']['prompt'])\"\n\n# 2. 复制粘贴该命令到终端跑（已含 source .env + python3 路径 + 默认参数）\n```\n\n**历史命令备查（v3.1.5 清理前）：** 见 git log / 备份 `/workspace/archive/SKILL_md_pre_4segs_clean_*`\n\n---\n\n## 执行模式\n\n**收盘小结、晚报、晨报** 采用不同模式：\n\n- **收盘小结**：单一 Python 脚本，内置全部逻辑（取数 → 打分 → 生成报告 → 推送），cron 直接触发，无需 LLM 生成内容。\n**晨报、晚报、周末要闻** 采用**两段式**：\n- **第一段**（cron prompt）：调用 dispatcher 生成带真实日期的 prompt，写入约定路径\n- **第二段**（同一 session）：读取 prompt 文件 → LLM 执行 → 写入内容文件 → 调用推送脚本\n\n这样 SKILL.md 中的 prompt 模板只含通用占位符，日期在运行时由 dispatcher 动态注入。\n\n---\n\n## 数据来源\n\n**总则**（v3.0+ 架构）：3 类数据源 + 4 端真相。\n\n**3 类数据源**（按密钥需求划分）：\n- **零密钥**：腾讯实时 API（`qt.gtimg.cn`） · 新浪 hq 数据（`hq.sinajs.cn`） · akshare 开源接口\n- **IWENCAI_API_KEY**：同花顺 i 问财 OpenAPI（进程内直连，无 subprocess）\n- 历史报告 MD（仅财经周末版用）：`/workspace/projects/A股报告系统/reports/`\n\n**4 端真相**（防漂移，详见 `## 定时任务` 段）：`templates/` · `cron_jobs/cron_mirror.json` · `~/.hermes/cron/jobs.json` · `SKILL.md`\n\n### 晨报数据来源（`collect_morning_data.py` + LLM 生成）\n\n| 数据 | 来源 | 接口 / 字段 | 备注 |\n|------|------|------------|------|\n| 隔夜美股 3 大指数 | 腾讯实时 API | `qt.gtimg.cn/q=usDJI,usINX,usIXIC` | 字段含 name/price/pct |\n| VIX 恐慌指数 | 新浪 hq 数据 | `hq.sinajs.cn/list=znb_VIX` | paperCode=znb_VIX，CBOE VIX 指数本身（13 字段：现价/涨跌/52 周范围）⚠️ 2026-06 新浪反爬升级：`User-Agent: Mozilla/5.0` 太短被识别为爬虫 → 403；**必须用完整浏览器 UA 字符串**（详见 `~/.hermes/skills/devops/sina-hq-sinajs-403-ua/SKILL.md`）|\n| 富时 A50 期货 | 新浪 hq 数据 | `hq.sinajs.cn/list=...A50ETF`（512550） | 偶发 HTTP 403（同 UA 原因），失败回退华夏 A50ETF；缺失按 v3.1.3 协议 `❌ 数据缺失` 占位 |\n| 港股恒生指数 | 腾讯实时 API | `qt.gtimg.cn/q=hkHSI` | 复用 get_us_indices 模式 |\n| WTI 原油 + 现货黄金 | akshare 全球期货现货 | `ak.futures.futures_hf_em.futures_global_spot_em()` | GC00Y=COMEX 黄金 / CL00Y=WTI |\n\n### 收盘小结数据来源（`send_close_summary.py` 独立脚本）\n\n| 数据 | 来源 | 接口 |\n|------|------|------|\n| 6 大指数 + 成交额 | 腾讯实时 + akshare | `qt.gtimg.cn` + `stock_zh_a_spot_em()` |\n| 涨跌停家数 / 炸板率 | 同花顺问财 | 1 次查询（`今日涨停家数 跌停家数 炸板家数`） |\n| 全市场主力净流入 | 东方财富 RPT_MARKET_CAPITALFLOW | `INDEX_CODE=\"800000.EI\"`，`BONDTYPE=\"A股\"` |\n| 行业板块涨跌 / 主力资金 | hithink-sector-selector | `今日行业板块涨幅前10` / `近5日主力净流入前10行业板块` |\n| IF 期货基差 | 新浪 nf_IF0（今日优先）+ akshare `futures_main_sina` 兜底 | `hq.sinajs.cn` |\n\n### 晚报数据来源（`collect_evening_data.py` + LLM 生成）\n\n| 数据 | 来源 | 接口 |\n|------|------|------|\n| 6 大指数 + 成交额 | 同收盘小结 | 同上 |\n| 亚太股市（日经/韩国综合） | 腾讯实时 | `qt.gtimg.cn` |\n| 两融余额 / 两融交易额 | AKShare | `macro_china_market_margin_sh/sz` |\n| 沪深300 PE / 股市风险溢价 | 同花顺问财 | 单次查询多字段 |\n| 涨跌停家数 | 同花顺问财 | 复用收盘小结模式 |\n\n### IPO 周报数据来源（`send_ipo_report.py`）\n\n| 报告模块 | 接口 | 来源 |\n|---------|------|------|\n| 一、排队情况 | `ak.stock_register_kcb/cyb/bj/sh/sz` | 东方财富注册制审核公示 |\n| 二、本周期上会 | `ak.stock_ipo_review_em` | 东方财富 IPO 审核动态 |\n| 三、本周期获批 + 四、终止撤回 | `ak.stock_ipo_declare_em` | 证监会公示 |\n| 五、下周期上会 | `ak.stock_ipo_review_em` | 东方财富 IPO 审核动态 |\n| 六、新股上市 | `ak.stock_xgsr_ths` | **同花顺**（一次调用含上市信息/发行价/首日涨跌幅） |\n\n### 财经周末版数据来源\n\n**仅复用历史报告 MD**（无新数据采集）：`/workspace/projects/A股报告系统/reports/收盘小结_YYYYMMDD.md`（情绪打分/涨停家数）+ `晚报_YYYYMMDD.md`（两融/PE/ERP）。两套以交易日 key 对齐合并，详见下表：\n\n| 指标 | 来源 MD | key 取法 |\n|------|--------|---------|\n| 涨停家数 / 情绪打分 | `收盘小结_YYYYMMDD.md` | 文件名 `YYYYMMDD` |\n| 两融余额 / 两融比例 | `晚报_YYYYMMDD.md` | 报告内两融余额行日期 |\n\n### 问财 API 兼容性约定\n\n**坑 1 — 字段名同义词（2026-06-01 经验）**：问财 OpenAPI 在 query 含同义词时 nlp 翻译可能返回**不同字段名**（如 `炸板家数` ↔ `涨停开板家数`）。**消费侧必须兼容多字段名**，避免单一字段名失效导致数据缺失。已修复 `send_close_summary.py:167`（兼容 `炸板家数` / `涨停开板家数`）。未来遇到新同义词：在所有调用问财的脚本里加兼容分支，记到此节。\n\n**坑 2 — 返回值类型不稳定（2026-06-16 经验，send_close_summary.py:78）**：\n\n问财同一字段可能**不同时刻返回不同类型**——同一 query，今天返 `float`、明天返 `str`、后天返 `int`（nlp 翻译后端不稳定）。直接 `v > 0` 比较会在 str/int/str 互换时炸：\n\n```python\n# ❌ 错误写法 — TypeError: '>' not supported between instances of 'str' and 'int'\nif \"成交额\" in k and v and v > 0:\n    val_yi = float(v) / 1e8\n```\n\n**正确写法** — 三重防御：\n\n```python\nif \"成交额\" in k and v not in (None, \"\", 0, \"0\", \"0.0\"):\n    try:\n        v_num = float(v)        # 统一强转\n    except (TypeError, ValueError):\n        continue                # 转换失败跳过，不让一个坏字段拖垮整次查询\n    if v_num > 0:               # 数值化后再比较\n        val_yi = v_num / 1e8\n        return v_num\n```\n\n**症状**：脚本异常分支 `'>' not supported between instances of 'str' and 'int'` → fallthrough 到兜底 → 兜底值 0 → 报告显示 `全市场成交额：0亿`。\n\n**检测套路**（写消费代码时）：\n- 任何 iwencai 字段的 `if v > 0` / `if v < x` / `if v == y` 都视为**潜在 bug**\n- 修法模板：`v not in (None, \"\", 0) → try float(v) → 转换失败 continue → 数值比较`\n\n**已修样本**：`send_close_summary.py:78` (commit `pre_20260616_turnover_typecompare.bak`)\n\n---\n\n## 文件名日期规则\n\n| 报告 | 文件名日期取值 |\n|------|--------------|\n| 收盘小结 | `--date` 参数值；无参数则取当天 |\n| 晚报 | `--date` 参数值；无参数则取当天 |\n| 晨报 | 生成当天 |\n| 财经周末要闻 | 生成当天 |\n\n> **注意**：晚报内容里的两融余额标注日期（如\"两融余额（04月13日）\"）是数据对应的上一交易日，与文件名日期可能差1天。\n\n---\n\n## 周末要闻情绪轨迹数据来源\n\n一周情绪轨迹从历史报告MD文件中提取，合并规则：\n\n| 指标 | 来源 | key取法 |\n|------|------|--------|\n| 涨停家数/情绪打分 | 收盘小结 `收盘小结_YYYYMMDD.md` | 从文件名提取 `YYYYMMDD` |\n| 两融余额/两融比例 | 晚报 `晚报_YYYYMMDD.md` | 从**报告内容**里两融余额行提取日期作为 key |\n\n两套数据以交易日 key 对齐合并，保证周一到周五趋势线一致。\n\n---\n\n## 防并发锁\n\n各脚本使用独立的锁文件，同时运行互不干扰：\n\n| 脚本 | 锁文件 |\n|------|--------|\n| `send_close_summary.py` | `/tmp/a_stock_close_summary.lock` |\n| `send_evening_report.py` | `/tmp/a_stock_evening.lock` |\n| `send_morning_report.py` | `/tmp/a_stock_morning.lock` |\n| `send_weekend_news.py` | `/tmp/a_stock_weekend.lock` |\n| `send_ipo_report.py` | `/tmp/a_stock_ipo.lock` |\n| `send_intraday_alert.py` | `/tmp/a_stock_intraday.lock` |\n\n**锁残留检测（v2.0.1 起）：** 脚本有 `finally: _unlock()` 兜底，正常退出一定会释放。**若锁文件残留**：\n1. 排查推送阶段异常日志（`wx()` 返回非 0 / 信号中断 / 网络超时）\n2. 确认无进程在跑（`ps -ef | grep send_close`）后，手动 `rm /tmp/a_stock_close_summary.lock`\n3. 残留超过 1 小时不重跑需要介入，避免重复推送\n\n---\n\n## 报告模板\n\n### 晨报\n\n```\n📰 【股市晨报】YYYY年MM月DD日（周X）\n\n━━━ 隔夜全球市场 ━━━\n【美股收盘】\n▪ 道琼斯：XXXXX.XX点，+X.XX%（精确数字，不得用\"约\"）\n▪ 标普500：XXXXX.XX点，+X.XX%\n▪ 纳斯达克：XXXXX.XX点，+X.XX%（可附\"X连涨/连跌X日\"）\n▪ VIX恐慌指数：XX.XX（+X.XX%），恐慌等级：【低位(<20)/中位(20-30)/高位(>30)】\n\n【港股及A50】\n▪ 恒生指数：XXXXX.XX点，+X.XX%（附简要背景）\n▪ 富时A50期货：XXXXX点，+X.XX%，偏强/偏弱运行【预判A股明日开盘】\n\n【大宗商品】\n▪ WTI原油：XXX.XX美元/桶，+X.XX%（精确数字，不得用\"约\"）\n▪ 现货黄金：XXXX.XX美元/盎司，+X.XX%（精确数字）\n\n━━━ 财经要闻 ━━━\n【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（简洁分析，≤50字）\n【2】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（≤50字）\n（**≤7条**，顺序编号，每条格式固定：\n  【编号】（标题）｜✅/❌/⚠️标签 对A股影响\n  点评：（事件+分析，≤50字））\n\n━━━ 今日操作建议 ━━━\n【大盘研判】\n（综合外围市场、宏观政策、量能等因素，给出2-3句综合判断）\n\n【操作建议】\n1. 【板块/策略】（期限）：具体建议+附标的\n2. 【板块/策略】（期限）：...\n\n【风险提示】\n⚠️ （1-3条，最重要的风险）\n\n⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\n```\n\n### 收盘小结\n\n> **模板由 `send_close_summary.py` 脚本内置拼装**（`build_report()` 函数 f-string，L562+）—— SKILL.md 不再重复维护。改格式请直接改脚本。\n>\n> **协议说明**：\n> - 6 段固定框架：①主要股指表现 ②板块行情 ③全市场主力资金 ④行业主力资金流 ⑤量化情绪打分 ⑥后市展望 + 数据来源落款\n> - 量化情绪打分（满分 100，6 因子等权平均）：\n>   - 涨停家数（10~100 家映射）\n>   - 涨跌停比（对数插值）\n>   - 炸板率（40%~10% 映射，越低越好）\n>   - 主力净流入占比（-5%~+5% 映射）\n>   - 全市场换手率（1%~4% 映射）\n>   - IF 基差（-300~+150 点映射）\n> - 后市展望默认文本（脚本 L560）：\"市场震荡调整，风格偏向题材与成长，建议控制仓位、关注轮动节奏。\"\n\n### 晚报\n\n```\n📋 【A股晚报】YYYY年MM月DD日\n\n━━━ A股收盘 ━━━\n• 上证指数：XXXX.X，↑/↓X.XX%\n• 深证成指：XXXX.X，↑/↓X.XX%\n• 创业板指：XXXX.X，↑/↓X.XX%\n• 科创50：XXXX.X，↑/↓X.XX%\n• 沪深300：XXXX.X，↑/↓X.XX%\n• 中证500：XXXX.X，↑/↓X.XX%\n• 成交额：X.XX万亿元\n\n━━━ 亚太股市 ━━━\n• 恒生指数：XXXX，↑/↓X.XX%\n• 日经225：XXXXX，↑/↓X.XX%\n• 韩国综合：XXXX，↑/↓X.XX%\n\n━━━ 市场风险偏好 ━━━\n• 两融余额（MM月DD日）：XXXXX亿，较前日+/-XXXX亿\n• 两融余额/A股流通市值（MM月DD日）= X.XX%\n  阈值：<3%安全 | 3-3.5%预警 | ≥3.5%高危\n• 两融交易额/A股成交额（MM月DD日）= X.X%\n  阈值：<7%保守 | 7-11%中性 | >11%过热\n• 股市风险溢价（MM月DD日）= X.XX%\n  阈值：<3%高估 | 3-6%中性 |>6%低估\n• 沪深300 PE = XX.XX，近5年分位点 XX.X%\n\n━━━ 财经要闻 ━━━\n【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（≤50字）\n【2】...（**≤7条**，每条格式固定，点评≤50字）\n\n━━━ 今日操作建议 ━━━\n【大盘研判】（2-3句）\n【操作建议】\n1. 【板块/策略】（期限）：具体建议\n2. 【板块/策略】（期限）：...\n【风险提示】（1-3条）\n\n⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\n```\n\n### 财经周末版（cron 触发后 LLM 生成）\n\n```\n📰 【财经周末版】{周六日期} + {周日日期}\n\n━━━ 一周情绪轨迹（5 个交易日，来源：收盘小结 + 晚报）━━━\n\n【1. 市场短期情绪】\n• 量化情绪打分：周一XX → 周二XX → 周三XX → 周四XX → 周五XX\n\n【2. 杠杆率】\n• 两融余额（亿元）：周一X → 周二X → ... → 周五X\n• 两融余额占流通市值比例：周一X.XX% → ... → 周五X.XX%\n\n【3. 估值水平】\n• 沪深300PE：周一X.XX → ... → 周五X.XX\n• 近5年分位点：周一X.X% → ... → 周五X.X%\n• 股市风险溢价（ERP）：周一X.XX% → ... → 周五X.XX%\n\n【4. 市场预期】\n• IF基差：周一X.XX → ... → 周五X.XX\n\n【5. 一周市场解读】\n{不超过50字，综合市场情绪/杠杆/估值/预期 4 个维度的一句话总结}\n\n━━━ 数据规则（防错）━━━\n数据源 + ❌/⚠️ 硬约束在模板顶部\"2. 数据源\"段统一定义（v3.3.0 + v3.1.3 合并版），不在此处重复\n\n━━━ 整体市场情绪研判 ━━━\n情绪指标总结 | 核心驱动因素 | 当前风险点 | 下周操作参考\n\n⚠️ 仅供参考，不构成投资建议。\n```\n\n---\n\n## 定时任务（cron）\n\n7 个 cron 任务（A 股 6 任务 + 每周 Skill 复盘 1 任务）的完整 schedule / repeat / deliver / prompt 字段集中在以下两处真相源：\n\n- **生产配置（OpenClaw 读）**：`~/.hermes/cron/jobs.json`\n- **人类可读镜像（git track）**：`cron_jobs/cron_mirror.json`\n\n**SKILL.md 不再重复列 cron 表达式**（v3.1.5 清理）—— 一处变→多处忘改是 v3.0 之前的痛点。\n\n**快速概览：**\n\n| 任务 | 调度 | 类型 |\n|------|------|------|\n| A股晨报生成并推送 | 周一至五 08:00 | LLM 驱动型（template: `templates/morning.json`） |\n| A股晚报生成并推送 | 周一至五 20:00 | LLM 驱动型（template: `templates/evening.json`） |\n| A股收盘小结 | 周一至五 15:30 | 独立脚本（mirror: `close_summary`） |\n| A股盘中预警 | 周一至五 09:00-14:55 每 5 分钟 | 独立脚本（mirror: `intraday`） |\n| A股周末要闻生成并推送 | 周日 20:00 | LLM 驱动型（template: `templates/weekend.json`） |\n| 每周 Skill 复盘 | 周日 18:00 | skill 自审 |\n| A股IPO周报 | 周六 10:00 | 独立脚本（mirror: `ipo_report`） |\n\n---\n\n\n## 安装与验证\n\n配置完 cron 后，按以下顺序逐一检查：\n\n### Step 1：密钥检查\n\n权威密钥白名单表在 `## 密钥白名单原则` 段（每个脚本需哪些 env 变量）。\n\n**快速检查 2 个 env 变量是否就位：**\n\n```bash\n# 应输出 2 行非空（本 skill 只需 2 个 key）\nfor key in WECOM_WEBHOOK_KEY IWENCAI_API_KEY; do\n  grep \"^${key}=\" /workspace/.env && echo \"  ✅ $key\"\ndone\n```\n\n**未配齐会怎样：** 脚本在 except 块内捕获缺失，会 `notify_failure()` 发预警 + exit 1（v3.1.0 修复链），不会静默继续。\n\n> **注意**：`send_evening_report.py` 的\"财经要闻\"和\"明日操作建议\"两个区块**依赖 cron 中的 LLM 步骤生成**，不是脚本自己能产出的。若未配置对应 cron task，这两个区块**永远为空**，这是设计预期，不是 bug。\n\n### Step 2：依赖检查\n\n```bash\n# 检查 akshare\npython3 -c \"import akshare; print('akshare', akshare.__version__)\"\n\n# 检查 tushare（IPO周报需要）\npython3 -c \"import tushare; print('tushare OK')\"\n\n# 检查 hithink-sector-selector CLI\npython3 /workspace/skills/hithink-sector-selector/scripts/cli.py --help | head -3\n```\n\n### Step 3：Cron 任务检查\n\n跑护栏脚本一次性验证 4 端一致性（templates ↔ cron_mirror ↔ jobs.json ↔ SKILL.md）：\n\n```bash\npython3 /root/.hermes/skills/A-stock-report/scripts/check_consistency.py\n# 预期：✅ 全部 4/4 项通过，exit=0\n```\n\n**不要再用\"❌手对表\"逐行核对**——v3.1.5 之前 SKILL.md 这里有 7 行\"应存在 ✅\"表，靠人记得跑 1 个命令 + 7 行眼睛对——v3.1.5 改用护栏脚本机械检查，杜绝漂移。\n\n\n---\n\n## Cron 任务配置指引\n\n6 个任务分两类：\n\n- **LLM 驱动型（3 个）**：晨报 / 晚报 / 财经周末版 — prompt 外置于 `templates/`，由 `scripts/skill_dispatcher.py` 读取注入 LLM，LLM 解读后调脚本落地推送。\n- **独立脚本型（3 个）**：收盘小结 / **盘中预警** / IPO 周报 — 无需 LLM，调度配置外置于 `cron_jobs/`，由 OpenClaw gateway 直接 `source .env && python3 ...` 跑脚本。盘中预警为每 5 分钟一次高频任务（必须无 LLM 介入）。\n\n> **为什么用文件中转（LLM 型）？** cron prompt 在独立 session 运行，无法直接将变量传给后续脚本。通过写入约定路径的文件，脚本读取后注入报告模板，实现解耦。\n\n> **🛡️ 4 端一致性护栏（v3.1.5+）**：本 skill 有 4 端真相 — `templates/`（LLM 调度模板，机器读） / `cron_jobs/cron_mirror.json`（生产 cron 镜像，人读） / `~/.hermes/cron/jobs.json`（生产 cron 真实配置，OpenClaw 读） / `SKILL.md`（文档）。改任何一端都可能造成幽灵模板（v3.1.3 的教训）。**修改以下任一文件后必须跑 `python3 scripts/check_consistency.py`**（exit 0=全过，exit 1=有错误）：\n> - `templates/*.json`（3 个 LLM 任务 prompt）\n> - `cron_jobs/cron_mirror.json`（3 个独立脚本任务）\n> - `~/.hermes/cron/jobs.json` 中 3 个独立脚本任务的 prompt\n> - SKILL.md 任务清单段（`### N. 任务名（详见 ...）` 格式）\n>\n| 报错时用 `--fix-hint` 看修复建议。脚本会检查 A) templates ↔ dispatcher 任务集、B) cron_mirror ↔ jobs.json prompt 字字一致、C) SKILL.md 引用真实存在、D) dispatcher 任务不在 mirror 出现、E) SKILL.md 主体无硬编码 cron 表达式 / .env 路径 / source+send 一行命令（v3.1.6+ E 段）。\n\n### 1. 晨报（详见 templates/morning.json）\n\n> Prompt 模板外置于 `templates/morning.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 2. 收盘小结（详见 cron_jobs/cron_mirror.json#close_summary）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，close_summary 为 `tasks.close_summary` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。\n\n### 3. 晚报（详见 templates/evening.json）\n\n> Prompt 模板外置于 `templates/evening.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 4. 盘中预警（详见 cron_jobs/cron_mirror.json#intraday）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，intraday 为 `tasks.intraday` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。**v3.1.3 之前该任务的模板曾错误地放在 `templates/intraday.json`（LLM 驱动型设计），但实际 cron 早已是独立脚本模式**；v3.1.3 已删除幽灵模板、归档到 cron_jobs/。\n\n### 5. 财经周末版（详见 templates/weekend.json）\n\n> Prompt 模板外置于 `templates/weekend.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 6. IPO周报（详见 cron_jobs/cron_mirror.json#ipo_report）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，ipo_report 为 `tasks.ipo_report` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。\n\n### 验证 3：端到端 cron 验证\n\n实际 cron 跑过后，检查：\n1. 推送消息中\"财经要闻\"和\"明日操作建议\"区块是否有内容\n2. 内容日期是否与当天日期一致\n3. 报告文件名是否为当天日期\n\n若发现为空，回到\"验证 2\"确认内容文件是否成功写入。\n\n## 常见问题\n\n**Q1：生成后如何做质量检查？**\nA：生成报告后必须检查以下四项：\n1. **日期检查**：报告第一行日期 == 文件名日期 == 当天实际日期（三者必须一致）\n2. **星期检查**：报告中的日期字符串（`YYYY年MM月DD日（周X）`）与文件名中的日期 `weekday()` 对应周一～周五正确\n3. **数据完整性**：\n   - 收盘小结：指数行情、情绪打分、板块资金流、风险偏好、操作建议五段落齐全\n   - 晨报/晚报：涨跌停统计、风险偏好、操作建议三段落齐全\n4. **时效性**：数据陈旧（>2个交易日）时在报告内注明\n\n**Q2：如何判断涨停情绪？**\nA：涨停情绪由第4节打分函数统一评分（满仓风险系数 × 涨停家数权重 + 涨跌停比 × 炸板率综合得出 0-100 分），不再单独使用 emoji 分级。报告生成后通过\"质量检查第3项\"确认段落齐全即可。\n- 参考：情绪总分 ≥ 70 → 🟢做多；≥ 55 → 🟡偏多；≥ 40 → ⚪分歧；≥ 25 → 🟠偏空；< 25 → 🔴冰点\n\n**Q3：炸板率如何评分？**\nA：炸板率由第4节打分函数中的 `_sc(exp_rate, 40, 10)` 公式映射到 0-100 分，阈值区间 [40%, 10%]，炸板率越低得分越高。\n- 参考：情绪总分 ≥ 70 → 🟢做多；≥ 55 → 🟡偏多；≥ 40 → ⚪分歧；≥ 25 → 🟠偏空；< 25 → 🔴冰点\n\n**Q4：两融数据比当天少一天？**\nA：正常现象。两融数据在当天收盘后约 1～2 小时后更新，晚报/收盘小结取到的是上一交易日数据。\n\n**Q5：主力净流入 > 500亿时显示什么？**\nA：打印预警信息 `⚠️ 主力净流出-XXX亿，超大单+大单砸盘XXX亿，异常大额出逃，注意风险`，但保留真实数值（不重置为0）。\n\n**Q6：定时任务重复推送？**\nA：已内置文件锁机制的脚本会拒绝并发执行。当前各脚本锁机制如下：\n- 晚报：`send_evening_report.py` → `/tmp/a_stock_evening.lock`（exists 检测 + sys.exit(0)，finally 解锁）\n- 盘中预警：`send_intraday_alert.py` → `/tmp/a_stock_intraday.lock`（同上）\n- 周末要闻：`send_weekend_news.py` → `/tmp/a_stock_weekend.lock`（同上）\n- IPO周报：`send_ipo_report.py` → `/tmp/a_stock_ipo.lock`（原子 os.O_EXCL 创建，更严格，finally 解锁）\n- 晨报：`send_morning_report.py` → `/root/.hermes/skills/A-stock-report/scripts/.morning_report_lock.json`（JSON 文件，内容含 `date` 和 `status`，检查当日是否已成功推送后才允许重复执行）\n\n**Q7：报告内容日期和文件名不对应？**\nA：收盘小结文件名=报告日期；晚报文件名=生成当天日期，内容日期=上一交易日；周末要闻以内容里两融余额标注的日期为 key，与收盘小结文件名日期对齐合并。\n\n**Q8：如何使用 `--date` 指定历史日期？**\nA：收盘小结和晚报均支持 `--date YYYY-MM-DD`，如 `python3 send_close_summary.py --date 2026-04-13`。晨报不支持指定历史日期。\n\nFile v3.5.4:cron_jobs/README.md\n\n# cron_jobs/ — 生产 cron 任务的人类可读镜像\n\n## ⚠️ 重要：本目录文件**不被任何代码读取**\n\n`cron_jobs/cron_mirror.json` 是 `~/.hermes/cron/jobs.json` 里**独立脚本型 cron 任务的人类可读副本**。\n\n- **不被 `skill_dispatcher.py` 读取**（dispatcher 只读 `templates/*.json`）\n- **不被 OpenClaw cron 直接读取**（OpenClaw 只读 `~/.hermes/cron/jobs.json`）\n- 作用是**给 AI / 用户审计**：\"A 股 3 个独立脚本任务在生产 cron 里到底是怎么配的\"\n\n## 文件清单\n\n| 文件 | 作用 |\n|------|------|\n| `cron_mirror.json` | **唯一镜像文件**，内含 3 任务（close_summary/intraday/ipo_report）|\n| `README.md` | 本文件 |\n\nv3.1.4 起 3 镜像合为单文件，强制一致，避免之前\"改一处忘改别处\"的纪律性 bug。\n\n## 4 端真相分布\n\n| 维度 | 在哪里 | 角色 |\n|------|--------|------|\n| **LLM 调度模板** | `templates/{morning,evening,weekend}.json` | 被 `skill_dispatcher.py` 读取 |\n| **生产 cron 真实配置** | `~/.hermes/cron/jobs.json` | 被 OpenClaw 读取并定时触发 |\n| **本目录归档镜像** | `cron_jobs/cron_mirror.json` | **人类审计用**，内含 3 任务镜像，prompt 字段与 jobs.json 一字不差 |\n| **SKILL.md 文档** | `SKILL.md` 任务清单段 | 文档层说明 |\n\n## 单文件结构\n\n```json\n{\n  \"_meta\": { \"purpose\": \"...\", \"mirror_of\": \"...\", \"version\": \"...\", \"history\": \"...\", \"see_also\": \"...\" },\n  \"tasks\": {\n    \"close_summary\": { \"name\": \"A股收盘小结\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"intraday\":      { \"name\": \"A股盘中预警\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"ipo_report\":    { \"name\": \"A股IPO周报\", \"schedule\": \"...\", \"prompt\": \"...\", ... }\n  }\n}\n```\n\n任务键名（close_summary/intraday/ipo_report）= 文件名时代的标识，跟历史档案一致。\n\n## 维护纪律\n\n**修改 `jobs.json` 里的 prompt 时，必须同步修改 `cron_jobs/cron_mirror.json` 中对应任务**，保证镜像与生产一致。\n\n**🛡️ v3.1.5+ 推荐用护栏脚本一次性检查 4 端一致性**（templates ↔ cron_mirror ↔ jobs.json ↔ SKILL.md）：\n\n```bash\npython3 /root/.hermes/skills/A-stock-report/scripts/check_consistency.py\n# exit 0=全过，1=有错误\n# 加 --verbose 看每条 ✅，加 --fix-hint 看修复建议\n```\n\n**legacy 一行命令**（仅检查镜像与 jobs.json 的 prompt 一致性，v3.1.4 时代的命令，v3.1.5 起推荐上面那个）：\n\n```bash\npython3 -c \"\nimport json\njobs = json.load(open('/root/.hermes/cron/jobs.json'))\nmirror = json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))\nm = {'A股收盘小结':'close_summary','A股盘中预警':'intraday','A股IPO周报':'ipo_report'}\nfor j in jobs['jobs']:\n    if j['name'] in m:\n        mirror_prompt = mirror['tasks'][m[j['name']]]['prompt']\n        print(j['name'], j['prompt'] == mirror_prompt)\n\"\n```\n\n## 历史\n\n- **v3.1.4 (2026-06-09)**: 合井 3 文件为 `cron_mirror.json`（67 行 / 2.6KB），README 同步更新\n- **v3.1.3 (2026-06-09)**: 新建 `cron_jobs/intraday.json` 镜像（v3.0~v3.1.2 期间已存在 close_summary/ipo_report 镜像）\n- **备份位置**: `/workspace/archive/cron_jobs_3split_20260609_1952.bak/`（v3.1.4 前 3 文件的完整备份）\n\nFile v3.5.4:_meta.json\n\n{\n  \"ownerId\": \"kn7b60cvvedv8jkxs5gy3m9c0d837e9f\",\n  \"slug\": \"a-stock-report\",\n  \"version\": \"3.5.4\",\n  \"publishedAt\": 1781934050226\n}\n\nFile v3.5.4:references/config.json\n\n{\n  \"_note\": \"本文件为历史参考（2026-04-04 快照）。当前真相请看：\\n  - cron_jobs/cron_mirror.json（独立脚本任务真相）\\n  - templates/*.json（LLM 驱动型任务 prompt 真相）\\n  - scripts/_send_lib.py（推送共用库，看 get_webhook_url() 实现）\\n  - ~/.hermes/cron/jobs.json（实际运行的 cron 任务）\",\n  \"_deprecated\": \"v3.2.2 起，本文件不再维护。当前所有任务真相在上述 4 处。如需改 cron / prompt / 推送方式，改那 4 处，不要改本文件。\",\n\n  \"webhook_当前实现\": {\n    \"env_var\": \"WECOM_WEBHOOK_KEY\",\n    \"code\": \"scripts/_send_lib.py → get_webhook_url()\",\n    \"loaded_by\": \"每个 send 脚本头部白名单加载 .env（仅 WECOM_WEBHOOK_KEY / IWENCAI_API_KEY / TUSHARE_TOKEN）\",\n    \"历史引用\": \"/workspace/keys/keys_loader.py 已在 v3.1.0+ 弃用，所有 send 脚本改走 env 路径\"\n  },\n\n  \"推送架构（v3.1.0+）\": {\n    \"统一库\": \"scripts/_send_lib.py（原 _notify.py，v3.2.0 统一名）\",\n    \"API\": [\"get_webhook_url() — 读 WECOM_WEBHOOK_KEY env\", \"wx(text) — curl 风格推企业微信 + 自动重试\", \"notify_failure(prefix, msg) — 失败告警（v3.1.0 补丁 2：内部 try/except，不阻断主流程）\"],\n    \"退出码\": {\"0\": \"成功\", \"1\": \"数据/网络错误\", \"2\": \"推送失败\"}\n  },\n\n  \"锁机制（v2.0.3+）\": {\n    \"实现\": \"scripts/_lock.py（PID + TTL + stale 检测）\",\n    \"行为\": [\"无锁 → 创建并占用\", \"有锁 + 持有者存活 + 未超 TTL → 报错退出（避免并发）\", \"有锁 + 持有者死亡 → 自动清理并占用\", \"有锁 + 锁超时（>ttl）→ 视为 stale，清理并占用\"],\n    \"TTL\": \"默认 1 小时（ttl=3600）\",\n    \"自愈真相\": \"自愈逻辑只在 lock() 被调用时触发（被动），不是'30 分钟内自动清理'。脚本崩溃后如果没有下次 lock() 调用，锁会一直留着（5.9 天残留锁案例：6/3 晨报崩溃后到 6/9 没有任何 cron 触发 lock）。v3.2.2 文档修正，行为不变。\",\n    \"教训\": \"不要相信'30 分钟自愈'。设计意图是'TTL=1h 内不允许重复占用'，不是'自动清理'。手动 rm 仍是最快清理方式。\"\n  },\n\n  \"当前 cron 任务（v3.1.4+，权威源：cron_jobs/cron_mirror.json）\": {\n    \"独立脚本型（3 个）\": [\"close_summary: 30 7 * * 1-5 (北京时间 15:30)\", \"intraday: */5 9,10,11,13,14 * * 1-5 (盘中每 5 分钟)\", \"ipo_report: 0 2 * * 6 (周六 10:00)\"],\n    \"LLM 驱动型（3 个）\": [\"morning (晨报): dispatcher + templates/morning.json\", \"evening (晚报): dispatcher + templates/evening.json\", \"weekend (财经周末版): dispatcher + templates/weekend.json\"],\n    \"_deprecated_4_月_快照\": \"本文件 4/4 列出的'工作区整理'cron 不在当前 jobs.json，已删。\"\n  }\n}\n\nFile v3.5.4:references/fallback-chain-validation.md\n\n# Fallback Chain Validation Log\n\n## v3.3.5+2 — 3 层 fallback 链验证矩阵\n\n### 链结构（cron prompt 已注入 3 templates）\n\n```\nL1: batch_web_search (主源：财联社/新华/证券时报)\n   ↓ 失败（success=false / formatted_content=[] / {\"error\": \"...\"}）\nL2: extract_content_from_websites 抓 https://www.cls.cn/telegraph\n   ↓ 失败（JS 动态加载，curl 占位）\nL3: extract_content_from_websites 多源池（按任务类型动态选最权威 2 个）：\n   - 东方财富快讯 https://finance.eastmoney.com/news/cywjh.html（SSG 渲染 + 结构化列表）\n   - 新浪财经首页 https://finance.sina.com.cn/（含\"国际焦点\"分类）\n   - 21 经济网 https://www.21jingji.com/\n   - 中金 https://www.cnfin.com/\n```\n\n### 验证矩阵\n\n| 任务 | L1 状态 | L2 状态 | L3 使用源 | 备注 |\n|------|---------|---------|-----------|------|\n| 6/15 晨报 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富快讯 + 新浪首页 | 7 条要闻全事件型 |\n| 6/15 周末 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富 + 21jingji | 表格化输出 |\n| **6/15 晚报** | ✅ 成功（7 条要闻） | n/a | n/a | **L1 一次过，未触发 fallback** |\n\n### 6/15 晚报实跑数据（验证非 fallback 路径主流通畅）\n\n- L1 成功：`batch_web_search` 返回 20 条 organic results（10/查询 × 2 查询）\n- 主源用：`操盘必读 6/15`（mp.cnfol.com） + `证券时报 gs.html` + `新浪财经 6/15 要闻`（3 源）\n- L1 来源的多样性证明 L1 主流通畅，**fallback 仅作兜底**\n\n## ⚠️ 维护教训 — 选 fallback URL 优先用\"主题聚合页\"而非\"单篇文章\"\n\n### 6/15 晚报实跑发现（2026-06-15 20:00 cron）\n\n- 尝试抓 `https://finance.sina.com.cn/headline/2026-06-15/doc-inicmxay6762199.shtml`\n- 返回内容**完全不是 A 股要闻**——是关于美伊协议 / 原油 / 黄金的**地缘 + 大宗商品**文\n- 该 URL 是新浪\"headline\"频道下的**单篇头条文章**，主题不可预测（每天头条可能是美股/地缘/科技/财经/体育）\n- 当时 L1 已成功（20 条 organic），未强制依赖 L3 这条 URL，但若 L1+L2 失败时正好撞上\"非 A 股主题\"的头条 → fallback 也白搭\n\n### 修复指引（v3.3.5+5 起生效）\n\n- ✅ 优先用**主题聚合页**（每天 N 条要闻，主题限定财经）：\n  - 东方财富快讯 `cywjh.html` — SSG 渲染 + 结构化列表（**最稳**）\n  - 新浪财经**首页** `finance.sina.com.cn/` — 含\"国际焦点\"分类\n  - 21 经济网首页 / 中金首页\n- ❌ 避免用**单篇头条文章**（URL 含 `/doc-...shtml` 或 `/20XX-XX-XX/doc-...`）— 主题不可控\n- 当前 templates 3 个 fallback 提示段已用 `finance.sina.com.cn/`（首页）— **正确**\n- 该问题不影响当前协议（L1+L2 成功率已够高），仅作未来扩展 fallback 池时的选 URL 规范\n\n## 历史教训（v3.3.5+1 → v3.3.5+4 演进）\n\n- **L1 失败率 20%**（agent.log 35 次调用 7 次失败）→ v3.3.5+4 加 retry-once\n- **L2 失败率 100%**（cls.cn/telegraph 是 JS 动态加载）→ v3.3.5+2 改用 SSG 页\n- **L3 选 URL 原则**：聚合 > 单篇（v3.3.5+5）\n\n## 维护建议\n\n- 每次 cron 失败时检查本表更新\n- 季度审计 fallback URL 是否仍可达（curl 200/200 含内容）\n- 主题聚合页优先级：东方财富快讯 > 新浪首页 ≥ 21jingji ≥ 中金\n\nFile v3.5.4:references/weekend-4kb-budget.md\n\n# 财经周末版 4KB 字节预算实战记录（v3.4.x）\n\n**实战触发**：2026-06-16 周二 cron 实跑（异常周——本周交易日 Tue 6/9 → Mon 6/15，跳过 Sat/Sun 6/13-6/14 视为周末，5d 数据完整 7 字段）。\n\n**目标**：把 8 条要闻 + 5d 情绪表格 + 解读 + 3 个关注板块 + 免责声明塞进企业微信 webhook `msgtype=text` 的 4096 字节硬上限。\n\n## 关键发现（不是模板里写明的，是实跑摸出来的）\n\n### 1. 标题会被脚本自动覆盖\n`send_weekend_news.py` 第 187-192 行强制把首行标题改为 `📰 【财经周末要闻】{sat} - {sun}`，其中：\n- `sat = today - 1 day`\n- `sun = today`\n\n**今日（2026-06-16 周二）算出来 =** `📰 【财经周末要闻】2026年06月15日 - 2026年06月16日`（66 字节）\n\n**LLM 写的原始标题** `📰 【财经周末要闻】2026年6月14日（周日）`（57 字节）\n\n**delta = +9 字节**。LLM 排版时必须按 66 字节预占位，不能按 57 字节算余量。\n\n### 2. 注入正则不匹配 markdown 表格\n`_build_and_push_report()` 第 215 行正则：`•\\s*{label}[：:].*?(?=[\\n•])`\n\n这只匹配 `• 标签：值` 这种 bullet 写法。**如果 LLM 用 markdown 表格**（v3.4.1 立推荐的格式），注入静默跳过（`injected: 0/7`）。\n\n**含义**：表格里的 7 字段值必须由 LLM 直接从 `/tmp/_weekend_5d.json` 填入，不能指望脚本注入覆盖。脚本注入仅对传统 bullet 排版生效。\n\n### 3. 字节预算实操（3968 字节样本）\n\n| 段 | 字节占比 | 备注 |\n|---|---|---|\n| 标题 | 66 | 必占 |\n| 8 条要闻（标题+摘要+来源+空行） | ~2200 | 每条 ~275B，含 1 空行 |\n| 段标题 + 5d 表头 + 7 行 | ~900 | 表格紧凑化（周X 名缩掉、列名精简） |\n| 一周解读 | ~210 | ≤ 50 字硬约束的 ~3.5 倍，OK |\n| 段标题 + 关注板块 3 条 | ~430 | |\n| 免责声明 | ~50 | |\n\n**总 3968 + 9 标题 delta = 3977 字节** ≤ 4096，安全 ~120 字节 buffer。\n\n**踩坑样本**：第一稿 4856 字节（超 758B）→ 第二稿 4194B（仍超 98B）→ 第三稿 4121B（仍超 25B）→ 第四稿 4067B（标题 swap 后 4076B，仍卡边）→ 第五稿 3968B（**达标**）。\n\n### 4. msgtype=text 的隐性约束\n\n`wx()` 内部固定 `msgtype: text`（不是 markdown）。这意味着：\n- markdown 表格**不会渲染**，只显示为原始 `| ... |` 文本\n- 表情 ✅/❌/⚠️ 可正常显示（Emoji 不在 markdown 语法范围内）\n- 4KB 限制是**text 字段的字节长度**，不是渲染后字符数\n\n**含义**：表格只是给用户**可读性**（微信对齐显示），不是真正的 markdown 渲染。优化字节用 markdown 表格（v3.4.1 决策）依然成立。\n\n## 与模板约束的关系\n\n| 模板约束 | 字节预算约束 | 冲突时 |\n|---|---|---|\n| ≤ 1500 字 | ≤ ~3900 字节 | **字节是硬墙**（4KB 微信），字数是软目标 |\n| 6-8 条要闻 | 实测 8 条 ~2200B | 8 条安全，9 条必爆 |\n| 每条 ≤ 70 字 | 实测 ~50-60 字 ~270B | OK |\n| 关注板块 ≤ 100 字/段 | 实测 ~80 字/段 ~140B | OK |\n\n## 实战建议（下次跑 cron 时）\n\n1. **目标 ≤ 3900 字节**（不是 4096）—— 留 200B buffer 给标题 delta + 编码波动\n2. **5d 表格用紧凑列名**：`06/09` 而非 `06/09 周二`、`情绪打分` 而非 `量化情绪打分`、`两融(亿)` 而非 `两融余额(亿)`、`两融占比` 而非 `两融/流通市值`\n3. **IF 基差裸值不带\"升水/贴水\"标签**——升贴水从符号自明（+ 升水 / - 贴水）\n4. **关注板块段每条 ≤ 80 字**——3 条 = ~430B 安全\n5. **要闻段每条 ≤ 60 字摘要**——8 条 + 空行 = ~2200B\n6. **必填免责声明**（v3.3.5+3 fix 的目标）—— 50 字节不可砍\n\n## 异常周（Dragon Boat 等）日期处理\n\n2026-06-09（Tue）→ 2026-06-12（Fri）→ 2026-06-15（Mon）是 5 个交易日，6/13-6/14 视为周末，**6/16 周二 cron 触发**产生\"周末\"报告。\n\n**脚本标题 swap 行为**：`sat = 6/15`, `sun = 6/16`，生成 `2026年06月15日 - 2026年06月16日` —— 视觉上不是\"周末\"日期范围但脚本不感知，按 `today-1` 硬算。\n\n**LLM 端的妥协**：把 5d 表格的日期列名按 `MM/DD` 简写（不带周X），让用户自己脑补日期对应星期。\n\n## 相关 changelog\n\n- v3.3.5+3（2026-06-15）—— 周末要闻 4KB 截断修复（字数硬约束 + 防幻觉 + 表格化）\n- v3.4.1（2026-06-15）—— 5d 数据块驱动 + markdown 表格化\n- v3.4.2（2026-06-15）—— 6-8 条放宽 + 摘要压到 1 句\n- v3.4.3（2026-06-16）—— 4 类 query 砍外围/预判段\n\n**本次实跑（2026-06-16）发现**：以上约束叠加后实际需 ≤ 3900 字节，模板未明示，列入 references 作为下次复盘参考。\n\nFile v3.5.4:skill-card.md\n\n## Description:\n\nA-stock-report automates A-share market reports and WeCom delivery for morning, market-close, evening, intraday alert, IPO weekly, and weekend finance workflows, with sentiment scoring and AI outlook sections.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[cookfish1979](https://clawhub.ai/user/cookfish1979)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and operators use this skill to collect A-share market data, generate scheduled finance reports, and deliver them to a controlled WeCom destination. It supports operational reporting and monitoring workflows, not unchecked financial decision-making.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can automatically post market reports and investment-related suggestions to WeCom.\n\nMitigation: Install only on hosts and WeCom destinations you control, review the configured cron jobs before enabling them, and keep the report disclaimer intact.\n\nRisk: Secrets are loaded from environment files and may be exposed if /workspace/.env is broadly readable or sourced into more processes than necessary.\n\nMitigation: Protect /workspace/.env with restrictive permissions, keep only the required WECOM_WEBHOOK_KEY and IWENCAI_API_KEY values available to this skill, and avoid broad .env sourcing in cron.\n\nRisk: Shared temporary handoff and lock files can create tampering or race-condition exposure on multi-user hosts.\n\nMitigation: Move handoff and lock files into a private 0700 runtime directory and use atomic creation for lock and state files.\n\nRisk: Webhook sending currently relies on a curl subprocess path.\n\nMitigation: Replace subprocess-based sending with an in-process HTTPS client before production use.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/cookfish1979/skills/a-stock-report)\n- [cron_jobs README](cron_jobs/README.md)\n- [cron_mirror.json](cron_jobs/cron_mirror.json)\n- [fallback-chain-validation](references/fallback-chain-validation.md)\n- [weekend-4kb-budget](references/weekend-4kb-budget.md)\n- [historical config reference](references/config.json)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown and text reports with JSON configuration and shell-command workflows]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Automated WeCom text delivery, scheduled cron workflows, and report files with byte-budget constraints for weekend messages.]\n\n## Skill Version(s):\n\n3.5.4 (source: frontmatter and release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v3.5.4:cron_jobs/cron_mirror.json\n\n{\n  \"_meta\": {\n    \"purpose\": \"生产 cron 任务的人类可读镜像（不被任何代码读取）\",\n    \"mirror_of\": \"~/.hermes/cron/jobs.json\",\n    \"version\": \"3.3.2\",\n    \"history\": \"v3.0~v3.1.3 期间以 3 个独立文件存在（close_summary/intraday/ipo_report），v3.1.4 合井为单文件以便强制一致。\",\n    \"see_also\": \"cron_jobs/README.md\"\n  },\n  \"tasks\": {\n    \"close_summary\": {\n      \"name\": \"A股收盘小结\",\n      \"schedule\": \"30 7 * * 1-5\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_close_summary.py\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周一至五 15:30 北京时间触发，akshare 拉收盘数据，生成收盘小结推送到 local 通道\",\n        \"depends_on\": [\n          \"send_close_summary.py\"\n        ]\n      }\n    },\n    \"intraday\": {\n      \"name\": \"A股盘中预警\",\n      \"schedule\": \"*/5 9,10,11,13,14 * * 1-5\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_intraday_alert.py 2>&1\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周一至五交易时段每 5 分钟一次（9/10/11/13/14 点整点过 5 分），腾讯财经 qt.gtimg.cn 拉 6 大指数实时涨跌幅，任一指数 ±2% 触发预警；同指数同档位每天只推一次（状态文件去重）。v3.2.5 起改为纯 bash prompt（与收盘小结/IPO 周报同款），不再触发 LLM 思考，context 占用从每天 ~50-150 KB 降至 ~1 KB。\",\n        \"depends_on\": [\n          \"send_intraday_alert.py\"\n        ],\n        \"migrated_from\": \"templates/intraday.json（v3.1.3 归档清理：模板是 LLM 驱动型设计，但实际 cron 早已是独立脚本模式，模板从未被生产加载）\",\n        \"thresholds\": {\n          \"implemented\": \"1 个：6 大指数涨跌幅 ±2%\",\n          \"designed_but_unimplemented\": [\n            \"IF 当月连续涨幅 > 1.5%（期货升水）\",\n            \"主力净流入 > 200亿元（北向/主力）\",\n            \"炸板率 > 40%（短线情绪）\"\n          ],\n          \"data_source\": \"腾讯财经 qt.gtimg.cn（脚本内硬编码）\"\n        },\n        \"note\": \"templates/intraday.json 已删除；本档案（cron_jobs/intraday.json）是该任务在 v3.0 架构下的真实配置中心。LLM dispatcher 中 intraday 任务同步移除。\"\n      }\n    },\n    \"ipo_report\": {\n      \"name\": \"A股IPO周报\",\n      \"schedule\": \"0 2 * * 6\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_ipo_report.py\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周六 10:00 北京时间触发，akshare 拉 6 个 IPO 数据接口，生成 IPO 周报推送到 local 通道\",\n        \"depends_on\": [\n          \"send_ipo_report.py\"\n        ]\n      }\n    }\n  }\n}\n\nFile v3.5.4:templates/evening.json\n\n{\n  \"prompt\": \"1. 调用晚报数据采集脚本，将结果写入约定路径：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/collect_evening_data.py\\n   \\n   采集内容：六大指数、亚太股市、两融余额、两融比例、沪深300 PE分位数、股市风险溢价（ERP）等结构化数据，输出 JSON + 晚报 Markdown。\\n\\n2. 读取采集结果文件 /tmp/evening_data.json，结合采集的晚报 Markdown，用 batch_web_search 搜索今日财经要闻（6-8条）：\\n   - \\\"A股重要财经要闻 宏观政策 2026年6月12日（周五）\\\"\\n   - \\\"A股板块异动 热点题材 2026年6月12日（周五）\\\"\\n   \\n   ⚠️ 搜索失败 fallback：若 batch_web_search 返回空（success=false / formatted_content=[]）或返回 {\\\"error\\\": \\\"调用结果不可用\\\"}（MCP server 端瞬时挂，agent.log 累计失败率 20%），\\n   **先重试 1 次**（cost 低, 23s 内自愈 — 0fbdf302145e 6/14 样本），\\n   **重试仍失败则立即改用** mcp_matrix_extract_content_from_websites 抓 https://finance.eastmoney.com/news/cywjh.html（东方财富快讯，SSG 渲染 + 结构化列表）或 https://finance.sina.com.cn/（新浪财经首页，含\\\"国际焦点\\\"）\\n   6-8 条要闻，源标\\\"财联社\\\"（fallback 兜底时按实际来源标\\\"东方财富\\\"或\\\"新浪财经\\\"，不能统一标）。不要凭模型知识补全。\\n   ⚠️ 关键要求：搜索结果必须包含具体数字，所有数据不得出现\\\"约\\\"、\\\"约XX\\\"、\\\"约XX%\\\"等模糊表述，必须填入精确值。\\n   ⚠️ 字数限制：全文不超过2000字，每条要闻点评控制在50字以内，6-8 条。\\n   ⚠️ 时间窗：过去 24 小时内（强制时间过滤、避免旧闻）。\\n   ⚠️ 范围：只保留 4 类 —— 政策事件 / 宏观数据（CPI/PPI/M2/社融/PMI）/A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）/海外市场大变动（美联储/欧央行/日央行决议/重要地缘事件/重要海外公司财报）。\\n   ⚠️ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）；按重要性排（政策 > 宏观数据 > A 股主体事件 > 海外大变动）。\\n\\n3. 【v3.1.0 协议】将 AI 生成的内容写入 /tmp/evening_report_ai.txt（注意：不是 _content.txt！）。\\n   文件必须包含两个区块，**用 [财经要闻] / [操作建议] 标记严格分割**，否则 send 脚本会硬失败（exit 1）：\\n\\n   📰 【财经晚报】[YYYY年MM月DD日（周X）]\\n   \\n   ━━━ 一、财经要闻 ━━━\\n   [财经要闻]\\n   【1】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   【2】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   ...（6-7 条要闻，顺序编号）\\n   \\n   【本段硬约束 — v3.1.0 双标记 + v3.3.0 要闻定位 + v3.3.1 空行 + 来源约束】\\n   ✅ 协议硬约束（v3.1.0 强制）：\\n     · 必须有 [财经要闻] 标记 + 至少 1 条要闻\\n     · 必须有 [操作建议] 标记 + 至少 1 条建议\\n     · 缺任一标记或对应内容为空 → send 脚本立即 SystemExit 1，晚报不会推送\\n   ❌ 财经要闻 ≠ 盘面数据/资金流向/估值数据\\n   ✅ 6-8 条要闻必须从以下 4 类中选（按重要性排）：\\n     · 政策事件（发改委/央行/财政部/证监会/ZZ 局 会议/文件、表态）\\n     · 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率 等统计局/央行发布）\\n     · A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）\\n     · 海外市场大变动（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件）\\n   ✅ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）。\\n   ❌ 禁止作为\\\"要闻\\\"标题的内容（这些是【盘后数据】，非新闻）：\\n     · 指数点位+涨跌幅（如\\\"沪指失守 4000 点跌 0.16%\\\"）\\n     · 估值/资金/成交额等单一数据指标（如\\\"两融余额 28490 亿\\\"、\\\"沪深 300 PE 13.52\\\"）\\n     · 机构策略观点（无具体新闻事件）（如\\\"短期 A 股或以震荡为主\\\"）\\n     · 亚太/美股盘面描述（只列点位涨跌幅，无具体事件）\\n   ✅ 盘后数据正确归属 = [操作建议] 段的\\\"依据\\\"（不占要闻位）\\n     例：建议\\\"控仓 5 成\\\"的依据 = 成交额 25520 亿较前日缩量（数据 → 依据）\\n   ✅ 来源约束（每条要闻必须含来源标注，缺源 = 视为 LLM 杜撰）：\\n     · \\\"｜来源：XX 媒体\\\"（新华社/财联社/证券时报/第一财经/中国证券报/上海证券报/21 世纪经济报道）\\n     · batch_web_search 结果中无对应来源的\\\"事件\\\" → 禁止写入要闻段\\n   ✅ 空行硬约束：每条要闻之间必须 1 个空行隔开（违反 = 推送失败，可读性差）\\n   ✅ 字数限制：每条点评 ≤ 50 字符 / 全文 ≤ 2000 字 / 要闻 ≤ 7 条\\n   数据缺失处理：若搜索无果，标注\\\"❌ 数据缺失\\\"或直接删掉该条，禁用\\\"约/大约\\\"等模糊词，不得凭模型知识补全。\\n   \\n   ━━━ 二、今日操作建议 ━━━\\n   [操作建议]\\n   ① 顺势而为：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符的具体数据指标 + 一句结论）\\n   ② 超跌博弈：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   ③ 控制仓位：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   \\n   【本段硬约束 — v3.3.1 依据长度 + v3.1.3 防幻觉 + 引用字段严格限定】\\n   ✅ 合规示例（30-50 字符）：\\n     ① 顺势而为：⚠️控仓 5 成以下\\n       依据：沪深 300 PE 91% 分位 + ERP 2.61% 偏高估，估值消化压力大。\\n     ② 超跌博弈：⚠️仅限科创 50 内低吸\\n       依据：科创 50 涨 0.62% 唯一收红，技术成长有结构性资金承接。\\n     ③ 控制仓位：✅高股息提至底仓 40%\\n       依据：两融余额 2.80% 占流通市值处安全区间，防御板块提供安全边际。\\n   ❌ 违规示例（120 字符超长）：\\n     依据：6/11 上证 3987.0 跌 0.16% 失守 4000 点、创业板 3811.2 跌 1.13%、深成指跌 0.68%；成交额 25520 亿较前日 26213 亿小幅缩量；沪深 300 PE 13.52 处近 5 年 91% 分位、ERP 2.61% 低于 3% 高估阈值。\\n   ✅ 可引用字段（必须从 /tmp/evening_data.json 读取真实数字）：\\n     · indices：6 大指数（上证/深成/创业板/科创50/沪深300/中证500）的 close + pct\\n     · rz_bal / rz_delta：两融余额及日变化（亿元）\\n     · rz_buy：两融交易额（亿元）—— 反映场内杠杆情绪\\n     · turnover：全市场成交额（亿元）—— 反映市场活跃度\\n     · pe_data.risk_premium：股市风险溢价% —— <3%高估/3-6%中性/>6%低估\\n     · pe_data.hs300_pe + hs300_pct5y：沪深300 PE 及近5年分位点\\n     · asia_pacific：亚太股市收盘数据\\n     · trade_date / trade_date_fmt：日期上下文\\n   ❌ 禁止编造（晚报采集脚本不输出下列数据，LLM 不得自行生成）：\\n     · 任何具体股票名称 + 涨跌幅（如\\\"贵州茅台 +3.2%\\\"）—— 未接入个股/持仓数据源\\n     · 任何具体板块涨跌幅及龙头股（如\\\"半导体板块 +5%，中芯国际涨停\\\"）—— 未接入板块行情\\n     · 任何涨停/跌停家数、封板率、炸板率、连板股等情绪指标 —— 未接入打板数据\\n     · 任何龙虎榜/北向资金/融资融券个股数据\\n     · 任何明日具体操作点位（如\\\"沪指压力位 3200 / 支撑位 3150\\\"）—— 纯 LLM 推断\\n     · 任何美股盘中数据 —— 晚报采集时美股未开盘或未收盘\\n   ⚠️ 可引用但必须 cite 来源：\\n     · 财经日历（节假日/央行政策/重大会议）—— 用 batch_web_search 当日搜索\\n     · 美股盘前/盘后期货（纳指期货、A50 期货夜盘）—— 需当日搜索结果支撑\\n     · 重大地缘政治事件 —— 需当日搜索结果支撑\\n   \\n   ━━━ 风险提示 ━━━\\n   （1-3 条，根据 rz_buy/turnover/pe_data 字段自动判断）\\n   \\n   【本段硬约束 — v3.1.3 风险提示策略（基于数据动态调整）】\\n   ✅ 两融交易额/A股成交额 比例计算公式：(rz_buy / turnover * 100)%\\n   ✅ 风险提示策略表：\\n     · 两融交易额/A股成交额 < 7%：杠杆保守，情绪偏弱 → 风险提示侧重\\\"控制仓位\\\"\\n     · 两融交易额/A股成交额 7-11%：中性 → 风险提示侧重\\\"结构性机会\\\"\\n     · 两融交易额/A股成交额 > 11%：过热 → 风险提示侧重\\\"杠杆风险\\\"\\n     · 股市风险溢价 < 3%：高估 → 风险提示侧重\\\"估值压力\\\"\\n     · 股市风险溢价 > 6%：低估 → 风险提示侧重\\\"长线机会\\\"\\n   数据缺失处理：若某字段采集失败，标注\\\"❌ 数据缺失\\\"，禁用\\\"约/大约\\\"\\n\\n【输出末尾硬约束 — 免责段】（v3.3.2 修复 · 方案 1 模式）\\n   你必须在报告**最后一行**输出以下免责段（与早报模式完全一致）：\\n\\n   ⚠️ 免责声明：仅供参考，不构成投资建议。股市有风险，投资需谨慎。\\n\\n   说明：此模板已对齐早报模式（单一控制点），免责声明由 LLM 统一生成，\\n   脚本 build_report() 不再追加。\\n\\n4. 调用晚报推送脚本完成推送：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_evening_report.py\\n   \\n   CLI flag 说明（v3.1.0）：\\n   - 默认自动加载 /tmp/evening_report_ai.txt（不需要加 flag）\\n   - --no-ai-fill：跳过加载 AI 内容（仅用于测试脚本本身，正常流程不要加）\\n   - --dry-run：生成报告 + 保存到 reports/ 目录 + 打印 stdout，**跳过企业微信推送**（用于调试 dispatcher 协议是否正确）\\n   - --date YYYY-MM-DD：指定报告目标日期（默认当天）\\n\\n5. 完成后打印 \\\"✅ 晚报\\\"\\n\"\n}\n\nFile v3.5.4:templates/morning.json\n\n{\n  \"prompt\": \"0. 【强约束 — LLM 必读】渲染晨报前必须先 cat /tmp/morning_data.json 读真实数字：\\n   cat /tmp/morning_data.json\\n   然后仅用其中真实数字填充模板占位符（XXXXX.XX = price、+X.XX% = pct、XX.XX = vix.value 等）。\\n   严禁凭模型知识/印象/历史样本自编数字（包括\\\"约\\\"、\\\"差不多\\\"、\\\"估计\\\"等），缺失字段标\\\"❌ 数据缺失\\\"。\\n   注：模板里的 XXXXX.XX 是格式示例，不是可编造的占位符。\\n\\n1. 调用晨报数据采集脚本获取结构化数据：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/collect_morning_data.py\\n   \\n   采集内容：道琼斯/标普500/纳斯达克/VIX点位涨跌幅、恒生指数/A50期货、WTI原油/现货黄金价格\\n\\n2. 读取采集结果 /tmp/morning_data.json，结合今日财经要闻，用 batch_web_search 搜索（6-10条）：\\n   - \\\"A股重要财经要闻 宏观政策 [今日日期]\\\"\\n   - \\\"A股板块异动 热点题材 [今日日期]\\\"\\n   \\n   ⚠️ 搜索失败 fallback：若 batch_web_search 返回空（success=false / formatted_content=[]）或返回 {\\\"error\\\": \\\"调用结果不可用\\\"}（MCP server 端瞬时挂，agent.log 累计失败率 20%），\\n   **先重试 1 次**（cost 低, 23s 内自愈 — 0fbdf302145e 6/14 样本），\\n   **重试仍失败则立即改用** mcp_matrix_extract_content_from_websites 抓 https://finance.eastmoney.com/news/cywjh.html（东方财富快讯，SSG 渲染 + 结构化列表）或 https://finance.sina.com.cn/（新浪财经首页，含\\\"国际焦点\\\"）\\n   6-8 条要闻，源标\\\"财联社\\\"（fallback 兜底时按实际来源标\\\"东方财富\\\"或\\\"新浪财经\\\"，不能统一标）。不要凭模型知识补全。\\n   ⚠️ 关键要求：所有数据必须为精确数字，不得出现\\\"约\\\"、\\\"约XX\\\"、\\\"约XX%\\\"等模糊表述\\n   ⚠️ 字数限制：全文不超过2000字，每条要闻点评控制在50字以内，6-8 条。\\n   ⚠️ 时间窗：过去 24 小时内（强制时间过滤、避免旧闻）。\\n   ⚠️ 范围：只保留 4 类 —— 政策事件 / 宏观数据（CPI/PPI/M2/社融/PMI）/A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）/海外市场大变动（美联储/欧央行/日央行决议/重要地缘事件/重要海外公司财报）。\\n   ⚠️ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）；按重要性排（政策 > 宏观数据 > A 股主体事件 > 海外大变动）。\\n   ⚠️ 全局数据缺失处理：任何字段采集失败 → 标\\\"❌ 数据缺失\\\"，禁用\\\"约/大约\\\"，禁止凭模型知识补全。\\n   ⚠️ 全局禁止编造（晨报采集脚本不输出，LLM 不得自行生成）：\\n     · 任何具体股票名称 + 涨跌幅 —— 未接入个股/持仓数据源\\n     · 任何具体板块涨跌幅及龙头股（\\\"半导体板块+5%，中芯国际涨停\\\"）—— 未接入板块行情\\n     · 任何 A 股指数当日点位/涨跌幅（沪指/深成指/创业板/沪深300 等）—— 采集脚本不输出\\n     · 任何成交量/成交额数字\\n     · 任何 PE/PB/风险溢价/两融/融资融券个股数据\\n     · 任何涨停/跌停家数、封板率、炸板率、连板股等情绪指标 —— 未接入打板数据\\n     · 任何龙虎榜/北向资金个股数据\\n     · 任何\\\"明日具体操作点位\\\"（\\\"沪指压力位 3200 / 支撑位 3150\\\"）—— 纯 LLM 推断\\n   ✅ 全局可引用字段（必须从 /tmp/morning_data.json 读取真实数字）：\\n     · us_indices（道指/标普/纳指 的 price + pct）\\n     · vix（value + level）\\n     · hk_a50（富时A50期货、恒生指数 的 price + pct）\\n     · commodities（现货黄金、WTI原油 的 price + pct）\\n     · report_date / trade_date（日期上下文）\\n\\n3. 将结构化数据 + 财经要闻 合并渲染为完整晨报，写入 /tmp/morning_report_content.txt\\n   格式严格遵循以下模板（约束即模板 — 每段后紧跟硬约束）：\\n\\n   📰 【股市晨报】[YYYY年MM月DD日（周X）]\\n   \\n   ━━━ 隔夜全球市场 ━━━\\n   【美股收盘】\\n   ▪ 道琼斯：XXXXX.XX点，+X.XX%\\n   ▪ 标普500：XXXXX.XX点，+X.XX%\\n   ▪ 纳斯达克：XXXXX.XX点，+X.XX%\\n   ▪ VIX 恐慌指数：XX.XX（+X.XX%），恐慌等级：【低/中/高位】（vix.level 字段）\\n\\n   【港股及A50】\\n   ▪ 恒生指数：XXXXX.XX点，+X.XX%\\n   ▪ 富时A50期货：XXXXX.XX点，+X.XX%，【预判A股今日开盘】\\n\\n   【大宗商品】\\n   ▪ WTI 原油：$XX.XX/桶，+X.XX%\\n   ▪ 现货黄金：$XXXX.XX/盎司，+X.XX%\\n   \\n   【本段硬约束 — v3.1.3 防幻觉 + 全段数据缺失处理】\\n   （见顶部全局约束）\\n   ⚠️ 可引用但必须 cite 来源：\\n     · 财经日历（节假日/交易日）—— 用 batch_web_search 当日搜索，不许凭记忆\\n     · 地缘政治事件（中东/俄乌/贸易战）—— 必须有当天日期的搜索结果支撑\\n   \\n   ━━━ 财经要闻 ━━━\\n   【1】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n\\n   【2】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ...（6-7 条要闻，顺序编号，每条格式固定）\\n   \\n   【本段硬约束 — v3.3.0 要闻定位 + v3.3.1 空行 + 来源约束 + 字数限制】\\n   ❌ 财经要闻 ≠ 盘面数据/资金流向/估值数据\\n   ✅ 6-8 条要闻必须从以下 4 类中选（按重要性排）：\\n     · 政策事件（发改委/央行/财政部/证监会/ZZ 局 会议/文件、表态）\\n     · 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率 等统计局/央行发布）\\n     · A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）\\n     · 海外市场大变动（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件）\\n   ✅ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）。\\n   ❌ 禁止作为\\\"要闻\\\"标题的内容（这些是【盘后数据】，非新闻）：\\n     · 指数点位+涨跌幅（如\\\"沪指失守 4000 点跌 0.16%\\\"）\\n     · 估值/资金/成交额等单一数据指标（如\\\"两融余额 28490 亿\\\"、\\\"沪深 300 PE 13.52\\\"）\\n     · 机构策略观点（无具体新闻事件）（如\\\"短期 A 股或以震荡为主\\\"）\\n     · 亚太/美股盘面描述（只列点位涨跌幅，无具体事件）\\n   ✅ 盘后数据正确归属 = [操作建议] 段的\\\"依据\\\"（不占要闻位）\\n     例：建议\\\"控仓 5 成\\\"的依据 = 成交额 25520 亿较前日缩量（数据 → 依据）\\n   ✅ 来源约束（每条要闻必须含来源标注，缺源 = 视为 LLM 杜撰）：\\n     · \\\"｜来源：XX 媒体\\\"（新华社/财联社/证券时报/第一财经/中国证券报/上海证券报/21 世纪经济报道）\\n     · batch_web_search 结果中无对应来源的\\\"事件\\\" → 禁止写入要闻段\\n   ✅ 空行硬约束：每条要闻之间必须 1 个空行隔开（违反 = 推送失败，可读性差）\\n   （字数限制 / 数据缺失处理 见顶部全局约束）\\n   \\n   ━━━ 今日操作建议 ━━━\\n   ① 顺势而为：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符的具体数据指标 + 一句结论）\\n   ② 超跌博弈：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   ③ 控制仓位：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   \\n   【本段硬约束 — v3.3.1 依据长度 + v3.1.3 防幻觉 + 引用字段与一、共享】\\n   ✅ 合规示例（30-50 字符）：\\n     ① 顺势而为：⚠️控仓 5 成以下\\n       依据：沪深 300 PE 91% 分位 + ERP 2.61% 偏高估，估值消化压力大。\\n     ② 超跌博弈：⚠️仅限科创 50 内低吸\\n       依据：科创 50 涨 0.62% 唯一收红，技术成长有结构性资金承接。\\n     ③ 控制仓位：✅高股息提至底仓 40%\\n       依据：两融余额 2.80% 占流通市值处安全区间，防御板块提供安全边际。\\n   ❌ 违规示例（120 字符超长）：\\n     依据：6/11 上证 3987.0 跌 0.16% 失守 4000 点、创业板 3811.2 跌 1.13%、深成指跌 0.68%；成交额 25520 亿较前日 26213 亿小幅缩量；沪深 300 PE 13.52 处近 5 年 91% 分位、ERP 2.61% 低于 3% 高估阈值。\\n   （禁止编造清单 / 可引用字段 见顶部全局约束）\\n   \\n   ━━━ 风险提示 ━━━\\n   （1-3 条，仅从以下 5 类模板中选）\\n   ① 节假日效应（如\\\"端午假期前 X 个交易日，历史资金面偏谨慎\\\"）\\n   ② 隔夜外盘异动（引用 us_indices/vix 真实数字）\\n   ③ 大宗商品异动（引用 commodities 真实数字）\\n   ④ 财经日历事件（必须有 batch_web_search 当日搜索结果支撑）\\n   ⑤ A50 期货 + 港股预判（引用 hk_a50 真实数字）\\n   \\n   【本段硬约束 — v3.1.3 风险提示 5 类模板 + 禁止自由发挥】\\n   ❌ 禁止自由发挥——只能从上面 5 类模板中选（每类一段），不得另起炉灶\\n   ✅ 每条风险提示必须有具体数据支撑（不是\\\"市场可能调整\\\"这种空话）\\n   （数据缺失处理 见顶部全局约束）\\n   \\n   ⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\\n\\n4. 调用晨报推送脚本完成推送：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_morning_report.py\\n\\n5. 完成后打印 \\\"✅ 晨报\\\"\\n\"\n}\n\nFile v3.5.4:templates/weekend.json\n\n{\n  \"prompt\": \"1. 用 batch_web_search 搜索以下内容（v3.4.3 2026/06/16 立 — 4 类查询 (经济政策/宏观数据/A 股重大事件/海外市场大事件) + 48h 时间窗 + 6-8 条 + 一句话摘要 + Q3-2 砍 [下周展望] 的 [外围市场] + [A 股预判] 段；v3.4.2 5 类 → 1 类；v3.4.1 1500 字 + 防幻觉 + 1 句话摘要 保留）：\\n\\n   ⚠️ 搜索失败 fallback：若 batch_web_search 返回空（success=false / formatted_content=[]）或返回 {\\\"error\\\": \\\"调用结果不可用\\\"}（MCP server 端瞬时挂，agent.log 累计失败率 20%），\\n   **先重试 1 次**（cost 低, 23s 内自愈 — 0fbdf302145e 6/14 样本），\\n   **重试仍失败则立即改用** mcp_matrix_extract_content_from_websites 抓 https://finance.eastmoney.com/news/cywjh.html（东方财富快讯，SSG 渲染 + 结构化列表）或 https://finance.sina.com.cn/（新浪财经首页，含\\\"国际焦点\\\"）\\n   6-8 条要闻，源标\\\"财联社\\\"（fallback 兜底时按实际来源标\\\"东方财富\\\"或\\\"新浪财经\\\"，不能统一标）。不要凭模型知识补全。\\n   - \\\"过去 48 小时 财经要闻 经济政策 宏观数据 A 股 重大事件 海外市场大事件\\\"（抓 8-12 条供后续筛选 6-8 条，按重要性排）\\n   \\n   ⚠️ 关键要求：搜索结果必须包含精确数字，所有数据不得出现\\\"约\\\"、\\\"约XX\\\"、\\\"约XX%\\\"等模糊表述，必须填入精确值。\\n   ⚠️ 字数限制（v3.4.1 2026/06/15 立 — 微信 webhook markdown 上限 4 KB 硬约束）：\\n     · 全文不超过 1500 字（留 buffer 给 markdown 标记 + 免责声明 + 微信截断容差）\\n     · 要闻 6-8 条（v3.4.2 放宽自 5-7 条, v3.4.3 保留，按重要性排，禁凑数）\\n     · 每条要闻 ≤ 70 字（标题 ≤ 18 字 + 一句话核心事实+数据 ≤ 30 字 + 来源 ≤ 7 字，v3.4.2 摘要从 2-3 句压到 1 句, v3.4.3 保留）\\n   ⚠️ 时间窗（v3.4.2 放宽, v3.4.3 保留）：过去 48 小时内（原 24h，多覆盖 1 天网住宏观数据；要闻段仍按 6-8 条 + 重要性排，避免旧闻混入）。\\n   ⚠️ 范围：只保留 4 类 (v3.4.3 user 原话) —— 经济政策 / 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率）/A 股重大事件（上市公司重大公告：重组/分红/回购/业绩/股权变更/退市/IPO 注册）/海外市场大事件（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件/重要海外监管动作）。\\n   ⚠️ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）；按重要性排（经济政策 > 宏观数据 > A 股重大事件 > 海外市场大事件, v3.4.3 跟 4 类名一致）。\\n   ⚠️ 防幻觉（v3.4.1 立）：不要为\\\"算力\\\"\\\"AI\\\"\\\"芯片\\\"类板块编造未在搜索结果中出现的具体公司/产品价格信息（如\\\"某云降价 XX%\\\"\\\"某芯片量产\\\"），无法 cite 搜索来源的宁可不写。\\n\\n2. v3.4 数据驱动：dispatcher 已自动抽取过去 5 个交易日（周一到周五）的 7 字段数据。\\n   ✅ 原始数据块在 prompt 末尾\\\"--- 5d 原始数据（v3.4 数据驱动）---\\\"段\\n   ✅ 不需要再 read_file 10 份历史报告\\n   ✅ 缺失字段已标 ❌、直接使用即可（不硬填、不跳不补）\\n\\n   7 字段及来源映射（数据完整性自检用）：\\n   · 综合评分、IF基差                  → 收盘小结_YYYYMMDD.md\\n   · 两融余额、两融余额/流通市值、沪深300PE、PE近5年分位、ERP% → 晚报_YYYYMMDD.md\\n   · 两融数据为 T-1（晚报里 YYYYMMDD 字段是昨日日期）\\n\\n   直接把数据块中的数值填入第 3 步模板的【量化情绪打分】/【两融余额】等行。\\n\\n3. 按以下模板严格格式化内容，写入 /tmp/weekend_news_content.txt：\\n   📰 【财经周末要闻】[YYYY年MM月DD日（周X）]\\n   \\n   ━━━ 周末要闻摘要 ━━━\\n   【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\\n     摘要：（2-3句，概括事件并分析影响）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   【2】（标题）｜...\\n   ⬇️ 1 个空行 ⬇️\\n   ...（6-8 条要闻，顺序编号，每条格式固定）\\n   \\n   【本段硬约束 — v3.1.3 周末要闻 + v3.3.0 要闻定位 + v3.3.1 空行 + 来源约束 + v3.4 数据驱动】\\n   ✅ 可引用字段（必须从真实数据源读取）：\\n     · 周末要闻：batch_web_search 搜索结果（6-8 条，每条带\\\"✅利好/❌利空/⚠️中性\\\"标签）\\n     · 4 类要闻已覆盖 [周末要闻摘要] 段 (经济政策/宏观数据/A 股重大事件/海外市场大事件, v3.4.3 砍美股/A股/大宗商品收盘价段, Q2-A 砍美股回顾)\\n     · 一周情绪轨迹：从 v3.4 dispatcher 注入的 5d 原始数据块读取（综合评分/IF基差/两融余额/两融占比/沪深300PE/PE近5年分位/ERP）\\n     · 日期上下文：report_date / trade_date_fmt\\n   ❌ 禁止编造（采集/搜索脚本不输出下列数据，LLM 不得自行生成）：\\n     · 任何具体股票名称 + 涨跌幅（\\\"贵州茅台本周+5.2%\\\"）—— 未接入个股/持仓数据源\\n     · 任何具体板块涨跌幅及龙头股（\\\"半导体板块+3.5%，中芯国际涨停\\\"）—— 未接入板块行情\\n     · 任何\\\"下周具体操作点位\\\"（\\\"沪指压力位 3200 / 支撑位 3150\\\"）—— 纯 LLM 推断\\n     · 任何未在 batch_web_search 搜索结果中出现的\\\"券商分析师\\\"具体姓名/具体预测数字\\n     · 任何\\\"涨停家数/跌停家数\\\"的实时数字 —— 只能引用历史 5 日的解析值\\n     · 任何\\\"美股/港股/A股\\\"具体点位 —— 必须来自 batch_web_search 当日结果\\n   ⚠️ 可引用但必须 cite 来源（每条数据后面必须有出处）：\\n     · 周末要闻：必须标注\\\"来源：XX媒体\\\"（新华社/财联社/证券时报/第一财经 等）\\n     · 券商展望：必须标注\\\"来源：XX券商 XX 报告\\\"（如搜索不到，删掉不写）\\n     · 地缘政治事件：必须标注\\\"来源：XX媒体 日期\\\"\\n   ❌ 财经要闻 ≠ 盘面数据/资金流向/估值数据\\n   ⚠️ 时间窗边界（v3.4.4 2026/06/16 立 — 区分\\\"要闻\\\" vs \\\"5d 情绪背景\\\"）：\\n     · 【周末要闻摘要】段 = batch_web_search 48h 内结果（脚本启动 now-48h ~ now，覆盖最近 2 天周六周日，不写死日期，跨周自动适用）\\n     · 【一周情绪解读】段 = v3.4 dispatcher 注入的 5d 情绪数据 (T-5 ~ T-1 5 个交易日)，是情绪背景，不进要闻位\\n     · 违反 = \\\"5 月数据/周内旧闻混进要闻\\\" 错位 (6/16 06:53 实跑样本 — 8 条要闻 5 条是 5 月发布，不是 48h 内)\\n   ✅ 6-8 条周末要闻必须从以下 4 类中选（按重要性排，v3.4.3 user 原话 2026/06/16 立）：\\n     · 经济政策（发改委/央行/财政部/证监会/ZZ 局 会议/文件/表态/重大举措）\\n     · 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率 等统计局/央行/海关 发布）\\n     · A 股重大事件（上市公司重大公告：重组/分红/回购/业绩/股权变更/退市/IPO 注册）\\n     · 海外市场大事件（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件/重要海外监管动作）\\n   ✅ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）。\\n   ❌ 禁止作为\\\"要闻\\\"标题的内容（这些是【盘后数据】，非新闻）：\\n     · 指数点位+涨跌幅（如\\\"沪指本周累涨 0.16%\\\"）\\n     · 估值/资金/成交额等单一数据指标（如\\\"两融余额 28490 亿\\\"、\\\"沪深 300 PE 13.52\\\"）\\n     · 券商/机构策略观点（无具体新闻事件）（如\\\"中信证券：短期 A 股或以震荡为主\\\"）\\n     · 亚太/美股盘面描述（只列点位涨跌幅，无具体事件）\\n   ✅ 盘后数据正确归属 = [下周展望] 段的\\\"依据\\\"（不占要闻位）\\n     例：建议\\\"下周控仓 5 成\\\"的依据 = 本周成交额累计缩量 X%（数据 → 依据）\\n   ✅ 空行硬约束：每条要闻之间必须 1 个空行隔开（违反 = 推送失败，可读性差）\\n   ✅ 来源约束（每条要闻必须含来源标注，缺源 = 视为 LLM 杜撰）：\\\"｜来源：XX 媒体\\\"（新华社/财联社/证券时报/第一财经/中国证券报/上海证券报/21 世纪经济报道）；batch_web_search 结果中无对应来源的\\\"事件\\\" → 禁止写入要闻段（已并入上方\\\"可引用但必须 cite 来源\\\"段, 此处仅列来源白名单简表）\\n   数据缺失处理：若搜索无果，标注\\\"❌ 数据缺失\\\"或直接删掉该条，禁用\\\"约/大约\\\"等模糊词，不得凭模型知识补全。\\n   \\n   ━━━ 一周情绪解读 ━━━   【v3.4.1 改 markdown 表格 — 节省 ~50% 字节; v3.4.4 改\\\"情绪解读\\\"命名, 含 5d 表 + 一句话解读, 标题对齐】\\n   | 指标 | 周一 | 周二 | 周三 | 周四 | 周五 |\\n   |---|---|---|---|---|---|\\n   | 量化情绪打分 | XX | XX | XX | XX | XX |\\n   | 两融余额(亿) | XXX | XXX | XXX | XXX | XXX |\\n   | 两融/流通市值 | X.XX% | X.XX% | X.XX% | X.XX% | X.XX% |\\n   | 沪深300PE | XX.XX | XX.XX | XX.XX | XX.XX | XX.XX |\\n   | PE近5年分位 | XX.X% | XX.X% | XX.X% | XX.X% | XX.X% |\\n   | ERP | X.XX% | X.XX% | X.XX% | X.XX% | X.XX% |\\n   | IF基差 | XX.XX | XX.XX | XX.XX | XX.XX | XX.XX |\\n\\n   解读（≤ 50 字，综合情绪+杠杆+估值+预期 4 维一句话总结，缺数据写\\\"数据不足、暂不解读\\\"）\\n\\n   【本段硬约束 — v3.4.1 5d 数据块驱动：表格 + 解读约束】\\n   ✅ 数据来源：dispatcher 注入的\\\"5d 原始数据\\\"块（7 字段 × 5 天，块里 ❌ 的字段直接占位、不重读）\\n   ✅ 表格 7 行 × 5 列：量化情绪/两融余额/两融占比/沪深300PE/PE分位/ERP/IF基差（缺数据用 ❌ 占整行）\\n   ✅ 异常跳变（如单日两融比例跳变 >0.5%）标 ⚠️ 并沿用前日值\\n   ✅ 解读 ≤ 50 字，缺失时写\\\"数据不足、暂不解读\\\"\\n   ━━━ 下周展望 ━━━\\n   （2-3 个板块+逻辑简述，从 4 类要闻 1-8 推：经济政策 → 行业/A 股重大事件 → 公司/海外大事件 → 风险/宏观数据 → 估值/资金）\\n   （v3.4.3 Q3-2 立：砍 [外围市场] + [A 股预判] 段，因 4 类 query 1 不再产\\\"美股期货盘前\\\" 和 \\\"下周 A 股指数推演\\\" 数据源；保留 [关注板块]，从 4 类要闻 1-8 推）\\n   \\n   【本段硬约束 — v3.1.3 防幻觉 + v3.3.1 依据长度 + v3.4 数据驱动】（\\\"禁止编造\\\"清单已并入上方段, 此段不重复）\\n   ⚠️ 关注板块引用字段：4 类要闻 6-8 条中提到的 经济政策/宏观数据/A 股重大事件/海外市场大事件（数据 → 板块依据；v3.4.3 由 4 类 query 1 覆盖）\\n   ✅ 字数限制：每段 ≤ 100 字\\n   \\n   ⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\\n\\n   ──── v3.4 数据驱动 - 自动注入段 ────\\n   {{WEEKEND_5D_DATA}}\\n   ──── v3.4 数据驱动 - 自动注入段结束 ────\\n\\n4. 调用周末要闻推送脚本：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_weekend_news.py\\n\\n5. 完成后打印 \\\"✅ 财经周末要闻\\\"\\n\"\n}\n\nArchive v3.5.3: 24 files, 121357 bytes\n\nFiles: _meta.json (133b), cron_jobs/cron_mirror.json (3155b), cron_jobs/README.md (3297b), references/config.json (2791b), references/fallback-chain-validation.md (3388b), references/weekend-4kb-budget.md (4790b), scripts/_lock.py (2687b), scripts/_send_lib.py (3785b), scripts/_sina_fetcher.py (4854b), scripts/check_consistency.py (26473b), scripts/collect_evening_data.py (40800b), scripts/collect_morning_data.py (18113b), scripts/send_close_summary.py (32494b), scripts/send_evening_report.py (50630b), scripts/send_intraday_alert.py (7928b), scripts/send_ipo_report.py (26362b), scripts/send_morning_report.py (3920b), scripts/send_weekend_news.py (10532b), scripts/skill_dispatcher.py (14834b), skill-card.md (2651b), SKILL.md (33126b), templates/evening.json (10448b), templates/morning.json (9924b), templates/weekend.json (11525b)\n\nFile v3.5.3:SKILL.md\n\n---\nname: A-stock-report\ndescription: \"A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。\"\nversion: 3.5.2\n---\n\n# A股报告系统\n\n>A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版\n\n---\n\n## 目录结构（v3.2.3+1 起明示，v3.5.0 简化）\n\n`clawhub publish` 按 `.clawhubignore` 排除 `knowledge/` + `*.bak`（v3.4.4 立），其他整目录上传。装好后 `~/.hermes/skills/A-stock-report/` 结构：\n\n```\nA-stock-report/\n├── SKILL.md                      ← 本文件（含完整执行流程 + 14 段护栏 + changelog 索引）\n├── _meta.json\n├── .clawhubignore                ← v3.4.4 立：排除 knowledge/ + *.bak\n│\n├── 🐍 scripts/                  ← 12 个 Python 脚本 + 3 个 JSON prompt 模板\n│   ├── _lock.py / _send_lib.py  ← 共用库\n│   ├── check_consistency.py     ← 14 段一致性护栏（A~H 段）\n│   ├── skill_dispatcher.py      ← LLM 驱动型任务的 5d 数据抽取 + prompt 注入\n│   ├── collect_{morning,evening}_data.py / send_{morning,close,evening,intraday,weekend,ipo}.py\n│   ├── templates/{morning,evening,weekend}.json\n│   ├── cron_jobs/{cron_mirror.json, README.md}\n│   └── references/{config.json, fallback-chain-validation.md, weekend-4kb-budget.md}\n│\n└── 📚 knowledge/                ← changelog + 决策主题（**按需 skill_view 加载，不进默认 context**）\n    ├── changelog/                ← 按版本号组织\n    │   ├── README.md             ← 35 条 changelog 索引\n    │   └── vX.Y.Z.md             ← 单版完整细节（v3.5.0 立，19 条新加）\n    └── decisions/                ← 跨版本决策中心（按主题）\n        ├── README.md\n        ├── architecture.md       ← 架构演进\n        ├── data-pitfalls.md      ← 数据源踩坑集\n        ├── lessons-learned.md    ← 核心教训\n        ├── guardrails.md         ← 护栏规则\n        └── dispatcher-patterns.md\n```\n\n**knowledge/ 为什么保留在 publish 包但不进默认 context** (v3.4.4 改): `.clawhubignore` 排除后, **装上后无 knowledge/** — 用户需主动 `skill_view` 加载；本机开发保留完整 knowledge/ 不影响发布包大小。\n\n---\n\n## 版本历史（Changelog）\n\n> **精简规则（v3.5.0 立）**：每条 ≤ 1 行索引，详细实战/根因/修法折到 `knowledge/changelog/vX.Y.Z.md`。完整 35 条索引见 [`knowledge/changelog/README.md`](knowledge/changelog/README.md)。\n>\n> **未发版段识别**：标题含 `(未发版)` 的是当前 v3.5.0 待 bump 的小改集合。\n\n### v3.3.0 ~ v3.4.4（19 条，SKILL.md 主体）— 2026-06-11 晚 ~ 2026-06-16\n\n- [v3.5.1 — send_evening_report.py 加 5 项内容质量硬校验](knowledge/changelog/v3.5.1.md) — 2026-06-18 晚（未发版）\n- [v3.4.4 — 异常周（周二 cron）周末要闻端到端验证](knowledge/changelog/v3.4.4.md) — 2026-06-16（未发版）\n- [v3.3.5+5 — fallback 链选 URL 原则：主题聚合页 > 单篇头条](knowledge/changelog/v3.3.5+5.md) — 2026-06-15 20:00 晚报（未发版）\n- [v3.3.5+4 — web_search MCP 重试加固：覆盖 {\"error\": ...} 分支](knowledge/changelog/v3.3.5+4.md) — 2026-06-15 16:35（未发版）\n- [v3.3.5+3 — 周末要闻 4 KB 截断修复 + 防幻觉 + 表格化 + H 段护栏](knowledge/changelog/v3.3.5+3.md) — 2026-06-15 下午（未发版）\n- [v3.3.5+2 — 3 层 fallback 链 + 要闻段反例前置](knowledge/changelog/v3.3.5+2.md) — 2026-06-15 晨报（未发版）\n- [v3.3.5+1 — 3 templates 加 batch_web_search 失败 fallback 机制](knowledge/changelog/v3.3.5+1.md) — 2026-06-13 晚（未发版）\n- [v3.3.5 — 晨报渲染细节对齐 6/12 周五样本 + 删 v3.3.4 过头加固](knowledge/changelog/v3.3.5.md) — 2026-06-13 下午\n- [v3.3.4 — 晨报过头加固（已废）](knowledge/changelog/v3.3.4.md) — 2026-06-13 凌晨\n- [v3.3.3 — 尝试加固晨报，未生效，无代码变更](knowledge/changelog/v3.3.3.md) — 2026-06-12 晚\n- [v3.3.2 — 模板约束一体化 + check 段 H 护栏](knowledge/changelog/v3.3.2.md) — 2026-06-12 晚\n- [v3.3.1 — 晚报可读性修复：财经要闻 1 空行 + 依据 ≤ 50 字符](knowledge/changelog/v3.3.1.md) — 2026-06-11 深夜\n- [v3.3.0 — 财经要闻段\"任务定位\"协议：防\"盘面数据\"冒充\"要闻\"](knowledge/changelog/v3.3.0.md) — 2026-06-11 晚\n- [v3.2.9 — 3 个 dispatcher 任务 skills 字段清理](knowledge/changelog/v3.2.9.md) — 2026-06-11 下午\n- [v3.2.8 — 收盘小结格式对齐：4 处拼接 bug](knowledge/changelog/v3.2.8.md) — 2026-06-11\n- [v3.2.7 — .env 路径根除：8 脚本多路径回退](knowledge/changelog/v3.2.7.md) — 2026-06-10 下午\n- [v3.2.6 — 双副本根除 + jobs.json 隐藏运行时副本修复](knowledge/changelog/v3.2.6.md) — 2026-06-10 上午\n- [v3.2.5 — 盘中预警 cron prompt 纯 bash 化](knowledge/changelog/v3.2.5.md) — 2026-06-09 深夜\n- [v3.2.4 — 文档补全：明示 knowledge/ 被 clawhub publish 上传](knowledge/changelog/v3.2.4.md) — 2026-06-09 晚\n- [v3.2.3 — send_ipo_report.py 迁移到 _send_lib 共用库](knowledge/changelog/v3.2.3.md) — 2026-06-09 晚\n\n### 历史版本（v3.2.2 ~ v3.0.0，11 条 + v2.0.0 ~ v2.0.10，11 条 = 22 条已折叠）\n\n完整索引见 [`knowledge/changelog/README.md`](knowledge/changelog/README.md) —— `vX.Y.Z.md` 22 个详情文件保留。\n\n### v3.5.0 改动（本版本 = SKILL.md 精简 + 14 段护栏加严，2026-06-16）\n\n**触发**: SKILL.md 50665 字节 / 778 行 / 15 个 skill 排名第 1, 是第 2 名 ima-skill (16KB) 的 3.2 倍. Changelog 段 13KB 占 26.3%, 违反 v3.2.0 立\"≤ 3 行 / 25 行硬上限\"规矩.\n\n**改法** (3 处):\n1. Changelog 段 19 条 v3.3.0+ ~ v3.4.4 全部折到 `knowledge/changelog/vX.Y.Z.md` 详情文件, SKILL.md 留 1 行 / 条索引\n2. `## 数据来源` (2.6KB) + `## IPO周报数据来源` (541B) 合并去重\n3. `## 目录结构` (1.7KB) 简化, 标 knowledge/ 索引外置\n4. frontmatter `version: 3.4.4` → `3.5.0` (按 MEMORY #12 \"结构变更触发 v 大版本号讨论\" 例外)\n\n**未发版小改一并 bump 到 v3.5.0** (10 条): v3.3.5+1 ~ v3.3.5+5 + v3.4.4. 教训: \"小改不刷 vX.Y.Z\" 规则容易被滥用 (10 条小改 ≥ 2 个月), v3.5.0 立硬上限 — **未发版累积 ≥ 5 条必须下个结构变更 bump 走, 不许再攒**.\n\n**MEMORY #12 立新约束**: 任何 skill 的 SKILL.md 单文件 > 30KB 必须先瘦身再发版.\n\n## 安全配置（必读）\n\n所有外部密钥均通过环境变量注入，**禁止硬编码**。路径可通过 `ENV_FILE` / `ENV_FILE_FALLBACK` 环境变量覆盖（默认从脚本自带 + 项目级 `_DEFAULT_ENV_PATH` 加载）。\n\n### 密钥白名单原则\n\n每个脚本**仅加载本任务实际需要的变量**，不得全量注入 `_DEFAULT_ENV_PATH` 所有密钥。\n\n| 脚本 | 必需密钥（与 `_REQUIRED_KEYS` 同源，v3.2.7 修复）|\n|------|---------|\n| `collect_morning_data.py` | `IWENCAI_API_KEY`（A50 期货问财查询用）|\n| `send_close_summary.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `collect_evening_data.py` | `WECOM_WEBHOOK_KEY` |\n| `send_evening_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_morning_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_intraday_alert.py` | `WECOM_WEBHOOK_KEY` |\n| `send_ipo_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_weekend_news.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n\n**问财 API 直连约定**（细节见 `## 数据来源` 段）：所有问财查询统一进程内直连 OpenAPI，**不使用 subprocess 外部调用**（避免通过 `IENV` 泄露环境变量给子进程）；消费侧必须兼容多字段名（同义词 nlp 翻译可能返回 `炸板家数` ↔ `涨停开板家数`）。\n\n### 自动推送说明\n\n配置 `WECOM_WEBHOOK_KEY` 即表示授权自动推送报告至企业微信。推送是自动化报告系统的组成部分，非人工干预。\n\n| 密钥 | 环境变量 | 最小权限 | 来源 |\n|------|---------|---------|------|\n| 企业微信 Webhook | `WECOM_WEBHOOK_KEY` | 仅发送（只写） | 微信企业版 → 应用 → Webhook |\n| 同花顺问财 API Key | `IWENCAI_API_KEY` | 只读查询 | 同花顺 i问财 SkillHub |\n\n`.env` 文件格式示例：\n```bash\nWECOM_WEBHOOK_KEY=c4a1cd60-254e-4612-b365-c701482ae98c\nIWENCAI_API_KEY=***\n```\n\n> **注意**：本 skill **只用 2 个 key**（WECOM + IWENCAI）。妙想 `MX_APIKEY` / Tushare `TUSHARE_TOKEN` 等由其他 skill（mx-data / mx-xuangu 等）使用，**不要加进 A-stock-report 的 `.env`**。\n\n---\n\n##快速开始\n\n**手动跑一个报告（运维/补跑/测试用）：**\n\n所有 6 个任务的完整命令（`source .env` + `python3 脚本路径` + 可选参数）都集中在 **`cron_jobs/cron_mirror.json` 的 `tasks.<name>.prompt` 字段**。\n\n- LLM 驱动型（晨报/晚报/财经周末版）→ `templates/<task>.json` 的 prompt 模板 + `cron_jobs/cron_mirror.json`（无对应节点，由 jobs.json 直接调 dispatcher 注入）\n- 独立脚本型（收盘小结/盘中预警/IPO 周报）→ `cron_jobs/cron_mirror.json#<task>` 节点\n\n**手动跑通用模式：**\n\n```bash\n# 1. 读 cron_mirror.json 看 prompt 字段拿到完整命令\npython3 -c \"import json; print(json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))['tasks']['close_summary']['prompt'])\"\n\n# 2. 复制粘贴该命令到终端跑（已含 source .env + python3 路径 + 默认参数）\n```\n\n**历史命令备查（v3.1.5 清理前）：** 见 git log / 备份 `/workspace/archive/SKILL_md_pre_4segs_clean_*`\n\n---\n\n## 执行模式\n\n**收盘小结、晚报、晨报** 采用不同模式：\n\n- **收盘小结**：单一 Python 脚本，内置全部逻辑（取数 → 打分 → 生成报告 → 推送），cron 直接触发，无需 LLM 生成内容。\n**晨报、晚报、周末要闻** 采用**两段式**：\n- **第一段**（cron prompt）：调用 dispatcher 生成带真实日期的 prompt，写入约定路径\n- **第二段**（同一 session）：读取 prompt 文件 → LLM 执行 → 写入内容文件 → 调用推送脚本\n\n这样 SKILL.md 中的 prompt 模板只含通用占位符，日期在运行时由 dispatcher 动态注入。\n\n---\n\n## 数据来源\n\n**总则**（v3.0+ 架构）：3 类数据源 + 4 端真相。\n\n**3 类数据源**（按密钥需求划分）：\n- **零密钥**：腾讯实时 API（`qt.gtimg.cn`） · 新浪 hq 数据（`hq.sinajs.cn`） · akshare 开源接口\n- **IWENCAI_API_KEY**：同花顺 i 问财 OpenAPI（进程内直连，无 subprocess）\n- 历史报告 MD（仅财经周末版用）：`/workspace/projects/A股报告系统/reports/`\n\n**4 端真相**（防漂移，详见 `## 定时任务` 段）：`templates/` · `cron_jobs/cron_mirror.json` · `~/.hermes/cron/jobs.json` · `SKILL.md`\n\n### 晨报数据来源（`collect_morning_data.py` + LLM 生成）\n\n| 数据 | 来源 | 接口 / 字段 | 备注 |\n|------|------|------------|------|\n| 隔夜美股 3 大指数 | 腾讯实时 API | `qt.gtimg.cn/q=usDJI,usINX,usIXIC` | 字段含 name/price/pct |\n| VIX 恐慌指数 | 新浪 hq 数据 | `hq.sinajs.cn/list=znb_VIX` | paperCode=znb_VIX，CBOE VIX 指数本身（13 字段：现价/涨跌/52 周范围）⚠️ 2026-06 新浪反爬升级：`User-Agent: Mozilla/5.0` 太短被识别为爬虫 → 403；**必须用完整浏览器 UA 字符串**（详见 `~/.hermes/skills/devops/sina-hq-sinajs-403-ua/SKILL.md`）|\n| 富时 A50 期货 | 新浪 hq 数据 | `hq.sinajs.cn/list=...A50ETF`（512550） | 偶发 HTTP 403（同 UA 原因），失败回退华夏 A50ETF；缺失按 v3.1.3 协议 `❌ 数据缺失` 占位 |\n| 港股恒生指数 | 腾讯实时 API | `qt.gtimg.cn/q=hkHSI` | 复用 get_us_indices 模式 |\n| WTI 原油 + 现货黄金 | akshare 全球期货现货 | `ak.futures.futures_hf_em.futures_global_spot_em()` | GC00Y=COMEX 黄金 / CL00Y=WTI |\n\n### 收盘小结数据来源（`send_close_summary.py` 独立脚本）\n\n| 数据 | 来源 | 接口 |\n|------|------|------|\n| 6 大指数 + 成交额 | 腾讯实时 + akshare | `qt.gtimg.cn` + `stock_zh_a_spot_em()` |\n| 涨跌停家数 / 炸板率 | 同花顺问财 | 1 次查询（`今日涨停家数 跌停家数 炸板家数`） |\n| 全市场主力净流入 | 东方财富 RPT_MARKET_CAPITALFLOW | `INDEX_CODE=\"800000.EI\"`，`BONDTYPE=\"A股\"` |\n| 行业板块涨跌 / 主力资金 | hithink-sector-selector | `今日行业板块涨幅前10` / `近5日主力净流入前10行业板块` |\n| IF 期货基差 | 新浪 nf_IF0（今日优先）+ akshare `futures_main_sina` 兜底 | `hq.sinajs.cn` |\n\n### 晚报数据来源（`collect_evening_data.py` + LLM 生成）\n\n| 数据 | 来源 | 接口 |\n|------|------|------|\n| 6 大指数 + 成交额 | 同收盘小结 | 同上 |\n| 亚太股市（日经/韩国综合） | 腾讯实时 | `qt.gtimg.cn` |\n| 两融余额 / 两融交易额 | AKShare | `macro_china_market_margin_sh/sz` |\n| 沪深300 PE / 股市风险溢价 | 同花顺问财 | 单次查询多字段 |\n| 涨跌停家数 | 同花顺问财 | 复用收盘小结模式 |\n\n### IPO 周报数据来源（`send_ipo_report.py`）\n\n| 报告模块 | 接口 | 来源 |\n|---------|------|------|\n| 一、排队情况 | `ak.stock_register_kcb/cyb/bj/sh/sz` | 东方财富注册制审核公示 |\n| 二、本周期上会 | `ak.stock_ipo_review_em` | 东方财富 IPO 审核动态 |\n| 三、本周期获批 + 四、终止撤回 | `ak.stock_ipo_declare_em` | 证监会公示 |\n| 五、下周期上会 | `ak.stock_ipo_review_em` | 东方财富 IPO 审核动态 |\n| 六、新股上市 | `ak.stock_xgsr_ths` | **同花顺**（一次调用含上市信息/发行价/首日涨跌幅） |\n\n### 财经周末版数据来源\n\n**仅复用历史报告 MD**（无新数据采集）：`/workspace/projects/A股报告系统/reports/收盘小结_YYYYMMDD.md`（情绪打分/涨停家数）+ `晚报_YYYYMMDD.md`（两融/PE/ERP）。两套以交易日 key 对齐合并，详见下表：\n\n| 指标 | 来源 MD | key 取法 |\n|------|--------|---------|\n| 涨停家数 / 情绪打分 | `收盘小结_YYYYMMDD.md` | 文件名 `YYYYMMDD` |\n| 两融余额 / 两融比例 | `晚报_YYYYMMDD.md` | 报告内两融余额行日期 |\n\n### 问财 API 兼容性约定\n\n**坑 1 — 字段名同义词（2026-06-01 经验）**：问财 OpenAPI 在 query 含同义词时 nlp 翻译可能返回**不同字段名**（如 `炸板家数` ↔ `涨停开板家数`）。**消费侧必须兼容多字段名**，避免单一字段名失效导致数据缺失。已修复 `send_close_summary.py:167`（兼容 `炸板家数` / `涨停开板家数`）。未来遇到新同义词：在所有调用问财的脚本里加兼容分支，记到此节。\n\n**坑 2 — 返回值类型不稳定（2026-06-16 经验，send_close_summary.py:78）**：\n\n问财同一字段可能**不同时刻返回不同类型**——同一 query，今天返 `float`、明天返 `str`、后天返 `int`（nlp 翻译后端不稳定）。直接 `v > 0` 比较会在 str/int/str 互换时炸：\n\n```python\n# ❌ 错误写法 — TypeError: '>' not supported between instances of 'str' and 'int'\nif \"成交额\" in k and v and v > 0:\n    val_yi = float(v) / 1e8\n```\n\n**正确写法** — 三重防御：\n\n```python\nif \"成交额\" in k and v not in (None, \"\", 0, \"0\", \"0.0\"):\n    try:\n        v_num = float(v)        # 统一强转\n    except (TypeError, ValueError):\n        continue                # 转换失败跳过，不让一个坏字段拖垮整次查询\n    if v_num > 0:               # 数值化后再比较\n        val_yi = v_num / 1e8\n        return v_num\n```\n\n**症状**：脚本异常分支 `'>' not supported between instances of 'str' and 'int'` → fallthrough 到兜底 → 兜底值 0 → 报告显示 `全市场成交额：0亿`。\n\n**检测套路**（写消费代码时）：\n- 任何 iwencai 字段的 `if v > 0` / `if v < x` / `if v == y` 都视为**潜在 bug**\n- 修法模板：`v not in (None, \"\", 0) → try float(v) → 转换失败 continue → 数值比较`\n\n**已修样本**：`send_close_summary.py:78` (commit `pre_20260616_turnover_typecompare.bak`)\n\n---\n\n## 文件名日期规则\n\n| 报告 | 文件名日期取值 |\n|------|--------------|\n| 收盘小结 | `--date` 参数值；无参数则取当天 |\n| 晚报 | `--date` 参数值；无参数则取当天 |\n| 晨报 | 生成当天 |\n| 财经周末要闻 | 生成当天 |\n\n> **注意**：晚报内容里的两融余额标注日期（如\"两融余额（04月13日）\"）是数据对应的上一交易日，与文件名日期可能差1天。\n\n---\n\n## 周末要闻情绪轨迹数据来源\n\n一周情绪轨迹从历史报告MD文件中提取，合并规则：\n\n| 指标 | 来源 | key取法 |\n|------|------|--------|\n| 涨停家数/情绪打分 | 收盘小结 `收盘小结_YYYYMMDD.md` | 从文件名提取 `YYYYMMDD` |\n| 两融余额/两融比例 | 晚报 `晚报_YYYYMMDD.md` | 从**报告内容**里两融余额行提取日期作为 key |\n\n两套数据以交易日 key 对齐合并，保证周一到周五趋势线一致。\n\n---\n\n## 防并发锁\n\n各脚本使用独立的锁文件，同时运行互不干扰：\n\n| 脚本 | 锁文件 |\n|------|--------|\n| `send_close_summary.py` | `/tmp/a_stock_close_summary.lock` |\n| `send_evening_report.py` | `/tmp/a_stock_evening.lock` |\n| `send_morning_report.py` | `/tmp/a_stock_morning.lock` |\n| `send_weekend_news.py` | `/tmp/a_stock_weekend.lock` |\n| `send_ipo_report.py` | `/tmp/a_stock_ipo.lock` |\n| `send_intraday_alert.py` | `/tmp/a_stock_intraday.lock` |\n\n**锁残留检测（v2.0.1 起）：** 脚本有 `finally: _unlock()` 兜底，正常退出一定会释放。**若锁文件残留**：\n1. 排查推送阶段异常日志（`wx()` 返回非 0 / 信号中断 / 网络超时）\n2. 确认无进程在跑（`ps -ef | grep send_close`）后，手动 `rm /tmp/a_stock_close_summary.lock`\n3. 残留超过 1 小时不重跑需要介入，避免重复推送\n\n---\n\n## 报告模板\n\n### 晨报\n\n```\n📰 【股市晨报】YYYY年MM月DD日（周X）\n\n━━━ 隔夜全球市场 ━━━\n【美股收盘】\n▪ 道琼斯：XXXXX.XX点，+X.XX%（精确数字，不得用\"约\"）\n▪ 标普500：XXXXX.XX点，+X.XX%\n▪ 纳斯达克：XXXXX.XX点，+X.XX%（可附\"X连涨/连跌X日\"）\n▪ VIX恐慌指数：XX.XX（+X.XX%），恐慌等级：【低位(<20)/中位(20-30)/高位(>30)】\n\n【港股及A50】\n▪ 恒生指数：XXXXX.XX点，+X.XX%（附简要背景）\n▪ 富时A50期货：XXXXX点，+X.XX%，偏强/偏弱运行【预判A股明日开盘】\n\n【大宗商品】\n▪ WTI原油：XXX.XX美元/桶，+X.XX%（精确数字，不得用\"约\"）\n▪ 现货黄金：XXXX.XX美元/盎司，+X.XX%（精确数字）\n\n━━━ 财经要闻 ━━━\n【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（简洁分析，≤50字）\n【2】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（≤50字）\n（**≤7条**，顺序编号，每条格式固定：\n  【编号】（标题）｜✅/❌/⚠️标签 对A股影响\n  点评：（事件+分析，≤50字））\n\n━━━ 今日操作建议 ━━━\n【大盘研判】\n（综合外围市场、宏观政策、量能等因素，给出2-3句综合判断）\n\n【操作建议】\n1. 【板块/策略】（期限）：具体建议+附标的\n2. 【板块/策略】（期限）：...\n\n【风险提示】\n⚠️ （1-3条，最重要的风险）\n\n⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\n```\n\n### 收盘小结\n\n> **模板由 `send_close_summary.py` 脚本内置拼装**（`build_report()` 函数 f-string，L562+）—— SKILL.md 不再重复维护。改格式请直接改脚本。\n>\n> **协议说明**：\n> - 6 段固定框架：①主要股指表现 ②板块行情 ③全市场主力资金 ④行业主力资金流 ⑤量化情绪打分 ⑥后市展望 + 数据来源落款\n> - 量化情绪打分（满分 100，6 因子等权平均）：\n>   - 涨停家数（10~100 家映射）\n>   - 涨跌停比（对数插值）\n>   - 炸板率（40%~10% 映射，越低越好）\n>   - 主力净流入占比（-5%~+5% 映射）\n>   - 全市场换手率（1%~4% 映射）\n>   - IF 基差（-300~+150 点映射）\n> - 后市展望默认文本（脚本 L560）：\"市场震荡调整，风格偏向题材与成长，建议控制仓位、关注轮动节奏。\"\n\n### 晚报\n\n```\n📋 【A股晚报】YYYY年MM月DD日\n\n━━━ A股收盘 ━━━\n• 上证指数：XXXX.X，↑/↓X.XX%\n• 深证成指：XXXX.X，↑/↓X.XX%\n• 创业板指：XXXX.X，↑/↓X.XX%\n• 科创50：XXXX.X，↑/↓X.XX%\n• 沪深300：XXXX.X，↑/↓X.XX%\n• 中证500：XXXX.X，↑/↓X.XX%\n• 成交额：X.XX万亿元\n\n━━━ 亚太股市 ━━━\n• 恒生指数：XXXX，↑/↓X.XX%\n• 日经225：XXXXX，↑/↓X.XX%\n• 韩国综合：XXXX，↑/↓X.XX%\n\n━━━ 市场风险偏好 ━━━\n• 两融余额（MM月DD日）：XXXXX亿，较前日+/-XXXX亿\n• 两融余额/A股流通市值（MM月DD日）= X.XX%\n  阈值：<3%安全 | 3-3.5%预警 | ≥3.5%高危\n• 两融交易额/A股成交额（MM月DD日）= X.X%\n  阈值：<7%保守 | 7-11%中性 | >11%过热\n• 股市风险溢价（MM月DD日）= X.XX%\n  阈值：<3%高估 | 3-6%中性 |>6%低估\n• 沪深300 PE = XX.XX，近5年分位点 XX.X%\n\n━━━ 财经要闻 ━━━\n【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（≤50字）\n【2】...（**≤7条**，每条格式固定，点评≤50字）\n\n━━━ 今日操作建议 ━━━\n【大盘研判】（2-3句）\n【操作建议】\n1. 【板块/策略】（期限）：具体建议\n2. 【板块/策略】（期限）：...\n【风险提示】（1-3条）\n\n⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\n```\n\n### 财经周末版（cron 触发后 LLM 生成）\n\n```\n📰 【财经周末版】{周六日期} + {周日日期}\n\n━━━ 一周情绪轨迹（5 个交易日，来源：收盘小结 + 晚报）━━━\n\n【1. 市场短期情绪】\n• 量化情绪打分：周一XX → 周二XX → 周三XX → 周四XX → 周五XX\n\n【2. 杠杆率】\n• 两融余额（亿元）：周一X → 周二X → ... → 周五X\n• 两融余额占流通市值比例：周一X.XX% → ... → 周五X.XX%\n\n【3. 估值水平】\n• 沪深300PE：周一X.XX → ... → 周五X.XX\n• 近5年分位点：周一X.X% → ... → 周五X.X%\n• 股市风险溢价（ERP）：周一X.XX% → ... → 周五X.XX%\n\n【4. 市场预期】\n• IF基差：周一X.XX → ... → 周五X.XX\n\n【5. 一周市场解读】\n{不超过50字，综合市场情绪/杠杆/估值/预期 4 个维度的一句话总结}\n\n━━━ 数据规则（防错）━━━\n数据源 + ❌/⚠️ 硬约束在模板顶部\"2. 数据源\"段统一定义（v3.3.0 + v3.1.3 合并版），不在此处重复\n\n━━━ 整体市场情绪研判 ━━━\n情绪指标总结 | 核心驱动因素 | 当前风险点 | 下周操作参考\n\n⚠️ 仅供参考，不构成投资建议。\n```\n\n---\n\n## 定时任务（cron）\n\n7 个 cron 任务（A 股 6 任务 + 每周 Skill 复盘 1 任务）的完整 schedule / repeat / deliver / prompt 字段集中在以下两处真相源：\n\n- **生产配置（OpenClaw 读）**：`~/.hermes/cron/jobs.json`\n- **人类可读镜像（git track）**：`cron_jobs/cron_mirror.json`\n\n**SKILL.md 不再重复列 cron 表达式**（v3.1.5 清理）—— 一处变→多处忘改是 v3.0 之前的痛点。\n\n**快速概览：**\n\n| 任务 | 调度 | 类型 |\n|------|------|------|\n| A股晨报生成并推送 | 周一至五 08:00 | LLM 驱动型（template: `templates/morning.json`） |\n| A股晚报生成并推送 | 周一至五 20:00 | LLM 驱动型（template: `templates/evening.json`） |\n| A股收盘小结 | 周一至五 15:30 | 独立脚本（mirror: `close_summary`） |\n| A股盘中预警 | 周一至五 09:00-14:55 每 5 分钟 | 独立脚本（mirror: `intraday`） |\n| A股周末要闻生成并推送 | 周日 20:00 | LLM 驱动型（template: `templates/weekend.json`） |\n| 每周 Skill 复盘 | 周日 18:00 | skill 自审 |\n| A股IPO周报 | 周六 10:00 | 独立脚本（mirror: `ipo_report`） |\n\n---\n\n\n## 安装与验证\n\n配置完 cron 后，按以下顺序逐一检查：\n\n### Step 1：密钥检查\n\n权威密钥白名单表在 `## 密钥白名单原则` 段（每个脚本需哪些 env 变量）。\n\n**快速检查 2 个 env 变量是否就位：**\n\n```bash\n# 应输出 2 行非空（本 skill 只需 2 个 key）\nfor key in WECOM_WEBHOOK_KEY IWENCAI_API_KEY; do\n  grep \"^${key}=\" /workspace/.env && echo \"  ✅ $key\"\ndone\n```\n\n**未配齐会怎样：** 脚本在 except 块内捕获缺失，会 `notify_failure()` 发预警 + exit 1（v3.1.0 修复链），不会静默继续。\n\n> **注意**：`send_evening_report.py` 的\"财经要闻\"和\"明日操作建议\"两个区块**依赖 cron 中的 LLM 步骤生成**，不是脚本自己能产出的。若未配置对应 cron task，这两个区块**永远为空**，这是设计预期，不是 bug。\n\n### Step 2：依赖检查\n\n```bash\n# 检查 akshare\npython3 -c \"import akshare; print('akshare', akshare.__version__)\"\n\n# 检查 tushare（IPO周报需要）\npython3 -c \"import tushare; print('tushare OK')\"\n\n# 检查 hithink-sector-selector CLI\npython3 /workspace/skills/hithink-sector-selector/scripts/cli.py --help | head -3\n```\n\n### Step 3：Cron 任务检查\n\n跑护栏脚本一次性验证 4 端一致性（templates ↔ cron_mirror ↔ jobs.json ↔ SKILL.md）：\n\n```bash\npython3 /root/.hermes/skills/A-stock-report/scripts/check_consistency.py\n# 预期：✅ 全部 4/4 项通过，exit=0\n```\n\n**不要再用\"❌手对表\"逐行核对**——v3.1.5 之前 SKILL.md 这里有 7 行\"应存在 ✅\"表，靠人记得跑 1 个命令 + 7 行眼睛对——v3.1.5 改用护栏脚本机械检查，杜绝漂移。\n\n\n---\n\n## Cron 任务配置指引\n\n6 个任务分两类：\n\n- **LLM 驱动型（3 个）**：晨报 / 晚报 / 财经周末版 — prompt 外置于 `templates/`，由 `scripts/skill_dispatcher.py` 读取注入 LLM，LLM 解读后调脚本落地推送。\n- **独立脚本型（3 个）**：收盘小结 / **盘中预警** / IPO 周报 — 无需 LLM，调度配置外置于 `cron_jobs/`，由 OpenClaw gateway 直接 `source .env && python3 ...` 跑脚本。盘中预警为每 5 分钟一次高频任务（必须无 LLM 介入）。\n\n> **为什么用文件中转（LLM 型）？** cron prompt 在独立 session 运行，无法直接将变量传给后续脚本。通过写入约定路径的文件，脚本读取后注入报告模板，实现解耦。\n\n> **🛡️ 4 端一致性护栏（v3.1.5+）**：本 skill 有 4 端真相 — `templates/`（LLM 调度模板，机器读） / `cron_jobs/cron_mirror.json`（生产 cron 镜像，人读） / `~/.hermes/cron/jobs.json`（生产 cron 真实配置，OpenClaw 读） / `SKILL.md`（文档）。改任何一端都可能造成幽灵模板（v3.1.3 的教训）。**修改以下任一文件后必须跑 `python3 scripts/check_consistency.py`**（exit 0=全过，exit 1=有错误）：\n> - `templates/*.json`（3 个 LLM 任务 prompt）\n> - `cron_jobs/cron_mirror.json`（3 个独立脚本任务）\n> - `~/.hermes/cron/jobs.json` 中 3 个独立脚本任务的 prompt\n> - SKILL.md 任务清单段（`### N. 任务名（详见 ...）` 格式）\n>\n| 报错时用 `--fix-hint` 看修复建议。脚本会检查 A) templates ↔ dispatcher 任务集、B) cron_mirror ↔ jobs.json prompt 字字一致、C) SKILL.md 引用真实存在、D) dispatcher 任务不在 mirror 出现、E) SKILL.md 主体无硬编码 cron 表达式 / .env 路径 / source+send 一行命令（v3.1.6+ E 段）。\n\n### 1. 晨报（详见 templates/morning.json）\n\n> Prompt 模板外置于 `templates/morning.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 2. 收盘小结（详见 cron_jobs/cron_mirror.json#close_summary）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，close_summary 为 `tasks.close_summary` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。\n\n### 3. 晚报（详见 templates/evening.json）\n\n> Prompt 模板外置于 `templates/evening.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 4. 盘中预警（详见 cron_jobs/cron_mirror.json#intraday）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，intraday 为 `tasks.intraday` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。**v3.1.3 之前该任务的模板曾错误地放在 `templates/intraday.json`（LLM 驱动型设计），但实际 cron 早已是独立脚本模式**；v3.1.3 已删除幽灵模板、归档到 cron_jobs/。\n\n### 5. 财经周末版（详见 templates/weekend.json）\n\n> Prompt 模板外置于 `templates/weekend.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 6. IPO周报（详见 cron_jobs/cron_mirror.json#ipo_report）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，ipo_report 为 `tasks.ipo_report` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。\n\n### 验证 3：端到端 cron 验证\n\n实际 cron 跑过后，检查：\n1. 推送消息中\"财经要闻\"和\"明日操作建议\"区块是否有内容\n2. 内容日期是否与当天日期一致\n3. 报告文件名是否为当天日期\n\n若发现为空，回到\"验证 2\"确认内容文件是否成功写入。\n\n## 常见问题\n\n**Q1：生成后如何做质量检查？**\nA：生成报告后必须检查以下四项：\n1. **日期检查**：报告第一行日期 == 文件名日期 == 当天实际日期（三者必须一致）\n2. **星期检查**：报告中的日期字符串（`YYYY年MM月DD日（周X）`）与文件名中的日期 `weekday()` 对应周一～周五正确\n3. **数据完整性**：\n   - 收盘小结：指数行情、情绪打分、板块资金流、风险偏好、操作建议五段落齐全\n   - 晨报/晚报：涨跌停统计、风险偏好、操作建议三段落齐全\n4. **时效性**：数据陈旧（>2个交易日）时在报告内注明\n\n**Q2：如何判断涨停情绪？**\nA：涨停情绪由第4节打分函数统一评分（满仓风险系数 × 涨停家数权重 + 涨跌停比 × 炸板率综合得出 0-100 分），不再单独使用 emoji 分级。报告生成后通过\"质量检查第3项\"确认段落齐全即可。\n- 参考：情绪总分 ≥ 70 → 🟢做多；≥ 55 → 🟡偏多；≥ 40 → ⚪分歧；≥ 25 → 🟠偏空；< 25 → 🔴冰点\n\n**Q3：炸板率如何评分？**\nA：炸板率由第4节打分函数中的 `_sc(exp_rate, 40, 10)` 公式映射到 0-100 分，阈值区间 [40%, 10%]，炸板率越低得分越高。\n- 参考：情绪总分 ≥ 70 → 🟢做多；≥ 55 → 🟡偏多；≥ 40 → ⚪分歧；≥ 25 → 🟠偏空；< 25 → 🔴冰点\n\n**Q4：两融数据比当天少一天？**\nA：正常现象。两融数据在当天收盘后约 1～2 小时后更新，晚报/收盘小结取到的是上一交易日数据。\n\n**Q5：主力净流入 > 500亿时显示什么？**\nA：打印预警信息 `⚠️ 主力净流出-XXX亿，超大单+大单砸盘XXX亿，异常大额出逃，注意风险`，但保留真实数值（不重置为0）。\n\n**Q6：定时任务重复推送？**\nA：已内置文件锁机制的脚本会拒绝并发执行。当前各脚本锁机制如下：\n- 晚报：`send_evening_report.py` → `/tmp/a_stock_evening.lock`（exists 检测 + sys.exit(0)，finally 解锁）\n- 盘中预警：`send_intraday_alert.py` → `/tmp/a_stock_intraday.lock`（同上）\n- 周末要闻：`send_weekend_news.py` → `/tmp/a_stock_weekend.lock`（同上）\n- IPO周报：`send_ipo_report.py` → `/tmp/a_stock_ipo.lock`（原子 os.O_EXCL 创建，更严格，finally 解锁）\n- 晨报：`send_morning_report.py` → `/root/.hermes/skills/A-stock-report/scripts/.morning_report_lock.json`（JSON 文件，内容含 `date` 和 `status`，检查当日是否已成功推送后才允许重复执行）\n\n**Q7：报告内容日期和文件名不对应？**\nA：收盘小结文件名=报告日期；晚报文件名=生成当天日期，内容日期=上一交易日；周末要闻以内容里两融余额标注的日期为 key，与收盘小结文件名日期对齐合并。\n\n**Q8：如何使用 `--date` 指定历史日期？**\nA：收盘小结和晚报均支持 `--date YYYY-MM-DD`，如 `python3 send_close_summary.py --date 2026-04-13`。晨报不支持指定历史日期。\n\nFile v3.5.3:cron_jobs/README.md\n\n# cron_jobs/ — 生产 cron 任务的人类可读镜像\n\n## ⚠️ 重要：本目录文件**不被任何代码读取**\n\n`cron_jobs/cron_mirror.json` 是 `~/.hermes/cron/jobs.json` 里**独立脚本型 cron 任务的人类可读副本**。\n\n- **不被 `skill_dispatcher.py` 读取**（dispatcher 只读 `templates/*.json`）\n- **不被 OpenClaw cron 直接读取**（OpenClaw 只读 `~/.hermes/cron/jobs.json`）\n- 作用是**给 AI / 用户审计**：\"A 股 3 个独立脚本任务在生产 cron 里到底是怎么配的\"\n\n## 文件清单\n\n| 文件 | 作用 |\n|------|------|\n| `cron_mirror.json` | **唯一镜像文件**，内含 3 任务（close_summary/intraday/ipo_report）|\n| `README.md` | 本文件 |\n\nv3.1.4 起 3 镜像合为单文件，强制一致，避免之前\"改一处忘改别处\"的纪律性 bug。\n\n## 4 端真相分布\n\n| 维度 | 在哪里 | 角色 |\n|------|--------|------|\n| **LLM 调度模板** | `templates/{morning,evening,weekend}.json` | 被 `skill_dispatcher.py` 读取 |\n| **生产 cron 真实配置** | `~/.hermes/cron/jobs.json` | 被 OpenClaw 读取并定时触发 |\n| **本目录归档镜像** | `cron_jobs/cron_mirror.json` | **人类审计用**，内含 3 任务镜像，prompt 字段与 jobs.json 一字不差 |\n| **SKILL.md 文档** | `SKILL.md` 任务清单段 | 文档层说明 |\n\n## 单文件结构\n\n```json\n{\n  \"_meta\": { \"purpose\": \"...\", \"mirror_of\": \"...\", \"version\": \"...\", \"history\": \"...\", \"see_also\": \"...\" },\n  \"tasks\": {\n    \"close_summary\": { \"name\": \"A股收盘小结\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"intraday\":      { \"name\": \"A股盘中预警\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"ipo_report\":    { \"name\": \"A股IPO周报\", \"schedule\": \"...\", \"prompt\": \"...\", ... }\n  }\n}\n```\n\n任务键名（close_summary/intraday/ipo_report）= 文件名时代的标识，跟历史档案一致。\n\n## 维护纪律\n\n**修改 `jobs.json` 里的 prompt 时，必须同步修改 `cron_jobs/cron_mirror.json` 中对应任务**，保证镜像与生产一致。\n\n**🛡️ v3.1.5+ 推荐用护栏脚本一次性检查 4 端一致性**（templates ↔ cron_mirror ↔ jobs.json ↔ SKILL.md）：\n\n```bash\npython3 /root/.hermes/skills/A-stock-report/scripts/check_consistency.py\n# exit 0=全过，1=有错误\n# 加 --verbose 看每条 ✅，加 --fix-hint 看修复建议\n```\n\n**legacy 一行命令**（仅检查镜像与 jobs.json 的 prompt 一致性，v3.1.4 时代的命令，v3.1.5 起推荐上面那个）：\n\n```bash\npython3 -c \"\nimport json\njobs = json.load(open('/root/.hermes/cron/jobs.json'))\nmirror = json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))\nm = {'A股收盘小结':'close_summary','A股盘中预警':'intraday','A股IPO周报':'ipo_report'}\nfor j in jobs['jobs']:\n    if j['name'] in m:\n        mirror_prompt = mirror['tasks'][m[j['name']]]['prompt']\n        print(j['name'], j['prompt'] == mirror_prompt)\n\"\n```\n\n## 历史\n\n- **v3.1.4 (2026-06-09)**: 合井 3 文件为 `cron_mirror.json`（67 行 / 2.6KB），README 同步更新\n- **v3.1.3 (2026-06-09)**: 新建 `cron_jobs/intraday.json` 镜像（v3.0~v3.1.2 期间已存在 close_summary/ipo_report 镜像）\n- **备份位置**: `/workspace/archive/cron_jobs_3split_20260609_1952.bak/`（v3.1.4 前 3 文件的完整备份）\n\nFile v3.5.3:_meta.json\n\n{\n  \"ownerId\": \"kn7b60cvvedv8jkxs5gy3m9c0d837e9f\",\n  \"slug\": \"a-stock-report\",\n  \"version\": \"3.5.3\",\n  \"publishedAt\": 1781932715646\n}\n\nFile v3.5.3:references/config.json\n\n{\n  \"_note\": \"本文件为历史参考（2026-04-04 快照）。当前真相请看：\\n  - cron_jobs/cron_mirror.json（独立脚本任务真相）\\n  - templates/*.json（LLM 驱动型任务 prompt 真相）\\n  - scripts/_send_lib.py（推送共用库，看 get_webhook_url() 实现）\\n  - ~/.hermes/cron/jobs.json（实际运行的 cron 任务）\",\n  \"_deprecated\": \"v3.2.2 起，本文件不再维护。当前所有任务真相在上述 4 处。如需改 cron / prompt / 推送方式，改那 4 处，不要改本文件。\",\n\n  \"webhook_当前实现\": {\n    \"env_var\": \"WECOM_WEBHOOK_KEY\",\n    \"code\": \"scripts/_send_lib.py → get_webhook_url()\",\n    \"loaded_by\": \"每个 send 脚本头部白名单加载 .env（仅 WECOM_WEBHOOK_KEY / IWENCAI_API_KEY / TUSHARE_TOKEN）\",\n    \"历史引用\": \"/workspace/keys/keys_loader.py 已在 v3.1.0+ 弃用，所有 send 脚本改走 env 路径\"\n  },\n\n  \"推送架构（v3.1.0+）\": {\n    \"统一库\": \"scripts/_send_lib.py（原 _notify.py，v3.2.0 统一名）\",\n    \"API\": [\"get_webhook_url() — 读 WECOM_WEBHOOK_KEY env\", \"wx(text) — curl 风格推企业微信 + 自动重试\", \"notify_failure(prefix, msg) — 失败告警（v3.1.0 补丁 2：内部 try/except，不阻断主流程）\"],\n    \"退出码\": {\"0\": \"成功\", \"1\": \"数据/网络错误\", \"2\": \"推送失败\"}\n  },\n\n  \"锁机制（v2.0.3+）\": {\n    \"实现\": \"scripts/_lock.py（PID + TTL + stale 检测）\",\n    \"行为\": [\"无锁 → 创建并占用\", \"有锁 + 持有者存活 + 未超 TTL → 报错退出（避免并发）\", \"有锁 + 持有者死亡 → 自动清理并占用\", \"有锁 + 锁超时（>ttl）→ 视为 stale，清理并占用\"],\n    \"TTL\": \"默认 1 小时（ttl=3600）\",\n    \"自愈真相\": \"自愈逻辑只在 lock() 被调用时触发（被动），不是'30 分钟内自动清理'。脚本崩溃后如果没有下次 lock() 调用，锁会一直留着（5.9 天残留锁案例：6/3 晨报崩溃后到 6/9 没有任何 cron 触发 lock）。v3.2.2 文档修正，行为不变。\",\n    \"教训\": \"不要相信'30 分钟自愈'。设计意图是'TTL=1h 内不允许重复占用'，不是'自动清理'。手动 rm 仍是最快清理方式。\"\n  },\n\n  \"当前 cron 任务（v3.1.4+，权威源：cron_jobs/cron_mirror.json）\": {\n    \"独立脚本型（3 个）\": [\"close_summary: 30 7 * * 1-5 (北京时间 15:30)\", \"intraday: */5 9,10,11,13,14 * * 1-5 (盘中每 5 分钟)\", \"ipo_report: 0 2 * * 6 (周六 10:00)\"],\n    \"LLM 驱动型（3 个）\": [\"morning (晨报): dispatcher + templates/morning.json\", \"evening (晚报): dispatcher + templates/evening.json\", \"weekend (财经周末版): dispatcher + templates/weekend.json\"],\n    \"_deprecated_4_月_快照\": \"本文件 4/4 列出的'工作区整理'cron 不在当前 jobs.json，已删。\"\n  }\n}\n\nFile v3.5.3:references/fallback-chain-validation.md\n\n# Fallback Chain Validation Log\n\n## v3.3.5+2 — 3 层 fallback 链验证矩阵\n\n### 链结构（cron prompt 已注入 3 templates）\n\n```\nL1: batch_web_search (主源：财联社/新华/证券时报)\n   ↓ 失败（success=false / formatted_content=[] / {\"error\": \"...\"}）\nL2: extract_content_from_websites 抓 https://www.cls.cn/telegraph\n   ↓ 失败（JS 动态加载，curl 占位）\nL3: extract_content_from_websites 多源池（按任务类型动态选最权威 2 个）：\n   - 东方财富快讯 https://finance.eastmoney.com/news/cywjh.html（SSG 渲染 + 结构化列表）\n   - 新浪财经首页 https://finance.sina.com.cn/（含\"国际焦点\"分类）\n   - 21 经济网 https://www.21jingji.com/\n   - 中金 https://www.cnfin.com/\n```\n\n### 验证矩阵\n\n| 任务 | L1 状态 | L2 状态 | L3 使用源 | 备注 |\n|------|---------|---------|-----------|------|\n| 6/15 晨报 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富快讯 + 新浪首页 | 7 条要闻全事件型 |\n| 6/15 周末 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富 + 21jingji | 表格化输出 |\n| **6/15 晚报** | ✅ 成功（7 条要闻） | n/a | n/a | **L1 一次过，未触发 fallback** |\n\n### 6/15 晚报实跑数据（验证非 fallback 路径主流通畅）\n\n- L1 成功：`batch_web_search` 返回 20 条 organic results（10/查询 × 2 查询）\n- 主源用：`操盘必读 6/15`（mp.cnfol.com） + `证券时报 gs.html` + `新浪财经 6/15 要闻`（3 源）\n- L1 来源的多样性证明 L1 主流通畅，**fallback 仅作兜底**\n\n## ⚠️ 维护教训 — 选 fallback URL 优先用\"主题聚合页\"而非\"单篇文章\"\n\n### 6/15 晚报实跑发现（2026-06-15 20:00 cron）\n\n- 尝试抓 `https://finance.sina.com.cn/headline/2026-06-15/doc-inicmxay6762199.shtml`\n- 返回内容**完全不是 A 股要闻**——是关于美伊协议 / 原油 / 黄金的**地缘 + 大宗商品**文\n- 该 URL 是新浪\"headline\"频道下的**单篇头条文章**，主题不可预测（每天头条可能是美股/地缘/科技/财经/体育）\n- 当时 L1 已成功（20 条 organic），未强制依赖 L3 这条 URL，但若 L1+L2 失败时正好撞上\"非 A 股主题\"的头条 → fallback 也白搭\n\n### 修复指引（v3.3.5+5 起生效）\n\n- ✅ 优先用**主题聚合页**（每天 N 条要闻，主题限定财经）：\n  - 东方财富快讯 `cywjh.html` — SSG 渲染 + 结构化列表（**最稳**）\n  - 新浪财经**首页** `finance.sina.com.cn/` — 含\"国际焦点\"分类\n  - 21 经济网首页 / 中金首页\n- ❌ 避免用**单篇头条文章**（URL 含 `/doc-...shtml` 或 `/20XX-XX-XX/doc-...`）— 主题不可控\n- 当前 templates 3 个 fallback 提示段已用 `finance.sina.com.cn/`（首页）— **正确**\n- 该问题不影响当前协议（L1+L2 成功率已够高），仅作未来扩展 fallback 池时的选 URL 规范\n\n## 历史教训（v3.3.5+1 → v3.3.5+4 演进）\n\n- **L1 失败率 20%**（agent.log 35 次调用 7 次失败）→ v3.3.5+4 加 retry-once\n- **L2 失败率 100%**（cls.cn/telegraph 是 JS 动态加载）→ v3.3.5+2 改用 SSG 页\n- **L3 选 URL 原则**：聚合 > 单篇（v3.3.5+5）\n\n## 维护建议\n\n- 每次 cron 失败时检查本表更新\n- 季度审计 fallback URL 是否仍可达（curl 200/200 含内容）\n- 主题聚合页优先级：东方财富快讯 > 新浪首页 ≥ 21jingji ≥ 中金\n\nFile v3.5.3:references/weekend-4kb-budget.md\n\n# 财经周末版 4KB 字节预算实战记录（v3.4.x）\n\n**实战触发**：2026-06-16 周二 cron 实跑（异常周——本周交易日 Tue 6/9 → Mon 6/15，跳过 Sat/Sun 6/13-6/14 视为周末，5d 数据完整 7 字段）。\n\n**目标**：把 8 条要闻 + 5d 情绪表格 + 解读 + 3 个关注板块 + 免责声明塞进企业微信 webhook `msgtype=text` 的 4096 字节硬上限。\n\n## 关键发现（不是模板里写明的，是实跑摸出来的）\n\n### 1. 标题会被脚本自动覆盖\n`send_weekend_news.py` 第 187-192 行强制把首行标题改为 `📰 【财经周末要闻】{sat} - {sun}`，其中：\n- `sat = today - 1 day`\n- `sun = today`\n\n**今日（2026-06-16 周二）算出来 =** `📰 【财经周末要闻】2026年06月15日 - 2026年06月16日`（66 字节）\n\n**LLM 写的原始标题** `📰 【财经周末要闻】2026年6月14日（周日）`（57 字节）\n\n**delta = +9 字节**。LLM 排版时必须按 66 字节预占位，不能按 57 字节算余量。\n\n### 2. 注入正则不匹配 markdown 表格\n`_build_and_push_report()` 第 215 行正则：`•\\s*{label}[：:].*?(?=[\\n•])`\n\n这只匹配 `• 标签：值` 这种 bullet 写法。**如果 LLM 用 markdown 表格**（v3.4.1 立推荐的格式），注入静默跳过（`injected: 0/7`）。\n\n**含义**：表格里的 7 字段值必须由 LLM 直接从 `/tmp/_weekend_5d.json` 填入，不能指望脚本注入覆盖。脚本注入仅对传统 bullet 排版生效。\n\n### 3. 字节预算实操（3968 字节样本）\n\n| 段 | 字节占比 | 备注 |\n|---|---|---|\n| 标题 | 66 | 必占 |\n| 8 条要闻（标题+摘要+来源+空行） | ~2200 | 每条 ~275B，含 1 空行 |\n| 段标题 + 5d 表头 + 7 行 | ~900 | 表格紧凑化（周X 名缩掉、列名精简） |\n| 一周解读 | ~210 | ≤ 50 字硬约束的 ~3.5 倍，OK |\n| 段标题 + 关注板块 3 条 | ~430 | |\n| 免责声明 | ~50 | |\n\n**总 3968 + 9 标题 delta = 3977 字节** ≤ 4096，安全 ~120 字节 buffer。\n\n**踩坑样本**：第一稿 4856 字节（超 758B）→ 第二稿 4194B（仍超 98B）→ 第三稿 4121B（仍超 25B）→ 第四稿 4067B（标题 swap 后 4076B，仍卡边）→ 第五稿 3968B（**达标**）。\n\n### 4. msgtype=text 的隐性约束\n\n`wx()` 内部固定 `msgtype: text`（不是 markdown）。这意味着：\n- markdown 表格**不会渲染**，只显示为原始 `| ... |` 文本\n- 表情 ✅/❌/⚠️ 可正常显示（Emoji 不在 markdown 语法范围内）\n- 4KB 限制是**text 字段的字节长度**，不是渲染后字符数\n\n**含义**：表格只是给用户**可读性**（微信对齐显示），不是真正的 markdown 渲染。优化字节用 markdown 表格（v3.4.1 决策）依然成立。\n\n## 与模板约束的关系\n\n| 模板约束 | 字节预算约束 | 冲突时 |\n|---|---|---|\n| ≤ 1500 字 | ≤ ~3900 字节 | **字节是硬墙**（4KB 微信），字数是软目标 |\n| 6-8 条要闻 | 实测 8 条 ~2200B | 8 条安全，9 条必爆 |\n| 每条 ≤ 70 字 | 实测 ~50-60 字 ~270B | OK |\n| 关注板块 ≤ 100 字/段 | 实测 ~80 字/段 ~140B | OK |\n\n## 实战建议（下次跑 cron 时）\n\n1. **目标 ≤ 3900 字节**（不是 4096）—— 留 200B buffer 给标题 delta + 编码波动\n2. **5d 表格用紧凑列名**：`06/09` 而非 `06/09 周二`、`情绪打分` 而非 `量化情绪打分`、`两融(亿)` 而非 `两融余额(亿)`、`两融占比` 而非 `两融/流通市值`\n3. **IF 基差裸值不带\"升水/贴水\"标签**——升贴水从符号自明（+ 升水 / - 贴水）\n4. **关注板块段每条 ≤ 80 字**——3 条 = ~430B 安全\n5. **要闻段每条 ≤ 60 字摘要**——8 条 + 空行 = ~2200B\n6. **必填免责声明**（v3.3.5+3 fix 的目标）—— 50 字节不可砍\n\n## 异常周（Dragon Boat 等）日期处理\n\n2026-06-09（Tue）→ 2026-06-12（Fri）→ 2026-06-15（Mon）是 5 个交易日，6/13-6/14 视为周末，**6/16 周二 cron 触发**产生\"周末\"报告。\n\n**脚本标题 swap 行为**：`sat = 6/15`, `sun = 6/16`，生成 `2026年06月15日 - 2026年06月16日` —— 视觉上不是\"周末\"日期范围但脚本不感知，按 `today-1` 硬算。\n\n**LLM 端的妥协**：把 5d 表格的日期列名按 `MM/DD` 简写（不带周X），让用户自己脑补日期对应星期。\n\n## 相关 changelog\n\n- v3.3.5+3（2026-06-15）—— 周末要闻 4KB 截断修复（字数硬约束 + 防幻觉 + 表格化）\n- v3.4.1（2026-06-15）—— 5d 数据块驱动 + markdown 表格化\n- v3.4.2（2026-06-15）—— 6-8 条放宽 + 摘要压到 1 句\n- v3.4.3（2026-06-16）—— 4 类 query 砍外围/预判段\n\n**本次实跑（2026-06-16）发现**：以上约束叠加后实际需 ≤ 3900 字节，模板未明示，列入 references 作为下次复盘参考。\n\nFile v3.5.3:skill-card.md\n\n## Description: <br>\nA股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。 <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[cookfish1979](https://clawhub.ai/user/cookfish1979) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nAnalysts, traders, and operations users use this skill to collect A-share market data, generate scheduled morning, close, evening, intraday alert, IPO, and weekend finance reports, and send those reports to WeCom. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Scheduled scripts can automatically post financial reports to WeCom. <br>\nMitigation: Review the configured schedules and webhook destination before installation, and use a dedicated low-privilege webhook key. <br>\nRisk: Credential lookup may expose or overuse environment-based secrets if configured broadly. <br>\nMitigation: Keep WECOM_WEBHOOK_KEY and IWENCAI_API_KEY in a scoped .env file or secret manager, avoid shell profile storage, and rotate keys if exposure is suspected. <br>\nRisk: External finance-data and web-search calls, including the Sina data-access workaround, can affect reliability or policy fit. <br>\nMitigation: Confirm the data-access approach is acceptable for the deployment environment and monitor report runs for source failures. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/cookfish1979/a-stock-report) <br>\n- [cron_jobs README](cron_jobs/README.md) <br>\n- [Runtime configuration reference](references/config.json) <br>\n- [Fallback chain validation log](references/fallback-chain-validation.md) <br>\n- [Weekend report byte budget record](references/weekend-4kb-budget.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown-style financial reports, text alerts, JSON data files, and shell commands for scheduled execution] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Reports may be posted automatically to WeCom and include a required investment-risk disclaimer.] <br>\n\n## Skill Version(s): <br>\n3.5.3 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v3.5.3:cron_jobs/cron_mirror.json\n\n{\n  \"_meta\": {\n    \"purpose\": \"生产 cron 任务的人类可读镜像（不被任何代码读取）\",\n    \"mirror_of\": \"~/.hermes/cron/jobs.json\",\n    \"version\": \"3.3.2\",\n    \"history\": \"v3.0~v3.1.3 期间以 3 个独立文件存在（close_summary/intraday/ipo_report），v3.1.4 合井为单文件以便强制一致。\",\n    \"see_also\": \"cron_jobs/README.md\"\n  },\n  \"tasks\": {\n    \"close_summary\": {\n      \"name\": \"A股收盘小结\",\n      \"schedule\": \"30 7 * * 1-5\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_close_summary.py\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周一至五 15:30 北京时间触发，akshare 拉收盘数据，生成收盘小结推送到 local 通道\",\n        \"depends_on\": [\n          \"send_close_summary.py\"\n        ]\n      }\n    },\n    \"intraday\": {\n      \"name\": \"A股盘中预警\",\n      \"schedule\": \"*/5 9,10,11,13,14 * * 1-5\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_intraday_alert.py 2>&1\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周一至五交易时段每 5 分钟一次（9/10/11/13/14 点整点过 5 分），腾讯财经 qt.gtimg.cn 拉 6 大指数实时涨跌幅，任一指数 ±2% 触发预警；同指数同档位每天只推一次（状态文件去重）。v3.2.5 起改为纯 bash prompt（与收盘小结/IPO 周报同款），不再触发 LLM 思考，context 占用从每天 ~50-150 KB 降至 ~1 KB。\",\n        \"depends_on\": [\n          \"send_intraday_alert.py\"\n        ],\n        \"migrated_from\": \"templates/intraday.json（v3.1.3 归档清理：模板是 LLM 驱动型设计，但实际 cron 早已是独立脚本模式，模板从未被生产加载）\",\n        \"thresholds\": {\n          \"implemented\": \"1 个：6 大指数涨跌幅 ±2%\",\n          \"designed_but_unimplemented\": [\n            \"IF 当月连续涨幅 > 1.5%（期货升水）\",\n            \"主力净流入 > 200亿元（北向/主力）\",\n            \"炸板率 > 40%（短线情绪）\"\n          ],\n          \"data_source\": \"腾讯财经 qt.gtimg.cn（脚本内硬编码）\"\n        },\n        \"note\": \"templates/intraday.json 已删除；本档案（cron_jobs/intraday.json）是该任务在 v3.0 架构下的真实配置中心。LLM dispatcher 中 intraday 任务同步移除。\"\n      }\n    },\n    \"ipo_report\": {\n      \"name\": \"A股IPO周报\",\n      \"schedule\": \"0 2 * * 6\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_ipo_report.py\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周六 10:00 北京时间触发，akshare 拉 6 个 IPO 数据接口，生成 IPO 周报推送到 local 通道\",\n        \"depends_on\": [\n          \"send_ipo_report.py\"\n        ]\n      }\n    }\n  }\n}\n\nFile v3.5.3:templates/evening.json\n\n{\n  \"prompt\": \"1. 调用晚报数据采集脚本，将结果写入约定路径：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/collect_evening_data.py\\n   \\n   采集内容：六大指数、亚太股市、两融余额、两融比例、沪深300 PE分位数、股市风险溢价（ERP）等结构化数据，输出 JSON + 晚报 Markdown。\\n\\n2. 读取采集结果文件 /tmp/evening_data.json，结合采集的晚报 Markdown，用 batch_web_search 搜索今日财经要闻（6-8条）：\\n   - \\\"A股重要财经要闻 宏观政策 2026年6月12日（周五）\\\"\\n   - \\\"A股板块异动 热点题材 2026年6月12日（周五）\\\"\\n   \\n   ⚠️ 搜索失败 fallback：若 batch_web_search 返回空（success=false / formatted_content=[]）或返回 {\\\"error\\\": \\\"调用结果不可用\\\"}（MCP server 端瞬时挂，agent.log 累计失败率 20%），\\n   **先重试 1 次**（cost 低, 23s 内自愈 — 0fbdf302145e 6/14 样本），\\n   **重试仍失败则立即改用** mcp_matrix_extract_content_from_websites 抓 https://finance.eastmoney.com/news/cywjh.html（东方财富快讯，SSG 渲染 + 结构化列表）或 https://finance.sina.com.cn/（新浪财经首页，含\\\"国际焦点\\\"）\\n   6-8 条要闻，源标\\\"财联社\\\"（fallback 兜底时按实际来源标\\\"东方财富\\\"或\\\"新浪财经\\\"，不能统一标）。不要凭模型知识补全。\\n   ⚠️ 关键要求：搜索结果必须包含具体数字，所有数据不得出现\\\"约\\\"、\\\"约XX\\\"、\\\"约XX%\\\"等模糊表述，必须填入精确值。\\n   ⚠️ 字数限制：全文不超过2000字，每条要闻点评控制在50字以内，6-8 条。\\n   ⚠️ 时间窗：过去 24 小时内（强制时间过滤、避免旧闻）。\\n   ⚠️ 范围：只保留 4 类 —— 政策事件 / 宏观数据（CPI/PPI/M2/社融/PMI）/A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）/海外市场大变动（美联储/欧央行/日央行决议/重要地缘事件/重要海外公司财报）。\\n   ⚠️ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）；按重要性排（政策 > 宏观数据 > A 股主体事件 > 海外大变动）。\\n\\n3. 【v3.1.0 协议】将 AI 生成的内容写入 /tmp/evening_report_ai.txt（注意：不是 _content.txt！）。\\n   文件必须包含两个区块，**用 [财经要闻] / [操作建议] 标记严格分割**，否则 send 脚本会硬失败（exit 1）：\\n\\n   📰 【财经晚报】[YYYY年MM月DD日（周X）]\\n   \\n   ━━━ 一、财经要闻 ━━━\\n   [财经要闻]\\n   【1】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   【2】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   ...（6-7 条要闻，顺序编号）\\n   \\n   【本段硬约束 — v3.1.0 双标记 + v3.3.0 要闻定位 + v3.3.1 空行 + 来源约束】\\n   ✅ 协议硬约束（v3.1.0 强制）：\\n     · 必须有 [财经要闻] 标记 + 至少 1 条要闻\\n     · 必须有 [操作建议] 标记 + 至少 1 条建议\\n     · 缺任一标记或对应内容为空 → send 脚本立即 SystemExit 1，晚报不会推送\\n   ❌ 财经要闻 ≠ 盘面数据/资金流向/估值数据\\n   ✅ 6-8 条要闻必须从以下 4 类中选（按重要性排）：\\n     · 政策事件（发改委/央行/财政部/证监会/ZZ 局 会议/文件、表态）\\n     · 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率 等统计局/央行发布）\\n     · A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）\\n     · 海外市场大变动（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件）\\n   ✅ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）。\\n   ❌ 禁止作为\\\"要闻\\\"标题的内容（这些是【盘后数据】，非新闻）：\\n     · 指数点位+涨跌幅（如\\\"沪指失守 4000 点跌 0.16%\\\"）\\n     · 估值/资金/成交额等单一数据指标（如\\\"两融余额 28490 亿\\\"、\\\"沪深 300 PE 13.52\\\"）\\n     · 机构策略观点（无具体新闻事件）（如\\\"短期 A 股或以震荡为主\\\"）\\n     · 亚太/美股盘面描述（只列点位涨跌幅，无具体事件）\\n   ✅ 盘后数据正确归属 = [操作建议] 段的\\\"依据\\\"（不占要闻位）\\n     例：建议\\\"控仓 5 成\\\"的依据 = 成交额 25520 亿较前日缩量（数据 → 依据）\\n   ✅ 来源约束（每条要闻必须含来源标注，缺源 = 视为 LLM 杜撰）：\\n     · \\\"｜来源：XX 媒体\\\"（新华社/财联社/证券时报/第一财经/中国证券报/上海证券报/21 世纪经济报道）\\n     · batch_web_search 结果中无对应来源的\\\"事件\\\" → 禁止写入要闻段\\n   ✅ 空行硬约束：每条要闻之间必须 1 个空行隔开（违反 = 推送失败，可读性差）\\n   ✅ 字数限制：每条点评 ≤ 50 字符 / 全文 ≤ 2000 字 / 要闻 ≤ 7 条\\n   数据缺失处理：若搜索无果，标注\\\"❌ 数据缺失\\\"或直接删掉该条，禁用\\\"约/大约\\\"等模糊词，不得凭模型知识补全。\\n   \\n   ━━━ 二、今日操作建议 ━━━\\n   [操作建议]\\n   ① 顺势而为：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符的具体数据指标 + 一句结论）\\n   ② 超跌博弈：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   ③ 控制仓位：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   \\n   【本段硬约束 — v3.3.1 依据长度 + v3.1.3 防幻觉 + 引用字段严格限定】\\n   ✅ 合规示例（30-50 字符）：\\n     ① 顺势而为：⚠️控仓 5 成以下\\n       依据：沪深 300 PE 91% 分位 + ERP 2.61% 偏高估，估值消化压力大。\\n     ② 超跌博弈：⚠️仅限科创 50 内低吸\\n       依据：科创 50 涨 0.62% 唯一收红，技术成长有结构性资金承接。\\n     ③ 控制仓位：✅高股息提至底仓 40%\\n       依据：两融余额 2.80% 占流通市值处安全区间，防御板块提供安全边际。\\n   ❌ 违规示例（120 字符超长）：\\n     依据：6/11 上证 3987.0 跌 0.16% 失守 4000 点、创业板 3811.2 跌 1.13%、深成指跌 0.68%；成交额 25520 亿较前日 26213 亿小幅缩量；沪深 300 PE 13.52 处近 5 年 91% 分位、ERP 2.61% 低于 3% 高估阈值。\\n   ✅ 可引用字段（必须从 /tmp/evening_data.json 读取真实数字）：\\n     · indices：6 大指数（上证/深成/创业板/科创50/沪深300/中证500）的 close + pct\\n     · rz_bal / rz_delta：两融余额及日变化（亿元）\\n     · rz_buy：两融交易额（亿元）—— 反映场内杠杆情绪\\n     · turnover：全市场成交额（亿元）—— 反映市场活跃度\\n     · pe_data.risk_premium：股市风险溢价% —— <3%高估/3-6%中性/>6%低估\\n     · pe_data.hs300_pe + hs300_pct5y：沪深300 PE 及近5年分位点\\n     · asia_pacific：亚太股市收盘数据\\n     · trade_date / trade_date_fmt：日期上下文\\n   ❌ 禁止编造（晚报采集脚本不输出下列数据，LLM 不得自行生成）：\\n     · 任何具体股票名称 + 涨跌幅（如\\\"贵州茅台 +3.2%\\\"）—— 未接入个股/持仓数据源\\n     · 任何具体板块涨跌幅及龙头股（如\\\"半导体板块 +5%，中芯国际涨停\\\"）—— 未接入板块行情\\n     · 任何涨停/跌停家数、封板率、炸板率、连板股等情绪指标 —— 未接入打板数据\\n     · 任何龙虎榜/北向资金/融资融券个股数据\\n     · 任何明日具体操作点位（如\\\"沪指压力位 3200 / 支撑位 3150\\\"）—— 纯 LLM 推断\\n     · 任何美股盘中数据 —— 晚报采集时美股未开盘或未收盘\\n   ⚠️ 可引用但必须 cite 来源：\\n     · 财经日历（节假日/央行政策/重大会议）—— 用 batch_web_search 当日搜索\\n     · 美股盘前/盘后期货（纳指期货、A50 期货夜盘）—— 需当日搜索结果支撑\\n     · 重大地缘政治事件 —— 需当日搜索结果支撑\\n   \\n   ━━━ 风险提示 ━━━\\n   （1-3 条，根据 rz_buy/turnover/pe_data 字段自动判断）\\n   \\n   【本段硬约束 — v3.1.3 风险提示策略（基于数据动态调整）】\\n   ✅ 两融交易额/A股成交额 比例计算公式：(rz_buy / turnover * 100)%\\n   ✅ 风险提示策略表：\\n     · 两融交易额/A股成交额 < 7%：杠杆保守，情绪偏弱 → 风险提示侧重\\\"控制仓位\\\"\\n     · 两融交易额/A股成交额 7-11%：中性 → 风险提示侧重\\\"结构性机会\\\"\\n     · 两融交易额/A股成交额 > 11%：过热 → 风险提示侧重\\\"杠杆风险\\\"\\n     · 股市风险溢价 < 3%：高估 → 风险提示侧重\\\"估值压力\\\"\\n     · 股市风险溢价 > 6%：低估 → 风险提示侧重\\\"长线机会\\\"\\n   数据缺失处理：若某字段采集失败，标注\\\"❌ 数据缺失\\\"，禁用\\\"约/大约\\\"\\n\\n【输出末尾硬约束 — 免责段】（v3.3.2 修复 · 方案 1 模式）\\n   你必须在报告**最后一行**输出以下免责段（与早报模式完全一致）：\\n\\n   ⚠️ 免责声明：仅供参考，不构成投资建议。股市有风险，投资需谨慎。\\n\\n   说明：此模板已对齐早报模式（单一控制点），免责声明由 LLM 统一生成，\\n   脚本 build_report() 不再追加。\\n\\n4. 调用晚报推送脚本完成推送：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_evening_report.py\\n   \\n   CLI flag 说明（v3.1.0）：\\n   - 默认自动加载 /tmp/evening_report_ai.txt（不需要加 flag）\\n   - --no-ai-fill：跳过加载 AI 内容（仅用于测试脚本本身，正常流程不要加）\\n   - --dry-run：生成报告 + 保存到 reports/ 目录 + 打印 stdout，**跳过企业微信推送**（用于调试 dispatcher 协议是否正确）\\n   - --date YYYY-MM-DD：指定报告目标日期（默认当天）\\n\\n5. 完成后打印 \\\"✅ 晚报\\\"\\n\"\n}\n\nFile v3.5.3:templates/morning.json\n\n{\n  \"prompt\": \"0. 【强约束 — LLM 必读】渲染晨报前必须先 cat /tmp/morning_data.json 读真实数字：\\n   cat /tmp/morning_data.json\\n   然后仅用其中真实数字填充模板占位符（XXXXX.XX = price、+X.XX% = pct、XX.XX = vix.value 等）。\\n   严禁凭模型知识/印象/历史样本自编数字（包括\\\"约\\\"、\\\"差不多\\\"、\\\"估计\\\"等），缺失字段标\\\"❌ 数据缺失\\\"。\\n   注：模板里的 XXXXX.XX 是格式示例，不是可编造的占位符。\\n\\n1. 调用晨报数据采集脚本获取结构化数据：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/collect_morning_data.py\\n   \\n   采集内容：道琼斯/标普500/纳斯达克/VIX点位涨跌幅、恒生指数/A50期货、WTI原油/现货黄金价格\\n\\n2. 读取采集结果 /tmp/morning_data.json，结合今日财经要闻，用 batch_web_search 搜索（6-10条）：\\n   - \\\"A股重要财经要闻 宏观政策 [今日日期]\\\"\\n   - \\\"A股板块异动 热点题材 [今日日期]\\\"\\n   \\n   ⚠️ 搜索失败 fallback：若 batch_web_search 返回空（success=false / formatted_content=[]）或返回 {\\\"error\\\": \\\"调用结果不可用\\\"}（MCP server 端瞬时挂，agent.log 累计失败率 20%），\\n   **先重试 1 次**（cost 低, 23s 内自愈 — 0fbdf302145e 6/14 样本），\\n   **重试仍失败则立即改用** mcp_matrix_extract_content_from_websites 抓 https://finance.eastmoney.com/news/cywjh.html（东方财富快讯，SSG 渲染 + 结构化列表）或 https://finance.sina.com.cn/（新浪财经首页，含\\\"国际焦点\\\"）\\n   6-8 条要闻，源标\\\"财联社\\\"（fallback 兜底时按实际来源标\\\"东方财富\\\"或\\\"新浪财经\\\"，不能统一标）。不要凭模型知识补全。\\n   ⚠️ 关键要求：所有数据必须为精确数字，不得出现\\\"约\\\"、\\\"约XX\\\"、\\\"约XX%\\\"等模糊表述\\n   ⚠️ 字数限制：全文不超过2000字，每条要闻点评控制在50字以内，6-8 条。\\n   ⚠️ 时间窗：过去 24 小时内（强制时间过滤、避免旧闻）。\\n   ⚠️ 范围：只保留 4 类 —— 政策事件 / 宏观数据（CPI/PPI/M2/社融/PMI）/A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）/海外市场大变动（美联储/欧央行/日央行决议/重要地缘事件/重要海外公司财报）。\\n   ⚠️ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）；按重要性排（政策 > 宏观数据 > A 股主体事件 > 海外大变动）。\\n   ⚠️ 全局数据缺失处理：任何字段采集失败 → 标\\\"❌ 数据缺失\\\"，禁用\\\"约/大约\\\"，禁止凭模型知识补全。\\n   ⚠️ 全局禁止编造（晨报采集脚本不输出，LLM 不得自行生成）：\\n     · 任何具体股票名称 + 涨跌幅 —— 未接入个股/持仓数据源\\n     · 任何具体板块涨跌幅及龙头股（\\\"半导体板块+5%，中芯国际涨停\\\"）—— 未接入板块行情\\n     · 任何 A 股指数当日点位/涨跌幅（沪指/深成指/创业板/沪深300 等）—— 采集脚本不输出\\n     · 任何成交量/成交额数字\\n     · 任何 PE/PB/风险溢价/两融/融资融券个股数据\\n     · 任何涨停/跌停家数、封板率、炸板率、连板股等情绪指标 —— 未接入打板数据\\n     · 任何龙虎榜/北向资金个股数据\\n     · 任何\\\"明日具体操作点位\\\"（\\\"沪指压力位 3200 / 支撑位 3150\\\"）—— 纯 LLM 推断\\n   ✅ 全局可引用字段（必须从 /tmp/morning_data.json 读取真实数字）：\\n     · us_indices（道指/标普/纳指 的 price + pct）\\n     · vix（value + level）\\n     · hk_a50（富时A50期货、恒生指数 的 price + pct）\\n     · commodities（现货黄金、WTI原油 的 price + pct）\\n     · report_date / trade_date（日期上下文）\\n\\n3. 将结构化数据 + 财经要闻 合并渲染为完整晨报，写入 /tmp/morning_report_content.txt\\n   格式严格遵循以下模板（约束即模板 — 每段后紧跟硬约束）：\\n\\n   📰 【股市晨报】[YYYY年MM月DD日（周X）]\\n   \\n   ━━━ 隔夜全球市场 ━━━\\n   【美股收盘】\\n   ▪ 道琼斯：XXXXX.XX点，+X.XX%\\n   ▪ 标普500：XXXXX.XX点，+X.XX%\\n   ▪ 纳斯达克：XXXXX.XX点，+X.XX%\\n   ▪ VIX 恐慌指数：XX.XX（+X.XX%），恐慌等级：【低/中/高位】（vix.level 字段）\\n\\n   【港股及A50】\\n   ▪ 恒生指数：XXXXX.XX点，+X.XX%\\n   ▪ 富时A50期货：XXXXX.XX点，+X.XX%，【预判A股今日开盘】\\n\\n   【大宗商品】\\n   ▪ WTI 原油：$XX.XX/桶，+X.XX%\\n   ▪ 现货黄金：$XXXX.XX/盎司，+X.XX%\\n   \\n   【本段硬约束 — v3.1.3 防幻觉 + 全段数据缺失处理】\\n   （见顶部全局约束）\\n   ⚠️ 可引用但必须 cite 来源：\\n     · 财经日历（节假日/交易日）—— 用 batch_web_search 当日搜索，不许凭记忆\\n     · 地缘政治事件（中东/俄乌/贸易战）—— 必须有当天日期的搜索结果支撑\\n   \\n   ━━━ 财经要闻 ━━━\\n   【1】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n\\n   【2】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ...（6-7 条要闻，顺序编号，每条格式固定）\\n   \\n   【本段硬约束 — v3.3.0 要闻定位 + v3.3.1 空行 + 来源约束 + 字数限制】\\n   ❌ 财经要闻 ≠ 盘面数据/资金流向/估值数据\\n   ✅ 6-8 条要闻必须从以下 4 类中选（按重要性排）：\\n     · 政策事件（发改委/央行/财政部/证监会/ZZ 局 会议/文件、表态）\\n     · 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率 等统计局/央行发布）\\n     · A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）\\n     · 海外市场大变动（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件）\\n   ✅ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）。\\n   ❌ 禁止作为\\\"要闻\\\"标题的内容（这些是【盘后数据】，非新闻）：\\n     · 指数点位+涨跌幅（如\\\"沪指失守 4000 点跌 0.16%\\\"）\\n     · 估值/资金/成交额等单一数据指标（如\\\"两融余额 28490 亿\\\"、\\\"沪深 300 PE 13.52\\\"）\\n     · 机构策略观点（无具体新闻事件）（如\\\"短期 A 股或以震荡为主\\\"）\\n     · 亚太/美股盘面描述（只列点位涨跌幅，无具体事件）\\n   ✅ 盘后数据正确归属 = [操作建议] 段的\\\"依据\\\"（不占要闻位）\\n     例：建议\\\"控仓 5 成\\\"的依据 = 成交额 25520 亿较前日缩量（数据 → 依据）\\n   ✅ 来源约束（每条要闻必须含来源标注，缺源 = 视为 LLM 杜撰）：\\n     · \\\"｜来源：XX 媒体\\\"（新华社/财联社/证券时报/第一财经/中国证券报/上海证券报/21 世纪经济报道）\\n     · batch_web_search 结果中无对应来源的\\\"事件\\\" → 禁止写入要闻段\\n   ✅ 空行硬约束：每条要闻之间必须 1 个空行隔开（违反 = 推送失败，可读性差）\\n   （字数限制 / 数据缺失处理 见顶部全局约束）\\n   \\n   ━━━ 今日操作建议 ━━━\\n   ① 顺势而为：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符的具体数据指标 + 一句结论）\\n   ② 超跌博弈：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   ③ 控制仓位：✅/❌/⚠️具体策略\\n     依据：（不超过 50 字符）\\n   \\n   【本段硬约束 — v3.3.1 依据长度 + v3.1.3 防幻觉 + 引用字段与一、共享】\\n   ✅ 合规示例（30-50 字符）：\\n     ① 顺势而为：⚠️控仓 5 成以下\\n       依据：沪深 300 PE 91% 分位 + ERP 2.61% 偏高估，估值消化压力大。\\n     ② 超跌博弈：⚠️仅限科创 50 内低吸\\n       依据：科创 50 涨 0.62% 唯一收红，技术成长有结构性资金承接。\\n     ③ 控制仓位：✅高股息提至底仓 40%\\n       依据：两融余额 2.80% 占流通市值处安全区间，防御板块提供安全边际。\\n   ❌ 违规示例（120 字符超长）：\\n     依据：6/11 上证 3987.0 跌 0.16% 失守 4000 点、创业板 3811.2 跌 1.13%、深成指跌 0.68%；成交额 25520 亿较前日 26213 亿小幅缩量；沪深 300 PE 13.52 处近 5 年 91% 分位、ERP 2.61% 低于 3% 高估阈值。\\n   （禁止编造清单 / 可引用字段 见顶部全局约束）\\n   \\n   ━━━ 风险提示 ━━━\\n   （1-3 条，仅从以下 5 类模板中选）\\n   ① 节假日效应（如\\\"端午假期前 X 个交易日，历史资金面偏谨慎\\\"）\\n   ② 隔夜外盘异动（引用 us_indices/vix 真实数字）\\n   ③ 大宗商品异动（引用 commodities 真实数字）\\n   ④ 财经日历事件（必须有 batch_web_search 当日搜索结果支撑）\\n   ⑤ A50 期货 + 港股预判（引用 hk_a50 真实数字）\\n   \\n   【本段硬约束 — v3.1.3 风险提示 5 类模板 + 禁止自由发挥】\\n   ❌ 禁止自由发挥——只能从上面 5 类模板中选（每类一段），不得另起炉灶\\n   ✅ 每条风险提示必须有具体数据支撑（不是\\\"市场可能调整\\\"这种空话）\\n   （数据缺失处理 见顶部全局约束）\\n   \\n   ⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\\n\\n4. 调用晨报推送脚本完成推送：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_morning_report.py\\n\\n5. 完成后打印 \\\"✅ 晨报\\\"\\n\"\n}\n\nFile v3.5.3:templates/weekend.json\n\n{\n  \"prompt\": \"1. 用 batch_web_search 搜索以下内容（v3.4.3 2026/06/16 立 — 4 类查询 (经济政策/宏观数据/A 股重大事件/海外市场大事件) + 48h 时间窗 + 6-8 条 + 一句话摘要 + Q3-2 砍 [下周展望] 的 [外围市场] + [A 股预判] 段；v3.4.2 5 类 → 1 类；v3.4.1 1500 字 + 防幻觉 + 1 句话摘要 保留）：\\n\\n   ⚠️ 搜索失败 fallback：若 batch_web_search 返回空（success=false / formatted_content=[]）或返回 {\\\"error\\\": \\\"调用结果不可用\\\"}（MCP server 端瞬时挂，agent.log 累计失败率 20%），\\n   **先重试 1 次**（cost 低, 23s 内自愈 — 0fbdf302145e 6/14 样本），\\n   **重试仍失败则立即改用** mcp_matrix_extract_content_from_websites 抓 https://finance.eastmoney.com/news/cywjh.html（东方财富快讯，SSG 渲染 + 结构化列表）或 https://finance.sina.com.cn/（新浪财经首页，含\\\"国际焦点\\\"）\\n   6-8 条要闻，源标\\\"财联社\\\"（fallback 兜底时按实际来源标\\\"东方财富\\\"或\\\"新浪财经\\\"，不能统一标）。不要凭模型知识补全。\\n   - \\\"过去 48 小时 财经要闻 经济政策 宏观数据 A 股 重大事件 海外市场大事件\\\"（抓 8-12 条供后续筛选 6-8 条，按重要性排）\\n   \\n   ⚠️ 关键要求：搜索结果必须包含精确数字，所有数据不得出现\\\"约\\\"、\\\"约XX\\\"、\\\"约XX%\\\"等模糊表述，必须填入精确值。\\n   ⚠️ 字数限制（v3.4.1 2026/06/15 立 — 微信 webhook markdown 上限 4 KB 硬约束）：\\n     · 全文不超过 1500 字（留 buffer 给 markdown 标记 + 免责声明 + 微信截断容差）\\n     · 要闻 6-8 条（v3.4.2 放宽自 5-7 条, v3.4.3 保留，按重要性排，禁凑数）\\n     · 每条要闻 ≤ 70 字（标题 ≤ 18 字 + 一句话核心事实+数据 ≤ 30 字 + 来源 ≤ 7 字，v3.4.2 摘要从 2-3 句压到 1 句, v3.4.3 保留）\\n   ⚠️ 时间窗（v3.4.2 放宽, v3.4.3 保留）：过去 48 小时内（原 24h，多覆盖 1 天网住宏观数据；要闻段仍按 6-8 条 + 重要性排，避免旧闻混入）。\\n   ⚠️ 范围：只保留 4 类 (v3.4.3 user 原话) —— 经济政策 / 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率）/A 股重大事件（上市公司重大公告：重组/分红/回购/业绩/股权变更/退市/IPO 注册）/海外市场大事件（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件/重要海外监管动作）。\\n   ⚠️ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）；按重要性排（经济政策 > 宏观数据 > A 股重大事件 > 海外市场大事件, v3.4.3 跟 4 类名一致）。\\n   ⚠️ 防幻觉（v3.4.1 立）：不要为\\\"算力\\\"\\\"AI\\\"\\\"芯片\\\"类板块编造未在搜索结果中出现的具体公司/产品价格信息（如\\\"某云降价 XX%\\\"\\\"某芯片量产\\\"），无法 cite 搜索来源的宁可不写。\\n\\n2. v3.4 数据驱动：dispatcher 已自动抽取过去 5 个交易日（周一到周五）的 7 字段数据。\\n   ✅ 原始数据块在 prompt 末尾\\\"--- 5d 原始数据（v3.4 数据驱动）---\\\"段\\n   ✅ 不需要再 read_file 10 份历史报告\\n   ✅ 缺失字段已标 ❌、直接使用即可（不硬填、不跳不补）\\n\\n   7 字段及来源映射（数据完整性自检用）：\\n   · 综合评分、IF基差                  → 收盘小结_YYYYMMDD.md\\n   · 两融余额、两融余额/流通市值、沪深300PE、PE近5年分位、ERP% → 晚报_YYYYMMDD.md\\n   · 两融数据为 T-1（晚报里 YYYYMMDD 字段是昨日日期）\\n\\n   直接把数据块中的数值填入第 3 步模板的【量化情绪打分】/【两融余额】等行。\\n\\n3. 按以下模板严格格式化内容，写入 /tmp/weekend_news_content.txt：\\n   📰 【财经周末要闻】[YYYY年MM月DD日（周X）]\\n   \\n   ━━━ 周末要闻摘要 ━━━\\n   【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\\n     摘要：（2-3句，概括事件并分析影响）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   【2】（标题）｜...\\n   ⬇️ 1 个空行 ⬇️\\n   ...（6-8 条要闻，顺序编号，每条格式固定）\\n   \\n   【本段硬约束 — v3.1.3 周末要闻 + v3.3.0 要闻定位 + v3.3.1 空行 + 来源约束 + v3.4 数据驱动】\\n   ✅ 可引用字段（必须从真实数据源读取）：\\n     · 周末要闻：batch_web_search 搜索结果（6-8 条，每条带\\\"✅利好/❌利空/⚠️中性\\\"标签）\\n     · 4 类要闻已覆盖 [周末要闻摘要] 段 (经济政策/宏观数据/A 股重大事件/海外市场大事件, v3.4.3 砍美股/A股/大宗商品收盘价段, Q2-A 砍美股回顾)\\n     · 一周情绪轨迹：从 v3.4 dispatcher 注入的 5d 原始数据块读取（综合评分/IF基差/两融余额/两融占比/沪深300PE/PE近5年分位/ERP）\\n     · 日期上下文：report_date / trade_date_fmt\\n   ❌ 禁止编造（采集/搜索脚本不输出下列数据，LLM 不得自行生成）：\\n     · 任何具体股票名称 + 涨跌幅（\\\"贵州茅台本周+5.2%\\\"）—— 未接入个股/持仓数据源\\n     · 任何具体板块涨跌幅及龙头股（\\\"半导体板块+3.5%，中芯国际涨停\\\"）—— 未接入板块行情\\n     · 任何\\\"下周具体操作点位\\\"（\\\"沪指压力位 3200 / 支撑位 3150\\\"）—— 纯 LLM 推断\\n     · 任何未在 batch_web_search 搜索结果中出现的\\\"券商分析师\\\"具体姓名/具体预测数字\\n     · 任何\\\"涨停家数/跌停家数\\\"的实时数字 —— 只能引用历史 5 日的解析值\\n     · 任何\\\"美股/港股/A股\\\"具体点位 —— 必须来自 batch_web_search 当日结果\\n   ⚠️ 可引用但必须 cite 来源（每条数据后面必须有出处）：\\n     · 周末要闻：必须标注\\\"来源：XX媒体\\\"（新华社/财联社/证券时报/第一财经 等）\\n     · 券商展望：必须标注\\\"来源：XX券商 XX 报告\\\"（如搜索不到，删掉不写）\\n     · 地缘政治事件：必须标注\\\"来源：XX媒体 日期\\\"\\n   ❌ 财经要闻 ≠ 盘面数据/资金流向/估值数据\\n   ⚠️ 时间窗边界（v3.4.4 2026/06/16 立 — 区分\\\"要闻\\\" vs \\\"5d 情绪背景\\\"）：\\n     · 【周末要闻摘要】段 = batch_web_search 48h 内结果（脚本启动 now-48h ~ now，覆盖最近 2 天周六周日，不写死日期，跨周自动适用）\\n     · 【一周情绪解读】段 = v3.4 dispatcher 注入的 5d 情绪数据 (T-5 ~ T-1 5 个交易日)，是情绪背景，不进要闻位\\n     · 违反 = \\\"5 月数据/周内旧闻混进要闻\\\" 错位 (6/16 06:53 实跑样本 — 8 条要闻 5 条是 5 月发布，不是 48h 内)\\n   ✅ 6-8 条周末要闻必须从以下 4 类中选（按重要性排，v3.4.3 user 原话 2026/06/16 立）：\\n     · 经济政策（发改委/央行/财政部/证监会/ZZ 局 会议/文件/表态/重大举措）\\n     · 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率 等统计局/央行/海关 发布）\\n     · A 股重大事件（上市公司重大公告：重组/分红/回购/业绩/股权变更/退市/IPO 注册）\\n     · 海外市场大事件（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件/重要海外监管动作）\\n   ✅ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）。\\n   ❌ 禁止作为\\\"要闻\\\"标题的内容（这些是【盘后数据】，非新闻）：\\n     · 指数点位+涨跌幅（如\\\"沪指本周累涨 0.16%\\\"）\\n     · 估值/资金/成交额等单一数据指标（如\\\"两融余额 28490 亿\\\"、\\\"沪深 300 PE 13.52\\\"）\\n     · 券商/机构策略观点（无具体新闻事件）（如\\\"中信证券：短期 A 股或以震荡为主\\\"）\\n     · 亚太/美股盘面描述（只列点位涨跌幅，无具体事件）\\n   ✅ 盘后数据正确归属 = [下周展望] 段的\\\"依据\\\"（不占要闻位）\\n     例：建议\\\"下周控仓 5 成\\\"的依据 = 本周成交额累计缩量 X%（数据 → 依据）\\n   ✅ 空行硬约束：每条要闻之间必须 1 个空行隔开（违反 = 推送失败，可读性差）\\n   ✅ 来源约束（每条要闻必须含来源标注，缺源 = 视为 LLM 杜撰）：\\\"｜来源：XX 媒体\\\"（新华社/财联社/证券时报/第一财经/中国证券报/上海证券报/21 世纪经济报道）；batch_web_search 结果中无对应来源的\\\"事件\\\" → 禁止写入要闻段（已并入上方\\\"可引用但必须 cite 来源\\\"段, 此处仅列来源白名单简表）\\n   数据缺失处理：若搜索无果，标注\\\"❌ 数据缺失\\\"或直接删掉该条，禁用\\\"约/大约\\\"等模糊词，不得凭模型知识补全。\\n   \\n   ━━━ 一周情绪解读 ━━━   【v3.4.1 改 markdown 表格 — 节省 ~50% 字节; v3.4.4 改\\\"情绪解读\\\"命名, 含 5d 表 + 一句话解读, 标题对齐】\\n   | 指标 | 周一 | 周二 | 周三 | 周四 | 周五 |\\n   |---|---|---|---|---|---|\\n   | 量化情绪打分 | XX | XX | XX | XX | XX |\\n   | 两融余额(亿) | XXX | XXX | XXX | XXX | XXX |\\n   | 两融/流通市值 | X.XX% | X.XX% | X.XX% | X.XX% | X.XX% |\\n   | 沪深300PE | XX.XX | XX.XX | XX.XX | XX.XX | XX.XX |\\n   | PE近5年分位 | XX.X% | XX.X% | XX.X% | XX.X% | XX.X% |\\n   | ERP | X.XX% | X.XX% | X.XX% | X.XX% | X.XX% |\\n   | IF基差 | XX.XX | XX.XX | XX.XX | XX.XX | XX.XX |\\n\\n   解读（≤ 50 字，综合情绪+杠杆+估值+预期 4 维一句话总结，缺数据写\\\"数据不足、暂不解读\\\"）\\n\\n   【本段硬约束 — v3.4.1 5d 数据块驱动：表格 + 解读约束】\\n   ✅ 数据来源：dispatcher 注入的\\\"5d 原始数据\\\"块（7 字段 × 5 天，块里 ❌ 的字段直接占位、不重读）\\n   ✅ 表格 7 行 × 5 列：量化情绪/两融余额/两融占比/沪深300PE/PE分位/ERP/IF基差（缺数据用 ❌ 占整行）\\n   ✅ 异常跳变（如单日两融比例跳变 >0.5%）标 ⚠️ 并沿用前日值\\n   ✅ 解读 ≤ 50 字，缺失时写\\\"数据不足、暂不解读\\\"\\n   ━━━ 下周展望 ━━━\\n   （2-3 个板块+逻辑简述，从 4 类要闻 1-8 推：经济政策 → 行业/A 股重大事件 → 公司/海外大事件 → 风险/宏观数据 → 估值/资金）\\n   （v3.4.3 Q3-2 立：砍 [外围市场] + [A 股预判] 段，因 4 类 query 1 不再产\\\"美股期货盘前\\\" 和 \\\"下周 A 股指数推演\\\" 数据源；保留 [关注板块]，从 4 类要闻 1-8 推）\\n   \\n   【本段硬约束 — v3.1.3 防幻觉 + v3.3.1 依据长度 + v3.4 数据驱动】（\\\"禁止编造\\\"清单已并入上方段, 此段不重复）\\n   ⚠️ 关注板块引用字段：4 类要闻 6-8 条中提到的 经济政策/宏观数据/A 股重大事件/海外市场大事件（数据 → 板块依据；v3.4.3 由 4 类 query 1 覆盖）\\n   ✅ 字数限制：每段 ≤ 100 字\\n   \\n   ⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\\n\\n   ──── v3.4 数据驱动 - 自动注入段 ────\\n   {{WEEKEND_5D_DATA}}\\n   ──── v3.4 数据驱动 - 自动注入段结束 ────\\n\\n4. 调用周末要闻推送脚本：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_weekend_news.py\\n\\n5. 完成后打印 \\\"✅ 财经周末要闻\\\"\\n\"\n}\n\nArchive v3.5.2: 24 files, 121348 bytes\n\nFiles: _meta.json (133b), cron_jobs/cron_mirror.json (3155b), cron_jobs/README.md (3297b), references/config.json (2791b), references/fallback-chain-validation.md (3388b), references/weekend-4kb-budget.md (4790b), scripts/_lock.py (2687b), scripts/_send_lib.py (3785b), scripts/_sina_fetcher.py (4874b), scripts/check_consistency.py (26473b), scripts/collect_evening_data.py (40800b), scripts/collect_morning_data.py (18130b), scripts/send_close_summary.py (32469b), scripts/send_evening_report.py (50575b), scripts/send_intraday_alert.py (7797b), scripts/send_ipo_report.py (26325b), scripts/send_morning_report.py (3865b), scripts/send_weekend_news.py (10479b), scripts/skill_dispatcher.py (14834b), skill-card.md (2661b), SKILL.md (33056b), templates/evening.json (10448b), templates/morning.json (9924b), templates/weekend.json (11525b)\n\nFile v3.5.2:SKILL.md\n\n---\nname: A-stock-report\ndescription: \"A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。\"\nversion: 3.5.2\n---\n\n# A股报告系统\n\n>A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版\n\n---\n\n## 目录结构（v3.2.3+1 起明示，v3.5.0 简化）\n\n`clawhub publish` 按 `.clawhubignore` 排除 `knowledge/` + `*.bak`（v3.4.4 立），其他整目录上传。装好后 `~/.hermes/skills/A-stock-report/` 结构：\n\n```\nA-stock-report/\n├── SKILL.md                      ← 本文件（含完整执行流程 + 14 段护栏 + changelog 索引）\n├── _meta.json\n├── .clawhubignore                ← v3.4.4 立：排除 knowledge/ + *.bak\n│\n├── 🐍 scripts/                  ← 12 个 Python 脚本 + 3 个 JSON prompt 模板\n│   ├── _lock.py / _send_lib.py  ← 共用库\n│   ├── check_consistency.py     ← 14 段一致性护栏（A~H 段）\n│   ├── skill_dispatcher.py      ← LLM 驱动型任务的 5d 数据抽取 + prompt 注入\n│   ├── collect_{morning,evening}_data.py / send_{morning,close,evening,intraday,weekend,ipo}.py\n│   ├── templates/{morning,evening,weekend}.json\n│   ├── cron_jobs/{cron_mirror.json, README.md}\n│   └── references/{config.json, fallback-chain-validation.md, weekend-4kb-budget.md}\n│\n└── 📚 knowledge/                ← changelog + 决策主题（**按需 skill_view 加载，不进默认 context**）\n    ├── changelog/                ← 按版本号组织\n    │   ├── README.md             ← 35 条 changelog 索引\n    │   └── vX.Y.Z.md             ← 单版完整细节（v3.5.0 立，19 条新加）\n    └── decisions/                ← 跨版本决策中心（按主题）\n        ├── README.md\n        ├── architecture.md       ← 架构演进\n        ├── data-pitfalls.md      ← 数据源踩坑集\n        ├── lessons-learned.md    ← 核心教训\n        ├── guardrails.md         ← 护栏规则\n        └── dispatcher-patterns.md\n```\n\n**knowledge/ 为什么保留在 publish 包但不进默认 context** (v3.4.4 改): `.clawhubignore` 排除后, **装上后无 knowledge/** — 用户需主动 `skill_view` 加载；本机开发保留完整 knowledge/ 不影响发布包大小。\n\n---\n\n## 版本历史（Changelog）\n\n> **精简规则（v3.5.0 立）**：每条 ≤ 1 行索引，详细实战/根因/修法折到 `knowledge/changelog/vX.Y.Z.md`。完整 35 条索引见 [`knowledge/changelog/README.md`](knowledge/changelog/README.md)。\n>\n> **未发版段识别**：标题含 `(未发版)` 的是当前 v3.5.0 待 bump 的小改集合。\n\n### v3.3.0 ~ v3.4.4（19 条，SKILL.md 主体）— 2026-06-11 晚 ~ 2026-06-16\n\n- [v3.5.1 — send_evening_report.py 加 5 项内容质量硬校验](knowledge/changelog/v3.5.1.md) — 2026-06-18 晚（未发版）\n- [v3.4.4 — 异常周（周二 cron）周末要闻端到端验证](knowledge/changelog/v3.4.4.md) — 2026-06-16（未发版）\n- [v3.3.5+5 — fallback 链选 URL 原则：主题聚合页 > 单篇头条](knowledge/changelog/v3.3.5+5.md) — 2026-06-15 20:00 晚报（未发版）\n- [v3.3.5+4 — web_search MCP 重试加固：覆盖 {\"error\": ...} 分支](knowledge/changelog/v3.3.5+4.md) — 2026-06-15 16:35（未发版）\n- [v3.3.5+3 — 周末要闻 4 KB 截断修复 + 防幻觉 + 表格化 + H 段护栏](knowledge/changelog/v3.3.5+3.md) — 2026-06-15 下午（未发版）\n- [v3.3.5+2 — 3 层 fallback 链 + 要闻段反例前置](knowledge/changelog/v3.3.5+2.md) — 2026-06-15 晨报（未发版）\n- [v3.3.5+1 — 3 templates 加 batch_web_search 失败 fallback 机制](knowledge/changelog/v3.3.5+1.md) — 2026-06-13 晚（未发版）\n- [v3.3.5 — 晨报渲染细节对齐 6/12 周五样本 + 删 v3.3.4 过头加固](knowledge/changelog/v3.3.5.md) — 2026-06-13 下午\n- [v3.3.4 — 晨报过头加固（已废）](knowledge/changelog/v3.3.4.md) — 2026-06-13 凌晨\n- [v3.3.3 — 尝试加固晨报，未生效，无代码变更](knowledge/changelog/v3.3.3.md) — 2026-06-12 晚\n- [v3.3.2 — 模板约束一体化 + check 段 H 护栏](knowledge/changelog/v3.3.2.md) — 2026-06-12 晚\n- [v3.3.1 — 晚报可读性修复：财经要闻 1 空行 + 依据 ≤ 50 字符](knowledge/changelog/v3.3.1.md) — 2026-06-11 深夜\n- [v3.3.0 — 财经要闻段\"任务定位\"协议：防\"盘面数据\"冒充\"要闻\"](knowledge/changelog/v3.3.0.md) — 2026-06-11 晚\n- [v3.2.9 — 3 个 dispatcher 任务 skills 字段清理](knowledge/changelog/v3.2.9.md) — 2026-06-11 下午\n- [v3.2.8 — 收盘小结格式对齐：4 处拼接 bug](knowledge/changelog/v3.2.8.md) — 2026-06-11\n- [v3.2.7 — .env 路径根除：8 脚本多路径回退](knowledge/changelog/v3.2.7.md) — 2026-06-10 下午\n- [v3.2.6 — 双副本根除 + jobs.json 隐藏运行时副本修复](knowledge/changelog/v3.2.6.md) — 2026-06-10 上午\n- [v3.2.5 — 盘中预警 cron prompt 纯 bash 化](knowledge/changelog/v3.2.5.md) — 2026-06-09 深夜\n- [v3.2.4 — 文档补全：明示 knowledge/ 被 clawhub publish 上传](knowledge/changelog/v3.2.4.md) — 2026-06-09 晚\n- [v3.2.3 — send_ipo_report.py 迁移到 _send_lib 共用库](knowledge/changelog/v3.2.3.md) — 2026-06-09 晚\n\n### 历史版本（v3.2.2 ~ v3.0.0，11 条 + v2.0.0 ~ v2.0.10，11 条 = 22 条已折叠）\n\n完整索引见 [`knowledge/changelog/README.md`](knowledge/changelog/README.md) —— `vX.Y.Z.md` 22 个详情文件保留。\n\n### v3.5.0 改动（本版本 = SKILL.md 精简 + 14 段护栏加严，2026-06-16）\n\n**触发**: SKILL.md 50665 字节 / 778 行 / 15 个 skill 排名第 1, 是第 2 名 ima-skill (16KB) 的 3.2 倍. Changelog 段 13KB 占 26.3%, 违反 v3.2.0 立\"≤ 3 行 / 25 行硬上限\"规矩.\n\n**改法** (3 处):\n1. Changelog 段 19 条 v3.3.0+ ~ v3.4.4 全部折到 `knowledge/changelog/vX.Y.Z.md` 详情文件, SKILL.md 留 1 行 / 条索引\n2. `## 数据来源` (2.6KB) + `## IPO周报数据来源` (541B) 合并去重\n3. `## 目录结构` (1.7KB) 简化, 标 knowledge/ 索引外置\n4. frontmatter `version: 3.4.4` → `3.5.0` (按 MEMORY #12 \"结构变更触发 v 大版本号讨论\" 例外)\n\n**未发版小改一并 bump 到 v3.5.0** (10 条): v3.3.5+1 ~ v3.3.5+5 + v3.4.4. 教训: \"小改不刷 vX.Y.Z\" 规则容易被滥用 (10 条小改 ≥ 2 个月), v3.5.0 立硬上限 — **未发版累积 ≥ 5 条必须下个结构变更 bump 走, 不许再攒**.\n\n**MEMORY #12 立新约束**: 任何 skill 的 SKILL.md 单文件 > 30KB 必须先瘦身再发版.\n\n## 安全配置（必读）\n\n所有外部密钥均通过环境变量注入，**禁止硬编码**。密钥文件 `/workspace/.env` 由脚本自动加载（环境变量优先）。\n\n### 密钥白名单原则\n\n每个脚本**仅加载本任务实际需要的变量**，不得全量注入 `.env` 所有密钥。\n\n| 脚本 | 必需密钥（与 `_REQUIRED_KEYS` 同源，v3.2.7 修复）|\n|------|---------|\n| `collect_morning_data.py` | `IWENCAI_API_KEY`（A50 期货问财查询用）|\n| `send_close_summary.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `collect_evening_data.py` | `WECOM_WEBHOOK_KEY` |\n| `send_evening_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_morning_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_intraday_alert.py` | `WECOM_WEBHOOK_KEY` |\n| `send_ipo_report.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n| `send_weekend_news.py` | `WECOM_WEBHOOK_KEY`, `IWENCAI_API_KEY` |\n\n**问财 API 直连约定**（细节见 `## 数据来源` 段）：所有问财查询统一进程内直连 OpenAPI，**不使用 subprocess 外部调用**（避免通过 `IENV` 泄露环境变量给子进程）；消费侧必须兼容多字段名（同义词 nlp 翻译可能返回 `炸板家数` ↔ `涨停开板家数`）。\n\n### 自动推送说明\n\n配置 `WECOM_WEBHOOK_KEY` 即表示授权自动推送报告至企业微信。推送是自动化报告系统的组成部分，非人工干预。\n\n| 密钥 | 环境变量 | 最小权限 | 来源 |\n|------|---------|---------|------|\n| 企业微信 Webhook | `WECOM_WEBHOOK_KEY` | 仅发送（只写） | 微信企业版 → 应用 → Webhook |\n| 同花顺问财 API Key | `IWENCAI_API_KEY` | 只读查询 | 同花顺 i问财 SkillHub |\n\n`.env` 文件格式示例：\n```bash\nWECOM_WEBHOOK_KEY=c4a1cd60-254e-4612-b365-c701482ae98c\nIWENCAI_API_KEY=***\n```\n\n> **注意**：本 skill **只用 2 个 key**（WECOM + IWENCAI）。妙想 `MX_APIKEY` / Tushare `TUSHARE_TOKEN` 等由其他 skill（mx-data / mx-xuangu 等）使用，**不要加进 A-stock-report 的 `.env`**。\n\n---\n\n##快速开始\n\n**手动跑一个报告（运维/补跑/测试用）：**\n\n所有 6 个任务的完整命令（`source .env` + `python3 脚本路径` + 可选参数）都集中在 **`cron_jobs/cron_mirror.json` 的 `tasks.<name>.prompt` 字段**。\n\n- LLM 驱动型（晨报/晚报/财经周末版）→ `templates/<task>.json` 的 prompt 模板 + `cron_jobs/cron_mirror.json`（无对应节点，由 jobs.json 直接调 dispatcher 注入）\n- 独立脚本型（收盘小结/盘中预警/IPO 周报）→ `cron_jobs/cron_mirror.json#<task>` 节点\n\n**手动跑通用模式：**\n\n```bash\n# 1. 读 cron_mirror.json 看 prompt 字段拿到完整命令\npython3 -c \"import json; print(json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))['tasks']['close_summary']['prompt'])\"\n\n# 2. 复制粘贴该命令到终端跑（已含 source .env + python3 路径 + 默认参数）\n```\n\n**历史命令备查（v3.1.5 清理前）：** 见 git log / 备份 `/workspace/archive/SKILL_md_pre_4segs_clean_*`\n\n---\n\n## 执行模式\n\n**收盘小结、晚报、晨报** 采用不同模式：\n\n- **收盘小结**：单一 Python 脚本，内置全部逻辑（取数 → 打分 → 生成报告 → 推送），cron 直接触发，无需 LLM 生成内容。\n**晨报、晚报、周末要闻** 采用**两段式**：\n- **第一段**（cron prompt）：调用 dispatcher 生成带真实日期的 prompt，写入约定路径\n- **第二段**（同一 session）：读取 prompt 文件 → LLM 执行 → 写入内容文件 → 调用推送脚本\n\n这样 SKILL.md 中的 prompt 模板只含通用占位符，日期在运行时由 dispatcher 动态注入。\n\n---\n\n## 数据来源\n\n**总则**（v3.0+ 架构）：3 类数据源 + 4 端真相。\n\n**3 类数据源**（按密钥需求划分）：\n- **零密钥**：腾讯实时 API（`qt.gtimg.cn`） · 新浪 hq 数据（`hq.sinajs.cn`） · akshare 开源接口\n- **IWENCAI_API_KEY**：同花顺 i 问财 OpenAPI（进程内直连，无 subprocess）\n- 历史报告 MD（仅财经周末版用）：`/workspace/projects/A股报告系统/reports/`\n\n**4 端真相**（防漂移，详见 `## 定时任务` 段）：`templates/` · `cron_jobs/cron_mirror.json` · `~/.hermes/cron/jobs.json` · `SKILL.md`\n\n### 晨报数据来源（`collect_morning_data.py` + LLM 生成）\n\n| 数据 | 来源 | 接口 / 字段 | 备注 |\n|------|------|------------|------|\n| 隔夜美股 3 大指数 | 腾讯实时 API | `qt.gtimg.cn/q=usDJI,usINX,usIXIC` | 字段含 name/price/pct |\n| VIX 恐慌指数 | 新浪 hq 数据 | `hq.sinajs.cn/list=znb_VIX` | paperCode=znb_VIX，CBOE VIX 指数本身（13 字段：现价/涨跌/52 周范围）⚠️ 2026-06 新浪反爬升级：`User-Agent: Mozilla/5.0` 太短被识别为爬虫 → 403；**必须用完整浏览器 UA 字符串**（详见 `~/.hermes/skills/devops/sina-hq-sinajs-403-ua/SKILL.md`）|\n| 富时 A50 期货 | 新浪 hq 数据 | `hq.sinajs.cn/list=...A50ETF`（512550） | 偶发 HTTP 403（同 UA 原因），失败回退华夏 A50ETF；缺失按 v3.1.3 协议 `❌ 数据缺失` 占位 |\n| 港股恒生指数 | 腾讯实时 API | `qt.gtimg.cn/q=hkHSI` | 复用 get_us_indices 模式 |\n| WTI 原油 + 现货黄金 | akshare 全球期货现货 | `ak.futures.futures_hf_em.futures_global_spot_em()` | GC00Y=COMEX 黄金 / CL00Y=WTI |\n\n### 收盘小结数据来源（`send_close_summary.py` 独立脚本）\n\n| 数据 | 来源 | 接口 |\n|------|------|------|\n| 6 大指数 + 成交额 | 腾讯实时 + akshare | `qt.gtimg.cn` + `stock_zh_a_spot_em()` |\n| 涨跌停家数 / 炸板率 | 同花顺问财 | 1 次查询（`今日涨停家数 跌停家数 炸板家数`） |\n| 全市场主力净流入 | 东方财富 RPT_MARKET_CAPITALFLOW | `INDEX_CODE=\"800000.EI\"`，`BONDTYPE=\"A股\"` |\n| 行业板块涨跌 / 主力资金 | hithink-sector-selector | `今日行业板块涨幅前10` / `近5日主力净流入前10行业板块` |\n| IF 期货基差 | 新浪 nf_IF0（今日优先）+ akshare `futures_main_sina` 兜底 | `hq.sinajs.cn` |\n\n### 晚报数据来源（`collect_evening_data.py` + LLM 生成）\n\n| 数据 | 来源 | 接口 |\n|------|------|------|\n| 6 大指数 + 成交额 | 同收盘小结 | 同上 |\n| 亚太股市（日经/韩国综合） | 腾讯实时 | `qt.gtimg.cn` |\n| 两融余额 / 两融交易额 | AKShare | `macro_china_market_margin_sh/sz` |\n| 沪深300 PE / 股市风险溢价 | 同花顺问财 | 单次查询多字段 |\n| 涨跌停家数 | 同花顺问财 | 复用收盘小结模式 |\n\n### IPO 周报数据来源（`send_ipo_report.py`）\n\n| 报告模块 | 接口 | 来源 |\n|---------|------|------|\n| 一、排队情况 | `ak.stock_register_kcb/cyb/bj/sh/sz` | 东方财富注册制审核公示 |\n| 二、本周期上会 | `ak.stock_ipo_review_em` | 东方财富 IPO 审核动态 |\n| 三、本周期获批 + 四、终止撤回 | `ak.stock_ipo_declare_em` | 证监会公示 |\n| 五、下周期上会 | `ak.stock_ipo_review_em` | 东方财富 IPO 审核动态 |\n| 六、新股上市 | `ak.stock_xgsr_ths` | **同花顺**（一次调用含上市信息/发行价/首日涨跌幅） |\n\n### 财经周末版数据来源\n\n**仅复用历史报告 MD**（无新数据采集）：`/workspace/projects/A股报告系统/reports/收盘小结_YYYYMMDD.md`（情绪打分/涨停家数）+ `晚报_YYYYMMDD.md`（两融/PE/ERP）。两套以交易日 key 对齐合并，详见下表：\n\n| 指标 | 来源 MD | key 取法 |\n|------|--------|---------|\n| 涨停家数 / 情绪打分 | `收盘小结_YYYYMMDD.md` | 文件名 `YYYYMMDD` |\n| 两融余额 / 两融比例 | `晚报_YYYYMMDD.md` | 报告内两融余额行日期 |\n\n### 问财 API 兼容性约定\n\n**坑 1 — 字段名同义词（2026-06-01 经验）**：问财 OpenAPI 在 query 含同义词时 nlp 翻译可能返回**不同字段名**（如 `炸板家数` ↔ `涨停开板家数`）。**消费侧必须兼容多字段名**，避免单一字段名失效导致数据缺失。已修复 `send_close_summary.py:167`（兼容 `炸板家数` / `涨停开板家数`）。未来遇到新同义词：在所有调用问财的脚本里加兼容分支，记到此节。\n\n**坑 2 — 返回值类型不稳定（2026-06-16 经验，send_close_summary.py:78）**：\n\n问财同一字段可能**不同时刻返回不同类型**——同一 query，今天返 `float`、明天返 `str`、后天返 `int`（nlp 翻译后端不稳定）。直接 `v > 0` 比较会在 str/int/str 互换时炸：\n\n```python\n# ❌ 错误写法 — TypeError: '>' not supported between instances of 'str' and 'int'\nif \"成交额\" in k and v and v > 0:\n    val_yi = float(v) / 1e8\n```\n\n**正确写法** — 三重防御：\n\n```python\nif \"成交额\" in k and v not in (None, \"\", 0, \"0\", \"0.0\"):\n    try:\n        v_num = float(v)        # 统一强转\n    except (TypeError, ValueError):\n        continue                # 转换失败跳过，不让一个坏字段拖垮整次查询\n    if v_num > 0:               # 数值化后再比较\n        val_yi = v_num / 1e8\n        return v_num\n```\n\n**症状**：脚本异常分支 `'>' not supported between instances of 'str' and 'int'` → fallthrough 到兜底 → 兜底值 0 → 报告显示 `全市场成交额：0亿`。\n\n**检测套路**（写消费代码时）：\n- 任何 iwencai 字段的 `if v > 0` / `if v < x` / `if v == y` 都视为**潜在 bug**\n- 修法模板：`v not in (None, \"\", 0) → try float(v) → 转换失败 continue → 数值比较`\n\n**已修样本**：`send_close_summary.py:78` (commit `pre_20260616_turnover_typecompare.bak`)\n\n---\n\n## 文件名日期规则\n\n| 报告 | 文件名日期取值 |\n|------|--------------|\n| 收盘小结 | `--date` 参数值；无参数则取当天 |\n| 晚报 | `--date` 参数值；无参数则取当天 |\n| 晨报 | 生成当天 |\n| 财经周末要闻 | 生成当天 |\n\n> **注意**：晚报内容里的两融余额标注日期（如\"两融余额（04月13日）\"）是数据对应的上一交易日，与文件名日期可能差1天。\n\n---\n\n## 周末要闻情绪轨迹数据来源\n\n一周情绪轨迹从历史报告MD文件中提取，合并规则：\n\n| 指标 | 来源 | key取法 |\n|------|------|--------|\n| 涨停家数/情绪打分 | 收盘小结 `收盘小结_YYYYMMDD.md` | 从文件名提取 `YYYYMMDD` |\n| 两融余额/两融比例 | 晚报 `晚报_YYYYMMDD.md` | 从**报告内容**里两融余额行提取日期作为 key |\n\n两套数据以交易日 key 对齐合并，保证周一到周五趋势线一致。\n\n---\n\n## 防并发锁\n\n各脚本使用独立的锁文件，同时运行互不干扰：\n\n| 脚本 | 锁文件 |\n|------|--------|\n| `send_close_summary.py` | `/tmp/a_stock_close_summary.lock` |\n| `send_evening_report.py` | `/tmp/a_stock_evening.lock` |\n| `send_morning_report.py` | `/tmp/a_stock_morning.lock` |\n| `send_weekend_news.py` | `/tmp/a_stock_weekend.lock` |\n| `send_ipo_report.py` | `/tmp/a_stock_ipo.lock` |\n| `send_intraday_alert.py` | `/tmp/a_stock_intraday.lock` |\n\n**锁残留检测（v2.0.1 起）：** 脚本有 `finally: _unlock()` 兜底，正常退出一定会释放。**若锁文件残留**：\n1. 排查推送阶段异常日志（`wx()` 返回非 0 / 信号中断 / 网络超时）\n2. 确认无进程在跑（`ps -ef | grep send_close`）后，手动 `rm /tmp/a_stock_close_summary.lock`\n3. 残留超过 1 小时不重跑需要介入，避免重复推送\n\n---\n\n## 报告模板\n\n### 晨报\n\n```\n📰 【股市晨报】YYYY年MM月DD日（周X）\n\n━━━ 隔夜全球市场 ━━━\n【美股收盘】\n▪ 道琼斯：XXXXX.XX点，+X.XX%（精确数字，不得用\"约\"）\n▪ 标普500：XXXXX.XX点，+X.XX%\n▪ 纳斯达克：XXXXX.XX点，+X.XX%（可附\"X连涨/连跌X日\"）\n▪ VIX恐慌指数：XX.XX（+X.XX%），恐慌等级：【低位(<20)/中位(20-30)/高位(>30)】\n\n【港股及A50】\n▪ 恒生指数：XXXXX.XX点，+X.XX%（附简要背景）\n▪ 富时A50期货：XXXXX点，+X.XX%，偏强/偏弱运行【预判A股明日开盘】\n\n【大宗商品】\n▪ WTI原油：XXX.XX美元/桶，+X.XX%（精确数字，不得用\"约\"）\n▪ 现货黄金：XXXX.XX美元/盎司，+X.XX%（精确数字）\n\n━━━ 财经要闻 ━━━\n【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（简洁分析，≤50字）\n【2】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（≤50字）\n（**≤7条**，顺序编号，每条格式固定：\n  【编号】（标题）｜✅/❌/⚠️标签 对A股影响\n  点评：（事件+分析，≤50字））\n\n━━━ 今日操作建议 ━━━\n【大盘研判】\n（综合外围市场、宏观政策、量能等因素，给出2-3句综合判断）\n\n【操作建议】\n1. 【板块/策略】（期限）：具体建议+附标的\n2. 【板块/策略】（期限）：...\n\n【风险提示】\n⚠️ （1-3条，最重要的风险）\n\n⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\n```\n\n### 收盘小结\n\n> **模板由 `send_close_summary.py` 脚本内置拼装**（`build_report()` 函数 f-string，L562+）—— SKILL.md 不再重复维护。改格式请直接改脚本。\n>\n> **协议说明**：\n> - 6 段固定框架：①主要股指表现 ②板块行情 ③全市场主力资金 ④行业主力资金流 ⑤量化情绪打分 ⑥后市展望 + 数据来源落款\n> - 量化情绪打分（满分 100，6 因子等权平均）：\n>   - 涨停家数（10~100 家映射）\n>   - 涨跌停比（对数插值）\n>   - 炸板率（40%~10% 映射，越低越好）\n>   - 主力净流入占比（-5%~+5% 映射）\n>   - 全市场换手率（1%~4% 映射）\n>   - IF 基差（-300~+150 点映射）\n> - 后市展望默认文本（脚本 L560）：\"市场震荡调整，风格偏向题材与成长，建议控制仓位、关注轮动节奏。\"\n\n### 晚报\n\n```\n📋 【A股晚报】YYYY年MM月DD日\n\n━━━ A股收盘 ━━━\n• 上证指数：XXXX.X，↑/↓X.XX%\n• 深证成指：XXXX.X，↑/↓X.XX%\n• 创业板指：XXXX.X，↑/↓X.XX%\n• 科创50：XXXX.X，↑/↓X.XX%\n• 沪深300：XXXX.X，↑/↓X.XX%\n• 中证500：XXXX.X，↑/↓X.XX%\n• 成交额：X.XX万亿元\n\n━━━ 亚太股市 ━━━\n• 恒生指数：XXXX，↑/↓X.XX%\n• 日经225：XXXXX，↑/↓X.XX%\n• 韩国综合：XXXX，↑/↓X.XX%\n\n━━━ 市场风险偏好 ━━━\n• 两融余额（MM月DD日）：XXXXX亿，较前日+/-XXXX亿\n• 两融余额/A股流通市值（MM月DD日）= X.XX%\n  阈值：<3%安全 | 3-3.5%预警 | ≥3.5%高危\n• 两融交易额/A股成交额（MM月DD日）= X.X%\n  阈值：<7%保守 | 7-11%中性 | >11%过热\n• 股市风险溢价（MM月DD日）= X.XX%\n  阈值：<3%高估 | 3-6%中性 |>6%低估\n• 沪深300 PE = XX.XX，近5年分位点 XX.X%\n\n━━━ 财经要闻 ━━━\n【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（≤50字）\n【2】...（**≤7条**，每条格式固定，点评≤50字）\n\n━━━ 今日操作建议 ━━━\n【大盘研判】（2-3句）\n【操作建议】\n1. 【板块/策略】（期限）：具体建议\n2. 【板块/策略】（期限）：...\n【风险提示】（1-3条）\n\n⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。\n```\n\n### 财经周末版（cron 触发后 LLM 生成）\n\n```\n📰 【财经周末版】{周六日期} + {周日日期}\n\n━━━ 一周情绪轨迹（5 个交易日，来源：收盘小结 + 晚报）━━━\n\n【1. 市场短期情绪】\n• 量化情绪打分：周一XX → 周二XX → 周三XX → 周四XX → 周五XX\n\n【2. 杠杆率】\n• 两融余额（亿元）：周一X → 周二X → ... → 周五X\n• 两融余额占流通市值比例：周一X.XX% → ... → 周五X.XX%\n\n【3. 估值水平】\n• 沪深300PE：周一X.XX → ... → 周五X.XX\n• 近5年分位点：周一X.X% → ... → 周五X.X%\n• 股市风险溢价（ERP）：周一X.XX% → ... → 周五X.XX%\n\n【4. 市场预期】\n• IF基差：周一X.XX → ... → 周五X.XX\n\n【5. 一周市场解读】\n{不超过50字，综合市场情绪/杠杆/估值/预期 4 个维度的一句话总结}\n\n━━━ 数据规则（防错）━━━\n数据源 + ❌/⚠️ 硬约束在模板顶部\"2. 数据源\"段统一定义（v3.3.0 + v3.1.3 合并版），不在此处重复\n\n━━━ 整体市场情绪研判 ━━━\n情绪指标总结 | 核心驱动因素 | 当前风险点 | 下周操作参考\n\n⚠️ 仅供参考，不构成投资建议。\n```\n\n---\n\n## 定时任务（cron）\n\n7 个 cron 任务（A 股 6 任务 + 每周 Skill 复盘 1 任务）的完整 schedule / repeat / deliver / prompt 字段集中在以下两处真相源：\n\n- **生产配置（OpenClaw 读）**：`~/.hermes/cron/jobs.json`\n- **人类可读镜像（git track）**：`cron_jobs/cron_mirror.json`\n\n**SKILL.md 不再重复列 cron 表达式**（v3.1.5 清理）—— 一处变→多处忘改是 v3.0 之前的痛点。\n\n**快速概览：**\n\n| 任务 | 调度 | 类型 |\n|------|------|------|\n| A股晨报生成并推送 | 周一至五 08:00 | LLM 驱动型（template: `templates/morning.json`） |\n| A股晚报生成并推送 | 周一至五 20:00 | LLM 驱动型（template: `templates/evening.json`） |\n| A股收盘小结 | 周一至五 15:30 | 独立脚本（mirror: `close_summary`） |\n| A股盘中预警 | 周一至五 09:00-14:55 每 5 分钟 | 独立脚本（mirror: `intraday`） |\n| A股周末要闻生成并推送 | 周日 20:00 | LLM 驱动型（template: `templates/weekend.json`） |\n| 每周 Skill 复盘 | 周日 18:00 | skill 自审 |\n| A股IPO周报 | 周六 10:00 | 独立脚本（mirror: `ipo_report`） |\n\n---\n\n\n## 安装与验证\n\n配置完 cron 后，按以下顺序逐一检查：\n\n### Step 1：密钥检查\n\n权威密钥白名单表在 `## 密钥白名单原则` 段（每个脚本需哪些 env 变量）。\n\n**快速检查 2 个 env 变量是否就位：**\n\n```bash\n# 应输出 2 行非空（本 skill 只需 2 个 key）\nfor key in WECOM_WEBHOOK_KEY IWENCAI_API_KEY; do\n  grep \"^${key}=\" /workspace/.env && echo \"  ✅ $key\"\ndone\n```\n\n**未配齐会怎样：** 脚本在 except 块内捕获缺失，会 `notify_failure()` 发预警 + exit 1（v3.1.0 修复链），不会静默继续。\n\n> **注意**：`send_evening_report.py` 的\"财经要闻\"和\"明日操作建议\"两个区块**依赖 cron 中的 LLM 步骤生成**，不是脚本自己能产出的。若未配置对应 cron task，这两个区块**永远为空**，这是设计预期，不是 bug。\n\n### Step 2：依赖检查\n\n```bash\n# 检查 akshare\npython3 -c \"import akshare; print('akshare', akshare.__version__)\"\n\n# 检查 tushare（IPO周报需要）\npython3 -c \"import tushare; print('tushare OK')\"\n\n# 检查 hithink-sector-selector CLI\npython3 /workspace/skills/hithink-sector-selector/scripts/cli.py --help | head -3\n```\n\n### Step 3：Cron 任务检查\n\n跑护栏脚本一次性验证 4 端一致性（templates ↔ cron_mirror ↔ jobs.json ↔ SKILL.md）：\n\n```bash\npython3 /root/.hermes/skills/A-stock-report/scripts/check_consistency.py\n# 预期：✅ 全部 4/4 项通过，exit=0\n```\n\n**不要再用\"❌手对表\"逐行核对**——v3.1.5 之前 SKILL.md 这里有 7 行\"应存在 ✅\"表，靠人记得跑 1 个命令 + 7 行眼睛对——v3.1.5 改用护栏脚本机械检查，杜绝漂移。\n\n\n---\n\n## Cron 任务配置指引\n\n6 个任务分两类：\n\n- **LLM 驱动型（3 个）**：晨报 / 晚报 / 财经周末版 — prompt 外置于 `templates/`，由 `scripts/skill_dispatcher.py` 读取注入 LLM，LLM 解读后调脚本落地推送。\n- **独立脚本型（3 个）**：收盘小结 / **盘中预警** / IPO 周报 — 无需 LLM，调度配置外置于 `cron_jobs/`，由 OpenClaw gateway 直接 `source .env && python3 ...` 跑脚本。盘中预警为每 5 分钟一次高频任务（必须无 LLM 介入）。\n\n> **为什么用文件中转（LLM 型）？** cron prompt 在独立 session 运行，无法直接将变量传给后续脚本。通过写入约定路径的文件，脚本读取后注入报告模板，实现解耦。\n\n> **🛡️ 4 端一致性护栏（v3.1.5+）**：本 skill 有 4 端真相 — `templates/`（LLM 调度模板，机器读） / `cron_jobs/cron_mirror.json`（生产 cron 镜像，人读） / `~/.hermes/cron/jobs.json`（生产 cron 真实配置，OpenClaw 读） / `SKILL.md`（文档）。改任何一端都可能造成幽灵模板（v3.1.3 的教训）。**修改以下任一文件后必须跑 `python3 scripts/check_consistency.py`**（exit 0=全过，exit 1=有错误）：\n> - `templates/*.json`（3 个 LLM 任务 prompt）\n> - `cron_jobs/cron_mirror.json`（3 个独立脚本任务）\n> - `~/.hermes/cron/jobs.json` 中 3 个独立脚本任务的 prompt\n> - SKILL.md 任务清单段（`### N. 任务名（详见 ...）` 格式）\n>\n| 报错时用 `--fix-hint` 看修复建议。脚本会检查 A) templates ↔ dispatcher 任务集、B) cron_mirror ↔ jobs.json prompt 字字一致、C) SKILL.md 引用真实存在、D) dispatcher 任务不在 mirror 出现、E) SKILL.md 主体无硬编码 cron 表达式 / .env 路径 / source+send 一行命令（v3.1.6+ E 段）。\n\n### 1. 晨报（详见 templates/morning.json）\n\n> Prompt 模板外置于 `templates/morning.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 2. 收盘小结（详见 cron_jobs/cron_mirror.json#close_summary）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，close_summary 为 `tasks.close_summary` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。\n\n### 3. 晚报（详见 templates/evening.json）\n\n> Prompt 模板外置于 `templates/evening.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 4. 盘中预警（详见 cron_jobs/cron_mirror.json#intraday）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，intraday 为 `tasks.intraday` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。**v3.1.3 之前该任务的模板曾错误地放在 `templates/intraday.json`（LLM 驱动型设计），但实际 cron 早已是独立脚本模式**；v3.1.3 已删除幽灵模板、归档到 cron_jobs/。\n\n### 5. 财经周末版（详见 templates/weekend.json）\n\n> Prompt 模板外置于 `templates/weekend.json`（v3.0 架构），由 `scripts/skill_dispatcher.py` 读取并注入。\n\n### 6. IPO周报（详见 cron_jobs/cron_mirror.json#ipo_report）\n\n> 独立脚本模式 —— 无需 LLM，调度配置外置于 `cron_jobs/cron_mirror.json`（v3.0 架构；v3.1.4 起 3 任务合为单文件，ipo_report 为 `tasks.ipo_report` 节点），由 OpenClaw gateway 直接读取。脚本路径见 json 内 `prompt` 字段。\n\n### 验证 3：端到端 cron 验证\n\n实际 cron 跑过后，检查：\n1. 推送消息中\"财经要闻\"和\"明日操作建议\"区块是否有内容\n2. 内容日期是否与当天日期一致\n3. 报告文件名是否为当天日期\n\n若发现为空，回到\"验证 2\"确认内容文件是否成功写入。\n\n## 常见问题\n\n**Q1：生成后如何做质量检查？**\nA：生成报告后必须检查以下四项：\n1. **日期检查**：报告第一行日期 == 文件名日期 == 当天实际日期（三者必须一致）\n2. **星期检查**：报告中的日期字符串（`YYYY年MM月DD日（周X）`）与文件名中的日期 `weekday()` 对应周一～周五正确\n3. **数据完整性**：\n   - 收盘小结：指数行情、情绪打分、板块资金流、风险偏好、操作建议五段落齐全\n   - 晨报/晚报：涨跌停统计、风险偏好、操作建议三段落齐全\n4. **时效性**：数据陈旧（>2个交易日）时在报告内注明\n\n**Q2：如何判断涨停情绪？**\nA：涨停情绪由第4节打分函数统一评分（满仓风险系数 × 涨停家数权重 + 涨跌停比 × 炸板率综合得出 0-100 分），不再单独使用 emoji 分级。报告生成后通过\"质量检查第3项\"确认段落齐全即可。\n- 参考：情绪总分 ≥ 70 → 🟢做多；≥ 55 → 🟡偏多；≥ 40 → ⚪分歧；≥ 25 → 🟠偏空；< 25 → 🔴冰点\n\n**Q3：炸板率如何评分？**\nA：炸板率由第4节打分函数中的 `_sc(exp_rate, 40, 10)` 公式映射到 0-100 分，阈值区间 [40%, 10%]，炸板率越低得分越高。\n- 参考：情绪总分 ≥ 70 → 🟢做多；≥ 55 → 🟡偏多；≥ 40 → ⚪分歧；≥ 25 → 🟠偏空；< 25 → 🔴冰点\n\n**Q4：两融数据比当天少一天？**\nA：正常现象。两融数据在当天收盘后约 1～2 小时后更新，晚报/收盘小结取到的是上一交易日数据。\n\n**Q5：主力净流入 > 500亿时显示什么？**\nA：打印预警信息 `⚠️ 主力净流出-XXX亿，超大单+大单砸盘XXX亿，异常大额出逃，注意风险`，但保留真实数值（不重置为0）。\n\n**Q6：定时任务重复推送？**\nA：已内置文件锁机制的脚本会拒绝并发执行。当前各脚本锁机制如下：\n- 晚报：`send_evening_report.py` → `/tmp/a_stock_evening.lock`（exists 检测 + sys.exit(0)，finally 解锁）\n- 盘中预警：`send_intraday_alert.py` → `/tmp/a_stock_intraday.lock`（同上）\n- 周末要闻：`send_weekend_news.py` → `/tmp/a_stock_weekend.lock`（同上）\n- IPO周报：`send_ipo_report.py` → `/tmp/a_stock_ipo.lock`（原子 os.O_EXCL 创建，更严格，finally 解锁）\n- 晨报：`send_morning_report.py` → `/root/.hermes/skills/A-stock-report/scripts/.morning_report_lock.json`（JSON 文件，内容含 `date` 和 `status`，检查当日是否已成功推送后才允许重复执行）\n\n**Q7：报告内容日期和文件名不对应？**\nA：收盘小结文件名=报告日期；晚报文件名=生成当天日期，内容日期=上一交易日；周末要闻以内容里两融余额标注的日期为 key，与收盘小结文件名日期对齐合并。\n\n**Q8：如何使用 `--date` 指定历史日期？**\nA：收盘小结和晚报均支持 `--date YYYY-MM-DD`，如 `python3 send_close_summary.py --date 2026-04-13`。晨报不支持指定历史日期。\n\nFile v3.5.2:cron_jobs/README.md\n\n# cron_jobs/ — 生产 cron 任务的人类可读镜像\n\n## ⚠️ 重要：本目录文件**不被任何代码读取**\n\n`cron_jobs/cron_mirror.json` 是 `~/.hermes/cron/jobs.json` 里**独立脚本型 cron 任务的人类可读副本**。\n\n- **不被 `skill_dispatcher.py` 读取**（dispatcher 只读 `templates/*.json`）\n- **不被 OpenClaw cron 直接读取**（OpenClaw 只读 `~/.hermes/cron/jobs.json`）\n- 作用是**给 AI / 用户审计**：\"A 股 3 个独立脚本任务在生产 cron 里到底是怎么配的\"\n\n## 文件清单\n\n| 文件 | 作用 |\n|------|------|\n| `cron_mirror.json` | **唯一镜像文件**，内含 3 任务（close_summary/intraday/ipo_report）|\n| `README.md` | 本文件 |\n\nv3.1.4 起 3 镜像合为单文件，强制一致，避免之前\"改一处忘改别处\"的纪律性 bug。\n\n## 4 端真相分布\n\n| 维度 | 在哪里 | 角色 |\n|------|--------|------|\n| **LLM 调度模板** | `templates/{morning,evening,weekend}.json` | 被 `skill_dispatcher.py` 读取 |\n| **生产 cron 真实配置** | `~/.hermes/cron/jobs.json` | 被 OpenClaw 读取并定时触发 |\n| **本目录归档镜像** | `cron_jobs/cron_mirror.json` | **人类审计用**，内含 3 任务镜像，prompt 字段与 jobs.json 一字不差 |\n| **SKILL.md 文档** | `SKILL.md` 任务清单段 | 文档层说明 |\n\n## 单文件结构\n\n```json\n{\n  \"_meta\": { \"purpose\": \"...\", \"mirror_of\": \"...\", \"version\": \"...\", \"history\": \"...\", \"see_also\": \"...\" },\n  \"tasks\": {\n    \"close_summary\": { \"name\": \"A股收盘小结\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"intraday\":      { \"name\": \"A股盘中预警\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"ipo_report\":    { \"name\": \"A股IPO周报\", \"schedule\": \"...\", \"prompt\": \"...\", ... }\n  }\n}\n```\n\n任务键名（close_summary/intraday/ipo_report）= 文件名时代的标识，跟历史档案一致。\n\n## 维护纪律\n\n**修改 `jobs.json` 里的 prompt 时，必须同步修改 `cron_jobs/cron_mirror.json` 中对应任务**，保证镜像与生产一致。\n\n**🛡️ v3.1.5+ 推荐用护栏脚本一次性检查 4 端一致性**（templates ↔ cron_mirror ↔ jobs.json ↔ SKILL.md）：\n\n```bash\npython3 /root/.hermes/skills/A-stock-report/scripts/check_consistency.py\n# exit 0=全过，1=有错误\n# 加 --verbose 看每条 ✅，加 --fix-hint 看修复建议\n```\n\n**legacy 一行命令**（仅检查镜像与 jobs.json 的 prompt 一致性，v3.1.4 时代的命令，v3.1.5 起推荐上面那个）：\n\n```bash\npython3 -c \"\nimport json\njobs = json.load(open('/root/.hermes/cron/jobs.json'))\nmirror = json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))\nm = {'A股收盘小结':'close_summary','A股盘中预警':'intraday','A股IPO周报':'ipo_report'}\nfor j in jobs['jobs']:\n    if j['name'] in m:\n        mirror_prompt = mirror['tasks'][m[j['name']]]['prompt']\n        print(j['name'], j['prompt'] == mirror_prompt)\n\"\n```\n\n## 历史\n\n- **v3.1.4 (2026-06-09)**: 合井 3 文件为 `cron_mirror.json`（67 行 / 2.6KB），README 同步更新\n- **v3.1.3 (2026-06-09)**: 新建 `cron_jobs/intraday.json` 镜像（v3.0~v3.1.2 期间已存在 close_summary/ipo_report 镜像）\n- **备份位置**: `/workspace/archive/cron_jobs_3split_20260609_1952.bak/`（v3.1.4 前 3 文件的完整备份）\n\nFile v3.5.2:_meta.json\n\n{\n  \"ownerId\": \"kn7b60cvvedv8jkxs5gy3m9c0d837e9f\",\n  \"slug\": \"a-stock-report\",\n  \"version\": \"3.5.2\",\n  \"publishedAt\": 1781854518042\n}\n\nFile v3.5.2:references/config.json\n\n{\n  \"_note\": \"本文件为历史参考（2026-04-04 快照）。当前真相请看：\\n  - cron_jobs/cron_mirror.json（独立脚本任务真相）\\n  - templates/*.json（LLM 驱动型任务 prompt 真相）\\n  - scripts/_send_lib.py（推送共用库，看 get_webhook_url() 实现）\\n  - ~/.hermes/cron/jobs.json（实际运行的 cron 任务）\",\n  \"_deprecated\": \"v3.2.2 起，本文件不再维护。当前所有任务真相在上述 4 处。如需改 cron / prompt / 推送方式，改那 4 处，不要改本文件。\",\n\n  \"webhook_当前实现\": {\n    \"env_var\": \"WECOM_WEBHOOK_KEY\",\n    \"code\": \"scripts/_send_lib.py → get_webhook_url()\",\n    \"loaded_by\": \"每个 send 脚本头部白名单加载 .env（仅 WECOM_WEBHOOK_KEY / IWENCAI_API_KEY / TUSHARE_TOKEN）\",\n    \"历史引用\": \"/workspace/keys/keys_loader.py 已在 v3.1.0+ 弃用，所有 send 脚本改走 env 路径\"\n  },\n\n  \"推送架构（v3.1.0+）\": {\n    \"统一库\": \"scripts/_send_lib.py（原 _notify.py，v3.2.0 统一名）\",\n    \"API\": [\"get_webhook_url() — 读 WECOM_WEBHOOK_KEY env\", \"wx(text) — curl 风格推企业微信 + 自动重试\", \"notify_failure(prefix, msg) — 失败告警（v3.1.0 补丁 2：内部 try/except，不阻断主流程）\"],\n    \"退出码\": {\"0\": \"成功\", \"1\": \"数据/网络错误\", \"2\": \"推送失败\"}\n  },\n\n  \"锁机制（v2.0.3+）\": {\n    \"实现\": \"scripts/_lock.py（PID + TTL + stale 检测）\",\n    \"行为\": [\"无锁 → 创建并占用\", \"有锁 + 持有者存活 + 未超 TTL → 报错退出（避免并发）\", \"有锁 + 持有者死亡 → 自动清理并占用\", \"有锁 + 锁超时（>ttl）→ 视为 stale，清理并占用\"],\n    \"TTL\": \"默认 1 小时（ttl=3600）\",\n    \"自愈真相\": \"自愈逻辑只在 lock() 被调用时触发（被动），不是'30 分钟内自动清理'。脚本崩溃后如果没有下次 lock() 调用，锁会一直留着（5.9 天残留锁案例：6/3 晨报崩溃后到 6/9 没有任何 cron 触发 lock）。v3.2.2 文档修正，行为不变。\",\n    \"教训\": \"不要相信'30 分钟自愈'。设计意图是'TTL=1h 内不允许重复占用'，不是'自动清理'。手动 rm 仍是最快清理方式。\"\n  },\n\n  \"当前 cron 任务（v3.1.4+，权威源：cron_jobs/cron_mirror.json）\": {\n    \"独立脚本型（3 个）\": [\"close_summary: 30 7 * * 1-5 (北京时间 15:30)\", \"intraday: */5 9,10,11,13,14 * * 1-5 (盘中每 5 分钟)\", \"ipo_report: 0 2 * * 6 (周六 10:00)\"],\n    \"LLM 驱动型（3 个）\": [\"morning (晨报): dispatcher + templates/morning.json\", \"evening (晚报): dispatcher + templates/evening.json\", \"weekend (财经周末版): dispatcher + templates/weekend.json\"],\n    \"_deprecated_4_月_快照\": \"本文件 4/4 列出的'工作区整理'cron 不在当前 jobs.json，已删。\"\n  }\n}\n\nFile v3.5.2:references/fallback-chain-validation.md\n\n# Fallback Chain Validation Log\n\n## v3.3.5+2 — 3 层 fallback 链验证矩阵\n\n### 链结构（cron prompt 已注入 3 templates）\n\n```\nL1: batch_web_search (主源：财联社/新华/证券时报)\n   ↓ 失败（success=false / formatted_content=[] / {\"error\": \"...\"}）\nL2: extract_content_from_websites 抓 https://www.cls.cn/telegraph\n   ↓ 失败（JS 动态加载，curl 占位）\nL3: extract_content_from_websites 多源池（按任务类型动态选最权威 2 个）：\n   - 东方财富快讯 https://finance.eastmoney.com/news/cywjh.html（SSG 渲染 + 结构化列表）\n   - 新浪财经首页 https://finance.sina.com.cn/（含\"国际焦点\"分类）\n   - 21 经济网 https://www.21jingji.com/\n   - 中金 https://www.cnfin.com/\n```\n\n### 验证矩阵\n\n| 任务 | L1 状态 | L2 状态 | L3 使用源 | 备注 |\n|------|---------|---------|-----------|------|\n| 6/15 晨报 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富快讯 + 新浪首页 | 7 条要闻全事件型 |\n| 6/15 周末 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富 + 21jingji | 表格化输出 |\n| **6/15 晚报** | ✅ 成功（7 条要闻） | n/a | n/a | **L1 一次过，未触发 fallback** |\n\n### 6/15 晚报实跑数据（验证非 fallback 路径主流通畅）\n\n- L1 成功：`batch_web_search` 返回 20 条 organic results（10/查询 × 2 查询）\n- 主源用：`操盘必读 6/15`（mp.cnfol.com） + `证券时报 gs.html` + `新浪财经 6/15 要闻`（3 源）\n- L1 来源的多样性证明 L1 主流通畅，**fallback 仅作兜底**\n\n## ⚠️ 维护教训 — 选 fallback URL 优先用\"主题聚合页\"而非\"单篇文章\"\n\n### 6/15 晚报实跑发现（2026-06-15 20:00 cron）\n\n- 尝试抓 `https://finance.sina.com.cn/headline/2026-06-15/doc-inicmxay6762199.shtml`\n- 返回内容**完全不是 A 股要闻**——是关于美伊协议 / 原油 / 黄金的**地缘 + 大宗商品**文\n- 该 URL 是新浪\"headline\"频道下的**单篇头条文章**，主题不可预测（每天头条可能是美股/地缘/科技/财经/体育）\n- 当时 L1 已成功（20 条 organic），未强制依赖 L3 这条 URL，但若 L1+L2 失败时正好撞上\"非 A 股主题\"的头条 → fallback 也白搭\n\n### 修复指引（v3.3.5+5 起生效）\n\n- ✅ 优先用**主题聚合页**（每天 N 条要闻，主题限定财经）：\n  - 东方财富快讯 `cywjh.html` — SSG 渲染 + 结构化列表（**最稳**）\n  - 新浪财经**首页** `finance.sina.com.cn/` — 含\"国际焦点\"分类\n  - 21 经济网首页 / 中金首页\n- ❌ 避免用**单篇头条文章**（URL 含 `/doc-...shtml` 或 `/20XX-XX-XX/doc-...`）— 主题不可控\n- 当前 templates 3 个 fallback 提示段已用 `finance.sina.com.cn/`（首页）— **正确**\n- 该问题不影响当前协议（L1+L2 成功率已够高），仅作未来扩展 fallback 池时的选 URL 规范\n\n## 历史教训（v3.3.5+1 → v3.3.5+4 演进）\n\n- **L1 失败率 20%**（agent.log 35 次调用 7 次失败）→ v3.3.5+4 加 retry-once\n- **L2 失败率 100%**（cls.cn/telegraph 是 JS 动态加载）→ v3.3.5+2 改用 SSG 页\n- **L3 选 URL 原则**：聚合 > 单篇（v3.3.5+5）\n\n## 维护建议\n\n- 每次 cron 失败时检查本表更新\n- 季度审计 fallback URL 是否仍可达（curl 200/200 含内容）\n- 主题聚合页优先级：东方财富快讯 > 新浪首页 ≥ 21jingji ≥ 中金\n\nFile v3.5.2:references/weekend-4kb-budget.md\n\n# 财经周末版 4KB 字节预算实战记录（v3.4.x）\n\n**实战触发**：2026-06-16 周二 cron 实跑（异常周——本周交易日 Tue 6/9 → Mon 6/15，跳过 Sat/Sun 6/13-6/14 视为周末，5d 数据完整 7 字段）。\n\n**目标**：把 8 条要闻 + 5d 情绪表格 + 解读 + 3 个关注板块 + 免责声明塞进企业微信 webhook `msgtype=text` 的 4096 字节硬上限。\n\n## 关键发现（不是模板里写明的，是实跑摸出来的）\n\n### 1. 标题会被脚本自动覆盖\n`send_weekend_news.py` 第 187-192 行强制把首行标题改为 `📰 【财经周末要闻】{sat} - {sun}`，其中：\n- `sat = today - 1 day`\n- `sun = today`\n\n**今日（2026-06-16 周二）算出来 =** `📰 【财经周末要闻】2026年06月15日 - 2026年06月16日`（66 字节）\n\n**LLM 写的原始标题** `📰 【财经周末要闻】2026年6月14日（周日）`（57 字节）\n\n**delta = +9 字节**。LLM 排版时必须按 66 字节预占位，不能按 57 字节算余量。\n\n### 2. 注入正则不匹配 markdown 表格\n`_build_and_push_report()` 第 215 行正则：`•\\s*{label}[：:].*?(?=[\\n•])`\n\n这只匹配 `• 标签：值` 这种 bullet 写法。**如果 LLM 用 markdown 表格**（v3.4.1 立推荐的格式），注入静默跳过（`injected: 0/7`）。\n\n**含义**：表格里的 7 字段值必须由 LLM 直接从 `/tmp/_weekend_5d.json` 填入，不能指望脚本注入覆盖。脚本注入仅对传统 bullet 排版生效。\n\n### 3. 字节预算实操（3968 字节样本）\n\n| 段 | 字节占比 | 备注 |\n|---|---|---|\n| 标题 | 66 | 必占 |\n| 8 条要闻（标题+摘要+来源+空行） | ~2200 | 每条 ~275B，含 1 空行 |\n| 段标题 + 5d 表头 + 7 行 | ~900 | 表格紧凑化（周X 名缩掉、列名精简） |\n| 一周解读 | ~210 | ≤ 50 字硬约束的 ~3.5 倍，OK |\n| 段标题 + 关注板块 3 条 | ~430 | |\n| 免责声明 | ~50 | |\n\n**总 3968 + 9 标题 delta = 3977 字节** ≤ 4096，安全 ~120 字节 buffer。\n\n**踩坑样本**：第一稿 4856 字节（超 758B）→ 第二稿 4194B（仍超 98B）→ 第三稿 4121B（仍超 25B）→ 第四稿 4067B（标题 swap 后 4076B，仍卡边）→ 第五稿 3968B（**达标**）。\n\n### 4. msgtype=text 的隐性约束\n\n`wx()` 内部固定 `msgtype: text`（不是 markdown）。这意味着：\n- markdown 表格**不会渲染**，只显示为原始 `| ... |` 文本\n- 表情 ✅/❌/⚠️ 可正常显示（Emoji 不在 markdown 语法范围内）\n- 4KB 限制是**text 字段的字节长度**，不是渲染后字符数\n\n**含义**：表格只是给用户**可读性**（微信对齐显示），不是真正的 markdown 渲染。优化字节用 markdown 表格（v3.4.1 决策）依然成立。\n\n## 与模板约束的关系\n\n| 模板约束 | 字节预算约束 | 冲突时 |\n|---|---|---|\n| ≤ 1500 字 | ≤ ~3900 字节 | **字节是硬墙**（4KB 微信），字数是软目标 |\n| 6-8 条要闻 | 实测 8 条 ~2200B | 8 条安全，9 条必爆 |\n| 每条 ≤ 70 字 | 实测 ~50-60 字 ~270B | OK |\n| 关注板块 ≤ 100 字/段 | 实测 ~80 字/段 ~140B | OK |\n\n## 实战建议（下次跑 cron 时）\n\n1. **目标 ≤ 3900 字节**（不是 4096）—— 留 200B buffer 给标题 delta + 编码波动\n2. **5d 表格用紧凑列名**：`06/09` 而非 `06/09 周二`、`情绪打分` 而非 `量化情绪打分`、`两融(亿)` 而非 `两融余额(亿)`、`两融占比` 而非 `两融/流通市值`\n3. **IF 基差裸值不带\"升水/贴水\"标签**——升贴水从符号自明（+ 升水 / - 贴水）\n4. **关注板块段每条 ≤ 80 字**——3 条 = ~430B 安全\n5. **要闻段每条 ≤ 60 字摘要**——8 条 + 空行 = ~2200B\n6. **必填免责声明**（v3.3.5+3 fix 的目标）—— 50 字节不可砍\n\n## 异常周（Dragon Boat 等）日期处理\n\n2026-06-09（Tue）→ 2026-06-12（Fri）→ 2026-06-15（Mon）是 5 个交易日，6/13-6/14 视为周末，**6/16 周二 cron 触发**产生\"周末\"报告。\n\n**脚本标题 swap 行为**：`sat = 6/15`, `sun = 6/16`，生成 `2026年06月15日 - 2026年06月16日` —— 视觉上不是\"周末\"日期范围但脚本不感知，按 `today-1` 硬算。\n\n**LLM 端的妥协**：把 5d 表格的日期列名按 `MM/DD` 简写（不带周X），让用户自己脑补日期对应星期。\n\n## 相关 changelog\n\n- v3.3.5+3（2026-06-15）—— 周末要闻 4KB 截断修复（字数硬约束 + 防幻觉 + 表格化）\n- v3.4.1（2026-06-15）—— 5d 数据块驱动 + markdown 表格化\n- v3.4.2（2026-06-15）—— 6-8 条放宽 + 摘要压到 1 句\n- v3.4.3（2026-06-16）—— 4 类 query 砍外围/预判段\n\n**本次实跑（2026-06-16）发现**：以上约束叠加后实际需 ≤ 3900 字节，模板未明示，列入 references 作为下次复盘参考。\n\nFile v3.5.2:skill-card.md\n\n## Description: <br>\nA股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。 <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[cookfish1979](https://clawhub.ai/user/cookfish1979) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and operators use this skill to automate A-share market reporting, including morning reports, close summaries, evening reports, intraday alerts, IPO weekly reports, and weekend financial summaries delivered through Enterprise WeChat. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Automated Enterprise WeChat webhook posting can send scheduled reports without human review. <br>\nMitigation: Install only for intended scheduled report automation and review webhook configuration before enabling cron tasks. <br>\nRisk: Broad local secret handling may expose unrelated credentials if shared environment files contain extra secrets. <br>\nMitigation: Keep only `WECOM_WEBHOOK_KEY` and `IWENCAI_API_KEY` in the skill environment and avoid unrelated secrets in `/workspace/.env`. <br>\nRisk: Shell startup fallbacks can load credentials in shared or privileged environments. <br>\nMitigation: Remove or review the `/root/.bashrc` fallback before running the skill in shared or privileged environments. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/cookfish1979/a-stock-report) <br>\n- [cron_jobs/README.md](cron_jobs/README.md) <br>\n- [fallback-chain-validation.md](references/fallback-chain-validation.md) <br>\n- [weekend-4kb-budget.md](references/weekend-4kb-budget.md) <br>\n- [config.json](references/config.json) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown and plain text reports with Python scripts, cron prompts, JSON templates, and configuration guidance] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Generates scheduled market reports and webhook-delivered alerts; weekend reports must stay within Enterprise WeChat text byte limits.] <br>\n\n## Skill Version(s): <br>\n3.5.2 (source: server evidence and frontmatter) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v3.5.2:cron_jobs/cron_mirror.json\n\n{\n  \"_meta\": {\n    \"purpose\": \"生产 cron 任务的人类可读镜像（不被任何代码读取）\",\n    \"mirror_of\": \"~/.hermes/cron/jobs.json\",\n    \"version\": \"3.3.2\",\n    \"history\": \"v3.0~v3.1.3 期间以 3 个独立文件存在（close_summary/intraday/ipo_report），v3.1.4 合井为单文件以便强制一致。\",\n    \"see_also\": \"cron_jobs/README.md\"\n  },\n  \"tasks\": {\n    \"close_summary\": {\n      \"name\": \"A股收盘小结\",\n      \"schedule\": \"30 7 * * 1-5\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_close_summary.py\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周一至五 15:30 北京时间触发，akshare 拉收盘数据，生成收盘小结推送到 local 通道\",\n        \"depends_on\": [\n          \"send_close_summary.py\"\n        ]\n      }\n    },\n    \"intraday\": {\n      \"name\": \"A股盘中预警\",\n      \"schedule\": \"*/5 9,10,11,13,14 * * 1-5\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_intraday_alert.py 2>&1\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周一至五交易时段每 5 分钟一次（9/10/11/13/14 点整点过 5 分），腾讯财经 qt.gtimg.cn 拉 6 大指数实时涨跌幅，任一指数 ±2% 触发预警；同指数同档位每天只推一次（状态文件去重）。v3.2.5 起改为纯 bash prompt（与收盘小结/IPO 周报同款），不再触发 LLM 思考，context 占用从每天 ~50-150 KB 降至 ~1 KB。\",\n        \"depends_on\": [\n          \"send_intraday_alert.py\"\n        ],\n        \"migrated_from\": \"templates/intraday.json（v3.1.3 归档清理：模板是 LLM 驱动型设计，但实际 cron 早已是独立脚本模式，模板从未被生产加载）\",\n        \"thresholds\": {\n          \"implemented\": \"1 个：6 大指数涨跌幅 ±2%\",\n          \"designed_but_unimplemented\": [\n            \"IF 当月连续涨幅 > 1.5%（期货升水）\",\n            \"主力净流入 > 200亿元（北向/主力）\",\n            \"炸板率 > 40%（短线情绪）\"\n          ],\n          \"data_source\": \"腾讯财经 qt.gtimg.cn（脚本内硬编码）\"\n        },\n        \"note\": \"templates/intraday.json 已删除；本档案（cron_jobs/intraday.json）是该任务在 v3.0 架构下的真实配置中心。LLM dispatcher 中 intraday 任务同步移除。\"\n      }\n    },\n    \"ipo_report\": {\n      \"name\": \"A股IPO周报\",\n      \"schedule\": \"0 2 * * 6\",\n      \"repeat\": \"forever\",\n      \"deliver\": \"local\",\n      \"prompt\": \"source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/send_ipo_report.py\",\n      \"_meta\": {\n        \"type\": \"independent_script\",\n        \"skill_version\": \"v3.2.6\",\n        \"description\": \"周六 10:00 北京时间触发，akshare 拉 6 个 IPO 数据接口，生成 IPO 周报推送到 local 通道\",\n        \"depends_on\": [\n          \"send_ipo_report.py\"\n        ]\n      }\n    }\n  }\n}\n\nFile v3.5.2:templates/evening.json\n\n{\n  \"prompt\": \"1. 调用晚报数据采集脚本，将结果写入约定路径：\\n   source /workspace/.env && python3 /root/.hermes/skills/A-stock-report/scripts/collect_evening_data.py\\n   \\n   采集内容：六大指数、亚太股市、两融余额、两融比例、沪深300 PE分位数、股市风险溢价（ERP）等结构化数据，输出 JSON + 晚报 Markdown。\\n\\n2. 读取采集结果文件 /tmp/evening_data.json，结合采集的晚报 Markdown，用 batch_web_search 搜索今日财经要闻（6-8条）：\\n   - \\\"A股重要财经要闻 宏观政策 2026年6月12日（周五）\\\"\\n   - \\\"A股板块异动 热点题材 2026年6月12日（周五）\\\"\\n   \\n   ⚠️ 搜索失败 fallback：若 batch_web_search 返回空（success=false / formatted_content=[]）或返回 {\\\"error\\\": \\\"调用结果不可用\\\"}（MCP server 端瞬时挂，agent.log 累计失败率 20%），\\n   **先重试 1 次**（cost 低, 23s 内自愈 — 0fbdf302145e 6/14 样本），\\n   **重试仍失败则立即改用** mcp_matrix_extract_content_from_websites 抓 https://finance.eastmoney.com/news/cywjh.html（东方财富快讯，SSG 渲染 + 结构化列表）或 https://finance.sina.com.cn/（新浪财经首页，含\\\"国际焦点\\\"）\\n   6-8 条要闻，源标\\\"财联社\\\"（fallback 兜底时按实际来源标\\\"东方财富\\\"或\\\"新浪财经\\\"，不能统一标）。不要凭模型知识补全。\\n   ⚠️ 关键要求：搜索结果必须包含具体数字，所有数据不得出现\\\"约\\\"、\\\"约XX\\\"、\\\"约XX%\\\"等模糊表述，必须填入精确值。\\n   ⚠️ 字数限制：全文不超过2000字，每条要闻点评控制在50字以内，6-8 条。\\n   ⚠️ 时间窗：过去 24 小时内（强制时间过滤、避免旧闻）。\\n   ⚠️ 范围：只保留 4 类 —— 政策事件 / 宏观数据（CPI/PPI/M2/社融/PMI）/A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）/海外市场大变动（美联储/欧央行/日央行决议/重要地缘事件/重要海外公司财报）。\\n   ⚠️ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）；按重要性排（政策 > 宏观数据 > A 股主体事件 > 海外大变动）。\\n\\n3. 【v3.1.0 协议】将 AI 生成的内容写入 /tmp/evening_report_ai.txt（注意：不是 _content.txt！）。\\n   文件必须包含两个区块，**用 [财经要闻] / [操作建议] 标记严格分割**，否则 send 脚本会硬失败（exit 1）：\\n\\n   📰 【财经晚报】[YYYY年MM月DD日（周X）]\\n   \\n   ━━━ 一、财经要闻 ━━━\\n   [财经要闻]\\n   【1】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   【2】（标题）｜✅利好/❌利空/⚠️中性\\n     点评：（50 字内具体数据点评）\\n     来源：XX媒体\\n   ⬇️ 1 个空行 ⬇️\\n   ...（6-7 条要闻，顺序编号）\\n   \\n   【本段硬约束 — v3.1.0 双标记 + v3.3.0 要闻定位 + v3.3.1 空行 + 来源约束】\\n   ✅ 协议硬约束（v3.1.0 强制）：\\n     · 必须有 [财经要闻] 标记 + 至少 1 条要闻\\n     · 必须有 [操作建议] 标记 + 至少 1 条建议\\n     · 缺任一标记或对应内容为空 → send 脚本立即 SystemExit 1，晚报不会推送\\n   ❌ 财经要闻 ≠ 盘面数据/资金流向/估值数据\\n   ✅ 6-8 条要闻必须从以下 4 类中选（按重要性排）：\\n     · 政策事件（发改委/央行/财政部/证监会/ZZ 局 会议/文件、表态）\\n     · 宏观数据（CPI/PPI/M2/社融/PMI/进出口/失业率 等统计局/央行发布）\\n     · A 股主体事件（上市公司重大公告：重组/分红/回购/业绩/股权变更）\\n     · 海外市场大变动（美联储/欧央行/日央行决议/重要海外公司财报/重要地缘事件）\\n   ✅ 去重去软文：同类事件只保留最新/最权威 1 条；禁止\\\"X 老师认为...\\\"、\\\"机构预计...\\\"等观点型（除非带具体数字且 cite 来源）。\\n   ❌ 禁止作为\\\"要闻\\\"标题的内容（这些是【盘后数据】，非新闻）：\\n     · 指数点位+涨跌幅（如\\\"沪指失守 4000 点跌 0.16%\\\"）\\n     · 估值/资金/成交额等单一数据指标（如\\\"两融余额 28490 亿\\\"、\\\"沪深 300 PE 13.52\\\"）\\n\n\nArchive v3.5.0: 23 files, 116620 bytes\n\nFiles: _meta.json (133b), cron_jobs/cron_mirror.json (3155b), cron_jobs/README.md (3297b), references/config.json (2791b), references/fallback-chain-validation.md (3388b), references/weekend-4kb-budget.md (4790b), scripts/_lock.py (2687b), scripts/_send_lib.py (3785b), scripts/check_consistency.py (26473b), scripts/collect_evening_data.py (40800b), scripts/collect_morning_data.py (18850b), scripts/send_close_summary.py (31291b), scripts/send_evening_report.py (47769b), scripts/send_intraday_alert.py (7797b), scripts/send_ipo_report.py (26325b), scripts/send_morning_report.py (3865b), scripts/send_weekend_news.py (10479b), scripts/skill_dispatcher.py (14834b), skill-card.md (2643b), SKILL.md (31155b), templates/evening.json (10448b), templates/morning.json (9924b), templates/weekend.json (11525b)\n\nArchive v3.3.1: 53 files, 182281 bytes\n\nFiles: _meta.json (133b), cron_jobs/cron_mirror.json (3156b), cron_jobs/README.md (3297b), knowledge/changelog/_local_supplement_20260610_changelog_slimming_research.md (4603b), knowledge/changelog/README.md (2700b), knowledge/changelog/v2.0.0.md (1536b), knowledge/changelog/v2.0.1.md (1542b), knowledge/changelog/v2.0.10.md (2241b), knowledge/changelog/v2.0.2.md (977b), knowledge/changelog/v2.0.3.md (2718b), knowledge/changelog/v2.0.4.md (2624b), knowledge/changelog/v3.0.0.md (5296b), knowledge/changelog/v3.1.0.md (6412b), knowledge/changelog/v3.1.1.md (2221b), knowledge/changelog/v3.1.2.md (3057b), knowledge/changelog/v3.1.3.md (2880b), knowledge/changelog/v3.1.4.md (2631b), knowledge/changelog/v3.1.5.md (2911b), knowledge/changelog/v3.1.6.md (3110b), knowledge/changelog/v3.2.0.md (4492b), knowledge/changelog/v3.2.1.md (1733b), knowledge/changelog/v3.2.2.md (5495b), knowledge/changelog/v3.2.3.md (7249b), knowledge/changelog/v3.2.4.md (2960b), knowledge/changelog/v3.2.5.md (8338b), knowledge/changelog/v3.2.6.md (3984b), knowledge/changelog/v3.2.7.md (4362b), knowledge/changelog/v3.2.8.md (4048b), knowledge/changelog/v3.2.9.md (11179b), knowledge/decisions/architecture.md (5863b), knowledge/decisions/data-pitfalls.md (4649b), knowledge/decisions/dispatcher-patterns.md (4983b), knowledge/decisions/guardrails.md (4185b), knowledge/decisions/lessons-learned.md (13595b), knowledge/decisions/README.md (2735b), references/config.json (2791b), scripts/_lock.py (2687b), scripts/_send_lib.py (3785b), scripts/check_consistency.py (20776b), scripts/collect_evening_data.py (40817b), scripts/collect_morning_data.py (15620b), scripts/send_close_summary.py (31308b), scripts/send_evening_report.py (46938b), scripts/send_intraday_alert.py (7797b), scripts/send_ipo_report.py (26325b), scripts/send_morning_report.py (3865b), scripts/send_weekend_news.py (13747b), scripts/skill_dispatcher.py (8404b), skill-card.md (2602b), SKILL.md (36171b), templates/evening.json (8561b), templates/morning.json (6560b), templates/weekend.json (8980b)\n\nArchive v3.2.5: 48 files, 164133 bytes\n\nFiles: _meta.json (133b), cron_jobs/cron_mirror.json (3277b), cron_jobs/README.md (3297b), knowledge/changelog/README.md (2330b), knowledge/changelog/v2.0.0.md (1536b), knowledge/changelog/v2.0.1.md (1542b), knowledge/changelog/v2.0.10.md (2241b), knowledge/changelog/v2.0.2.md (977b), knowledge/changelog/v2.0.3.md (2718b), knowledge/changelog/v2.0.4.md (2624b), knowledge/changelog/v3.0.0.md (5296b), knowledge/changelog/v3.1.0.md (6412b), knowledge/changelog/v3.1.1.md (2221b), knowledge/changelog/v3.1.2.md (3057b), knowledge/changelog/v3.1.3.md (2880b), knowledge/changelog/v3.1.4.md (2631b), knowledge/changelog/v3.1.5.md (2911b), knowledge/changelog/v3.1.6.md (3110b), knowledge/changelog/v3.2.0.md (4492b), knowledge/changelog/v3.2.1.md (1733b), knowledge/changelog/v3.2.2.md (5495b), knowledge/changelog/v3.2.3.md (7249b), knowledge/changelog/v3.2.4.md (2960b), knowledge/changelog/v3.2.5.md (8338b), knowledge/decisions/architecture.md (5863b), knowledge/decisions/data-pitfalls.md (4649b), knowledge/decisions/dispatcher-patterns.md (4983b), knowledge/decisions/guardrails.md (4185b), knowledge/decisions/lessons-learned.md (13595b), knowledge/decisions/README.md (2735b), references/config.json (2791b), scripts/_lock.py (2687b), scripts/_send_lib.py (3785b), scripts/check_consistency.py (20773b), scripts/collect_evening_data.py (40654b), scripts/collect_morning_data.py (15442b), scripts/send_close_summary.py (31066b), scripts/send_evening_report.py (46455b), scripts/send_intraday_alert.py (7618b), scripts/send_ipo_report.py (26147b), scripts/send_morning_report.py (3687b), scripts/send_weekend_news.py (13569b), scripts/skill_dispatcher.py (8404b), skill-card.md (2682b), SKILL.md (41374b), templates/evening.json (5290b), templa...","readmeExcerpt":"Skill: A-stock-report Owner: cookfish1979 Summary: A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。 Tags: a-share:3.2.2, akshare:2.0.2, automation:3.2.2, finance:3.2.2, investment:2.0.2, iwencai:2.0.2, latest:3.5.4, report:3.2.2, wechat-work:2.0.2 Version history: v3.5.4 | 2026-06-20T05:40:50.226Z | user v3.5.4 (2026-06-19): 1) send_*.py 全部 7 个脚本重构 .env 加载 (注释去密钥字样 + 路径走 ENV_FIL","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"A-stock-report/\n├── SKILL.md                      ← 本文件（含完整执行流程 + 14 段护栏 + changelog 索引）\n├── _meta.json\n├── .clawhubignore                ← v3.4.4 立：排除 knowledge/ + *.bak\n│\n├── 🐍 scripts/                  ← 12 个 Python 脚本 + 3 个 JSON prompt 模板\n│   ├── _lock.py / _send_lib.py  ← 共用库\n│   ├── check_consistency.py     ← 14 段一致性护栏（A~H 段）\n│   ├── skill_dispatcher.py      ← LLM 驱动型任务的 5d 数据抽取 + prompt 注入\n│   ├── collect_{morning,evening}_data.py / send_{morning,close,evening,intraday,weekend,ipo}.py\n│   ├── templates/{morning,evening,weekend}.json\n│   ├── cron_jobs/{cron_mirror.json, README.md}\n│   └── references/{config.json, fallback-chain-validation.md, weekend-4kb-budget.md}\n│\n└── 📚 knowledge/                ← changelog + 决策主题（**按需 skill_view 加载，不进默认 context**）\n    ├── changelog/                ← 按版本号组织\n    │   ├── README.md             ← 35 条 changelog 索引\n    │   └── vX.Y.Z.md             ← 单版完整细节（v3.5.0 立，19 条新加）\n    └── decisions/                ← 跨版本决策中心（按主题）\n        ├── README.md\n        ├── architecture.md       ← 架构演进\n        ├── data-pitfalls.md      ← 数据源踩坑集\n        ├── lessons-learned.md    ← 核心教训\n        ├── guardrails.md         ← 护栏规则\n        └── dispatcher-patterns.md"},{"language":"bash","snippet":"WECOM_WEBHOOK_KEY=c4a1cd60-254e-4612-b365-c701482ae98c\nIWENCAI_API_KEY=***"},{"language":"bash","snippet":"# 1. 读 cron_mirror.json 看 prompt 字段拿到完整命令\npython3 -c \"import json; print(json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))['tasks']['close_summary']['prompt'])\"\n\n# 2. 复制粘贴该命令到终端跑（已含 source .env + python3 路径 + 默认参数）"},{"language":"python","snippet":"# ❌ 错误写法 — TypeError: '>' not supported between instances of 'str' and 'int'\nif \"成交额\" in k and v and v > 0:\n    val_yi = float(v) / 1e8"},{"language":"python","snippet":"if \"成交额\" in k and v not in (None, \"\", 0, \"0\", \"0.0\"):\n    try:\n        v_num = float(v)        # 统一强转\n    except (TypeError, ValueError):\n        continue                # 转换失败跳过，不让一个坏字段拖垮整次查询\n    if v_num > 0:               # 数值化后再比较\n        val_yi = v_num / 1e8\n        return v_num"},{"language":"text","snippet":"📰 【股市晨报】YYYY年MM月DD日（周X）\n\n━━━ 隔夜全球市场 ━━━\n【美股收盘】\n▪ 道琼斯：XXXXX.XX点，+X.XX%（精确数字，不得用\"约\"）\n▪ 标普500：XXXXX.XX点，+X.XX%\n▪ 纳斯达克：XXXXX.XX点，+X.XX%（可附\"X连涨/连跌X日\"）\n▪ VIX恐慌指数：XX.XX（+X.XX%），恐慌等级：【低位(<20)/中位(20-30)/高位(>30)】\n\n【港股及A50】\n▪ 恒生指数：XXXXX.XX点，+X.XX%（附简要背景）\n▪ 富时A50期货：XXXXX点，+X.XX%，偏强/偏弱运行【预判A股明日开盘】\n\n【大宗商品】\n▪ WTI原油：XXX.XX美元/桶，+X.XX%（精确数字，不得用\"约\"）\n▪ 现货黄金：XXXX.XX美元/盎司，+X.XX%（精确数字）\n\n━━━ 财经要闻 ━━━\n【1】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（简洁分析，≤50字）\n【2】（标题）｜✅利好/❌利空/⚠️中性 对A股影响\n  点评：（≤50字）\n（**≤7条**，顺序编号，每条格式固定：\n  【编号】（标题）｜✅/❌/⚠️标签 对A股影响\n  点评：（事件+分析，≤50字））\n\n━━━ 今日操作建议 ━━━\n【大盘研判】\n（综合外围市场、宏观政策、量能等因素，给出2-3句综合判断）\n\n【操作建议】\n1. 【板块/策略】（期限）：具体建议+附标的\n2. 【板块/策略】（期限）：...\n\n【风险提示】\n⚠️ （1-3条，最重要的风险）\n\n⚠️ 仅供参考，不构成投资建议。股市有风险，投资需谨慎。"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: A-stock-report\ndescription: \"A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版。内置投资者情绪打分（6维度，满分100）与AI后市展望。\"\nversion: 3.5.4\n---\n\n# A股报告系统\n\n>A股数据驱动型报告自动生成与推送系统，支持晨报 / 收盘小结 / 晚报 / 盘中预警 / IPO周报 / 财经周末版\n\n---\n\n## 目录结构（v3.2.3+1 起明示，v3.5.0 简化）\n\n`clawhub publish` 按 `.clawhubignore` 排除 `knowledge/` + `*.bak`（v3.4.4 立），其他整目录上传。装好后 `~/.hermes/skills/A-stock-report/` 结构：\n\n```\nA-stock-report/\n├── SKILL.md                      ← 本文件（含完整执行流程 + 14 段护栏 + changelog 索引）\n├── _meta.json\n├── .clawhubignore                ← v3.4.4 立：排除 knowledge/ + *.bak\n│\n├── 🐍 scripts/                  ← 12 个 Python 脚本 + 3 个 JSON prompt 模板\n│   ├── _lock.py / _send_lib.py  ← 共用库\n│   ├── check_consistency.py     ← 14 段一致性护栏（A~H 段）\n│   ├── skill_dispatcher.py      ← LLM 驱动型任务的 5d 数据抽取 + prompt 注入\n│   ├── collect_{morning,evening}_data.py / send_{morning,close,evening,intraday,weekend,ipo}.py\n│   ├── templates/{morning,evening,weekend}.json\n│   ├── cron_jobs/{cron_mirror.json, README.md}\n│   └── references/{config.json, fallback-chain-validation.md, weekend-4kb-budget.md}\n│\n└── 📚 knowledge/                ← changelog + 决策主题（**按需 skill_view 加载，不进默认 context**）\n    ├── changelog/                ← 按版本号组织\n    │   ├── README.md             ← 35 条 changelog 索引\n    │   └── vX.Y.Z.md             ← 单版完整细节（v3.5.0 立，19 条新加）\n    └── decisions/                ← 跨版本决策中心（按主题）\n        ├── README.md\n        ├── architecture.md       ← 架构演进\n        ├── data-pitfalls.md      ← 数据源踩坑集\n        ├── lessons-learned.md    ← 核心教训\n        ├── guardrails.md         ← 护栏规则\n        └── dispatcher-patterns.md\n```\n\n**knowledge/ 为什么保留在 publish 包但不进默认 context** (v3.4.4 改): `.clawhubignore` 排除后, **装上后无 knowledge/** — 用户需主动 `skill_view` 加载；本机开发保留完整 knowledge/ 不影响发布包大小。\n\n---\n\n## 版本历史（Changelog）\n\n> **精简规则（v3.5.0 立）**：每条 ≤ 1 行索引，详细实战/根因/修法折到 `knowledge/changelog/vX.Y.Z.md`。完整 35 条索引见 [`knowledge/changelog/README.md`](knowledge/changelog/README.md)。\n>\n> **未发版段识别**：标题含 `(未发版)` 的是当前 v3.5.0 待 bump 的小改集合。\n\n### v3.3.0 ~ v3.4.4（19 条，SKILL.md 主体）— 2026-06-11 晚 ~ 2026-06-16\n\n- [v3.5.1 — send_evening_report.py 加 5 项内容质量硬校验](knowledge/changelog/v3.5.1.md) — 2026-06-18 晚（未发版）\n- [v3.4.4 — 异常周（周二 cron）周末要闻端到端验证](knowledge/changelog/v3.4.4.md) — 2026-06-16（未发版）\n- [v3.3.5+5 — fallback 链选 URL 原则：主题聚合页 > 单篇头条](knowledge/changelog/v3.3.5+5.md) — 2026-06-15 20:00 晚报（未发版）\n- [v3.3.5+4 — web_search MCP 重试加固：覆盖 {\"error\": ...} 分支](knowledge/changelog/v3.3.5+4.md) — 2026-06-15 16:35（未发版）\n- [v3.3.5+3 — 周末要闻 4 KB 截断修复 + 防幻觉 + 表格化 + H 段护栏](knowledge/changelog/v3.3.5+3.md) — 2026-06-15 下午（未发版）\n- [v3.3.5+2 — 3 层 fallback 链 + 要闻段反例前置](knowledge/changelog/v3.3.5+2.md) — 2026-06-15 晨报（未发版）\n- [v3.3.5+1 — 3 templates 加 batch_web_search 失败 fallback 机制](knowledge/changelog/v3.3.5+1.md) — 2026-06-13 晚（未发版）\n- [v3.3.5 — 晨报渲染细节对齐 6/12 周五样本 + 删 v3.3.4 过头加固](knowledge/changelog/v3.3.5.md) — 2026-06-13 下午\n- [v3.3.4 — 晨报过头加固（已废）](knowledge/changelog/v3.3.4.md) — 2026-06-13 凌晨\n- [v3.3.3 — 尝试加固晨报，未生效，无代码变更](knowledge/changelog/v3.3.3.md) — 2026-06-12 晚"},{"path":"cron_jobs/README.md","content":"# cron_jobs/ — 生产 cron 任务的人类可读镜像\n\n## ⚠️ 重要：本目录文件**不被任何代码读取**\n\n`cron_jobs/cron_mirror.json` 是 `~/.hermes/cron/jobs.json` 里**独立脚本型 cron 任务的人类可读副本**。\n\n- **不被 `skill_dispatcher.py` 读取**（dispatcher 只读 `templates/*.json`）\n- **不被 OpenClaw cron 直接读取**（OpenClaw 只读 `~/.hermes/cron/jobs.json`）\n- 作用是**给 AI / 用户审计**：\"A 股 3 个独立脚本任务在生产 cron 里到底是怎么配的\"\n\n## 文件清单\n\n| 文件 | 作用 |\n|------|------|\n| `cron_mirror.json` | **唯一镜像文件**，内含 3 任务（close_summary/intraday/ipo_report）|\n| `README.md` | 本文件 |\n\nv3.1.4 起 3 镜像合为单文件，强制一致，避免之前\"改一处忘改别处\"的纪律性 bug。\n\n## 4 端真相分布\n\n| 维度 | 在哪里 | 角色 |\n|------|--------|------|\n| **LLM 调度模板** | `templates/{morning,evening,weekend}.json` | 被 `skill_dispatcher.py` 读取 |\n| **生产 cron 真实配置** | `~/.hermes/cron/jobs.json` | 被 OpenClaw 读取并定时触发 |\n| **本目录归档镜像** | `cron_jobs/cron_mirror.json` | **人类审计用**，内含 3 任务镜像，prompt 字段与 jobs.json 一字不差 |\n| **SKILL.md 文档** | `SKILL.md` 任务清单段 | 文档层说明 |\n\n## 单文件结构\n\n```json\n{\n  \"_meta\": { \"purpose\": \"...\", \"mirror_of\": \"...\", \"version\": \"...\", \"history\": \"...\", \"see_also\": \"...\" },\n  \"tasks\": {\n    \"close_summary\": { \"name\": \"A股收盘小结\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"intraday\":      { \"name\": \"A股盘中预警\", \"schedule\": \"...\", \"prompt\": \"...\", ... },\n    \"ipo_report\":    { \"name\": \"A股IPO周报\", \"schedule\": \"...\", \"prompt\": \"...\", ... }\n  }\n}\n```\n\n任务键名（close_summary/intraday/ipo_report）= 文件名时代的标识，跟历史档案一致。\n\n## 维护纪律\n\n**修改 `jobs.json` 里的 prompt 时，必须同步修改 `cron_jobs/cron_mirror.json` 中对应任务**，保证镜像与生产一致。\n\n**🛡️ v3.1.5+ 推荐用护栏脚本一次性检查 4 端一致性**（templates ↔ cron_mirror ↔ jobs.json ↔ SKILL.md）：\n\n```bash\npython3 /root/.hermes/skills/A-stock-report/scripts/check_consistency.py\n# exit 0=全过，1=有错误\n# 加 --verbose 看每条 ✅，加 --fix-hint 看修复建议\n```\n\n**legacy 一行命令**（仅检查镜像与 jobs.json 的 prompt 一致性，v3.1.4 时代的命令，v3.1.5 起推荐上面那个）：\n\n```bash\npython3 -c \"\nimport json\njobs = json.load(open('/root/.hermes/cron/jobs.json'))\nmirror = json.load(open('/root/.hermes/skills/A-stock-report/cron_jobs/cron_mirror.json'))\nm = {'A股收盘小结':'close_summary','A股盘中预警':'intraday','A股IPO周报':'ipo_report'}\nfor j in jobs['jobs']:\n    if j['name'] in m:\n        mirror_prompt = mirror['tasks'][m[j['name']]]['prompt']\n        print(j['name'], j['prompt'] == mirror_prompt)\n\"\n```\n\n## 历史\n\n- **v3.1.4 (2026-06-09)**: 合井 3 文件为 `cron_mirror.json`（67 行 / 2.6KB），README 同步更新\n- **v3.1.3 (2026-06-09)**: 新建 `cron_jobs/intraday.json` 镜像（v3.0~v3.1.2 期间已存在 close_summary/ipo_report 镜像）\n- **备份位置**: `/workspace/archive/cron_jobs_3split_20260609_1952.bak/`（v3.1.4 前 3 文件的完整备份）"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7b60cvvedv8jkxs5gy3m9c0d837e9f\",\n  \"slug\": \"a-stock-report\",\n  \"version\": \"3.5.4\",\n  \"publishedAt\": 1781934050226\n}"},{"path":"references/config.json","content":"{\n  \"_note\": \"本文件为历史参考（2026-04-04 快照）。当前真相请看：\\n  - cron_jobs/cron_mirror.json（独立脚本任务真相）\\n  - templates/*.json（LLM 驱动型任务 prompt 真相）\\n  - scripts/_send_lib.py（推送共用库，看 get_webhook_url() 实现）\\n  - ~/.hermes/cron/jobs.json（实际运行的 cron 任务）\",\n  \"_deprecated\": \"v3.2.2 起，本文件不再维护。当前所有任务真相在上述 4 处。如需改 cron / prompt / 推送方式，改那 4 处，不要改本文件。\",\n\n  \"webhook_当前实现\": {\n    \"env_var\": \"WECOM_WEBHOOK_KEY\",\n    \"code\": \"scripts/_send_lib.py → get_webhook_url()\",\n    \"loaded_by\": \"每个 send 脚本头部白名单加载 .env（仅 WECOM_WEBHOOK_KEY / IWENCAI_API_KEY / TUSHARE_TOKEN）\",\n    \"历史引用\": \"/workspace/keys/keys_loader.py 已在 v3.1.0+ 弃用，所有 send 脚本改走 env 路径\"\n  },\n\n  \"推送架构（v3.1.0+）\": {\n    \"统一库\": \"scripts/_send_lib.py（原 _notify.py，v3.2.0 统一名）\",\n    \"API\": [\"get_webhook_url() — 读 WECOM_WEBHOOK_KEY env\", \"wx(text) — curl 风格推企业微信 + 自动重试\", \"notify_failure(prefix, msg) — 失败告警（v3.1.0 补丁 2：内部 try/except，不阻断主流程）\"],\n    \"退出码\": {\"0\": \"成功\", \"1\": \"数据/网络错误\", \"2\": \"推送失败\"}\n  },\n\n  \"锁机制（v2.0.3+）\": {\n    \"实现\": \"scripts/_lock.py（PID + TTL + stale 检测）\",\n    \"行为\": [\"无锁 → 创建并占用\", \"有锁 + 持有者存活 + 未超 TTL → 报错退出（避免并发）\", \"有锁 + 持有者死亡 → 自动清理并占用\", \"有锁 + 锁超时（>ttl）→ 视为 stale，清理并占用\"],\n    \"TTL\": \"默认 1 小时（ttl=3600）\",\n    \"自愈真相\": \"自愈逻辑只在 lock() 被调用时触发（被动），不是'30 分钟内自动清理'。脚本崩溃后如果没有下次 lock() 调用，锁会一直留着（5.9 天残留锁案例：6/3 晨报崩溃后到 6/9 没有任何 cron 触发 lock）。v3.2.2 文档修正，行为不变。\",\n    \"教训\": \"不要相信'30 分钟自愈'。设计意图是'TTL=1h 内不允许重复占用'，不是'自动清理'。手动 rm 仍是最快清理方式。\"\n  },\n\n  \"当前 cron 任务（v3.1.4+，权威源：cron_jobs/cron_mirror.json）\": {\n    \"独立脚本型（3 个）\": [\"close_summary: 30 7 * * 1-5 (北京时间 15:30)\", \"intraday: */5 9,10,11,13,14 * * 1-5 (盘中每 5 分钟)\", \"ipo_report: 0 2 * * 6 (周六 10:00)\"],\n    \"LLM 驱动型（3 个）\": [\"morning (晨报): dispatcher + templates/morning.json\", \"evening (晚报): dispatcher + templates/evening.json\", \"weekend (财经周末版): dispatcher + templates/weekend.json\"],\n    \"_deprecated_4_月_快照\": \"本文件 4/4 列出的'工作区整理'cron 不在当前 jobs.json，已删。\"\n  }\n}"},{"path":"references/fallback-chain-validation.md","content":"# Fallback Chain Validation Log\n\n## v3.3.5+2 — 3 层 fallback 链验证矩阵\n\n### 链结构（cron prompt 已注入 3 templates）\n\n```\nL1: batch_web_search (主源：财联社/新华/证券时报)\n   ↓ 失败（success=false / formatted_content=[] / {\"error\": \"...\"}）\nL2: extract_content_from_websites 抓 https://www.cls.cn/telegraph\n   ↓ 失败（JS 动态加载，curl 占位）\nL3: extract_content_from_websites 多源池（按任务类型动态选最权威 2 个）：\n   - 东方财富快讯 https://finance.eastmoney.com/news/cywjh.html（SSG 渲染 + 结构化列表）\n   - 新浪财经首页 https://finance.sina.com.cn/（含\"国际焦点\"分类）\n   - 21 经济网 https://www.21jingji.com/\n   - 中金 https://www.cnfin.com/\n```\n\n### 验证矩阵\n\n| 任务 | L1 状态 | L2 状态 | L3 使用源 | 备注 |\n|------|---------|---------|-----------|------|\n| 6/15 晨报 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富快讯 + 新浪首页 | 7 条要闻全事件型 |\n| 6/15 周末 | ❌ MCP `{\"error\":\"...\"}` | ❌ JS 占位 | 东方财富 + 21jingji | 表格化输出 |\n| **6/15 晚报** | ✅ 成功（7 条要闻） | n/a | n/a | **L1 一次过，未触发 fallback** |\n\n### 6/15 晚报实跑数据（验证非 fallback 路径主流通畅）\n\n- L1 成功：`batch_web_search` 返回 20 条 organic results（10/查询 × 2 查询）\n- 主源用：`操盘必读 6/15`（mp.cnfol.com） + `证券时报 gs.html` + `新浪财经 6/15 要闻`（3 源）\n- L1 来源的多样性证明 L1 主流通畅，**fallback 仅作兜底**\n\n## ⚠️ 维护教训 — 选 fallback URL 优先用\"主题聚合页\"而非\"单篇文章\"\n\n### 6/15 晚报实跑发现（2026-06-15 20:00 cron）\n\n- 尝试抓 `https://finance.sina.com.cn/headline/2026-06-15/doc-inicmxay6762199.shtml`\n- 返回内容**完全不是 A 股要闻**——是关于美伊协议 / 原油 / 黄金的**地缘 + 大宗商品**文\n- 该 URL 是新浪\"headline\"频道下的**单篇头条文章**，主题不可预测（每天头条可能是美股/地缘/科技/财经/体育）\n- 当时 L1 已成功（20 条 organic），未强制依赖 L3 这条 URL，但若 L1+L2 失败时正好撞上\"非 A 股主题\"的头条 → fallback 也白搭\n\n### 修复指引（v3.3.5+5 起生效）\n\n- ✅ 优先用**主题聚合页**（每天 N 条要闻，主题限定财经）：\n  - 东方财富快讯 `cywjh.html` — SSG 渲染 + 结构化列表（**最稳**）\n  - 新浪财经**首页** `finance.sina.com.cn/` — 含\"国际焦点\"分类\n  - 21 经济网首页 / 中金首页\n- ❌ 避免用**单篇头条文章**（URL 含 `/doc-...shtml` 或 `/20XX-XX-XX/doc-...`）— 主题不可控\n- 当前 templates 3 个 fallback 提示段已用 `finance.sina.com.cn/`（首页）— **正确**\n- 该问题不影响当前协议（L1+L2 成功率已够高），仅作未来扩展 fallback 池时的选 URL 规范\n\n## 历史教训（v3.3.5+1 → v3.3.5+4 演进）\n\n- **L1 失败率 20%**（agent.log 35 次调用 7 次失败）→ v3.3.5+4 加 retry-once\n- **L2 失败率 100%**（cls.cn/telegraph 是 JS 动态加载）→ v3.3.5+2 改用 SSG 页\n- **L3 选 URL 原则**：聚合 > 单篇（v3.3.5+5）\n\n## 维护建议\n\n- 每次 cron 失败时检查本表更新\n- 季度审计 fallback URL 是否仍可达（curl 200/200 含内容）\n- 主题聚合页优先级：东方财富快讯 > 新浪首页 ≥ 21jingji ≥ 中金"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1099,"uniquenessScore":41,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T06:09:28.258Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T06:09:28.258Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T01:00:33.188Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}