
Jesse_ChenandClaude Opus 5
5582091851
Independent Staging Quality Gate / validate (push) Canceled after 2m18s
Independent Staging Quality Gate / publish (push) Canceled after 0s
refactor(api): 抽出 offline compute mixins,关掉 2/4 处 handler 伪造
spike 闸门(任务书 §5.2)结果为红,按 §6.3 退回 A 方案。
spike:115 个闭包方法整体移入 ConsultationComputeMixin 后,
tests/test_api_server_security.py 一字不改跑出 1 failed / 128 passed。
test_chart_async_job_executes_in_background 挂在
monkeypatch.setattr(jyotish_api_server, '_write_async_job_record', ...):
调用方法随 mixin 搬走后从新模块 globals 解析,补丁落在旧模块绑定上不生效。
已实证把同一 fake 打到 mixin 模块即恢复原行为,故为落点问题而非搬坏。
循环 import 不是障碍(移动集不引用 JyotishAPIHandler)。
退回 A 的实际交付:新建 scripts/offline_compute_mixins.py,
收 BadRequest、3 个模块级助手,以及 RequestParamMixin /
VedastroEvidenceMixin / SynastryMixin 共 7 个方法(300 行),
JyotishAPIHandler 通过继承保留全部方法,HTTP 侧零变化。
consultation_workflow_service.build_runtime_evidence_helpers 与
local_accuracy_report 改为直接实例化 mixin,不再伪造 handler。
11 个搬走的定义经 SHA-256 逐个比对与搬走前字节级相同;
jyotish_api_server.py 的 diff 为 11 行插入 / 378 行删除,无重排。
scripts 侧 __new__ 4 → 2(剩 2 处都在咨询工作流链上);
类方法 225 → 218;行数 11,291 → 10,924。
合同测试收紧基线并新增 scripts 侧专门断言与反向 import 断言;
两次反向验证(加回 __new__ / 加类方法)均正确变红。
新增 tests/test_offline_compute_mixins.py 覆盖此前零覆盖的 MCP 路径,
并加入 CORE_PYTEST_TARGETS。
tests/test_api_server_security.py 一字未改,129 passed。
快速门 pytest 段 798 passed / 1 skipped / 0 failed。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
2026-09-16 03:46:01 +00:00
..
2026-06-27 18:55:49 +08:00
2026-09-16 07:11:07 +08:00
2026-09-15 09:04:03 +08:00
2026-06-12 18:50:39 +08:00
2026-07-02 19:56:28 +08:00
2026-09-16 07:11:07 +08:00
2026-07-28 13:04:30 +08:00
2026-09-07 09:10:37 +08:00
2026-09-04 00:26:57 +08:00
2026-07-19 22:23:29 +08:00
2026-09-03 23:49:42 +08:00
2026-06-07 14:44:53 +08:00
2026-06-05 14:30:20 +08:00
2026-07-12 19:22:13 +08:00
2026-06-07 13:09:08 +08:00
2026-09-05 11:10:44 +08:00
2026-09-05 11:10:44 +08:00
2026-07-20 16:56:46 +08:00
2026-09-15 16:10:21 +08:00
2026-07-17 22:19:09 +08:00
2026-06-10 20:50:52 +08:00
2026-06-24 13:37:33 +08:00
2026-06-13 13:08:12 +08:00
2026-09-03 20:28:57 +08:00
2026-09-03 20:28:57 +08:00
2026-06-27 18:55:49 +08:00
2026-07-17 11:39:24 +08:00
2026-07-21 22:16:18 +08:00
2026-05-04 22:43:56 +08:00
2026-09-03 23:22:50 +08:00
2026-06-27 19:09:31 +08:00
2026-06-11 19:03:21 +08:00
2026-06-13 15:06:11 +08:00
2026-06-13 15:06:11 +08:00
2026-09-02 01:21:40 +08:00
2026-07-20 00:42:11 +08:00
2026-06-05 17:16:23 +08:00
2026-07-08 17:03:04 +08:00
2026-09-15 10:09:26 +08:00
2026-09-04 00:26:57 +08:00
2026-09-03 16:55:26 +08:00
2026-07-21 22:35:13 +08:00
2026-09-02 18:03:23 +08:00
2026-06-11 19:03:21 +08:00
2026-07-16 23:22:18 +08:00
2026-06-11 21:58:08 +08:00
2026-09-03 16:55:26 +08:00
2026-09-09 15:11:00 +08:00
2026-09-09 16:04:52 +08:00
2026-07-21 19:21:02 +08:00
2026-07-20 00:03:56 +08:00
2026-09-03 23:22:50 +08:00
2026-06-04 12:19:11 +08:00
2026-07-01 19:15:35 +08:00
2026-09-03 23:22:50 +08:00
2026-09-03 23:22:50 +08:00
2026-07-19 15:47:40 +08:00
2026-07-21 16:56:20 +08:00
2026-09-09 16:04:52 +08:00
2026-07-20 11:09:13 +08:00
2026-06-11 19:03:21 +08:00
2026-07-17 00:23:31 +08:00
2026-08-15 06:04:23 +08:00
2026-09-03 23:57:27 +08:00
2026-08-18 23:30:36 +08:00
2026-09-16 03:46:01 +00:00
2026-07-22 17:39:11 +08:00
2026-07-16 12:38:09 +08:00
2026-07-16 13:40:28 +08:00
2026-07-10 22:31:28 +08:00
2026-06-07 12:11:15 +08:00
2026-07-19 23:24:06 +08:00
2026-07-19 23:24:06 +08:00
2026-07-23 12:03:58 +08:00
2026-08-20 21:42:47 +08:00
2026-07-06 13:06:12 +08:00
2026-06-07 12:11:15 +08:00
2026-04-20 20:58:21 +08:00
2026-09-09 16:04:52 +08:00
2026-05-04 20:33:13 +08:00
2026-06-27 01:03:02 +08:00
2026-06-27 00:43:10 +08:00
2026-06-25 18:33:26 +08:00
2026-07-19 15:14:13 +08:00
2026-07-19 18:36:25 +08:00
2026-07-19 16:36:41 +08:00
2026-07-19 23:30:46 +08:00
2026-07-19 08:02:44 +08:00
2026-07-19 08:02:44 +08:00
2026-07-19 08:59:33 +08:00
2026-06-24 13:37:33 +08:00
2026-07-17 22:35:19 +08:00
2026-07-05 18:27:33 +08:00
2026-07-25 01:17:14 +08:00
2026-09-03 17:35:26 +08:00
2026-06-25 18:33:26 +08:00
2026-06-11 22:07:47 +08:00
2026-09-03 20:28:57 +08:00
2026-09-09 16:04:52 +08:00
2026-09-09 16:04:52 +08:00
2026-07-19 04:38:20 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-09-03 23:22:50 +08:00
2026-07-20 11:02:41 +08:00
2026-07-20 11:02:41 +08:00
2026-09-15 16:10:21 +08:00
2026-05-03 20:50:05 +08:00
2026-07-20 00:03:56 +08:00
2026-06-24 13:37:33 +08:00
2026-07-23 12:03:58 +08:00
2026-07-16 20:36:44 +08:00
2026-07-08 17:03:04 +08:00
2026-07-20 00:18:18 +08:00
2026-07-17 14:32:56 +08:00
2026-07-08 18:34:13 +08:00
2026-07-20 00:57:46 +08:00
2026-09-04 02:11:57 +08:00
2026-09-07 09:10:37 +08:00
2026-09-06 23:00:01 +08:00
2026-09-04 02:11:57 +08:00
2026-07-08 16:23:45 +08:00
2026-09-15 10:09:26 +08:00
2026-09-03 23:22:50 +08:00
2026-06-28 18:18:33 +08:00
2026-07-02 01:22:53 +08:00
2026-09-15 17:54:20 +08:00
2026-07-17 15:23:16 +08:00
2026-06-05 14:30:20 +08:00
2026-07-01 19:15:35 +08:00
2026-09-03 23:22:50 +08:00
2026-09-03 16:55:26 +08:00
2026-06-03 15:18:12 +08:00
2026-06-03 15:18:12 +08:00
2026-07-22 23:40:59 +08:00
2026-07-20 00:18:18 +08:00
2026-07-05 18:27:33 +08:00
2026-08-15 12:13:09 +08:00
2026-07-20 11:02:41 +08:00
2026-07-05 18:27:33 +08:00
2026-09-03 20:28:57 +08:00
2026-09-16 03:46:01 +00:00
2026-09-15 10:09:26 +08:00
2026-07-21 16:52:58 +08:00
2026-07-21 16:52:58 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-07-18 01:00:53 +08:00
2026-07-23 12:03:58 +08:00
2026-06-11 19:03:21 +08:00
2026-06-07 20:16:47 +08:00
2026-05-04 22:43:56 +08:00
2026-07-23 12:03:58 +08:00
2026-07-23 12:03:58 +08:00
2026-07-19 18:36:25 +08:00
2026-07-23 12:03:58 +08:00
2026-09-05 11:10:44 +08:00
2026-09-05 11:10:44 +08:00
2026-09-05 11:10:44 +08:00
2026-09-05 11:10:44 +08:00
2026-09-05 11:10:44 +08:00
2026-07-19 18:36:25 +08:00
2026-07-23 12:03:58 +08:00
2026-07-23 12:03:58 +08:00
2026-09-03 20:28:57 +08:00
2026-06-29 03:54:45 +08:00
2026-09-16 03:46:01 +00:00
2026-06-29 10:45:11 +08:00
2026-07-20 00:03:56 +08:00
2026-07-19 18:45:46 +08:00
2026-06-28 17:19:30 +08:00
2026-06-13 15:06:11 +08:00
2026-06-13 10:56:41 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-07-21 22:16:18 +08:00
2026-08-29 01:33:20 +08:00
2026-08-29 01:33:20 +08:00
2026-07-21 22:16:18 +08:00
2026-07-22 09:58:32 +08:00
2026-06-11 21:58:08 +08:00
2026-09-03 23:22:50 +08:00
2026-07-23 12:03:58 +08:00
2026-07-19 23:20:39 +08:00
2026-07-20 13:55:54 +08:00
2026-07-23 12:03:58 +08:00
2026-09-03 23:22:50 +08:00
2026-06-11 19:03:21 +08:00
2026-07-12 00:27:25 +08:00
2026-06-13 16:18:37 +08:00
2026-06-04 12:19:11 +08:00
2026-09-03 20:28:57 +08:00
2026-09-09 16:04:52 +08:00
2026-07-08 16:23:45 +08:00
2026-09-03 16:55:26 +08:00
2026-07-17 00:27:57 +08:00
2026-09-16 03:46:01 +00:00
2026-07-08 17:03:04 +08:00
2026-06-28 15:45:31 +08:00
2026-09-03 23:22:50 +08:00
2026-07-02 01:22:53 +08:00
2026-06-28 17:57:16 +08:00
2026-06-27 01:48:47 +08:00
2026-06-28 18:18:33 +08:00
2026-07-01 21:35:15 +08:00
2026-06-13 15:06:11 +08:00
2026-06-13 15:06:11 +08:00
2026-06-11 19:03:21 +08:00
2026-06-13 15:06:11 +08:00
2026-09-09 16:04:52 +08:00
2026-07-21 21:25:57 +08:00
2026-09-04 21:33:27 +08:00
2026-09-03 23:22:50 +08:00
2026-07-20 18:40:02 +08:00
2026-07-20 18:40:02 +08:00
2026-07-20 13:55:54 +08:00
2026-07-21 19:21:02 +08:00
2026-07-20 18:40:02 +08:00
2026-07-20 18:40:02 +08:00
2026-07-21 19:21:02 +08:00
2026-09-03 23:22:50 +08:00
2026-07-20 18:40:02 +08:00
2026-07-20 18:40:02 +08:00
2026-07-20 18:40:02 +08:00
2026-07-16 21:54:34 +08:00
2026-07-12 19:22:13 +08:00
2026-08-10 17:57:06 +08:00
2026-07-08 17:03:04 +08:00
2026-06-28 17:51:34 +08:00
2026-07-21 16:52:58 +08:00
2026-07-05 18:27:33 +08:00
2026-07-19 18:45:46 +08:00
2026-07-20 02:44:05 +08:00
2026-09-05 11:10:44 +08:00
2026-07-19 18:45:46 +08:00
2026-07-01 21:35:15 +08:00
2026-07-08 16:23:45 +08:00
2026-07-16 21:01:24 +08:00
2026-07-17 19:51:31 +08:00
2026-07-13 22:53:04 +08:00
2026-07-20 12:45:18 +08:00
2026-09-09 16:04:52 +08:00
2026-09-03 23:22:50 +08:00
2026-07-16 20:36:44 +08:00
2026-07-22 23:40:59 +08:00
2026-07-23 12:39:10 +08:00
2026-09-15 17:54:20 +08:00
2026-09-15 17:54:20 +08:00
2026-08-20 21:42:47 +08:00
2026-07-17 01:03:50 +08:00
2026-07-17 01:03:50 +08:00
2026-06-07 12:11:15 +08:00
2026-06-07 12:11:15 +08:00
2026-07-12 00:27:25 +08:00
2026-07-20 13:55:54 +08:00
2026-07-22 09:58:32 +08:00
2026-07-25 11:50:41 +08:00
2026-09-06 23:05:42 +08:00
2026-08-20 11:04:55 +08:00
2026-07-25 01:17:14 +08:00
2026-07-23 12:03:58 +08:00
2026-07-18 03:46:20 +08:00
2026-09-09 16:04:52 +08:00
2026-09-09 16:04:52 +08:00
2026-06-29 03:25:03 +08:00
2026-09-03 16:55:26 +08:00
2026-07-21 16:56:20 +08:00
2026-09-09 15:11:00 +08:00
2026-09-09 16:58:46 +08:00
2026-09-03 20:28:57 +08:00
2026-07-17 00:23:31 +08:00
2026-09-16 03:46:01 +00:00
2026-06-11 19:03:21 +08:00
2026-07-16 21:54:34 +08:00
2026-09-09 16:04:52 +08:00
2026-06-24 13:37:33 +08:00
2026-07-19 08:59:33 +08:00
2026-07-22 23:40:59 +08:00
2026-07-23 12:03:58 +08:00
2026-07-23 12:03:58 +08:00
2026-07-23 12:03:58 +08:00
2026-07-19 23:12:27 +08:00
2026-07-19 22:36:48 +08:00
2026-07-21 19:21:02 +08:00
2026-07-22 19:55:13 +08:00
2026-07-23 12:03:58 +08:00
2026-06-29 10:38:17 +08:00
2026-06-29 10:38:17 +08:00
2026-09-03 23:22:50 +08:00
2026-06-29 10:38:17 +08:00
2026-07-15 19:13:05 +08:00
2026-06-28 17:01:56 +08:00
2026-06-29 10:38:17 +08:00
2026-07-22 19:55:13 +08:00
2026-07-19 22:46:04 +08:00
2026-06-29 10:38:17 +08:00
2026-06-29 10:38:17 +08:00
2026-06-29 10:38:17 +08:00
2026-08-20 21:42:47 +08:00
2026-09-05 11:10:44 +08:00
2026-09-09 16:04:52 +08:00
2026-09-09 16:04:52 +08:00
2026-09-09 16:04:52 +08:00
2026-07-17 00:16:41 +08:00
2026-07-17 15:23:16 +08:00
2026-09-03 16:55:26 +08:00
2026-09-03 16:55:26 +08:00
2026-07-19 18:45:46 +08:00
2026-07-19 15:06:22 +08:00
2026-09-03 20:28:57 +08:00
2026-09-09 16:04:52 +08:00
2026-06-03 13:55:51 +08:00
2026-06-07 12:11:15 +08:00
2026-07-08 17:03:04 +08:00
2026-07-16 22:41:10 +08:00
2026-06-13 15:06:11 +08:00
2026-06-13 16:18:37 +08:00
2026-07-16 11:09:46 +08:00
2026-07-08 17:03:04 +08:00
2026-07-08 17:03:04 +08:00
2026-07-01 21:35:15 +08:00
2026-07-01 21:35:15 +08:00
2026-07-02 01:22:53 +08:00
2026-09-03 20:28:57 +08:00
2026-09-05 11:10:44 +08:00
2026-09-05 11:10:44 +08:00
2026-07-23 12:03:58 +08:00
2026-09-03 20:28:57 +08:00
2026-07-21 16:52:58 +08:00
2026-07-20 11:02:41 +08:00
2026-07-12 19:22:13 +08:00
2026-07-22 09:58:32 +08:00
2026-07-21 16:52:58 +08:00
2026-07-21 16:52:58 +08:00
2026-07-20 00:03:56 +08:00
2026-07-20 00:57:46 +08:00
2026-07-17 22:35:19 +08:00
2026-07-16 23:29:48 +08:00
2026-07-20 02:48:15 +08:00
2026-07-11 23:24:54 +08:00
2026-07-18 00:46:41 +08:00
2026-09-06 21:46:16 +08:00
2026-07-19 08:02:44 +08:00
2026-07-23 20:21:27 +08:00
2026-06-24 13:37:33 +08:00
2026-06-13 15:06:11 +08:00
2026-07-08 16:23:45 +08:00
2026-06-25 18:33:26 +08:00
2026-09-09 16:04:52 +08:00
2026-06-13 15:06:11 +08:00
2026-07-22 23:40:59 +08:00
2026-09-04 03:29:34 +08:00
2026-09-03 16:55:26 +08:00
2026-07-01 19:15:35 +08:00
2026-06-26 17:36:39 +08:00
2026-06-27 19:09:31 +08:00
2026-06-27 19:09:31 +08:00
2026-04-24 22:36:57 +08:00
2026-06-05 14:30:20 +08:00
2026-09-03 20:28:57 +08:00
2026-06-24 13:37:33 +08:00
2026-07-17 17:52:30 +08:00
2026-07-17 17:51:48 +08:00
2026-07-21 20:30:49 +08:00
2026-07-02 20:12:43 +08:00
2026-09-03 17:35:26 +08:00
2026-09-16 07:36:09 +08:00
2026-09-16 02:01:33 +00:00
2026-07-18 00:46:41 +08:00
2026-07-19 15:14:13 +08:00
2026-06-29 10:45:11 +08:00
2026-07-23 12:52:26 +08:00
2026-07-01 19:15:35 +08:00
2026-07-15 22:23:17 +08:00
2026-07-08 18:34:13 +08:00
2026-09-03 17:35:26 +08:00
2026-07-17 19:51:31 +08:00
2026-09-03 17:35:26 +08:00
2026-06-29 15:40:34 +08:00
2026-07-15 22:23:17 +08:00
2026-07-19 08:59:33 +08:00
2026-09-03 17:35:26 +08:00
2026-07-19 22:23:29 +08:00
2026-09-16 00:25:15 +08:00
2026-09-16 07:36:09 +08:00
2026-07-17 00:40:00 +08:00
2026-07-18 04:15:19 +08:00
2026-07-19 21:37:03 +08:00
2026-07-19 22:32:56 +08:00
2026-07-19 22:07:31 +08:00
2026-07-20 00:03:56 +08:00
2026-07-06 13:06:12 +08:00
2026-06-28 17:32:03 +08:00
2026-07-18 01:30:50 +08:00
2026-09-15 16:10:21 +08:00
2026-07-10 22:31:28 +08:00
2026-07-10 22:31:28 +08:00
2026-07-17 22:35:19 +08:00
2026-09-03 20:28:57 +08:00
2026-07-20 00:42:11 +08:00
2026-07-20 02:48:15 +08:00
2026-07-18 00:46:41 +08:00
2026-07-17 22:19:09 +08:00
2026-07-17 22:19:09 +08:00
2026-07-17 22:19:09 +08:00
2026-07-17 22:19:09 +08:00
2026-07-17 22:19:09 +08:00
2026-07-19 15:14:13 +08:00
2026-09-16 02:01:33 +00:00
2026-06-27 18:55:49 +08:00
2026-06-13 15:06:11 +08:00
2026-06-07 20:16:47 +08:00