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