[object Object]

← back to Ticket System

Make ticket launches Codex and duplicate-safe

3655395b87f2447559d04f4999274fc0dfbb2e04 · 2026-09-02 15:40:23 -0700 · Steve Abrams

Files touched

Diff

commit 3655395b87f2447559d04f4999274fc0dfbb2e04
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Sep 2 15:40:23 2026 -0700

    Make ticket launches Codex and duplicate-safe
---
 board.html | 5 +++--
 server.js  | 3 ++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/board.html b/board.html
index 573eb59a..14ac2956 100644
--- a/board.html
+++ b/board.html
@@ -227,7 +227,8 @@ let PILL_VIS=Object.assign(Object.fromEntries(PILLS.map(p=>[p.k,1])),LS('tkPills
 const DET=[{k:'comment',l:'comments'},{k:'note',l:'notes'},{k:'action',l:'actions'},{k:'win',l:'wins'},{k:'challenge',l:'challenges'},{k:'cody',l:'cody dissents'}];
 let DET_VIS=LS('tkDet',null)||Object.fromEntries(DET.map(d=>[d.k,1]));
 let DM_ON=LS('tkDM',1), LASTMSG=[];
-let RUN_PROFILE=LS('tkRunProfile','claude-sonnet');
+let RUN_PROFILE=LS('tkRunProfile','codex');
+if(LS('tkRunProfileDefaultV2','')!=='codex'){RUN_PROFILE='codex';save('tkRunProfile','codex');save('tkRunProfileDefaultV2','codex');}
 document.documentElement.style.setProperty('--rowpad',DENS+'px'); $('#dens').value=DENS; $('#grp').value=GROUP; $('#view').value=VIEW;
 if(![...$('#runProfile').options].some(o=>o.value===RUN_PROFILE))RUN_PROFILE='claude-sonnet';$('#runProfile').value=RUN_PROFILE;
 const ordered=()=>ORDER.map(k=>COLS.find(c=>c.k===k)).filter(c=>c&&VIS[c.k]);
@@ -277,7 +278,7 @@ function render(){
   const rowTr=t=>{
     const tr=document.createElement('tr');tr.className='row'+(SEL.has(t.id)?' sel':'')+(t.status==='stopped'?' stopped':'');tr.dataset.id=t.id;
     tr.innerHTML=`<td class="cb"><input type="checkbox" class="rowcb" ${SEL.has(t.id)?'checked':''}></td>`+cols.map(c=>`<td>${c.cell(t)}</td>`).join('');
-    tr.querySelector('.rowcb').onclick=e=>{e.stopPropagation();if(e.target.checked)SEL.add(t.id);else SEL.delete(t.id);tr.classList.toggle('sel',e.target.checked);syncBar();};
+    tr.querySelector('.rowcb').onclick=e=>{e.stopPropagation();if(e.target.checked)SEL.add(t.id);else SEL.delete(t.id);tr.classList.toggle('sel',e.target.checked);setRunMsg('');syncBar();};
     tr.onclick=e=>{if(e.target.closest('a,.who,.proj,input'))return;const nx=tr.nextElementSibling;if(nx&&nx.classList.contains('det')){nx.remove();return;}
       const d=document.createElement('tr');d.className='det';
       const cShown=(t.comments||[]).filter(c=>DET_VIS[c.kind]!==0);
diff --git a/server.js b/server.js
index 2f83e67b..dd48c612 100644
--- a/server.js
+++ b/server.js
@@ -13,7 +13,7 @@ const DTD_RUNNING = path.join(DATA_DIR, 'dtd-verdicts.running'); // present whil
 const RUN_SH = path.join(__dirname, 'run-ticket.sh');           // opens an iTerm2 Claude session
 const DTD_RUN = path.join(__dirname, 'dtd-run.js');             // batched panel.sh sweep
 const RUN_PROFILES = new Set(['claude-sonnet', 'claude-opus', 'claude-haiku', 'codex', 'local-qwen-27b', 'local-qwen-14b']);
-const DEFAULT_RUN_PROFILE = 'claude-sonnet';
+const DEFAULT_RUN_PROFILE = 'codex';
 const RUN_PROFILE_OVERRIDE = '/tmp/ticket-run-profile-override.json';
 
 // A bounded operator override wins over stale browser localStorage. The file is
@@ -373,6 +373,7 @@ http.createServer((req, res) => {
       ids.forEach((id, i) => {
         const t = map.get(id);
         if (t && t.status === 'stopped') { skipped.push({ id, why: 'stopped' }); return; }
+        if (t && t.status === 'doing') { skipped.push({ id, why: 'already-doing' }); return; }
         if (t && (t.kind || 'task') !== 'task') { skipped.push({ id, why: 'designation-' + t.kind }); return; }
         let cwd = os.homedir();
         const proj = t && t.project;

← 77a5723b Keep ticket control popup visible  ·  back to Ticket System  ·  Keep ticket controls in a real window d9472b3e →