[object Object]

← 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 →