[object Object]

← back to Answer Cockpit

TK-11793: expectKey digest covers only the menu (question + option labels) — text cards' volatile tails 409'd every correct click

25022978f84cf0c0547cc5fdfb165991f2148523 · 2026-09-15 19:39:29 -0700 · Steve Abrams

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

Files touched

Diff

commit 25022978f84cf0c0547cc5fdfb165991f2148523
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Tue Sep 15 19:39:29 2026 -0700

    TK-11793: expectKey digest covers only the menu (question + option labels) — text cards' volatile tails 409'd every correct click
    
    Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---
 lib/queue.js | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/lib/queue.js b/lib/queue.js
index b890a51..0620c2f 100644
--- a/lib/queue.js
+++ b/lib/queue.js
@@ -110,10 +110,13 @@ async function freshLive() {
  * the same still 409s a stale card (Cody hole #3, TK-11793). keyFor(row) resolves detail.
  */
 function digestOf(detail) {
+  // Digest ONLY the menu (question + option labels): that is the content a click could
+  // mis-answer, and it is stable while displayed. A text card's last lines change every
+  // second on a thinking session, so hashing them 409'd every correct click.
   if (!detail) return '-';
   const q = detail.question && detail.question.questions && detail.question.questions[0];
-  const basis = q ? (q.question + '|' + q.options.map((o) => o.label).join('|')) : (detail.lastText ? String(detail.lastText).slice(-300) : '');
-  if (!basis) return '-';
+  if (!q) return '-';
+  const basis = q.question + '|' + q.options.map((o) => o.label).join('|');
   return require('crypto').createHash('sha1').update(basis).digest('hex').slice(0, 8);
 }
 function keyOf(row, detail) { return `${row.tty}|${row.ticket || '-'}|${row.color}|${digestOf(detail)}`; }

← 490a399 TK-11793: Cody FIX-FIRST — multi-select menus refuse typed a  ·  back to Answer Cockpit  ·  TK-11793 cycle 3: ticket-backlog lane — tickets waiting on S bc4853b →