diff --git a/DEVLOG.md b/DEVLOG.md
index 268d9ef..d43b14f 100644
--- a/DEVLOG.md
+++ b/DEVLOG.md
@@ -74,6 +74,10 @@
3. 月度复盘:数据多一段就重跑标定脚本,校准阈值与 S0/k。
4. check_db 表清单缺 pms_strategy 与 pms_op_log 的既有欠账,单独提。
+**同日修订(2026-08-19,桥机判收后两条)**
+一,判收补记。桥机 make test 与建表全部通过。dry_run 试算返回 +14.7197、区域中性,与标定报告同日值一致,方案第六节的前四步完成。宿主机的 python3 版本旧,不认 json.tool 的 --no-ensure-ascii 参数,去掉该参数即可,不是系统问题。
+二,前端改版(用户要求:不占大块,放页面第一行)。撤掉「宏观择时」大面板,改为首行一枚紧凑徽标,与市场、买入、执行、自主、计划等徽标并排。常态显示指数值与区域;有建议、闸生效或数据不可用时转警示色;有建议时徽标显示"有建议",点击即走采纳确认。全部详情移进鼠标悬浮提示:近二十日迷你走势、阈值与档位、闸状态、建议卡带采纳按钮、最近宏观命令;运维模式下悬浮里另有试算与立即扫描两个按钮。偏热闸与数据不可用两条横幅保留。无头渲染判收九项全过、零页面错误(徽标带值、有建议标记、大面板已删、悬浮里建议卡/采纳按钮/二十根迷你条/最近命令/闸说明、横幅仍在)。改动只有 index.html 一个文件,回滚还原它即可;改的是前端资源,生效仍需 make deploy 重建镜像。
+
---
## 2026-08-18 · 决策系统卖出采纳复核:降门槛+全留痕 / 确认即加速 / 清仓完成清场
diff --git a/app/web/static/index.html b/app/web/static/index.html
index 99b40ee..19d3b20 100644
--- a/app/web/static/index.html
+++ b/app/web/static/index.html
@@ -186,7 +186,6 @@ pre.json{background:var(--surface-2);border:1px solid var(--hair);border-radius:
.mz-bars{display:flex;align-items:flex-end;gap:2px;height:34px;margin:7px 0 3px;}
.mz-bar{width:9px;border-radius:2px;min-height:3px;opacity:.9;}
.mz-zone{padding:1px 9px;border-radius:9px;font-size:12px;font-weight:600;color:#fff;}
-.mz-advice{margin:7px 0;padding:8px 11px;border:1px solid var(--warn);border-radius:9px;display:flex;gap:10px;align-items:center;flex-wrap:wrap;}
@@ -199,6 +198,40 @@ pre.json{background:var(--surface-2);border:1px solid var(--hair);border-radius:
执行 {{ ov.exec_halt ? '已暂停':'正常' }}
自主 {{ tx('autonomy', ov.autonomy) }}?
计划 {{ planStatus.ok===false ? '不可用' : (planStatus.date || '-') }}
+
+
+
+
宏观择时未启用总开关 PMS_MACRO_ENABLED 在「参数设置」里打开
+
宏观择时:暂无信号数据(还没扫描过;调度位在交易日 09:35)
+
+ {{ mzSig.label }}
+ {{ mzSig.value==null ? '—' : (mzSig.value>0?'+':'') + Number(mzSig.value).toFixed(1) }}
+ {{ mzLabel(mzSig.zone) }}
+ {{ mzSig.ymd }}
+ 超额深度 {{ mzSig.e_now }} · 区内第 {{ mzSig.streak }} 天
+ {{ mzSig.note }}
+
+
+
+ 近 {{ (mzSig.history||[]).length }} 个交易日 · 热 +{{ (macro.params||{}).hot_th }} / 冷 {{ (macro.params||{}).cold_th }} / 退出带 ±{{ (macro.params||{}).exit_band }} · 档位 {{ macro.autonomy==='full' ? '全自动' : (macro.autonomy==='propose_only' ? '只出建议' : '只算不动') }}
+ 偏热闸生效中:系统自主买入与策略买开腿已暂停(你的命令不受影响)
+
+
今日建议:{{ mzSig.advice.direction==='REDUCE' ? '降仓' : '升仓' }} {{ (mzSig.advice.pct*100).toFixed(1) }}%
+
+
{{ mzSig.advice.why }} · 当日有效,隔日作废
+
+ 最近宏观命令 {{ mzSig.last_command.command_id }} · {{ mzSig.last_command.cmd_type==='REDUCE_EXPOSURE' ? '降仓' : '升仓' }} · {{ mzSig.last_command.status }}
+
+
+
+
+ 读取失败: {{ mzSig.error }}
+
+
+
+ 宏观 {{ mzChipText }}
+
下发 {{ dm.mode || '-' }}?
@@ -262,44 +295,6 @@ pre.json{background:var(--surface-2);border:1px solid var(--hair);border-radius:
下方查看全部 ▾
-
-
-
宏观择时 · 股汇对冲指数 → 整体仓位
- (总开关关闭, 只展示不动作)
- (档位 {{ macro.autonomy==='full' ? '全自动' : (macro.autonomy==='propose_only' ? '只出建议' : '只算不动') }})
-
-
-
-
{{ s.label }}
-
{{ s.value==null ? '—' : (s.value>0?'+':'') + Number(s.value).toFixed(1) }}
-
{{ mzLabel(s.zone) }}
-
超额深度 {{ s.e_now }}
-
区内第 {{ s.streak }} 天
-
宏观命令在途
-
{{ s.ymd }}
-
-
-
-
-
-
-
-
近 {{ s.history.length }} 个交易日 · 热区阈值 +{{ (macro.params||{}).hot_th }} / 冷区 {{ (macro.params||{}).cold_th }} / 退出带 ±{{ (macro.params||{}).exit_band }}
-
- 今日建议:{{ s.advice.direction==='REDUCE' ? '降仓' : '升仓' }} {{ (s.advice.pct*100).toFixed(1) }}%
- {{ s.advice.why }}
-
- 当日有效, 隔日自动作废
-
-
{{ s.note }}
-
最近宏观命令 {{ s.last_command.command_id }} · {{ s.last_command.cmd_type==='REDUCE_EXPOSURE' ? '降仓' : '升仓' }} · {{ s.last_command.status }} · 进度 {{ money(s.last_command.done_amount||0) }} / {{ money(s.last_command.target_amount) }}
-
读取失败: {{ s.error }}
-
-
暂无信号数据(还没扫描过, 或宏观层未启用)
-
-
上游信号 · 只读参考,不进下单逻辑 {{ showUpstream?'▲ 收起':'▼ 展开' }}
@@ -2154,6 +2149,29 @@ createApp({
ElementPlus.ElMessage[(d && d.ok) ? 'success' : 'error']((d && d.ok) ? ('已下达 ' + (d.command_id || '')) : ((d && d.error) || '采纳失败'));
await Promise.all([loadMacro(), loadCommands()]);
}
+ // 首行徽标 (2026-08-19 用户要求由大面板改为首行紧凑显示, 详情进悬浮提示)
+ const mzSig = computed(() => (((macro.value || {}).signals) || [])[0] || null);
+ const mzAdvicePending = computed(() => { const s = mzSig.value; return !!(s && s.advice && !s.advice.adopted); });
+ const mzChipCls = computed(() => {
+ const m = macro.value || {};
+ if (m.enabled === false) return 'idle';
+ const s = mzSig.value;
+ if (!s) return 'idle';
+ if (mzAdvicePending.value || macroGateOn.value || s.zone === 'UNAVAILABLE') return 'warn';
+ return 'ok';
+ });
+ const mzChipText = computed(() => {
+ const m = macro.value || {};
+ if (m.enabled === false) return '未启用';
+ const s = mzSig.value;
+ if (!s) return '—';
+ if (s.zone === 'UNAVAILABLE') return '数据不可用';
+ const v = s.value == null ? '—' : ((s.value > 0 ? '+' : '') + Number(s.value).toFixed(1));
+ let t = v + ' ' + mzLabel(s.zone);
+ if (mzAdvicePending.value) t += ' · 有建议';
+ return t;
+ });
+ function macroChipClick() { if (mzAdvicePending.value && mzSig.value) macroAdopt(mzSig.value.key); }
async function loadUpstream() {
const d = await call('get', '/api/upstream-signals');
@@ -2433,6 +2451,7 @@ createApp({
upstream, showUpstream, usrc, loadUpstream,
macro, macroGateOn, macroUnavailable, mzLabel, mzColor, mzBarStyle,
loadMacro, macroScan, macroAdopt,
+ mzSig, mzAdvicePending, mzChipCls, mzChipText, macroChipClick,
showAlerts, alertItems, alertLatest, alertLevelClass, alertGroups, alertStripItems,
alertStripCount, alertTotalCount, catShown, toggleCat, ageText, alertRowClass,
alertItemsF, levelShown, toggleLevel, levelCount, ALERT_LEVELS, lvLabel, lvClass, alertGridFixed, passLevel, flowText, flowClass,