codebee 0.1.76 → 0.1.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +633 -624
- package/LICENSE +21 -21
- package/README.md +508 -509
- package/app/.playwright-cli/console-2026-09-23T08-26-03-635Z.log +88 -0
- package/app/.playwright-cli/page-2026-09-23T08-26-03-845Z.yml +126 -0
- package/app/.playwright-cli/page-2026-09-23T08-29-44-203Z.png +0 -0
- package/app/.playwright-cli/page-2026-09-23T08-35-42-046Z.yml +210 -0
- package/app/.playwright-cli/page-2026-09-23T08-36-52-858Z.png +0 -0
- package/app/.playwright-cli/page-2026-09-23T08-37-33-938Z.png +0 -0
- package/app/.playwright-cli/run-detail-after.png +0 -0
- package/app/core/acceptance.py +100 -100
- package/app/core/aiflavor.py +197 -197
- package/app/core/analytics.py +38 -38
- package/app/core/artifacts.py +148 -148
- package/app/core/assets.py +110 -110
- package/app/core/attachments.py +623 -623
- package/app/core/audit.py +30 -30
- package/app/core/backup.py +470 -470
- package/app/core/beekeeper.py +183 -183
- package/app/core/benchstore.py +95 -95
- package/app/core/board.py +209 -209
- package/app/core/bookmeta.py +1036 -1036
- package/app/core/bookmeta_catalog.py +180 -180
- package/app/core/branching.py +137 -137
- package/app/core/builtin_agent.py +1680 -1680
- package/app/core/capability.py +144 -144
- package/app/core/chaptersafe.py +32 -32
- package/app/core/cleanup.py +303 -303
- package/app/core/compaction.py +201 -201
- package/app/core/contracts.py +255 -255
- package/app/core/covergen.py +356 -356
- package/app/core/defectretro.py +43 -43
- package/app/core/diagnostics.py +114 -114
- package/app/core/dispatch.py +190 -190
- package/app/core/dispatch_log.py +128 -128
- package/app/core/env_scrub.py +85 -85
- package/app/core/errorlog.py +137 -137
- package/app/core/evaluation.py +174 -174
- package/app/core/failure_notify.py +290 -290
- package/app/core/goal_service.py +167 -167
- package/app/core/health.py +389 -389
- package/app/core/history.py +38 -38
- package/app/core/hooks.py +162 -162
- package/app/core/manager.py +2232 -2232
- package/app/core/mocks.py +64 -64
- package/app/core/notify.py +201 -201
- package/app/core/novel_quality.py +189 -189
- package/app/core/openapi.py +154 -154
- package/app/core/operations.py +228 -228
- package/app/core/paihang.py +145 -145
- package/app/core/pipeline.py +29 -0
- package/app/core/planner.py +88 -0
- package/app/core/portguard.py +111 -111
- package/app/core/presence.py +77 -77
- package/app/core/preview.py +293 -293
- package/app/core/prompt_guard.py +78 -78
- package/app/core/publish/__init__.py +7 -7
- package/app/core/publish/browser.py +655 -655
- package/app/core/publish/fanqie.py +165 -165
- package/app/core/publish/flow.py +640 -640
- package/app/core/publish/flows-fanqie-calibrated.json +336 -336
- package/app/core/publish/manager.py +1118 -1118
- package/app/core/publish/qimao.py +176 -176
- package/app/core/publish/ws.py +139 -139
- package/app/core/quality_gate.py +194 -194
- package/app/core/redact.py +38 -38
- package/app/core/repeat_guard.py +129 -129
- package/app/core/retrieval.py +137 -137
- package/app/core/router.py +398 -398
- package/app/core/runner.py +2238 -2238
- package/app/core/selfupdate.py +384 -384
- package/app/core/session_log.py +161 -161
- package/app/core/sessions.py +312 -312
- package/app/core/settings_schema.py +270 -270
- package/app/core/share_page.py +114 -114
- package/app/core/skill_scan.py +139 -139
- package/app/core/skillpacks/market/character-bible.md +66 -66
- package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
- package/app/core/skillpacks/market/git-workflow.md +57 -57
- package/app/core/skillpacks/market/release-notes.md +72 -72
- package/app/core/skillpacks/market/weekly-report.md +71 -71
- package/app/core/skillpacks/market/worldview-consistency.md +70 -70
- package/app/core/skills.py +1 -1
- package/app/core/step_runner.py +132 -132
- package/app/core/story_tracking.py +275 -275
- package/app/core/task_compile.py +199 -199
- package/app/core/telemetry.py +292 -292
- package/app/core/tlsctx.py +64 -64
- package/app/core/token_meter.py +147 -147
- package/app/core/tracing.py +144 -144
- package/app/core/upstream.py +41 -41
- package/app/core/usage.py +1035 -1035
- package/app/core/volumes.py +389 -389
- package/app/core/wxdigest.py +858 -858
- package/app/core/zentao.py +2692 -2692
- package/app/mcp_server.py +244 -244
- package/app/output/_createbook_body.json +1 -0
- package/app/output/_probe_fq_click.py +50 -0
- package/app/output/_probe_fq_form.py +42 -0
- package/app/output/_probe_fq_modal.py +55 -0
- package/app/output/_probe_fq_points.py +71 -0
- package/app/output/_probe_fq_submit.py +34 -0
- package/app/output/_probe_fq_watch.py +62 -0
- package/app/pick_dialog.py +110 -110
- package/app/ui/artdiff.js +74 -74
- package/app/ui/board.html +162 -162
- package/app/ui/board.js +305 -305
- package/app/ui/i18n.js +2 -2
- package/app/ui/icons/bee.svg +79 -79
- package/app/ui/manifest.json +16 -16
- package/app/ui/qrcode.js +2297 -2297
- package/app/ui/style.css +7086 -7086
- package/bin/tutti.js +147 -147
- package/package.json +48 -48
- package/tools/wx_reader.py +261 -261
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
[ 154ms] [VERBOSE] [DOM] Password field is not contained in a form: (More info: https://goo.gl/9p2vKq) %o @ http://127.0.0.1:8766/board.html:0
|
|
2
|
+
[ 4086ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
3
|
+
[ 8084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
4
|
+
[ 12084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
5
|
+
[ 16071ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
6
|
+
[ 20083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
7
|
+
[ 24080ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
8
|
+
[ 28074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
9
|
+
[ 32078ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
10
|
+
[ 36084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
11
|
+
[ 40087ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
12
|
+
[ 44075ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
13
|
+
[ 48074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
14
|
+
[ 52070ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
15
|
+
[ 56083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
16
|
+
[ 60070ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
17
|
+
[ 64074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
18
|
+
[ 68084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
19
|
+
[ 72076ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
20
|
+
[ 76083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
21
|
+
[ 80075ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
22
|
+
[ 84072ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
23
|
+
[ 88077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
24
|
+
[ 92073ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
25
|
+
[ 96084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
26
|
+
[ 100086ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
27
|
+
[ 104085ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
28
|
+
[ 108083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
29
|
+
[ 112083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
30
|
+
[ 116076ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
31
|
+
[ 120074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
32
|
+
[ 124084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
33
|
+
[ 128080ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
34
|
+
[ 132074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
35
|
+
[ 136074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
36
|
+
[ 140070ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
37
|
+
[ 144080ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
38
|
+
[ 148075ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
39
|
+
[ 152077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
40
|
+
[ 156075ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
41
|
+
[ 160072ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
42
|
+
[ 164074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
43
|
+
[ 168083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
44
|
+
[ 172076ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
45
|
+
[ 176073ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
46
|
+
[ 180085ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
47
|
+
[ 184071ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
48
|
+
[ 188079ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
49
|
+
[ 192075ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
50
|
+
[ 196085ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
51
|
+
[ 200073ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
52
|
+
[ 204080ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
53
|
+
[ 208077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
54
|
+
[ 212074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
55
|
+
[ 216084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
56
|
+
[ 220077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
57
|
+
[ 224077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
58
|
+
[ 228079ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
59
|
+
[ 232072ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
60
|
+
[ 236083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
61
|
+
[ 240069ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
62
|
+
[ 244077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
63
|
+
[ 248085ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
64
|
+
[ 252072ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
65
|
+
[ 256073ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
66
|
+
[ 260078ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
67
|
+
[ 264072ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
68
|
+
[ 268074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
69
|
+
[ 272082ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
70
|
+
[ 276076ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
71
|
+
[ 280075ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
72
|
+
[ 284079ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
73
|
+
[ 288083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
74
|
+
[ 292069ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
75
|
+
[ 296083ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
76
|
+
[ 300075ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
77
|
+
[ 304077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
78
|
+
[ 308074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
79
|
+
[ 312079ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
80
|
+
[ 316074ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
81
|
+
[ 320076ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
82
|
+
[ 324084ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
83
|
+
[ 328076ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
84
|
+
[ 332080ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
85
|
+
[ 336077ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
86
|
+
[ 340085ms] [ERROR] Failed to load resource: net::ERR_CONNECTION_REFUSED @ http://127.0.0.1:8766/api/board:0
|
|
87
|
+
[ 438049ms] [VERBOSE] [DOM] Password field is not contained in a form: (More info: https://goo.gl/9p2vKq) %o @ http://127.0.0.1:8766/board.html:0
|
|
88
|
+
[ 578323ms] [VERBOSE] [DOM] Password field is not contained in a form: (More info: https://goo.gl/9p2vKq) %o @ http://127.0.0.1:8766/board.html:0
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
- generic [active] [ref=e1]:
|
|
2
|
+
- banner [ref=e2]:
|
|
3
|
+
- generic [ref=e8]:
|
|
4
|
+
- generic [ref=e9]: CODEBEE / OPERATIONS
|
|
5
|
+
- generic [ref=e10]: 任务驾驶舱
|
|
6
|
+
- generic [ref=e11]:
|
|
7
|
+
- generic [ref=e13]: 实时监控
|
|
8
|
+
- generic [ref=e14]: /
|
|
9
|
+
- generic [ref=e15]: 已同步 · 16:26:03
|
|
10
|
+
- generic [ref=e16]:
|
|
11
|
+
- generic "执行池占用" [ref=e17]: 蜂巢 0/12 · 对话 0/4
|
|
12
|
+
- generic [ref=e18]: "--:--:--"
|
|
13
|
+
- main [ref=e19]:
|
|
14
|
+
- generic [ref=e20]:
|
|
15
|
+
- text: OPERATIONS / STATUS
|
|
16
|
+
- generic [ref=e21]:
|
|
17
|
+
- generic [ref=e22]: 蜂群状态
|
|
18
|
+
- generic [ref=e25]:
|
|
19
|
+
- generic [ref=e26]:
|
|
20
|
+
- heading "蜂群待命" [level=1] [ref=e27]
|
|
21
|
+
- paragraph [ref=e28]: 没有正在运行的任务,新任务在主界面创建后会实时出现在这里
|
|
22
|
+
- generic [ref=e29]:
|
|
23
|
+
- strong [ref=e30]: "0"
|
|
24
|
+
- generic [ref=e31]: 个活动单元
|
|
25
|
+
- generic [ref=e32]:
|
|
26
|
+
- generic [ref=e33]: 系统状态良好
|
|
27
|
+
- generic [ref=e36]: 实时聚合 · 每 4 秒刷新
|
|
28
|
+
- generic [ref=e44]:
|
|
29
|
+
- strong [ref=e45]: "0"
|
|
30
|
+
- generic [ref=e46]: ACTIVE
|
|
31
|
+
- generic [ref=e47]:
|
|
32
|
+
- generic [ref=e48]: 执行池
|
|
33
|
+
- generic [ref=e50]:
|
|
34
|
+
- strong [ref=e51]: "0"
|
|
35
|
+
- generic [ref=e52]: /
|
|
36
|
+
- generic [ref=e53]: "12"
|
|
37
|
+
- emphasis [ref=e54]: 在线槽位
|
|
38
|
+
- generic [ref=e56]:
|
|
39
|
+
- generic [ref=e57]: 队列等待
|
|
40
|
+
- generic [ref=e58]: "0"
|
|
41
|
+
- generic [ref=e59]:
|
|
42
|
+
- generic [ref=e60]: 今日成功率
|
|
43
|
+
- generic [ref=e61]: —
|
|
44
|
+
- region "核心指标" [ref=e62]:
|
|
45
|
+
- generic [ref=e63]:
|
|
46
|
+
- generic [ref=e64]: 运行中
|
|
47
|
+
- generic [ref=e67]: "0"
|
|
48
|
+
- generic [ref=e68]:
|
|
49
|
+
- generic [ref=e69]: 当前活动
|
|
50
|
+
- generic [ref=e70]: LIVE
|
|
51
|
+
- generic [ref=e71]:
|
|
52
|
+
- generic [ref=e72]: 排队中
|
|
53
|
+
- generic [ref=e75]: "0"
|
|
54
|
+
- generic [ref=e76]:
|
|
55
|
+
- generic [ref=e77]: 等待调度
|
|
56
|
+
- generic [ref=e78]: QUEUE
|
|
57
|
+
- generic [ref=e79]:
|
|
58
|
+
- generic [ref=e80]: 今日完成
|
|
59
|
+
- generic [ref=e83]: "0"
|
|
60
|
+
- generic [ref=e84]:
|
|
61
|
+
- generic [ref=e85]: 完成运行
|
|
62
|
+
- generic [ref=e86]: DONE
|
|
63
|
+
- generic [ref=e87]:
|
|
64
|
+
- generic [ref=e88]: 今日失败
|
|
65
|
+
- generic [ref=e91]: "0"
|
|
66
|
+
- generic [ref=e92]:
|
|
67
|
+
- generic [ref=e93]: 需要关注
|
|
68
|
+
- generic [ref=e94]: ALERT
|
|
69
|
+
- generic [ref=e95]:
|
|
70
|
+
- generic [ref=e96]: 今日 tokens
|
|
71
|
+
- generic [ref=e99]: "0"
|
|
72
|
+
- generic [ref=e100]:
|
|
73
|
+
- generic [ref=e101]: 模型消耗
|
|
74
|
+
- generic [ref=e102]: USAGE
|
|
75
|
+
- generic [ref=e103]:
|
|
76
|
+
- generic [ref=e104]: 今日成本
|
|
77
|
+
- generic [ref=e107]: $0.000
|
|
78
|
+
- generic [ref=e108]:
|
|
79
|
+
- generic [ref=e109]: 运行成本
|
|
80
|
+
- generic [ref=e110]: COST
|
|
81
|
+
- generic [ref=e111]:
|
|
82
|
+
- generic [ref=e112]:
|
|
83
|
+
- generic [ref=e113]:
|
|
84
|
+
- generic [ref=e114]:
|
|
85
|
+
- generic [ref=e115]: 实时任务流
|
|
86
|
+
- heading "运行中任务" [level=2] [ref=e118]
|
|
87
|
+
- generic [ref=e119]:
|
|
88
|
+
- generic [ref=e120]: 0 ACTIVE
|
|
89
|
+
- generic [ref=e121]: 监控中
|
|
90
|
+
- generic [ref=e122]:
|
|
91
|
+
- text: NO ACTIVE RUNS
|
|
92
|
+
- generic [ref=e127]: "0"
|
|
93
|
+
- generic [ref=e128]: 队列已清空
|
|
94
|
+
- generic [ref=e129]: 等待新的任务接入蜂巢
|
|
95
|
+
- generic [ref=e130]:
|
|
96
|
+
- generic [ref=e131]: 工作池就绪
|
|
97
|
+
- generic [ref=e134]: 监控在线
|
|
98
|
+
- complementary [ref=e137]:
|
|
99
|
+
- generic [ref=e138]:
|
|
100
|
+
- generic [ref=e139]:
|
|
101
|
+
- generic [ref=e140]:
|
|
102
|
+
- generic [ref=e141]: 资源脉冲
|
|
103
|
+
- heading "近 7 日 tokens" [level=3] [ref=e144]
|
|
104
|
+
- generic [ref=e145]: 7 DAYS
|
|
105
|
+
- generic [ref=e146]:
|
|
106
|
+
- generic "2026-09-17 · 0" [ref=e147]: 09-17
|
|
107
|
+
- generic "2026-09-18 · 0" [ref=e150]: 09-18
|
|
108
|
+
- generic "2026-09-19 · 0" [ref=e153]: 09-19
|
|
109
|
+
- generic "2026-09-20 · 0" [ref=e156]: 09-20
|
|
110
|
+
- generic "2026-09-21 · 0" [ref=e159]: 09-21
|
|
111
|
+
- generic "2026-09-22 · 0" [ref=e162]: 09-22
|
|
112
|
+
- generic "2026-09-23 · 0" [ref=e165]: 09-23
|
|
113
|
+
- generic [ref=e168]:
|
|
114
|
+
- generic [ref=e169]:
|
|
115
|
+
- generic [ref=e170]:
|
|
116
|
+
- generic [ref=e171]: 模型分布
|
|
117
|
+
- heading "近 7 日模型 TOP5" [level=3] [ref=e174]
|
|
118
|
+
- generic [ref=e175]: TOP 5
|
|
119
|
+
- generic [ref=e176]: 暂无调用记录
|
|
120
|
+
- generic [ref=e178]:
|
|
121
|
+
- generic [ref=e179]:
|
|
122
|
+
- generic [ref=e180]:
|
|
123
|
+
- generic [ref=e181]: 事件日志
|
|
124
|
+
- heading "最近动态" [level=3] [ref=e184]
|
|
125
|
+
- generic [ref=e185]: 0 条事件
|
|
126
|
+
- generic [ref=e186]: 还没有已完成的运行
|
|
Binary file
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
- generic [active] [ref=f3e1]:
|
|
2
|
+
- banner [ref=f3e2]:
|
|
3
|
+
- generic [ref=f3e8]:
|
|
4
|
+
- generic [ref=f3e9]: CODEBEE / OPERATIONS
|
|
5
|
+
- generic [ref=f3e10]: 任务驾驶舱
|
|
6
|
+
- generic [ref=f3e11]:
|
|
7
|
+
- generic [ref=f3e13]: 实时监控
|
|
8
|
+
- generic [ref=f3e14]: /
|
|
9
|
+
- generic [ref=f3e15]: 已同步 · 16:30:00
|
|
10
|
+
- generic [ref=f3e16]:
|
|
11
|
+
- generic "执行池占用" [ref=f3e17]: 蜂巢 3/5 · 对话 0/4
|
|
12
|
+
- generic [ref=f3e18]: "--:--:--"
|
|
13
|
+
- main [ref=f3e19]:
|
|
14
|
+
- generic [ref=f3e20]:
|
|
15
|
+
- text: OPERATIONS / STATUS
|
|
16
|
+
- generic [ref=f3e21]:
|
|
17
|
+
- generic [ref=f3e22]: 蜂群状态
|
|
18
|
+
- generic [ref=f3e25]:
|
|
19
|
+
- generic [ref=f3e26]:
|
|
20
|
+
- heading "蜂群运行中" [level=1] [ref=f3e27]
|
|
21
|
+
- paragraph [ref=f3e28]: 当前有 3 个任务正在并行执行
|
|
22
|
+
- generic [ref=f3e29]:
|
|
23
|
+
- strong [ref=f3e30]: "3"
|
|
24
|
+
- generic [ref=f3e31]: 个活动单元
|
|
25
|
+
- generic [ref=f3e32]:
|
|
26
|
+
- generic [ref=f3e33]: 系统状态良好
|
|
27
|
+
- generic [ref=f3e36]: 实时聚合 · 每 4 秒刷新
|
|
28
|
+
- generic [ref=f3e44]:
|
|
29
|
+
- strong [ref=f3e45]: "3"
|
|
30
|
+
- generic [ref=f3e46]: ACTIVE
|
|
31
|
+
- generic [ref=f3e47]:
|
|
32
|
+
- generic [ref=f3e48]: 执行池
|
|
33
|
+
- generic [ref=f3e50]:
|
|
34
|
+
- strong [ref=f3e51]: "3"
|
|
35
|
+
- generic [ref=f3e52]: /
|
|
36
|
+
- generic [ref=f3e53]: "5"
|
|
37
|
+
- emphasis [ref=f3e54]: 在线槽位
|
|
38
|
+
- generic [ref=f3e56]:
|
|
39
|
+
- generic [ref=f3e57]: 队列等待
|
|
40
|
+
- generic [ref=f3e58]: "0"
|
|
41
|
+
- generic [ref=f3e59]:
|
|
42
|
+
- generic [ref=f3e60]: 今日成功率
|
|
43
|
+
- generic [ref=f3e61]: 42%
|
|
44
|
+
- region "核心指标" [ref=f3e62]:
|
|
45
|
+
- generic [ref=f3e63]:
|
|
46
|
+
- generic [ref=f3e64]: 运行中
|
|
47
|
+
- generic [ref=f3e67]: "3"
|
|
48
|
+
- generic [ref=f3e68]:
|
|
49
|
+
- generic [ref=f3e69]: 当前活动
|
|
50
|
+
- generic [ref=f3e70]: LIVE
|
|
51
|
+
- generic [ref=f3e71]:
|
|
52
|
+
- generic [ref=f3e72]: 排队中
|
|
53
|
+
- generic [ref=f3e75]: "0"
|
|
54
|
+
- generic [ref=f3e76]:
|
|
55
|
+
- generic [ref=f3e77]: 等待调度
|
|
56
|
+
- generic [ref=f3e78]: QUEUE
|
|
57
|
+
- generic [ref=f3e79]:
|
|
58
|
+
- generic [ref=f3e80]: 今日完成
|
|
59
|
+
- generic [ref=f3e83]: "11"
|
|
60
|
+
- generic [ref=f3e84]:
|
|
61
|
+
- generic [ref=f3e85]: 完成运行
|
|
62
|
+
- generic [ref=f3e86]: DONE
|
|
63
|
+
- generic [ref=f3e87]:
|
|
64
|
+
- generic [ref=f3e88]: 今日失败
|
|
65
|
+
- generic [ref=f3e91]: "15"
|
|
66
|
+
- generic [ref=f3e92]:
|
|
67
|
+
- generic [ref=f3e93]: 需要关注
|
|
68
|
+
- generic [ref=f3e94]: ALERT
|
|
69
|
+
- generic [ref=f3e95]:
|
|
70
|
+
- generic [ref=f3e96]: 今日 tokens
|
|
71
|
+
- generic [ref=f3e99]: 1.78亿
|
|
72
|
+
- generic [ref=f3e100]:
|
|
73
|
+
- generic [ref=f3e101]: 模型消耗
|
|
74
|
+
- generic [ref=f3e102]: USAGE
|
|
75
|
+
- generic [ref=f3e103]:
|
|
76
|
+
- generic [ref=f3e104]: 今日成本
|
|
77
|
+
- generic [ref=f3e107]: $39.95
|
|
78
|
+
- generic [ref=f3e108]:
|
|
79
|
+
- generic [ref=f3e109]: 运行成本
|
|
80
|
+
- generic [ref=f3e110]: COST
|
|
81
|
+
- generic [ref=f3e111]:
|
|
82
|
+
- generic [ref=f3e112]:
|
|
83
|
+
- generic [ref=f3e113]:
|
|
84
|
+
- generic [ref=f3e114]:
|
|
85
|
+
- generic [ref=f3e115]: 实时任务流
|
|
86
|
+
- heading "运行中任务" [level=2] [ref=f3e118]
|
|
87
|
+
- generic [ref=f3e119]:
|
|
88
|
+
- generic [ref=f3e120]: 3 ACTIVE
|
|
89
|
+
- generic [ref=f3e121]: 监控中
|
|
90
|
+
- generic [ref=f3e122]:
|
|
91
|
+
- generic [ref=f3e123]:
|
|
92
|
+
- generic [ref=f3e124]:
|
|
93
|
+
- generic [ref=f3e125]: Code
|
|
94
|
+
- generic [ref=f3e126]: ZenTao backend coupon management attribute refactor
|
|
95
|
+
- generic [ref=f3e127]: 06:51
|
|
96
|
+
- generic [ref=f3e128]:
|
|
97
|
+
- generic [ref=f3e129]: glm-5.3-flash
|
|
98
|
+
- generic [ref=f3e130]: Bigmodel - API Key
|
|
99
|
+
- generic [ref=f3e131]: Claude Code
|
|
100
|
+
- generic [ref=f3e134]:
|
|
101
|
+
- generic [ref=f3e135]: "#1"
|
|
102
|
+
- generic [ref=f3e136]: Claude Code
|
|
103
|
+
- generic [ref=f3e137]: Running
|
|
104
|
+
- generic [ref=f3e138]: 预估 17:20 · 进度≈40%
|
|
105
|
+
- text: LIVE
|
|
106
|
+
- generic [ref=f3e139]:
|
|
107
|
+
- generic [ref=f3e140]:
|
|
108
|
+
- generic [ref=f3e141]: Docs
|
|
109
|
+
- generic [ref=f3e142]: Knowledge base weekly cleanup 09-23 00:30
|
|
110
|
+
- generic [ref=f3e143]: 08:11
|
|
111
|
+
- generic [ref=f3e144]:
|
|
112
|
+
- generic [ref=f3e145]: glm-5.3-flash
|
|
113
|
+
- generic [ref=f3e146]: Bigmodel - API Key
|
|
114
|
+
- generic [ref=f3e147]: Claude Code
|
|
115
|
+
- generic [ref=f3e150]:
|
|
116
|
+
- generic [ref=f3e151]: "#1"
|
|
117
|
+
- generic [ref=f3e152]: Claude Code
|
|
118
|
+
- generic [ref=f3e153]: Running
|
|
119
|
+
- generic [ref=f3e154]: 预估 15:20 · 进度≈53%
|
|
120
|
+
- text: LIVE
|
|
121
|
+
- generic [ref=f3e155]:
|
|
122
|
+
- generic [ref=f3e156]:
|
|
123
|
+
- generic [ref=f3e157]: Novel
|
|
124
|
+
- generic [ref=f3e158]: Choose a popular novel direction and generate an outline
|
|
125
|
+
- generic [ref=f3e159]: 09:11
|
|
126
|
+
- generic [ref=f3e160]:
|
|
127
|
+
- generic [ref=f3e161]: glm-5.3-flash
|
|
128
|
+
- generic [ref=f3e162]: Bigmodel - API Key
|
|
129
|
+
- generic [ref=f3e163]: Claude Code
|
|
130
|
+
- generic [ref=f3e173]:
|
|
131
|
+
- generic [ref=f3e174]: "#8"
|
|
132
|
+
- generic [ref=f3e175]: Claude Code
|
|
133
|
+
- generic [ref=f3e176]: Running
|
|
134
|
+
- generic [ref=f3e177]: 预估 17:20 · 进度≈53%
|
|
135
|
+
- text: LIVE
|
|
136
|
+
- text: NO ACTIVE RUNS
|
|
137
|
+
- complementary [ref=f3e178]:
|
|
138
|
+
- generic [ref=f3e179]:
|
|
139
|
+
- generic [ref=f3e180]:
|
|
140
|
+
- generic [ref=f3e181]:
|
|
141
|
+
- generic [ref=f3e182]: 资源脉冲
|
|
142
|
+
- heading "近 7 日 tokens" [level=3] [ref=f3e185]
|
|
143
|
+
- generic [ref=f3e186]: 7 DAYS
|
|
144
|
+
- generic [ref=f3e187]:
|
|
145
|
+
- generic "2026-09-17 · 0" [ref=f3e188]: 09-17
|
|
146
|
+
- generic "2026-09-18 · 0" [ref=f3e191]: 09-18
|
|
147
|
+
- generic "2026-09-19 · 2500.0万" [ref=f3e194]: 09-19
|
|
148
|
+
- generic "2026-09-20 · 0" [ref=f3e197]: 09-20
|
|
149
|
+
- generic "2026-09-21 · 5600.0万" [ref=f3e200]: 09-21
|
|
150
|
+
- generic "2026-09-22 · 9600.0万" [ref=f3e203]: 09-22
|
|
151
|
+
- generic "2026-09-23 · 9700.0万" [ref=f3e206]: 09-23
|
|
152
|
+
- generic [ref=f3e209]:
|
|
153
|
+
- generic [ref=f3e210]:
|
|
154
|
+
- generic [ref=f3e211]:
|
|
155
|
+
- generic [ref=f3e212]: 模型分布
|
|
156
|
+
- heading "近 7 日模型 TOP5" [level=3] [ref=f3e215]
|
|
157
|
+
- generic [ref=f3e216]: TOP 5
|
|
158
|
+
- generic [ref=f3e217]:
|
|
159
|
+
- generic [ref=f3e218]:
|
|
160
|
+
- generic "glm-5.3-flash" [ref=f3e219]
|
|
161
|
+
- generic [ref=f3e222]: 1962.5万
|
|
162
|
+
- generic [ref=f3e223]:
|
|
163
|
+
- generic "(default)" [ref=f3e224]
|
|
164
|
+
- generic [ref=f3e227]: 1134.0万
|
|
165
|
+
- generic [ref=f3e228]:
|
|
166
|
+
- generic "deepseek-v4.1-flash" [ref=f3e229]
|
|
167
|
+
- generic [ref=f3e232]: 652.0万
|
|
168
|
+
- generic [ref=f3e233]:
|
|
169
|
+
- generic "[opencode]deepseek-v4" [ref=f3e234]
|
|
170
|
+
- generic [ref=f3e237]: 467.0万
|
|
171
|
+
- generic [ref=f3e238]:
|
|
172
|
+
- generic "gemini-3.8-flash" [ref=f3e239]
|
|
173
|
+
- generic [ref=f3e242]: 278.0万
|
|
174
|
+
- generic [ref=f3e243]:
|
|
175
|
+
- generic [ref=f3e244]:
|
|
176
|
+
- generic [ref=f3e245]:
|
|
177
|
+
- generic [ref=f3e246]: 事件日志
|
|
178
|
+
- heading "最近动态" [level=3] [ref=f3e249]
|
|
179
|
+
- generic [ref=f3e250]: 10 条事件
|
|
180
|
+
- generic [ref=f3e251]:
|
|
181
|
+
- generic [ref=f3e252]:
|
|
182
|
+
- generic "ZenTao backend coupon management" [ref=f3e254]
|
|
183
|
+
- generic [ref=f3e255]: 01:18 · 15:30
|
|
184
|
+
- generic [ref=f3e256]:
|
|
185
|
+
- generic "Knowledge base weekly cleanup" [ref=f3e258]
|
|
186
|
+
- generic [ref=f3e259]: 02:00 · 15:30
|
|
187
|
+
- generic [ref=f3e260]:
|
|
188
|
+
- generic "Novel outline generation" [ref=f3e262]
|
|
189
|
+
- generic [ref=f3e263]: 02:42 · 15:30
|
|
190
|
+
- generic [ref=f3e264]:
|
|
191
|
+
- generic "ZenTao backend coupon management" [ref=f3e266]
|
|
192
|
+
- generic [ref=f3e267]: 03:24 · 15:30
|
|
193
|
+
- generic [ref=f3e268]:
|
|
194
|
+
- generic "Knowledge base weekly cleanup" [ref=f3e270]
|
|
195
|
+
- generic [ref=f3e271]: 04:06 · 15:30
|
|
196
|
+
- generic [ref=f3e272]:
|
|
197
|
+
- generic "Novel outline generation" [ref=f3e274]
|
|
198
|
+
- generic [ref=f3e275]: 04:48 · 15:30
|
|
199
|
+
- generic [ref=f3e276]:
|
|
200
|
+
- generic "ZenTao backend coupon management" [ref=f3e278]
|
|
201
|
+
- generic [ref=f3e279]: 05:30 · 15:30
|
|
202
|
+
- generic [ref=f3e280]:
|
|
203
|
+
- generic "Knowledge base weekly cleanup" [ref=f3e282]
|
|
204
|
+
- generic [ref=f3e283]: 06:12 · 15:30
|
|
205
|
+
- generic [ref=f3e284]:
|
|
206
|
+
- generic "Novel outline generation" [ref=f3e286]
|
|
207
|
+
- generic [ref=f3e287]: 06:54 · 15:30
|
|
208
|
+
- generic [ref=f3e288]:
|
|
209
|
+
- generic "ZenTao backend coupon management" [ref=f3e290]
|
|
210
|
+
- generic [ref=f3e291]: 07:36 · 15:30
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/app/core/acceptance.py
CHANGED
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
"""Run acceptance matrix and evidence normalization.
|
|
3
|
-
|
|
4
|
-
The matrix keeps correctness, performance, boundary behavior, exception
|
|
5
|
-
handling, readability and security as separate conclusions. Missing evidence
|
|
6
|
-
is reported as ``not_evaluated``/``unknown`` rather than being inferred from a
|
|
7
|
-
successful process exit.
|
|
8
|
-
"""
|
|
9
|
-
from __future__ import annotations
|
|
10
|
-
|
|
11
|
-
import time
|
|
12
|
-
|
|
13
|
-
CASES = ("correctness", "performance", "boundary", "exception",
|
|
14
|
-
"readability", "security")
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def _case(name, status, evidence=None, reason=""):
|
|
18
|
-
return {"case": name, "status": status,
|
|
19
|
-
"evidence": [evidence] if isinstance(evidence, dict) else [],
|
|
20
|
-
"reason": str(reason or "")[:300]}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def _quality_verdict(run):
|
|
24
|
-
verdict = run.get("verdict") or {}
|
|
25
|
-
for key in ("pass", "publishable", "verify_pass"):
|
|
26
|
-
if isinstance(verdict.get(key), bool):
|
|
27
|
-
return verdict.get(key), key
|
|
28
|
-
return None, ""
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def evaluate_run(run, task=None):
|
|
32
|
-
"""Build a deterministic acceptance result from persisted run evidence."""
|
|
33
|
-
run = run or {}
|
|
34
|
-
task = task or {}
|
|
35
|
-
status = str(run.get("status") or "")
|
|
36
|
-
verdict = run.get("verdict") or {}
|
|
37
|
-
out = []
|
|
38
|
-
|
|
39
|
-
correct, source = _quality_verdict(run)
|
|
40
|
-
if status in ("failed", "timeout", "cancelled"):
|
|
41
|
-
out.append(_case("correctness", "unknown",
|
|
42
|
-
{"source": "run.status", "value": status},
|
|
43
|
-
"任务终态未形成可判定的质量结论"))
|
|
44
|
-
elif correct is not None:
|
|
45
|
-
out.append(_case("correctness", "passed" if correct else "failed",
|
|
46
|
-
{"source": "run.verdict", "field": source,
|
|
47
|
-
"value": bool(correct)}))
|
|
48
|
-
else:
|
|
49
|
-
out.append(_case("correctness", "not_evaluated", reason="缺少验证或质量门证据"))
|
|
50
|
-
|
|
51
|
-
duration = run.get("duration_s")
|
|
52
|
-
if duration is None and run.get("started_at") and run.get("ended_at"):
|
|
53
|
-
duration = "recorded"
|
|
54
|
-
has_duration = isinstance(duration, (int, float)) and duration >= 0
|
|
55
|
-
has_usage = any(isinstance(run.get(key), (int, float)) and run.get(key) > 0
|
|
56
|
-
for key in ("tokens", "cost_usd"))
|
|
57
|
-
if has_duration or has_usage:
|
|
58
|
-
out.append(_case("performance", "passed", {
|
|
59
|
-
"source": "run.metrics", "duration_s": duration,
|
|
60
|
-
"tokens": run.get("tokens", 0), "cost_usd": run.get("cost_usd", 0),
|
|
61
|
-
}, "仅表示性能数据已记录,不代表达到业务阈值"))
|
|
62
|
-
else:
|
|
63
|
-
out.append(_case("performance", "not_evaluated", reason="缺少耗时或用量证据"))
|
|
64
|
-
|
|
65
|
-
boundary = verdict.get("boundary_checks")
|
|
66
|
-
if isinstance(boundary, list) and boundary and all(
|
|
67
|
-
isinstance(x, dict) and isinstance(x.get("passed"), bool) for x in boundary):
|
|
68
|
-
failed = [x for x in boundary if x.get("passed") is False]
|
|
69
|
-
out.append(_case("boundary", "failed" if failed else "passed",
|
|
70
|
-
{"source": "run.verdict.boundary_checks", "count": len(boundary),
|
|
71
|
-
"failed": len(failed)}))
|
|
72
|
-
else:
|
|
73
|
-
out.append(_case("boundary", "not_evaluated", reason="当前任务未声明边界检查证据"))
|
|
74
|
-
|
|
75
|
-
exception = verdict.get("exception")
|
|
76
|
-
if isinstance(exception, bool):
|
|
77
|
-
out.append(_case("exception", "passed" if exception else "failed",
|
|
78
|
-
{"source": "run.verdict.exception", "value": exception}))
|
|
79
|
-
elif status in ("failed", "timeout"):
|
|
80
|
-
out.append(_case("exception", "failed" if status in ("failed", "timeout") else "unknown",
|
|
81
|
-
{"source": "run.error", "status": status,
|
|
82
|
-
"error": str(run.get("error") or "")[:300]}))
|
|
83
|
-
elif status == "cancelled":
|
|
84
|
-
out.append(_case("exception", "unknown",
|
|
85
|
-
{"source": "run.status", "value": status}))
|
|
86
|
-
else:
|
|
87
|
-
out.append(_case("exception", "not_evaluated", reason="缺少独立异常处理证据"))
|
|
88
|
-
|
|
89
|
-
for name, key in (("readability", "readability"), ("security", "security")):
|
|
90
|
-
value = verdict.get(key)
|
|
91
|
-
if isinstance(value, bool):
|
|
92
|
-
out.append(_case(name, "passed" if value else "failed",
|
|
93
|
-
{"source": "run.verdict.%s" % key, "value": value}))
|
|
94
|
-
else:
|
|
95
|
-
out.append(_case(name, "not_evaluated", reason="未提供独立 %s 证据" % name))
|
|
96
|
-
|
|
97
|
-
# 总体通过要求六个维度都有明确通过证据;缺证据不能被两个局部绿灯掩盖。
|
|
98
|
-
return {"version": 1, "evaluated_at": time.time(),
|
|
99
|
-
"passed": bool(out and all(x["status"] == "passed" for x in out)),
|
|
100
|
-
"cases": out}
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""Run acceptance matrix and evidence normalization.
|
|
3
|
+
|
|
4
|
+
The matrix keeps correctness, performance, boundary behavior, exception
|
|
5
|
+
handling, readability and security as separate conclusions. Missing evidence
|
|
6
|
+
is reported as ``not_evaluated``/``unknown`` rather than being inferred from a
|
|
7
|
+
successful process exit.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import time
|
|
12
|
+
|
|
13
|
+
CASES = ("correctness", "performance", "boundary", "exception",
|
|
14
|
+
"readability", "security")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _case(name, status, evidence=None, reason=""):
|
|
18
|
+
return {"case": name, "status": status,
|
|
19
|
+
"evidence": [evidence] if isinstance(evidence, dict) else [],
|
|
20
|
+
"reason": str(reason or "")[:300]}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _quality_verdict(run):
|
|
24
|
+
verdict = run.get("verdict") or {}
|
|
25
|
+
for key in ("pass", "publishable", "verify_pass"):
|
|
26
|
+
if isinstance(verdict.get(key), bool):
|
|
27
|
+
return verdict.get(key), key
|
|
28
|
+
return None, ""
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def evaluate_run(run, task=None):
|
|
32
|
+
"""Build a deterministic acceptance result from persisted run evidence."""
|
|
33
|
+
run = run or {}
|
|
34
|
+
task = task or {}
|
|
35
|
+
status = str(run.get("status") or "")
|
|
36
|
+
verdict = run.get("verdict") or {}
|
|
37
|
+
out = []
|
|
38
|
+
|
|
39
|
+
correct, source = _quality_verdict(run)
|
|
40
|
+
if status in ("failed", "timeout", "cancelled"):
|
|
41
|
+
out.append(_case("correctness", "unknown",
|
|
42
|
+
{"source": "run.status", "value": status},
|
|
43
|
+
"任务终态未形成可判定的质量结论"))
|
|
44
|
+
elif correct is not None:
|
|
45
|
+
out.append(_case("correctness", "passed" if correct else "failed",
|
|
46
|
+
{"source": "run.verdict", "field": source,
|
|
47
|
+
"value": bool(correct)}))
|
|
48
|
+
else:
|
|
49
|
+
out.append(_case("correctness", "not_evaluated", reason="缺少验证或质量门证据"))
|
|
50
|
+
|
|
51
|
+
duration = run.get("duration_s")
|
|
52
|
+
if duration is None and run.get("started_at") and run.get("ended_at"):
|
|
53
|
+
duration = "recorded"
|
|
54
|
+
has_duration = isinstance(duration, (int, float)) and duration >= 0
|
|
55
|
+
has_usage = any(isinstance(run.get(key), (int, float)) and run.get(key) > 0
|
|
56
|
+
for key in ("tokens", "cost_usd"))
|
|
57
|
+
if has_duration or has_usage:
|
|
58
|
+
out.append(_case("performance", "passed", {
|
|
59
|
+
"source": "run.metrics", "duration_s": duration,
|
|
60
|
+
"tokens": run.get("tokens", 0), "cost_usd": run.get("cost_usd", 0),
|
|
61
|
+
}, "仅表示性能数据已记录,不代表达到业务阈值"))
|
|
62
|
+
else:
|
|
63
|
+
out.append(_case("performance", "not_evaluated", reason="缺少耗时或用量证据"))
|
|
64
|
+
|
|
65
|
+
boundary = verdict.get("boundary_checks")
|
|
66
|
+
if isinstance(boundary, list) and boundary and all(
|
|
67
|
+
isinstance(x, dict) and isinstance(x.get("passed"), bool) for x in boundary):
|
|
68
|
+
failed = [x for x in boundary if x.get("passed") is False]
|
|
69
|
+
out.append(_case("boundary", "failed" if failed else "passed",
|
|
70
|
+
{"source": "run.verdict.boundary_checks", "count": len(boundary),
|
|
71
|
+
"failed": len(failed)}))
|
|
72
|
+
else:
|
|
73
|
+
out.append(_case("boundary", "not_evaluated", reason="当前任务未声明边界检查证据"))
|
|
74
|
+
|
|
75
|
+
exception = verdict.get("exception")
|
|
76
|
+
if isinstance(exception, bool):
|
|
77
|
+
out.append(_case("exception", "passed" if exception else "failed",
|
|
78
|
+
{"source": "run.verdict.exception", "value": exception}))
|
|
79
|
+
elif status in ("failed", "timeout"):
|
|
80
|
+
out.append(_case("exception", "failed" if status in ("failed", "timeout") else "unknown",
|
|
81
|
+
{"source": "run.error", "status": status,
|
|
82
|
+
"error": str(run.get("error") or "")[:300]}))
|
|
83
|
+
elif status == "cancelled":
|
|
84
|
+
out.append(_case("exception", "unknown",
|
|
85
|
+
{"source": "run.status", "value": status}))
|
|
86
|
+
else:
|
|
87
|
+
out.append(_case("exception", "not_evaluated", reason="缺少独立异常处理证据"))
|
|
88
|
+
|
|
89
|
+
for name, key in (("readability", "readability"), ("security", "security")):
|
|
90
|
+
value = verdict.get(key)
|
|
91
|
+
if isinstance(value, bool):
|
|
92
|
+
out.append(_case(name, "passed" if value else "failed",
|
|
93
|
+
{"source": "run.verdict.%s" % key, "value": value}))
|
|
94
|
+
else:
|
|
95
|
+
out.append(_case(name, "not_evaluated", reason="未提供独立 %s 证据" % name))
|
|
96
|
+
|
|
97
|
+
# 总体通过要求六个维度都有明确通过证据;缺证据不能被两个局部绿灯掩盖。
|
|
98
|
+
return {"version": 1, "evaluated_at": time.time(),
|
|
99
|
+
"passed": bool(out and all(x["status"] == "passed" for x in out)),
|
|
100
|
+
"cases": out}
|