diff --git a/dashboard/server.py b/dashboard/server.py
index ebb7f4c..a15063d 100644
--- a/dashboard/server.py
+++ b/dashboard/server.py
@@ -470,10 +470,27 @@ def view_runs():
runs_html = (f"
运行(最近 50)
"
+ _RUN_COLS + _run_rows(runs) + "
") if runs else \
empty_gap("暂无运行记录", "创作链落库后,每次运行登记一行(example_run)。")
- cand = (empty_gap("待审候选 · 待落库", "候选表(99)未建,AI 候选正文暂无持久化登记。")
- if not table_exists("example_candidate") else "候选表已建 · 暂无候选
")
- dec = (empty_gap("用户决策 · 待落库", "决策记录表(99)未建,接受/合并/丢弃暂以 git 提交留痕。")
- if not table_exists("example_user_decision") else "决策表已建 · 暂无决策
")
+ if table_exists("example_candidate"):
+ _, cands = q("SELECT id, work_id, target_chapter, candidate_version, run_type, state, source_role "
+ "FROM example_candidate WHERE deleted=false AND state IN ('draft','checking','passed') "
+ "ORDER BY create_time DESC LIMIT 30")
+ cand = ("待审候选(活跃)
"
+ "| id | 作品 | 章 | 版本 | 类型 | 状态 | 角色 |
"
+ + "".join(f"| {esc(c[0])} | {esc(c[1])} | {esc(c[2])} | "
+ f"{esc(c[3])} | {esc(c[4])} | {chip(c[5])} | {esc(c[6])} |
" for c in cands)
+ + "
") if cands else "候选表已建 · 暂无待审候选
"
+ else:
+ cand = empty_gap("待审候选 · 待落库", "候选表(99)未建,AI 候选正文暂无持久化登记。")
+ if table_exists("example_user_decision"):
+ _, decs = q("SELECT work_id, target_chapter, decision, rationale, decided_by, create_time "
+ "FROM example_user_decision ORDER BY create_time DESC LIMIT 30")
+ dec = ("用户决策(最近 30)
"
+ "| 作品 | 章 | 决策 | 理据 | 决策人 | 时间 |
"
+ + "".join(f"| {esc(d[0])} | {esc(d[1])} | {chip({'accept':'good','merge':'warn','discard':'crit'}.get(d[2],'warn'), d[2])} | "
+ f"{esc((d[3] or '')[:40])} | {esc(d[4])} | {esc(d[5])} |
" for d in decs)
+ + "
") if decs else "决策表已建 · 暂无决策
"
+ else:
+ dec = empty_gap("用户决策 · 待落库", "决策记录表(99)未建,接受/合并/丢弃暂以 git 提交留痕。")
body = (f"运行记录agentic 的操作与产出 · 流程 05 · 质量 06
"
f"{entries}{runs_html}待审候选
{cand}用户决策
{dec}")
return layout("运行记录", body, "/runs")