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