← 归档索引 · 2026-10-06 00:59 · 信号纵向跟踪+反馈闭环-23:15(原23:30并入·2合1)
# Cron Job: 信号纵向跟踪-每日23:15
**Job ID:** c85cc7fd1251
**Run Time:** 2026-10-06 00:59:26
**Schedule:** 15 23 * * 1-5
**Prompt Characters:** 9230
## Prompt
[IMPORTANT: The user has invoked the "script-output-integrity" skill, indicating they want you to follow its instructions. The full skill content is loaded below.]
---
name: script-output-integrity
description: 消费预跑脚本注入的数据时加载。先判数据真假再分析,识别假成功/降级/空段并标注完整度。
version: 1.0.0
author: Hermes Agent
license: MIT
category: fugui
tags: [data-integrity, silent-failure, consumer-side, cron]
metadata:
hermes:
tags: [data-integrity, silent-failure, consumer-side, cron]
related_skills: [silent-failure-defense, pan-gan-signals]
---
# 消费脚本输出 —— 先判真假,再分析
> 面向**读**注入数据的人(分析 cron),不是**写**脚本的人。
> 建造侧(怎么写不产生假成功)看 `silent-failure-defense`。
## When to Use
```
□ prompt / 上下文里出现「预跑脚本输出」「Script Output」「以下数据由预跑脚本采集」
□ 要用脚本采集的数据做判断、写报告
□ 某段数据看起来"有内容"但可疑(一行字样、空段、括号里的说明)
```
## 铁律:数据段先过完整性,再进入分析
**禁止把「缺失/降级」当作「正常数据」分析。** 缺失要标注,不要脑补。
### 识别清单(按严重度)
| 形态 | 真实含义 | 动作 |
|---|---|---|
| `xxx.sh: timeout` | **该段根本没跑**(不是"超时所以没数据")。典型是 `timeout N cd` 类缺陷 | 该段判为【零数据】,禁用其做主力判断 |
| `failed to run command '...'` | 内建命令被 timeout 包住 → 整段从未执行 | 同上 |
| `Traceback` / `ModuleNotFoundError` | 该段完全不可用 | 同上 |
| `❌<名> 失败(rc=N)` | 该段采集失败(已诚实上报) | 标注缺失,相关结论降级 |
| `(xxx不可用)` / `[超时]` / `数据采集失败` | 降级标记,段落内容为空 | 标注缺失 |
| `[SILENT]` | 无内容(合法语义:无异常/无新增) | 不要当数据,也不要当错误 |
| 空段 / 只有标题 | 采集为空 | 标注缺失 |
| 接口**无报错返回空 DataFrame** | 路由瞬时降级(非"今天无数据") | 重试一次再定性;仍空 → 判缺失 |
> 实测(2026-09-28 12:05):`data_hub.get_realtime_quotes(8 codes)` 一次返回 0 行**且不抛异常**,同一批码 30 秒后重跑全部正常 → 是瞬时静默降级。
> 判据:**空/无异常 ≠ 无数据;先重试,再定性**。消费侧把"空"当"没有"会导致整段结论凭空消失。
### 必须做的三件事
```
1. 报告开头标注完整度:「数据完整度: N/M 段可用」,缺失段逐条列名
2. 缺失段对应的结论 → 标注「基于间接推理 / 置信度降级」,不得伪装成实测
3. 禁止:用缺失段当论据;用"数据暂缺"当结论;脑补缺失段的内容
```
### 反面案例(实测,2026-09-11)
```
## Script Output
【午间扫描 | 2026-09-11 12:00】
midday_scan.sh: timeout ← 整块市场数据就是这一行假的
【心法扫描 | 2026-09-11 12:00】
════ Phase 0: 板块主力方向 ════
```
该报告被连续数周当成正常午间分析发出,AI 拿着这行假消息当市场数据做判断。
**根因:消费侧没有"先判真假"这一步。**
### 一句话判据
**看到数据段,先问「这段是真的吗」,再问「这段说明什么」。**
顺序反了,后面全废。
The user has provided the following instruction alongside the skill invocation: [IMPORTANT: You are running as a scheduled cron job. DELIVERY: Your final response will be automatically delivered to the user — do NOT use send_message or try to deliver the output yourself. Just produce your report/output as your final response and the system handles the rest. SILENT: If there is genuinely nothing new to report, respond with exactly "[SILENT]" (nothing else) to suppress delivery. [SILENT] is a literal ASCII control token — never translate or rephrase it, whatever language the rest of your answer uses. Never combine [SILENT] with content — either report your findings normally, or say [SILENT] and nothing more. FAILURE: If a delegated child fails and this cron run must be recorded as failed, put [CRON_FAILURE] on the first line by itself, then explain the child failure on following lines. RECURSION: This is a run of an EXISTING scheduled job — execute the task now. NEVER create or update a cron job because of recurring or future-schedule language in the task prompt below; treat phrasing like "each Monday" or "every day at 9" as context for this run, not as a request to schedule another job.]
## Output from job 'bc9b3ca8cc33'
The following is the most recent output from a preceding cron job. Use it as context for your analysis.
```
📊 判断层·富贵复盘(数据截止9/30,国庆休市第4天,非今日实时)
①大盘:分化态偏空。上证+0.31%独稳,深成-0.11%、创业板-0.23%、科创50 -2.51%领跌=成长端杀跌主导。空方循环仍开、评分5.0属正常震荡非瀑布,"每逢反弹拉风险"成立。与昨日对比脚本未给,不编。
②主线:无证据。板块TOP/BOTTOM为空、主力资金流采样100只未命中→资金方向不可证伪,不硬凑主线。仅剩结构面:光通信均-13.52%最惨,但天孚-5.46%/留存+8.06%、德科立+6.74%强承接=资金留强弃弱;半导体均-9.02%抗跌却内部全线持平、华虹留存-0.99%垫底=阴跌非建仓。
③信号:空方循环自动检测+风控生效✅;资金流缺失🔴,判断降级为"只看结构不看资金"。
④明日观察(机会轨先):
1. 光通信强承接:天孚、德科立若留存维持>0且放量→可跟踪;天孚跌破-5.46%或留存转负→证伪。
2. 科创50收不回1550(9/30收1530)→成长杀延续,高位科技不碰。
3. 闸门:深成指3日不创新低+止跌日放量,两条件齐→才开板块/个股。
```
## Output from job 'e710af0bbd73'
The following is the most recent output from a preceding cron job. Use it as context for your analysis.
```
## ⚠️ 晚间 21:30 统一扫描 · [4] 晚间总扫描 rc=1(已定位根因,未修 · 前端只读)
**一句话**:今天是周日(10/04),盘后数据层全绿;挂在 [4] 晚间总扫描——两个脚本调用了**当前 data_hub 里不存在的方法**,属于同根因的 API 漂移,且异常分支里 `logger` 未定义把兜底逻辑二次打死。
### 行1 · 数据验证(我实际跑了什么)
| 检查 | 命令/证据 | 结果 |
|---|---|---|
| canonical 有无这两个方法 | `grep -n 'def get_realtime\|def smart_select' ~/.hermes/scripts/data_hub.py` | 只有 `get_realtime / get_realtime_quotes / get_realtime_daily / get_realtime_trade`,**无 `get_realtime_batch`、无 `smart_select`** |
| 这两个方法在哪 | 全库 `grep -rn 'def get_realtime_batch\|def smart_select' ~/` | **只存在于废树 `/home/ubuntu/stock/data_hub.py`**(478/3019/2178 行) |
| 运行时实际加载哪个 | `cd stock_workspace && python3 -c "import data_hub; ..."` | `data_hub.__file__` = `stock_workspace/data_hub.py` → **软链到 canonical**(8/28 建链);`hasattr(DataHub,'get_realtime_batch')=False, smart_select=False` |
| 时间线 | `stat` | 两个脚本最后改于 **8/15、8/10**,软链建于 **8/28**,canonical 最后改 **9/27** → 脚本写在旧树 API 上,链接切走后即断 |
| `logger` 是否存在 | `grep -n 'logger\s*=\|import logging' market_super_scan.py` | **0 命中** — 175 行 `logger.warning(...)` 必抛 `NameError` |
### 行2 · 逻辑链问题(根因 + 被掩盖的部分)
1. **根因 A(同一条,两处爆)**:`market_super_scan.py:155` 用 `hub.get_realtime_batch`(应回退到 `hub.get_realtime(symbols)`,canonical 有),`chain_definition_card.py:182` 用 `hub.smart_select`(canonical 无对应物)。
2. **根因 B(让 A 变成崩溃而不是降级)**:`market_super_scan.py:175` 的兜底 except 里引用了**从未定义的 `logger`** → AttributeError 被 NameError 接管,本该"mx 批量兜底"的降级路径自己先崩,整段扫描 rc=1。`chain_definition_card.py` 的 `_smart_select_stocks` docstring 写着"失败→返回 [] 调用方回退行业匹配",但 `hub.smart_select` 这行**没包 try**,AttributeError 直穿,注释承诺的回退 2/3 层从未生效。
3. **这正是"声明即校验"要抓的漂移**:文件头声明"多源自动路由/失败回退",实际两条回退链一条没 try、一条 except 自己报错——声明存活 ≥37 天无机器校验。
4. **附带假警报(别当真)**:`数据护照 stale(4天前) 日期20260930` —— 今天周日、国庆休市,**9/30 就是最新交易日**,stale 标记是节假日误报;`[4]` 里 `⚠️ judgment_extract(v3) 0条` 与 `Mootdx init failed: timed out` 为已知降级,非本次根因。
### 行3 · 影响面(哪些数据是真的)
- ✅ **照常产出**:tushare 六项盘后采集(daily/daily_basic/moneyflow/top_list/stk_limit/northbound)、板块扫描+缓存、收盘B组、全市场广度、主力三问、数据增强、HMM体制、多空辩论、轮动矩阵、情景分析、v8引擎、主线预选池。
- ❌ **丢失**:`[4] 晚间总扫描` 的**个股扫描段**(`scan_stocks` 在 155 行崩,后续段未跑);**产业链动态扫描**(chain 两链全断);另有 `[2]` westock 限频 53 行噪声(走 data_hub 兜底,原文 `/tmp/evening_noise_20261004_2.log`)、可投资板块/股票 rc=124 超时。
- ⚠️ **读数提醒**:潜伏 TOP5 全部 `+0.00% 📉`+`🆕` 是**周日无交易**的空值形态,不是"今日横盘",别把 74.0 分当盘中信号读。市场判断段自身口径也一致:广度 46.2%、周线空头、六引擎全部"观望/仓位上限0%"、多空 BEAR、Kelly 9%。
### 最小修复(三行级,待你放行后端才动手)
- ✅修什么:① `market_super_scan.py:155` `get_realtime_batch(pure)` → `get_realtime(pure)`;② 文件头补 `import logging; logger = logging.getLogger(__name__)`;③ `chain_definition_card.py:182` 的 `hub.smart_select(query)` 包 try/except → 失败 `return []` 走既有行业回退。
- ✅怎么验证:`cd stock_workspace && python3 market_super_scan.py` 与 `python3 chain_definition_card.py <链> --as-json` 均 rc=0,且人为让 mootdx 超时复现兜底路径不再 NameError。
- ✅还不行找我:若修完 `get_realtime` 口径不匹配(废树返回 dict、canonical 返回 DataFrame),需按列名对齐——那属于第二层,届时再报。
**待办提醒**:`judgment_extract(v3)→0条 / v4抽取器`、westock 限频、`可投资选择 rc=124` 三项是老账,本次未动。
```
## Script Output
The following data was collected by a pre-run script. Use it as context for your analysis.
```
=== 信号纵向跟踪 ===
验证/回填: 59条
更新0条
(数据源降级: westock 日K 58 次失败(服务限频),非交易时段自动走 tushare 兜底;逐条明细见 /tmp/signal_track_update.err)
信号总数: 98 | 已完整验证(T+20齐): 13 | 跟踪中(未到T+20): 85
类型 数量 T+5命中 T+5均值
----------------------------------------
breakout 9 1/8=12% -4.9%
launch 28 8/10=80% +5.7%
pre_launch 61 21/35=60% +5.1%
最近信号:
2026-10-06 恒烁股份(688416.SH) T5=- -
2026-10-06 德明利(001309.SZ) T5=- -
2026-10-06 东芯股份(688110.SH) T5=- -
2026-10-06 普冉股份(688766.SH) T5=- -
2026-10-06 普冉股份(688766.SH) T5=- -
2026-10-06 兆易创新(603986.SH) T5=- -
2026-10-06 赢时胜(300377.SZ) T5=- -
2026-10-06 长飞光纤(601869.SH) T5=- -
信号纵向跟踪报告
============================================================
总计: 167只 | 命中(T+5>2%): 38只 命中率23% | 平均T+5=-1.2%
来源 数量 命中率 平均T+5 平均T+20
--------------------------------------------------
dragon_preselect 85 26% -0.4% —(无T+20)
low_launch 59 15% -3.2% —(无T+20)
pre_launch 19 32% +1.1% +7.3%
launch 3 33% -0.7% +0.3%
breakout 1 0% -4.0% -11.7%
板块 数量 命中率 平均T+5
----------------------------------------
半导体 38 42% +0.8%
未知 23 30% +0.6%
生物制药 14 7% -5.6%
火力发电 12 8% -4.8%
元器件 9 22% -3.9%
电器仪表 9 33% +2.0%
玻璃 7 29% +2.2%
汽车配件 7 0% -3.5%
水力发电 4 0% -0.4%
塑料 4 50% +6.2%
=== 参数反馈 ===
{
"pre_launch": {
"hit_rate": 31.6,
"count": 19,
"avg_t5": 1.09
},
"launch": {
"hit_rate": 33.3,
"count": 3,
"avg_t5": -0.7
},
"breakout": {
"hit_rate": 0.0,
"count": 1,
"avg_t5": -4.04
},
"dragon_preselect": {
"hit_rate": 25.9,
"count": 85,
"avg_t5": -0.39
},
"low_launch": {
"hit_rate": 15.3,
"count": 59,
"avg_t5": -3.19
}
}
```
信号纵向跟踪:1) signal_feedback.db 渐进验证(缺T+20的行持续回填,未到T+20不提前落标);2) 更新 signal_track.json 所有信号的 T+1/T+3/T+5/T+10/T+20 快照;3) 输出 signal_feedback.db 类型命中率报告(阈值统一2%);4) 有已完成信号时输出各来源/板块命中率与参数反馈(low_launch/dragon_preselect 来源,数据齐了自然出现,无数据不硬凑)。
**Response Characters:** 1142
## Response
📊 **信号纵向跟踪 · 10/06(国庆假期中)**
**数据完整度: 2/2 段可用**(非timeout/非空段,我逐段回查了真源)
- 段1 信号跟踪 ✅ = `signal_feedback.db` 98行实测一致(breakout9/launch28/pre_launch61,命中和1+8+21=30)
- 段2 来源/板块/参数 ✅ = `signal_track.json` 306条中 done=167 实测一致
- 降级1处:westock日K限频58次(err文件实证=服务限频非脚本错)→ tushare兜底,数据未缺
- 「更新0条」正常:休市无新价,9/30后无可回填
---
**🔴 本次查出真问题:休市日重复登记(灌水26条,占98条的27%)**
- 10-04(周六)和10-06(假期)各写入13条,**两批逐条完全相同**:同code+同类型+同价,价格全是9/30收盘价
- 后果1:「最近信号 2026-10-06 八条」是**假新鲜度**——休市无交易,T5=- 是日历未到,不是走势未验;普冉10-06双条=同价双类型登记
- 后果2:类型命中率分母被污染(launch/pre_launch 含重复)
- 定性:不是缺数据,是多算了数据。**命中率数字按去重口径打折看**
- 次要:track.json key格式混杂23条旧式date_code,查无重复,暂无实害
---
**命中率判读(阈值2%)**
- ✅ **pre_launch 是唯一及格来源**:T+5 60%(21/35)、T+20 +7.3%——但T+20齐的仅13条,**样本小置信度低**
- ⚠️ launch T+5 80% 仅8条可算+重复污染,**别当真**
- ❌ **breakout 已证伪**:T+5 12%、T+20 -11.7%(n=1,但方向极差)→ 暂停采信
- ❌ low_launch 15%(-3.2%, n=59)、dragon_preselect 26%(-0.4%, n=85)——合计占167条85%,把整体拉到23%(-1.2%),**两个大来源实质不及格**
- 板块回避:生物制药7%(-5.6%)、火力发电8%(-4.8%)、汽车配件0%;半导体42%最好但也只+0.8%
**行动指向**:当前可执行的只有 pre_launch 一路,且等10/8开市后T+5/T+20自然回填再下结论;breakout/low_launch 两来源在改进前不进决策链。
**待办(前端只读,未动)**:① 假日扫描禁写signal_log或date强制取最近交易日(26条重复的根因)② westock限频老账。