{"slug":"Ken","total":72,"limit":100,"offset":0,"since":null,"commits":[{"hash":"a2449ac","date":"2026-09-26 09:58:50 -0700","author":"Steve Abrams","subject":"Ken reconcile-canary: retry transient PG restart errors (57P03/ENOENT/ECONNREFUSED) before exit 2; log error code (TK-11999)","body":"Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01GEE4jWy9RBmz5QnR2xcvno"},{"hash":"cc32555","date":"2026-09-11 19:10:45 -0700","author":"Steve Abrams","subject":"Bump kalshi-dash to 1.0.5 after verified socket migration","body":""},{"hash":"d840eb6","date":"2026-09-11 10:32:29 -0700","author":"Steve Abrams","subject":"Use Unix socket for Ken hourly signal database","body":""},{"hash":"8f36d51","date":"2026-08-31 11:48:29 -0700","author":"Steve Abrams","subject":"document TK-10166 live-arm verification","body":""},{"hash":"a030a58","date":"2026-08-13 14:04:00 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-13T13:58:08 (1 data files) — package-lock.json","body":""},{"hash":"75b875f","date":"2026-08-13 13:29:45 -0700","author":"Steve Abrams","subject":"chore(ken): v1.1.0 (session close — weather-news pulse feature, default-off/shadow)","body":""},{"hash":"67b0c90","date":"2026-08-13 13:23:34 -0700","author":"Steve Abrams","subject":"feat(ken): WEATHER_PULSE_SHADOW mode — log the nudge, do not apply to p_yes","body":"Money-safe: with WEATHER_PULSE_SHADOW=1 the pulse is computed + logged into\ncomponents.weather_pulse but p_yes is unchanged (verified pYesFinal===pYes), so real\ntrades cannot move. ecosystem bertha-cron env set to WEATHER_PULSE=1 + SHADOW=1 for\nlive-market validation before the nudge is ever allowed to influence a real order."},{"hash":"a6239c3","date":"2026-08-13 13:17:25 -0700","author":"Steve Abrams","subject":"chore(ken): enable WEATHER_PULSE=1 in bertha-cron env (advisory pulse on next deploy)","body":""},{"hash":"c87cbf8","date":"2026-08-13 13:11:29 -0700","author":"Steve Abrams","subject":"feat(ken): weather-pulse resolves NWS office from event.location","body":"The pulse now FIRES from the location the models pipeline already carries — city name\n-> getCityCoords -> NWS /points -> gridId (office) -> AFD read. Still gated/capped/fail-safe\nand DEFAULT-OFF. Verified live: New York->OKX (nudge -0.002), Los Angeles->LOX (nudge 0)."},{"hash":"7dc1cce","date":"2026-08-13 13:07:12 -0700","author":"Steve Abrams","subject":"feat(ken): optional weather-news pulse (agent-reach free NWS AFD reader)","body":"Advisory-only, capped (±0.03), contested-markets-only, gated by WEATHER_PULSE=1.\nFail-safe: flag off or any error => no-op (byte-identical). Read-only; never touches\nrisk.js / order sizing / live-money gates. Verified: flag-off no-op + live $0 OKX AFD fetch."},{"hash":"f1bde08","date":"2026-08-04 15:37:38 -0700","author":"Steve Abrams","subject":"chore: v1.0.4 (session close) — auth hardening for public ken.agentabrams.com exposure","body":""},{"hash":"531d5a7","date":"2026-08-04 14:23:05 -0700","author":"Steve Abrams","subject":"Ken auth: close IP-bypass hole before public reverse-proxy exposure","body":"- Drop 45.61.58.125 (Kamatera) from the auth-bypass whitelist so proxied\n  public traffic must pass login (basic-auth / Google OAuth), not auto-trust.\n- isWhitelistedIP() now keys off req.socket.remoteAddress (real TCP peer)\n  instead of the client-controllable X-Forwarded-For header — a public\n  visitor can no longer forge `X-Forwarded-For: 127.0.0.1` to bypass auth.\n- Loopback (127.0.0.1/::1) bypass retained so the safe-mode guard keeps working.\n\nPrep for serving ken.agentabrams.com via Kamatera reverse-proxy to Mac2."},{"hash":"0d924a3","date":"2026-08-04 10:48:45 -0700","author":"Steve Abrams","subject":"chore: lint + refactor (mkMarket readability), v1.0.3 (session close)","body":""},{"hash":"5d8b90b","date":"2026-08-04 10:32:39 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-04T10:32:27 (2 files) — kalshi-dash/ken-paper.png kalshi-dash/ken-real.png","body":""},{"hash":"aa47a3b","date":"2026-08-04 10:16:39 -0700","author":"Steve Abrams","subject":"Ken: make real-money dashboard mode deep-linkable via ?real=1/0 query param","body":""},{"hash":"8ba8972","date":"2026-08-04 10:13:03 -0700","author":"Steve Abrams","subject":"Ken: add real-money-only dashboard toggle (Paper Arena ⟷ Real Money)","body":"- New GET /api/dashboard/real endpoint: same shape as /api/dashboard but\n  computed from ken_trades (actual Kalshi orders) + live account balance,\n  not the 99-bot paper arena. Paper path untouched.\n- Dashboard.jsx: persistent realMode toggle button in header, dynamic\n  labels/subtitle, refetches on toggle. Rebuilt bundle."},{"hash":"2bec9fc","date":"2026-08-04 09:32:14 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-04T09:32:01 (1 files) — kalshi-dash/place-manual-trade.mjs","body":""},{"hash":"9969827","date":"2026-08-04 04:03:21 -0700","author":"steve@designerwallcoverings.com","subject":"fix: migrate Kalshi exit orders + manual create_order to v2 /portfolio/events/orders API","body":"Take-profit and stop-loss sell paths were still calling retired POST /portfolio/orders (v1, 410).\nManual create_order was also on v1. All three now use POST /portfolio/events/orders with\nbid/ask semantics, IOC time_in_force for market-like behavior, and yes-price dollar values.\n\nRefs: TK-10174"},{"hash":"982c1f4","date":"2026-08-03 13:24:37 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T13:24:27 (1 files) — kalshi-dash/ken-refresh-site.sh","body":""},{"hash":"07bb411","date":"2026-08-03 12:24:15 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T12:23:59 (1 files) — kalshi-dash/ken-trade-flash.sh","body":""},{"hash":"d6811ed","date":"2026-08-03 12:23:36 -0700","author":"Steve Abrams","subject":"Ken: incorporate the brass AB Trading Switch onto the dashboard front page","body":"Serve /trading-switch-widget.js and inject it into the SPA index.html at serve-time (no React rebuild). Renders a compact brass bat-switch pinned bottom-right of the dashboard, wired to the same set_trading endpoint + guard source-of-truth; right-click opens the full /trading panel."},{"hash":"ea9bacb","date":"2026-08-03 12:18:39 -0700","author":"Steve Abrams","subject":"Ken: style the /trading toggle as a large brass AB bat-switch","body":"Brass faceplate + corner screws, engraved AB monogram + ON/OFF labels, throw lever with a knob that glows green when armed. Same data-on wiring; purely presentational."},{"hash":"2191a43","date":"2026-08-03 12:05:18 -0700","author":"Steve Abrams","subject":"Ken: add /trading real-money on-off switch (UI toggle = source of truth)","body":"New auth-gated /trading page + POST /api/trading/mode action=set_trading that atomically sets risk_state.config.trading_on + safe_mode (+auto-trader). Rewired ken-safemode-guard.sh from 'always hold safe_mode=true' to SOURCE-OF-TRUTH: it holds safe_mode == !trading_on, auto-heals + alerts on unauthorized drift in EITHER direction, and never-silent alerts when armed / when a real trade lands. Bootstrapped the guard via launchd (it had died). Default OFF/safe; arming stays a human toggle.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"416f69e","date":"2026-08-03 11:53:58 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T11:53:46 (1 files) — kalshi-dash/package-lock.json","body":""},{"hash":"fa8b5c2","date":"2026-08-03 11:30:51 -0700","author":"steve@designerwallcoverings.com","subject":"chore: v1.0.2 (session close — 8 Ken bug fixes + reconciliation canary + near-term/liquidity filters)","body":""},{"hash":"14b4275","date":"2026-08-03 11:23:45 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T11:23:33 (2 files) — kalshi-dash/arm-live-run.mjs kalshi-dash/ken-safemode-guard.sh","body":""},{"hash":"b49c172","date":"2026-08-03 11:01:31 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: widen near-term window 120->365 days — 120d left only ~11 tradeable markets; the actual junk was 2028-2045 multi-year longshots, which a 1-year window excludes while keeping liquid mid-term markets.","body":""},{"hash":"afc629c","date":"2026-08-03 10:59:39 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: carry close_time into allMarkets — the near-term filter nuked the pool to 0 active because the market mapping dropped close_time. Now mapped so the 120-day filter works.","body":""},{"hash":"b2c914b","date":"2026-08-03 10:57:49 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: near-term + real-book filter (Steve) — scan now only trades markets closing within 120 days with a two-sided book; real-trade path also requires yes_ask/yes_bid (not stale last_price) + near-term. Stops winners building track records on far-future longshots (2028-2045) that have no live order book to bet real money against.","body":""},{"hash":"2976075","date":"2026-08-03 10:43:00 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: MIN_RESOLVED 100->50 (Steve, 2026-08-03) — let real trading start sooner on the fresh sim; keeps 2-winner consensus + independence denylist as the real safety. High-conviction winners (90% win) are well above noise at N=50.","body":""},{"hash":"b2420a9","date":"2026-08-03 10:32:18 -0700","author":"Steve Abrams","subject":"Ken: migrate live buy order to Kalshi v2 create-order (POST /portfolio/events/orders)","body":"v1 POST /portfolio/orders now 410s (deprecated_v1_order_endpoint) — no real order could place. v2 single YES-book: bid=buy YES, ask=sell YES(=buy NO), price=YES price in dollars, +required self_trade_prevention_type + client_order_id idempotency key. Fixes zero-fills on the live $50 run. Exit sells (TP/SL) left on v1 as a flagged follow-up; positions still resolve at settlement.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"259b896","date":"2026-08-03 10:24:39 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: reconcile-canary self-alerts to CNCP parking-lot on divergence (best-effort, never masks exit code). Installed as launchd com.steve.ken-reconcile-canary (30min + RunAtLoad) per Steve approval.","body":""},{"hash":"a33bc89","date":"2026-08-03 10:21:21 -0700","author":"steve@designerwallcoverings.com","subject":"Ken (Cody gate c): add read-only reconciliation canary — verifies ken_portfolios rollup (returned/invested/balance) still equals the per-trade ledger within $2. Catches the bigint-string over-credit bug class forever. Exit 1 + ALERT on divergence. Coerces bigint-as-string (the very bug).","body":""},{"hash":"2f7617c","date":"2026-08-03 10:20:49 -0700","author":"steve@designerwallcoverings.com","subject":"Ken (Cody gate b): independence gate on winner-consensus — exclude control/indiscriminate strategies (random/spray_pray/full_send = noise/take-all; penny_pincher/nickel_slots/degen_lite = low-edge no quality gate) from driving REAL trades. Two correlated low-bar strategies agreeing was noise, not consensus. They still paper-trade as controls.","body":""},{"hash":"eb2e485","date":"2026-08-03 09:57:19 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: ROOT-CAUSE the paper over-credit — node-postgres returns bigint cost_cents as a STRING, so 'returned = cost_cents + pnl' CONCATENATED ('71'+21='7121') instead of adding, over-crediting every WIN ~100-1000x (this, not double-counting, was the balloon; survived the idempotency fix). Coerce cost to Number. Removed temp debug probe.","body":""},{"hash":"2e71021","date":"2026-08-03 09:48:56 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: TEMP debug probe — log any settle crediting >$50 (returned/cost/pnl/price/qty) to isolate the residual ~100x over-credit that survives the idempotency fix","body":""},{"hash":"811d382","date":"2026-08-03 09:46:34 -0700","author":"Steve Abrams","subject":"chore: gitignore runtime data, v1.0.1 (session close)","body":""},{"hash":"d2605df","date":"2026-08-03 09:40:19 -0700","author":"steve@designerwallcoverings.com","subject":"Ken (Cody gate): raise winner-gate MIN_RESOLVED 20->100 (N=20@60% clearable by ~25% variance → real money followed lucky noise); fix cumulative_pnl_cents to accumulate in ON CONFLICT (was frozen at day's first trade); fix resolver log to count SETTLED not SELECTED trades","body":""},{"hash":"d1ce301","date":"2026-08-03 09:35:56 -0700","author":"Steve Abrams","subject":"Ken: saveTradeConfig read-merges DB enabled gate (root-cause re-arm fix) + loud catch [yoloforever c1, Cody-gated, TK-10166]","body":""},{"hash":"bf37e33","date":"2026-08-03 09:35:23 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: fix restartIntervals crash — it referenced boot-scoped runScanSafe/runSweepSafe (ReferenceError crashed the process whenever POST /api/scan-config ran). Call module-level autonomousScan/redditIntelligenceLoop directly with catch guards. Boot path unchanged.","body":""},{"hash":"9507bcf","date":"2026-08-03 09:33:32 -0700","author":"Steve Abrams","subject":"Ken: config-cache coherence — autoTrader refreshes enabled gate from DB each cycle (no more silent re-arm) [yoloforever c1, TK-10166]","body":""},{"hash":"9de5a64","date":"2026-08-03 09:24:22 -0700","author":"Steve Abrams","subject":"Ken UI: unmistakable PAPER/LIVE-MONEY badge + 'Paper Balance' label — stop conflating live DATA with live TRADING (TK-10166)","body":""},{"hash":"fc471b8","date":"2026-08-03 09:22:48 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T09:22:36 (1 files) — kalshi-dash/src/Layout.jsx","body":""},{"hash":"e7e3c8c","date":"2026-08-03 09:16:02 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: fix resolver 270x portfolio over-credit — settle idempotently (UPDATE ... WHERE status='open' RETURNING, credit only on winning the flip) + re-entrancy guard so duplicate intervals (5121/9388) + slow passes can't double-count. Real bets follow paper winners, so clean rollups matter.","body":""},{"hash":"b9768ef","date":"2026-08-03 08:58:54 -0700","author":"Steve Abrams","subject":"Ken v2 GO-LIVE wiring: live orders follow profitable-winner consensus w/ live-price fetch; NOT the weather engine (TK-10166)","body":""},{"hash":"ae4735c","date":"2026-08-03 08:52:35 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T08:52:19 (1 files) — kalshi-dash/.gitignore","body":""},{"hash":"d137b3b","date":"2026-08-03 08:34:49 -0700","author":"Steve Abrams","subject":"Ken v2: profit-based ranking — sum(daily_pnl_cents), gate on net>0, rank by real $ (TK-10166)","body":""},{"hash":"74d4a2d","date":"2026-08-03 08:30:45 -0700","author":"Steve Abrams","subject":"Ken v2 follow-the-winners: hourly auto-check, alerts on QUIET->SIGNAL emergence (TK-10166)","body":""},{"hash":"f60f68f","date":"2026-08-03 08:22:18 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T08:22:05 (1 files) — kalshi-dash/.gitignore","body":""},{"hash":"5735837","date":"2026-08-03 08:21:49 -0700","author":"Steve Abrams","subject":"Ken v2 follow-the-winners signal: durable win-record source (ken_daily_pnl) + graceful rebuild state (TK-10166)","body":""},{"hash":"5e77ebc","date":"2026-08-03 07:52:03 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-03T07:51:47 (1 files) — kalshi-dash/server.js","body":""},{"hash":"05c7572","date":"2026-08-03 07:49:16 -0700","author":"steve@designerwallcoverings.com","subject":"Ken: FIX resolver never settling — trades inserted with empty status but resolver queried status='open', so 30k paper trades froze open forever (returns never credited → phantom -$30k balance). INSERT now writes status='open' + column default set. True paper P&L is -$907, not -$30,092.","body":""},{"hash":"a3aff5e","date":"2026-07-15 13:05:48 -0700","author":"Steve Abrams","subject":"Ken: surface real Kalshi API error body (was '[object Object]') + method/path in kalshiFetch errors — reveals the 410 order-failure reason","body":""},{"hash":"2066e75","date":"2026-07-15 12:40:37 -0700","author":"Steve Abrams","subject":"Ken: FIX no-trades root cause — Kalshi API renamed price fields (yes_bid→yes_bid_dollars string, volume_24h→volume_24h_fp). Ken read the dead fields → every market mapped to 0 → 0 active → 0 signals → 0 trades. Now reads new _dollars/_fp fields (dollars-string→cents), backward-compatible. Live test: 0→851 active markets.","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"5a71f56","date":"2026-07-15 12:18:29 -0700","author":"Steve Abrams","subject":"Ken: live Risk Level knob in Settings — drag to preview, Apply commits min_confidence to /api/trading/mode (real-money knob, explicit apply). Plus standalone risk-knob.html visualizer.","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"4d35550","date":"2026-07-15 12:06:33 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-15T12:06:24 (1 files) — kalshi-dash/risk-knob.html","body":""},{"hash":"0331471","date":"2026-07-15 11:55:33 -0700","author":"Steve Abrams","subject":"Ken: set-confidence.sh fails loud (exit 1 + stderr) on any non-success — no more silent no-op on a real-money knob","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"c49a8e1","date":"2026-07-15 11:55:04 -0700","author":"Steve Abrams","subject":"Ken: scoped set-confidence.sh — fix endpoint to /api/trading/mode (was /api/risk → silent no-op); adjusts ONLY min_confidence 50-99","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"d83c6ee","date":"2026-07-14 12:34:27 -0700","author":"Steve Abrams","subject":"Ken: retry/backoff in geminiAnalyze for shared-Ollama 'server busy' contention (stays all-local, best-effort)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"16c240e","date":"2026-07-14 11:07:59 -0700","author":"Steve Abrams","subject":"Ken: fix Weather page 400 — server now handles 'get_data' action (on-mount load), aliased to fetch_all","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a327393","date":"2026-07-14 10:11:54 -0700","author":"Steve Abrams","subject":"Ken: live-run status chip in dashboard header (motion graphics)","body":"- GET /api/live-run — day X/N, $ spent today vs daily cap, auto-off date, days left\n- Layout.jsx status bar: animated LiveRunChip (pulsing glow, shimmer sweep, blinking\n  live dot, flowing progress bar, rAF count-up on $ spent). Idle 'PAPER' pill when\n  no run armed; full green LIVE chip when active.\n- index.css: lrchip motion keyframes (lrGlow/lrShimmer/lrBlink/lrBarFlow)\n- also added the chip + endpoint-consumer to the legacy inline dashboard\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"1bdf579","date":"2026-07-14 09:52:53 -0700","author":"Steve Abrams","subject":"Ken: bounded live-run controls — $/day spend cap + auto-off after N days","body":"- getLiveRun/saveLiveRun (ken_config 'live_run')\n- autoTrader: auto-disarm (enabled=false + safe_mode=on) after end_date; per-day\n  spend cap via liveDailyRemaining (resets each calendar day)\n- arm-live-run.mjs: arms a bounded run ($10/day x5, total $50 cap). Arming the\n  gates stays a human action (classifier-gated), not autonomous.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"af4870c","date":"2026-07-14 08:51:27 -0700","author":"Steve Abrams","subject":"Ken: gate manual create_order endpoint on safe_mode too (close the non-autoTrader real-order path)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"6fc1f52","date":"2026-07-10 11:15:35 -0700","author":"Steve","subject":"Ken: enforce safe/paper — autoTrader honors safe_mode + master enabled defaults OFF (no real orders without deliberate toggle)","body":""},{"hash":"a060e29","date":"2026-07-10 11:12:20 -0700","author":"Steve","subject":"Ken: add captured_at to ken_market_snapshots (momentum query) — pipelines error-free","body":""},{"hash":"2fa8032","date":"2026-07-10 11:11:08 -0700","author":"Steve","subject":"Ken: seed 99 paper-trading portfolios + add portfolio stat columns (local boot)","body":""},{"hash":"a3dd171","date":"2026-07-10 11:03:57 -0700","author":"Steve","subject":"Ken: switch AI analyst from paid Gemini to local Ollama (hermes3:8b) + local boot on Mac3","body":"- geminiAnalyze() now calls local Ollama /api/generate (format:json), env-overridable\n  via KEN_LOCAL_MODEL/OLLAMA_URL; removes GEMINI_API_KEY dependency\n- raise per-day AI cap 200 -> 100000 (local = $0, no throttle)\n- persona/label strings reflect local model\n- add start.sh (sources .env) + reconstructed schema.sql (18 ken_* tables) so Ken\n  boots + persists on Mac3 against local Postgres 'ken' + existing bertha_betting"},{"hash":"c303efd","date":"2026-06-03 20:24:32 -0700","author":"SteveStudio2","subject":"Untrack .DS_Store + gitignore it","body":""},{"hash":"cb1104e","date":"2026-05-30 23:58:03 -0700","author":"SteveStudio2","subject":"gitignore: add backup/source-leak file globs (*.bak, *.orig, *.old, etc.)","body":""},{"hash":"cf5d8b8","date":"2026-05-13 08:57:55 -0700","author":"Steve","subject":"snapshot: 1 file(s) changed, +1 new","body":""},{"hash":"a27e0fd","date":"2026-05-07 12:29:27 -0700","author":"Steve","subject":"tighten .gitignore: add missing standing-rule patterns (.env* tmp/ *.log .DS_Store dist/ build/ .next/)","body":""},{"hash":"93ce9eb","date":"2026-05-04 03:46:34 -0700","author":"SteveStudio2","subject":"[overnight] pre-debate baseline","body":""}]}