fix(HEL-529): 布局鲁棒、问师血缘修正与动效语义增强
布局:表格长错误/备注统一单行大白话摘要+截断(.ellip),完整原文放 title 悬停;当前来源列 nowrap 防逐字竖排;压力态(长错误/多接口/多观测行) 1920×920、1920×1080、1024 均无横向溢出、血缘 1080P 一屏。 血缘:按真实调用代码修正——ifind_wencai 的真实消费者是股票池事件补充 (pools/service.py:82),不是问师;新增 ifind_history 条目对应问师·趋势/ 宏观思维模型的可选指数/ETF 矩阵 (mentor/service.py:433 ifind.history, 未配置时 fail-open);新增 3 项自动测试锁定映射并以源码调用点为证。 动效:延迟/成功率仅在真实采样值变化时翻动高亮(data-rate flash); spark-end/血缘心跳按行/节点错峰相位;页面隐藏时动态循环不做任何工作; LINK 呼吸(gnode-pulse)与真实调用脉冲(node-ping)语义区分保持。 测试:全套 194 项通过。 Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -209,5 +209,52 @@ class SourceCatalogJoinTests(_Base):
|
||||
self.assertTrue(item.get("update_freq"), f"missing update_freq for {item['dataset']}")
|
||||
|
||||
|
||||
class LineageMentorIfindTests(_Base):
|
||||
"""问师 → iFinD 血缘修正(第二轮返工):不按名称猜关系,按真实调用代码。"""
|
||||
|
||||
REPO = Path(__file__).resolve().parents[2]
|
||||
|
||||
def test_no_mentor_dependency_on_ifind_wencai(self) -> None:
|
||||
items = self.hub.admin.lineage("20240902")["items"]
|
||||
wencai = [i for i in items if i["dataset"] == "ifind_wencai"]
|
||||
self.assertEqual(len(wencai), 1)
|
||||
consumers = wencai[0]["known_consumers"]
|
||||
for consumer in consumers:
|
||||
self.assertNotIn("问师", consumer, f"wencai consumer must not be 问师: {consumer}")
|
||||
all_consumers = " ".join(c for i in items for c in i["known_consumers"])
|
||||
self.assertNotIn("问师(自然语言选股", all_consumers)
|
||||
|
||||
def test_wencai_real_consumer_is_pools_enrichment_with_code_evidence(self) -> None:
|
||||
items = self.hub.admin.lineage("20240902")["items"]
|
||||
wencai = [i for i in items if i["dataset"] == "ifind_wencai"][0]
|
||||
self.assertTrue(any("股票池" in c for c in wencai["known_consumers"]))
|
||||
# Real call evidence in the main-site source tree:
|
||||
pools_src = (self.REPO / "backend" / "features" / "pools" / "service.py").read_text(encoding="utf-8")
|
||||
self.assertIn("ifind.wencai(", pools_src)
|
||||
self.assertIn("ifind_event_enrichment_v1", pools_src)
|
||||
# And 问师 itself never calls wencai:
|
||||
mentor_src = (self.REPO / "backend" / "features" / "mentor" / "service.py").read_text(encoding="utf-8")
|
||||
self.assertNotIn(".wencai(", mentor_src)
|
||||
|
||||
def test_mentor_optional_ifind_history_subcapabilities(self) -> None:
|
||||
items = self.hub.admin.lineage("20240902")["items"]
|
||||
history = [i for i in items if i["dataset"] == "ifind_history"]
|
||||
self.assertEqual(len(history), 1)
|
||||
consumers = history[0]["known_consumers"]
|
||||
self.assertTrue(any("趋势思维模型" in c for c in consumers))
|
||||
self.assertTrue(any("宏观思维模型" in c for c in consumers))
|
||||
# every consumer must be a 问师 sub-capability, not the whole board
|
||||
for consumer in consumers:
|
||||
self.assertIn("·", consumer, f"not a sub-capability mapping: {consumer}")
|
||||
# Real call evidence: mentor builds market matrices via ifind.history
|
||||
mentor_src = (self.REPO / "backend" / "features" / "mentor" / "service.py").read_text(encoding="utf-8")
|
||||
self.assertIn("ifind.history(", mentor_src)
|
||||
self.assertIn("_mentor_market_matrix", mentor_src)
|
||||
self.assertIn("MENTOR_INDEX_UNIVERSE", mentor_src)
|
||||
self.assertIn("MENTOR_ETF_UNIVERSE", mentor_src)
|
||||
# Optional dependency: fails open when ifind is not configured
|
||||
self.assertIn("if not ifind or not ifind.configured", mentor_src)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user