From cabcf0439726877305d74e19a4c9fadc9b61765b Mon Sep 17 00:00:00 2001 From: zlt Date: Thu, 10 Sep 2026 13:47:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=20batch25=20=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E9=92=89=E4=BD=8F=E6=8E=92=E7=89=88=E8=80=8C=E9=9D=9E=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E7=9A=84=E6=96=AD=E8=A8=80=EF=BC=9B=E7=A1=AC=E9=A3=8E?= =?UTF-8?q?=E9=99=A9=E6=8E=92=E5=9C=A8=E9=87=8D=E9=97=AE=E4=B9=8B=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit batch25 那条断言写的是 `'or bool(reask_why))' in src`,它把「reask_why 必须是 force_queue 那一行的最后一项」也一起钉住了 —— 而那只是当时的排版,不是这条规矩的 内容。往一票否决里加「上游标了硬风险的候选也交人」之后,那一行结尾变成 `bool(risk_why))`,断言就红了,而被它保护的行为一个字都没变。改成取出那一行、 只看 reask_why 在不在里面。 同时把交人原因的次序改回来:重问放行仍排最前(2026-09-09 拍板),硬风险紧随其后。 原先我把硬风险排到了最前,那等于顺手推翻上一次拍板 —— 而两者实际上几乎不会同时 出现(上游标了硬风险的票判决多半不是「候选」,走不到重问那一步),这个次序之争 是空的,不值得为它改口径。 Co-Authored-By: Claude Opus 5 --- app/services/proposal_service.py | 10 ++++++---- scripts/test_batch25_units.py | 11 +++++++++-- scripts/test_batch26_units.py | 7 +++++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/app/services/proposal_service.py b/app/services/proposal_service.py index 18d95d4..df69998 100644 --- a/app/services/proposal_service.py +++ b/app/services/proposal_service.py @@ -686,12 +686,14 @@ def _route_one(c, view, params, stock_params, brake_active, now, dry_run, out, else "档位 full")))}) else: pid = _make_proposal(c, price, verdict) - # 交人的原因按从具体到笼统取: 上游标的硬风险 → 重问放行 → 候选自带的 (关注判决等, + # 交人的原因按从具体到笼统取: 重问放行 → 上游标的硬风险 → 候选自带的 (关注判决等, # 见 action_engine.verdict_confirm_why) → 来源强制的 (研究证据走弱那类减持) → # 深档补仓那条老规矩 → 研判不可用 → 档位。 - # 硬风险排在最前 (2026-09-10): 它是「有人看见了不对劲」, 比「曾被驳回」更该先说; - # 重问放行紧随其后, 它是这张提议第二需要人知道的事 (曾被驳回、什么变了、可能买不上)。 - why = (risk_why or reask_why or c.get("confirm_why") or src_why + # 重问放行仍排在最前 (2026-09-09 拍板): 它是这张提议最需要人知道的那件事 + # (曾被驳回、什么变了、可能买不上)。硬风险 (2026-09-10 加) 紧随其后 —— 两者 + # 实际上几乎不会同时出现: 上游标了硬风险的票判决多半不是「候选」, 走不到重问那一步, + # 所以这个次序之争是空的, 不必为它推翻上一次拍板。 + why = (reask_why or risk_why or c.get("confirm_why") or src_why or ("深档补仓强制确认" if c.get("needs_user_confirm") else None) or ("研判不可用, 降级人工确认" if verdict.get("degraded") else None) or ("新建仓档位 propose_only" if is_open else "档位 propose_only")) diff --git a/scripts/test_batch25_units.py b/scripts/test_batch25_units.py index 468d867..1e8a369 100644 --- a/scripts/test_batch25_units.py +++ b/scripts/test_batch25_units.py @@ -260,8 +260,15 @@ def test_u1_sender(): def test_route(): src = io.open(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "app/services/proposal_service.py"), encoding="utf-8").read() - assert 'or bool(reask_why))' in src, "重问必须进 force_queue 一票否决" - assert 'reask_why or c.get("confirm_why")' in src, "重问的原因要排在最前, 人最需要知道它" + # 2026-09-10 改了断言的写法, 意图不变。原先写的是 `'or bool(reask_why))' in src`, + # 它把「reask_why 必须是那一行的最后一项」也一起钉住了 —— 而那只是当时的排版, + # 不是这条规矩的内容。同日往一票否决里加「上游标了硬风险的候选也交人」之后, + # 那一行结尾从 `bool(reask_why))` 变成 `bool(risk_why))`, 这条断言就红了, + # 而被它保护的行为一个字都没变。现在改成取出那一行、只看 reask_why 在不在里面。 + _fq = src[src.index("force_queue = ("):src.index("auto_exec = (not force_queue)")] + assert "bool(reask_why)" in _fq, "重问必须进 force_queue 一票否决" + # 2026-09-10 往这条链里插了「上游标了硬风险」一档, 排在重问之后 —— 重问仍是最前一项。 + assert src.index("why = (reask_why") > 0, "重问的原因要排在最前, 人最需要知道它" assert '"重问后仍驳回:" + _rsn' in src and '_hn["reask_seq"] = 1' in src assert 'reask_service.commit(code, _rk, price)' in src i = src.index("_rk = c.get(\"reask\") if not dry_run else None") diff --git a/scripts/test_batch26_units.py b/scripts/test_batch26_units.py index 992b4bd..dc0cc1c 100644 --- a/scripts/test_batch26_units.py +++ b/scripts/test_batch26_units.py @@ -187,8 +187,11 @@ def _(): assert line, "找不到 force_queue 那一行,这道检查的前提没了" seg = src[src.index("force_queue = ("):src.index("auto_exec = (not force_queue)")] assert "risk_why" in seg, "硬风险没有算进一票否决:full 档下带风险的票会被自动买入" - # 而且交人的原因要能说出是风险,不能笼统说「档位 propose_only」 - assert "why = (risk_why or" in src, "交人原因没有把硬风险排在最前" + # 交人原因要能说出是风险,不能笼统说「档位 propose_only」。 + # 次序上重问放行仍排在最前(2026-09-09 拍板),硬风险紧随其后 —— 两者实际上 + # 几乎不会同时出现:上游标了硬风险的票判决多半不是「候选」,走不到重问那一步。 + assert "risk_why or c.get(" in src or "or risk_why or" in src, \ + "交人原因里没有硬风险这一档" @case("E2 硬风险的判据取的是候选硬数字里的 risk,与那条更窄的旁路同一个键")