← back to Ken
Ken: saveTradeConfig read-merges DB enabled gate (root-cause re-arm fix) + loud catch [yoloforever c1, Cody-gated, TK-10166]
d1ce3017f4cba5a41110aa685089d0a94fbd9705 · 2026-08-03 09:35:56 -0700 · Steve Abrams
Files touched
Diff
commit d1ce3017f4cba5a41110aa685089d0a94fbd9705
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Mon Aug 3 09:35:56 2026 -0700
Ken: saveTradeConfig read-merges DB enabled gate (root-cause re-arm fix) + loud catch [yoloforever c1, Cody-gated, TK-10166]
---
kalshi-dash/server.js | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/kalshi-dash/server.js b/kalshi-dash/server.js
index 77d5828..5afed93 100644
--- a/kalshi-dash/server.js
+++ b/kalshi-dash/server.js
@@ -7428,13 +7428,23 @@ async function loadTradeConfig() {
}
async function saveTradeConfig() {
+ // Root-cause fix (TK-10166, Cody-gated): NEVER blind-overwrite the whole object. The DB
+ // is authoritative for the `enabled` kill-switch, so read-merge it before writing —
+ // otherwise any UI config save (budget/confidence/etc.) after an out-of-band DB disarm
+ // would silently re-arm real trading by clobbering enabled with a stale in-memory value.
try {
+ const { rows } = await kenQ("SELECT value FROM ken_config WHERE key = 'trade_config'");
+ const merged = { ...TRADE_CONFIG };
+ if (rows.length && typeof rows[0].value?.enabled === 'boolean') {
+ merged.enabled = rows[0].value.enabled; // DB wins on the money gate
+ }
await kenQ(`
INSERT INTO ken_config (key, value, updated_at) VALUES ('trade_config', $1, NOW())
ON CONFLICT (key) DO UPDATE SET value = $1, updated_at = NOW()
- `, [JSON.stringify(TRADE_CONFIG)]);
+ `, [JSON.stringify(merged)]);
+ TRADE_CONFIG.enabled = merged.enabled; // keep memory coherent after the merge
} catch (e) {
- console.log(`[Ken] Failed to save trade config: ${e.message}`);
+ console.error(`[Ken] CRITICAL: Failed to save trade config: ${e.message}`);
}
}
← bf37e33 Ken: fix restartIntervals crash — it referenced boot-scoped
·
back to Ken
·
Ken (Cody gate): raise winner-gate MIN_RESOLVED 20->100 (N=2 d2605df →