@jhizzard/termdeck 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +4 -5
- package/packages/cli/src/index.js +2 -2
- package/packages/client/public/app.js +98 -8
- package/packages/client/public/style.css +9 -0
- package/packages/server/share/termdeck/templates/claude-code-auditor.txt +34 -0
- package/packages/server/share/termdeck/templates/claude-code-orchestrator.txt +30 -0
- package/packages/server/share/termdeck/templates/claude-code-worker.txt +26 -0
- package/packages/server/share/termdeck/templates/codex-auditor.txt +36 -0
- package/packages/server/share/termdeck/templates/codex-worker.txt +28 -0
- package/packages/server/share/termdeck/templates/gemini-auditor.txt +33 -0
- package/packages/server/share/termdeck/templates/gemini-worker.txt +25 -0
- package/packages/server/share/termdeck/templates/grok-auditor.txt +35 -0
- package/packages/server/share/termdeck/templates/grok-worker.txt +25 -0
- package/packages/server/src/index.js +46 -15
- package/packages/server/src/orchestration-preview.js +1 -1
- package/packages/server/src/parked-detection.js +50 -0
- package/packages/server/src/session.js +25 -3
- package/packages/server/src/sprint-inject.js +2 -2
- package/packages/server/src/sprint-routes.js +17 -0
- package/packages/server/src/sprints/inject.js +323 -0
- package/packages/server/src/sprints/nudge.js +147 -0
- package/packages/server/src/sprints/status-parser.js +129 -0
- package/packages/server/src/templates/template-engine.js +197 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TermDeck
|
|
2
2
|
|
|
3
|
-
[](https://github.com/jhizzard/termdeck/actions/workflows/ci.yml)
|
|
4
4
|
|
|
5
5
|
> **The terminal that remembers what you fixed last month.**
|
|
6
6
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jhizzard/termdeck",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Browser-based terminal multiplexer with metadata overlays, panel flashback memory recall, and AI-aware session management",
|
|
5
5
|
"bin": {
|
|
6
6
|
"termdeck": "./packages/cli/src/index.js"
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"packages/cli/src/**",
|
|
11
11
|
"packages/cli/templates/**",
|
|
12
12
|
"packages/server/src/**",
|
|
13
|
+
"packages/server/share/**",
|
|
13
14
|
"packages/client/public/**",
|
|
14
15
|
"packages/stack-installer/assets/hooks/**",
|
|
15
16
|
"config/config.example.yaml",
|
|
@@ -39,15 +40,13 @@
|
|
|
39
40
|
"@homebridge/node-pty-prebuilt-multiarch": "^0.13.1",
|
|
40
41
|
"better-sqlite3": "^12.9.0",
|
|
41
42
|
"chalk": "^5.3.0",
|
|
42
|
-
"express": "^
|
|
43
|
-
"open": "^10.0.0",
|
|
43
|
+
"express": "^5.2.1",
|
|
44
44
|
"pg": "^8.20.0",
|
|
45
|
-
"uuid": "^13.0.0",
|
|
46
45
|
"ws": "^8.16.0",
|
|
47
46
|
"yaml": "^2.3.4"
|
|
48
47
|
},
|
|
49
48
|
"devDependencies": {
|
|
50
|
-
"@anthropic-ai/sdk": "^0.
|
|
49
|
+
"@anthropic-ai/sdk": "^0.96.0"
|
|
51
50
|
},
|
|
52
51
|
"keywords": [
|
|
53
52
|
"terminal",
|
|
@@ -164,8 +164,8 @@ function reclaimStalePort(port) {
|
|
|
164
164
|
try { process.kill(parseInt(pid, 10), 'SIGKILL'); } catch (_e) {}
|
|
165
165
|
}
|
|
166
166
|
} else {
|
|
167
|
-
|
|
168
|
-
|
|
167
|
+
process.stderr.write(`\n \x1b[31m✗ Port ${port} is in use by a non-TermDeck process (PIDs: ${pids.join(' ')})\x1b[0m\n`);
|
|
168
|
+
process.stderr.write(` \x1b[2mTry a different port: termdeck --port ${port + 1}\x1b[0m\n\n`);
|
|
169
169
|
process.exit(1);
|
|
170
170
|
}
|
|
171
171
|
}
|
|
@@ -438,6 +438,7 @@
|
|
|
438
438
|
<a class="theme-reset" id="theme-reset-${id}" href="javascript:void(0)" onclick="resetTheme('${id}')" title="Revert to project / global default from config.yaml" style="font-size:11px;color:#7aa2f7;text-decoration:none;margin-left:4px;opacity:0.7;cursor:pointer">↺ default</a>
|
|
439
439
|
<button class="ctrl-btn" onclick="focusPanel('${id}')">focus</button>
|
|
440
440
|
<button class="ctrl-btn" onclick="halfPanel('${id}')">half</button>
|
|
441
|
+
<button class="ctrl-btn orch-toggle${isOrchestratorRole(meta.role) ? ' is-orch' : ''}" id="orch-toggle-${id}" type="button" onclick="toggleOrchestratorRole('${id}')" title="${isOrchestratorRole(meta.role) ? 'Unmark this panel as the orchestrator' : 'Mark this panel as the orchestrator — gold border, ORCH badge, pinned row'}">${orchToggleLabel(meta.role)}</button>
|
|
441
442
|
<button class="ctrl-btn reply-toggle" id="reply-btn-${id}" onclick="toggleReplyForm('${id}')" title="Send text to another terminal">reply ▸</button>
|
|
442
443
|
<input type="text" class="ctrl-input" id="ai-${id}" placeholder="Ask about this terminal..." onkeydown="if(event.key==='Enter')askAI('${id}', this.value)">
|
|
443
444
|
</div>
|
|
@@ -729,11 +730,17 @@
|
|
|
729
730
|
return panelProject === selectedFilter;
|
|
730
731
|
}
|
|
731
732
|
|
|
732
|
-
//
|
|
733
|
-
//
|
|
733
|
+
// Sprint 66 T1 (Task 1.1) — the chip row renders whenever there is at
|
|
734
|
+
// least one project bucket, so the project-filter feature is *discoverable*
|
|
735
|
+
// rather than hidden until a second project shows up. Brad's 2026-05-13 v2
|
|
736
|
+
// spec asked for an always-visible rail; his single-live-panel setup sat
|
|
737
|
+
// below the old ≥2 threshold and saw nothing. With one project the row is
|
|
738
|
+
// [ All ] + that one project chip — harmless, and it advertises the filter.
|
|
739
|
+
// `hasNullProject` is retained in the signature for call-site / test
|
|
740
|
+
// compatibility; with ≥1 project the row shows regardless of it, and with
|
|
741
|
+
// zero projects an All-only row carries no filter value so it stays hidden.
|
|
734
742
|
function shouldShowChipRow(projects, hasNullProject) {
|
|
735
|
-
|
|
736
|
-
return n >= 2 || (n >= 1 && hasNullProject === true);
|
|
743
|
+
return (projects || []).length >= 1;
|
|
737
744
|
}
|
|
738
745
|
|
|
739
746
|
// Approach A (Brad's 2026-05-13 spec): orchestrator identity is the
|
|
@@ -742,6 +749,21 @@
|
|
|
742
749
|
return role === 'orchestrator';
|
|
743
750
|
}
|
|
744
751
|
|
|
752
|
+
// Sprint 66 T1 (Task 1.3) — the binary "mark / unmark orchestrator" toggle.
|
|
753
|
+
// nextRoleForToggle: the role the toggle moves a panel TO, given its
|
|
754
|
+
// current role — orchestrator ⇄ unroled (null). A worker/reviewer/auditor
|
|
755
|
+
// panel is "not orchestrator", so the toggle promotes it to orchestrator;
|
|
756
|
+
// it does NOT preserve a prior non-orch role (the affordance is a binary
|
|
757
|
+
// ORCH switch, not a role-history stack — it matches "mark / unmark as
|
|
758
|
+
// orchestrator"). orchToggleLabel: the toggle button's text for a role.
|
|
759
|
+
// Both pure — unit-tested in tests/dashboard-panels-client.test.js.
|
|
760
|
+
function nextRoleForToggle(currentRole) {
|
|
761
|
+
return currentRole === 'orchestrator' ? null : 'orchestrator';
|
|
762
|
+
}
|
|
763
|
+
function orchToggleLabel(role) {
|
|
764
|
+
return role === 'orchestrator' ? 'unmark orch' : 'mark orch';
|
|
765
|
+
}
|
|
766
|
+
|
|
745
767
|
// Belt-and-suspenders for missed panel_exited frames: panel ids the
|
|
746
768
|
// dashboard still has a tile for, but which no longer appear in the
|
|
747
769
|
// server's broadcast session list. Works whether or not T2 filters exited
|
|
@@ -912,10 +934,15 @@
|
|
|
912
934
|
}
|
|
913
935
|
}
|
|
914
936
|
|
|
915
|
-
// 1.2 —
|
|
916
|
-
//
|
|
917
|
-
//
|
|
918
|
-
//
|
|
937
|
+
// 1.2 — reconcile: keep every tile in the container its role dictates.
|
|
938
|
+
// Re-evaluates isOrchestratorRole() for every panel on each call, so it is
|
|
939
|
+
// the primary mover whenever a role CHANGES — not merely a placement
|
|
940
|
+
// safety net. Sprint 66 T1 (Task 1.2) made meta.role mutable post-spawn
|
|
941
|
+
// (PATCH /api/sessions/:id {role}); a role flip arrives via status_broadcast,
|
|
942
|
+
// updatePanelMeta() merges it into entry.session.meta, scheduleChromeRefresh()
|
|
943
|
+
// runs this, and the panel moves into / out of the ORCH row carrying the
|
|
944
|
+
// panel--role-orch class (the gold border + "ORCH " badge are pure CSS on
|
|
945
|
+
// that class). Returns true if any tile moved.
|
|
919
946
|
function reconcileOrchRow() {
|
|
920
947
|
const orchRow = document.getElementById('orch-pin-row');
|
|
921
948
|
const grid = document.getElementById('termGrid');
|
|
@@ -2177,6 +2204,64 @@
|
|
|
2177
2204
|
if (sel && sel.value !== resolved) sel.value = resolved;
|
|
2178
2205
|
}
|
|
2179
2206
|
|
|
2207
|
+
// Sprint 66 T1 (Task 1.3) — mark / unmark a LIVE panel as the orchestrator
|
|
2208
|
+
// in place. Brad's existing orchestrator panel was spawned with no role and
|
|
2209
|
+
// there was no way to set one short of destroy+recreate via the raw API.
|
|
2210
|
+
// This PATCHes meta.role (the Task 1.2 endpoint); on success the panel
|
|
2211
|
+
// moves into the pinned ORCH row and gains the gold border + "ORCH " badge
|
|
2212
|
+
// with no reload — reconcileOrchRow() (via refreshDashboardChrome) moves it.
|
|
2213
|
+
// Multi-orchestrator is allowed: marking panel B does not unmark panel A
|
|
2214
|
+
// (the ORCH row holds more than one; the operator explicitly unmarks). A
|
|
2215
|
+
// global function — invoked from the Overview-tab button's inline onclick.
|
|
2216
|
+
async function toggleOrchestratorRole(id) {
|
|
2217
|
+
const entry = state.sessions.get(id);
|
|
2218
|
+
if (!entry || entry._mounting || !entry.session) return;
|
|
2219
|
+
const current = entry.session.meta ? entry.session.meta.role : null;
|
|
2220
|
+
const next = nextRoleForToggle(current);
|
|
2221
|
+
const btn = document.getElementById(`orch-toggle-${id}`);
|
|
2222
|
+
if (btn) btn.disabled = true;
|
|
2223
|
+
try {
|
|
2224
|
+
const updated = await api('PATCH', `/api/sessions/${id}`, { role: next });
|
|
2225
|
+
// api() returns the parsed body; a non-2xx body is annotated with
|
|
2226
|
+
// `.error` (annotateApiFailure). The toggle only ever sends a
|
|
2227
|
+
// whitelisted value so a 400 should not occur — but a 404 (panel gone)
|
|
2228
|
+
// or a network failure can, and must not be applied as success.
|
|
2229
|
+
if (updated && updated.error) {
|
|
2230
|
+
console.error('[client] orchestrator-role toggle failed:', updated.error);
|
|
2231
|
+
return;
|
|
2232
|
+
}
|
|
2233
|
+
// Apply the authoritative server role from the PATCH response, then
|
|
2234
|
+
// re-route + re-skin the panel. The 2s status_broadcast converges to
|
|
2235
|
+
// the same value (eventually-consistent — same model as changeTheme).
|
|
2236
|
+
if (entry.session.meta) {
|
|
2237
|
+
entry.session.meta.role = (updated && updated.meta) ? updated.meta.role : next;
|
|
2238
|
+
}
|
|
2239
|
+
refreshDashboardChrome();
|
|
2240
|
+
} catch (err) {
|
|
2241
|
+
console.error('[client] orchestrator-role toggle error:', err);
|
|
2242
|
+
} finally {
|
|
2243
|
+
if (btn) btn.disabled = false;
|
|
2244
|
+
syncOrchToggle(id);
|
|
2245
|
+
}
|
|
2246
|
+
}
|
|
2247
|
+
|
|
2248
|
+
// Sprint 66 T1 (Task 1.3) — keep a panel's orch-toggle button in sync with
|
|
2249
|
+
// its current meta.role (label, active class, tooltip). Called after a
|
|
2250
|
+
// toggle and on every status_broadcast (updatePanelMeta), so the button is
|
|
2251
|
+
// correct even when the role is changed from another dashboard tab.
|
|
2252
|
+
function syncOrchToggle(id) {
|
|
2253
|
+
const entry = state.sessions.get(id);
|
|
2254
|
+
const btn = document.getElementById(`orch-toggle-${id}`);
|
|
2255
|
+
if (!entry || entry._mounting || !entry.session || !btn) return;
|
|
2256
|
+
const role = entry.session.meta ? entry.session.meta.role : null;
|
|
2257
|
+
const isOrch = isOrchestratorRole(role);
|
|
2258
|
+
btn.textContent = orchToggleLabel(role);
|
|
2259
|
+
btn.classList.toggle('is-orch', isOrch);
|
|
2260
|
+
btn.title = isOrch
|
|
2261
|
+
? 'Unmark this panel as the orchestrator'
|
|
2262
|
+
: 'Mark this panel as the orchestrator — gold border, ORCH badge, pinned row';
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2180
2265
|
async function askAI(id, question) {
|
|
2181
2266
|
if (!question.trim()) return;
|
|
2182
2267
|
const entry = state.sessions.get(id);
|
|
@@ -3405,6 +3490,11 @@
|
|
|
3405
3490
|
entry.session.meta = { ...entry.session.meta, ...meta };
|
|
3406
3491
|
}
|
|
3407
3492
|
|
|
3493
|
+
// Sprint 66 T1 (Task 1.3) — re-sync the orch-toggle button from the just-
|
|
3494
|
+
// merged role, so a role changed from another dashboard tab is reflected
|
|
3495
|
+
// here too (the per-tab toggle path syncs in its own finally block).
|
|
3496
|
+
syncOrchToggle(id);
|
|
3497
|
+
|
|
3408
3498
|
const dot = document.getElementById(`dot-${id}`);
|
|
3409
3499
|
const status = document.getElementById(`status-${id}`);
|
|
3410
3500
|
const metaLast = document.getElementById(`meta-last-${id}`);
|
|
@@ -694,6 +694,15 @@
|
|
|
694
694
|
.ctrl-btn:hover { color: var(--tg-text); border-color: var(--tg-border-active); }
|
|
695
695
|
.ctrl-btn.active { color: var(--tg-accent); border-color: var(--tg-accent-dim); }
|
|
696
696
|
|
|
697
|
+
/* Sprint 66 T1 (Task 1.3) — the "mark / unmark orchestrator" toggle in the
|
|
698
|
+
Overview controls. When the panel IS the orchestrator the button takes
|
|
699
|
+
the gold/amber accent — the same hue as the ORCH-pin border + badge — so
|
|
700
|
+
the control and the panel treatment read as one feature. */
|
|
701
|
+
.ctrl-btn.orch-toggle.is-orch {
|
|
702
|
+
color: var(--tg-accent-orch, #d4a017);
|
|
703
|
+
border-color: var(--tg-accent-orch, #d4a017);
|
|
704
|
+
}
|
|
705
|
+
|
|
697
706
|
.theme-select {
|
|
698
707
|
background: var(--tg-bg);
|
|
699
708
|
border: 1px solid var(--tg-border);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
You are {{lane_tag}} (auditor) in {{sprint_name}}, running in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence:
|
|
4
|
+
1. memory_recall(project="{{project_name}}", query="{{memory_query_lane}}")
|
|
5
|
+
2. memory_recall(query="{{memory_query_broad}}")
|
|
6
|
+
3. Read ~/.claude/CLAUDE.md and ./CLAUDE.md
|
|
7
|
+
4. Read {{sprint_dir}}/PLANNING.md
|
|
8
|
+
5. Read {{sprint_dir}}/STATUS.md
|
|
9
|
+
6. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative)
|
|
10
|
+
|
|
11
|
+
{{cross_lane_intel}}
|
|
12
|
+
|
|
13
|
+
Synchronize on LANDED (read this first). The build sprint produces code over time, not in one shot. Until ≥1 worker posts `### [T<n>] LANDED`, your AUDIT-REDs would be observations of the pre-build state, NOT failure findings. Do NOT issue FINAL-VERDICT until either: (a) the orchestrator closes the sprint explicitly, or (b) all worker lanes have posted DONE. While waiting, post `CHECKPOINT` (see mandate below) — do not idle silently.
|
|
14
|
+
|
|
15
|
+
Audit cycle per worker LANDED:
|
|
16
|
+
1. Read the LANDED post + the file:line evidence it cites.
|
|
17
|
+
2. Independently reproduce — do NOT borrow the worker's test fixture. Build a minimal payload from scratch.
|
|
18
|
+
3. On broken: `### [{{lane_tag}}] AUDIT-RED 2026-MM-DD HH:MM ET — <file:line + repro + reasoning>` routed to the owning worker lane.
|
|
19
|
+
4. On sound: record verified-pass for that LANDED inside the next CHECKPOINT post (no separate "GREEN" per item — only the final FINAL-VERDICT).
|
|
20
|
+
|
|
21
|
+
CHECKPOINT mandate (load-bearing). Post `### [{{lane_tag}}] CHECKPOINT 2026-MM-DD HH:MM ET — Phase N / <name>` at every phase boundary AND at least every 15 minutes of active work. Each CHECKPOINT includes (a) current phase + name, (b) what's verified so far with file:line, (c) what's pending, (d) most recent worker LANDED you were about to verify. STATUS.md is the only substrate that survives panel compaction; your in-context audit state does not.
|
|
22
|
+
|
|
23
|
+
Tooling-failure fallback (Sprint 1 Codex precedent). If your shell tooling appears to have died (commands return nothing, the panel is unresponsive to `cd` or `ls`), post a final TOOLING-FAILURE CHECKPOINT to STATUS.md with everything you verified up to that point. The orchestrator can spawn a codex-rescue subagent as the verification fallback. Do NOT silently abandon — the substrate-update is the orchestrator's safety net.
|
|
24
|
+
|
|
25
|
+
Audit tasks (sprint-specific):
|
|
26
|
+
{{audit_tasks}}
|
|
27
|
+
|
|
28
|
+
Discipline — post `### [{{lane_tag}}] AUDIT-RED / AUDIT-CONCERN / CHECKPOINT / FINAL-VERDICT 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely. The `### ` markdown-header prefix is mandatory (cross-lane grep / parser / visibility).
|
|
29
|
+
|
|
30
|
+
Run `{{test_command}}` independently against worker LANDED claims — baseline is {{baseline_suite_result}}; an auditor-side regression is itself a finding worth posting.
|
|
31
|
+
|
|
32
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`. The orchestrator handles commit at sprint close.
|
|
33
|
+
|
|
34
|
+
Then begin.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
You are the orchestrator for {{sprint_name}}, running in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence:
|
|
4
|
+
1. memory_recall(project="{{project_name}}", query="{{memory_query_lane}}")
|
|
5
|
+
2. memory_recall(query="{{memory_query_broad}}")
|
|
6
|
+
3. Read ~/.claude/CLAUDE.md and ./CLAUDE.md
|
|
7
|
+
4. Read {{sprint_dir}}/PLANNING.md
|
|
8
|
+
5. Read {{sprint_dir}}/STATUS.md (the substrate you will author into all sprint long — read whole-file, not just the tail)
|
|
9
|
+
6. Read each lane brief under {{sprint_dir}}/T*.md so you can adjudicate cross-lane FINDINGs
|
|
10
|
+
|
|
11
|
+
Your responsibilities:
|
|
12
|
+
- Inject T1/T2/T3/T4 via `POST /api/sprints/inject` once the panels are open. (If that endpoint is not yet available, fall back to the documented two-stage submit pattern: bracketed-paste body via `POST /api/sessions/:id/input`, settle 400ms, then `\r` alone.)
|
|
13
|
+
- Set up a recurring polling tick (default 270s — stays inside the prompt-cache window). Use `ScheduleWakeup` or `/loop` to fire the tick. On each tick:
|
|
14
|
+
(a) Read STATUS.md whole-file (NOT tail-only — workers post inside their own sections; tail-only polling misses mid-file LANDEDs).
|
|
15
|
+
(b) Read `meta.parked` per panel via `GET /api/sessions` (NOT `meta.status` — that field is documented unreliable; it stays "active using tools" indefinitely after a Claude Code panel hits its completion banner).
|
|
16
|
+
(c) Nudge parked lanes via `POST /api/sprints/nudge` with kind=`post-landed-reminder` / `status-check` as appropriate.
|
|
17
|
+
- Adjudicate cross-lane FINDINGs via `### [ORCH] RULING 2026-MM-DD HH:MM ET — <scope decision>`. Apply GAP-vs-EXPANSION discipline: a finding that exposes a gap INSIDE a locked sub-task's intent is in-scope; a finding that needs a genuinely separate sub-task is OUT-OF-SCOPE and gets deferred.
|
|
18
|
+
- Do NOT issue `[ORCH] STATUS` proxy-LANDED on a worker's behalf unless that worker's lane has clearly died (tooling-failure fallback). The default is to nudge the worker; proxy-LANDED is a last resort.
|
|
19
|
+
- Close the sprint with a single `### [ORCH] FINAL-VERDICT GREEN/RED 2026-MM-DD HH:MM ET — <verdict + suite counts>` post AFTER the auditor's amended FINAL-VERDICT and all workers' DONE posts.
|
|
20
|
+
- Polling stops on amended FINAL-VERDICT GREEN.
|
|
21
|
+
|
|
22
|
+
After the sprint closes (FINAL-VERDICT GREEN), execute the close-out protocol yourself — do NOT rely on lanes to self-harvest (panels can die between FINAL-VERDICT and `/exit`):
|
|
23
|
+
- Read STATUS.md whole-file as the durable record of every lane's work.
|
|
24
|
+
- Extract kitchen-level (not recipe-level) memories per `~/.claude/CLAUDE.md` § "Kitchen vs recipes — memory granularity". Prefer fewer, denser, cross-cutting principles over many shallow per-lane recipes.
|
|
25
|
+
- Call `memory_remember` for each kitchen-lesson (5–8 typical for a ~1hr sprint).
|
|
26
|
+
- Version bumps, CHANGELOG, BACKLOG updates, RESTART-PROMPT, gitleaks, commit, publish hand-off, push, tag.
|
|
27
|
+
|
|
28
|
+
During the sprint: do NOT bump versions, touch CHANGELOG, or `git commit`. Those happen only at close-out.
|
|
29
|
+
|
|
30
|
+
Then begin.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
You are {{lane_tag}} in {{sprint_name}}, running in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence:
|
|
4
|
+
1. memory_recall(project="{{project_name}}", query="{{memory_query_lane}}")
|
|
5
|
+
2. memory_recall(query="{{memory_query_broad}}")
|
|
6
|
+
3. Read ~/.claude/CLAUDE.md and ./CLAUDE.md
|
|
7
|
+
4. Read {{sprint_dir}}/PLANNING.md
|
|
8
|
+
5. Read {{sprint_dir}}/STATUS.md
|
|
9
|
+
6. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative)
|
|
10
|
+
|
|
11
|
+
{{cross_lane_intel}}
|
|
12
|
+
|
|
13
|
+
Discipline — post `### [{{lane_tag}}] FINDING / PROPOSE / LANDED / DONE 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely as you work. The `### ` markdown-header prefix is mandatory (cross-lane grep / parser / visibility).
|
|
14
|
+
|
|
15
|
+
Done-when (mandatory): your task is NOT complete when local tests pass. It is complete only when ALL of these are true:
|
|
16
|
+
(a) Tests green (`{{test_command}}` ≤ baseline {{baseline_suite_result}}).
|
|
17
|
+
(b) `### [{{lane_tag}}] LANDED 2026-MM-DD HH:MM ET — <gist>` posted to {{sprint_dir}}/STATUS.md with file:line evidence + the exact test command + result.
|
|
18
|
+
(c) Auditor has had a chance to react — do not idle for 10+ minutes after posting LANDED.
|
|
19
|
+
|
|
20
|
+
The TermDeck panel-status API does not refresh when you reach your Claude Code completion banner ("Cogitated/Churned/Brewed/Cooked for Nm Ns" in gray). Your LANDED post on STATUS.md is the ONLY signal of done-ness reaching the orchestrator + auditor.
|
|
21
|
+
|
|
22
|
+
If you find a bug in another lane's code, post `### [{{lane_tag}}] FINDING 2026-MM-DD HH:MM ET → ROUTED TO T<m> — <file:line + reasoning>`. Do NOT silently work around it. Orchestrator adjudicates with `### [ORCH] RULING`.
|
|
23
|
+
|
|
24
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`. The orchestrator handles commit at sprint close.
|
|
25
|
+
|
|
26
|
+
Then begin.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
You are {{lane_tag}} (auditor) in {{sprint_name}}, running on the Codex CLI in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence:
|
|
4
|
+
1. Run `date` to time-stamp.
|
|
5
|
+
2. memory_recall(project="{{project_name}}", query="{{memory_query_lane}}")
|
|
6
|
+
(Mnestra MCP is wired into Codex via ~/.codex/config.toml. If memory_recall is unavailable, grep ~/.claude/projects/.../memory/ as a fallback.)
|
|
7
|
+
3. memory_recall(query="{{memory_query_broad}}")
|
|
8
|
+
4. Read ./AGENTS.md (Codex's canonical project router; auto-generated mirror of CLAUDE.md).
|
|
9
|
+
5. Read {{sprint_dir}}/PLANNING.md
|
|
10
|
+
6. Read {{sprint_dir}}/STATUS.md
|
|
11
|
+
7. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative)
|
|
12
|
+
|
|
13
|
+
{{cross_lane_intel}}
|
|
14
|
+
|
|
15
|
+
Synchronize on LANDED (read this first). The build sprint produces code over time, not in one shot. Until ≥1 worker posts `### [T<n>] LANDED`, your AUDIT-REDs would be observations of the pre-build state, NOT failure findings. Do NOT issue FINAL-VERDICT until either: (a) the orchestrator closes the sprint explicitly, or (b) all worker lanes have posted DONE.
|
|
16
|
+
|
|
17
|
+
Audit cycle per worker LANDED:
|
|
18
|
+
1. Read the LANDED post + the file:line evidence it cites.
|
|
19
|
+
2. Independently reproduce — do NOT borrow the worker's test fixture. Build a minimal payload from scratch.
|
|
20
|
+
3. On broken: `### [{{lane_tag}}] AUDIT-RED 2026-MM-DD HH:MM ET — <file:line + repro + reasoning>` routed to the owning worker.
|
|
21
|
+
4. On sound: record verified-pass for that LANDED inside the next CHECKPOINT post.
|
|
22
|
+
|
|
23
|
+
CHECKPOINT mandate (load-bearing). Post `### [{{lane_tag}}] CHECKPOINT 2026-MM-DD HH:MM ET — Phase N / <name>` at every phase boundary AND at least every 15 minutes of active work. STATUS.md is the only substrate that survives panel compaction; your in-context audit state does not.
|
|
24
|
+
|
|
25
|
+
Tooling-failure fallback. If your shell or MCP tooling fails (commands return nothing, hang, etc.), post a TOOLING-FAILURE CHECKPOINT to STATUS.md with what's verified so far. The orchestrator can spawn a fallback verification subagent.
|
|
26
|
+
|
|
27
|
+
Audit tasks (sprint-specific):
|
|
28
|
+
{{audit_tasks}}
|
|
29
|
+
|
|
30
|
+
Discipline — post `### [{{lane_tag}}] AUDIT-RED / AUDIT-CONCERN / CHECKPOINT / FINAL-VERDICT 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely. The `### ` markdown-header prefix is mandatory.
|
|
31
|
+
|
|
32
|
+
Run `{{test_command}}` independently against worker LANDED claims — baseline is {{baseline_suite_result}}.
|
|
33
|
+
|
|
34
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`.
|
|
35
|
+
|
|
36
|
+
Then begin.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
You are {{lane_tag}} in {{sprint_name}}, running on the Codex CLI in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence:
|
|
4
|
+
1. Run `date` to time-stamp.
|
|
5
|
+
2. memory_recall(project="{{project_name}}", query="{{memory_query_lane}}")
|
|
6
|
+
(Mnestra MCP is wired into Codex via ~/.codex/config.toml [mcp_servers.mnestra]. If memory_recall is unavailable, fall back to grepping the project memory directory under ~/.claude/projects/.)
|
|
7
|
+
3. memory_recall(query="{{memory_query_broad}}")
|
|
8
|
+
4. Read ./AGENTS.md (auto-generated mirror of CLAUDE.md via scripts/sync-agent-instructions.js — canonical content lives in CLAUDE.md but AGENTS.md is what Codex reads natively).
|
|
9
|
+
5. Read {{sprint_dir}}/PLANNING.md
|
|
10
|
+
6. Read {{sprint_dir}}/STATUS.md
|
|
11
|
+
7. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative)
|
|
12
|
+
|
|
13
|
+
{{cross_lane_intel}}
|
|
14
|
+
|
|
15
|
+
Discipline — post `### [{{lane_tag}}] FINDING / PROPOSE / LANDED / DONE 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely as you work. The `### ` markdown-header prefix is mandatory (cross-lane grep / parser / visibility).
|
|
16
|
+
|
|
17
|
+
Done-when (mandatory): your task is NOT complete when local tests pass. It is complete only when ALL of these are true:
|
|
18
|
+
(a) Tests green (`{{test_command}}` ≤ baseline {{baseline_suite_result}}).
|
|
19
|
+
(b) `### [{{lane_tag}}] LANDED 2026-MM-DD HH:MM ET — <gist>` posted to {{sprint_dir}}/STATUS.md with file:line evidence + the exact test command + result.
|
|
20
|
+
(c) Auditor has had a chance to react — do not idle for 10+ minutes after posting LANDED.
|
|
21
|
+
|
|
22
|
+
The TermDeck panel-status API does not refresh when you reach your Codex completion banner. Your LANDED post on STATUS.md is the ONLY signal of done-ness reaching the orchestrator + auditor.
|
|
23
|
+
|
|
24
|
+
If you find a bug in another lane's code, post `### [{{lane_tag}}] FINDING 2026-MM-DD HH:MM ET → ROUTED TO T<m> — <file:line + reasoning>`. Do NOT silently work around it. Orchestrator adjudicates with `### [ORCH] RULING`.
|
|
25
|
+
|
|
26
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`. The orchestrator handles commit at sprint close.
|
|
27
|
+
|
|
28
|
+
Then begin.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
You are {{lane_tag}} (auditor) in {{sprint_name}}, running on the Gemini CLI in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence (Gemini does NOT have Mnestra MCP by default — the brief is self-contained; start there):
|
|
4
|
+
1. Run `date` to time-stamp.
|
|
5
|
+
2. Read ./GEMINI.md (Gemini's canonical project router).
|
|
6
|
+
3. Read {{sprint_dir}}/PLANNING.md
|
|
7
|
+
4. Read {{sprint_dir}}/STATUS.md
|
|
8
|
+
5. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative; this brief is self-contained because Gemini cannot recall memory).
|
|
9
|
+
|
|
10
|
+
{{cross_lane_intel}}
|
|
11
|
+
|
|
12
|
+
Synchronize on LANDED (read this first). The build sprint produces code over time, not in one shot. Until ≥1 worker posts `### [T<n>] LANDED`, your AUDIT-REDs would be observations of the pre-build state, NOT failure findings. Do NOT issue FINAL-VERDICT until either: (a) the orchestrator closes the sprint explicitly, or (b) all worker lanes have posted DONE.
|
|
13
|
+
|
|
14
|
+
Audit cycle per worker LANDED:
|
|
15
|
+
1. Read the LANDED post + the file:line evidence it cites.
|
|
16
|
+
2. Independently reproduce — do NOT borrow the worker's test fixture. Build a minimal payload from scratch.
|
|
17
|
+
3. On broken: `### [{{lane_tag}}] AUDIT-RED 2026-MM-DD HH:MM ET — <file:line + repro + reasoning>` routed to the owning worker.
|
|
18
|
+
4. On sound: record verified-pass for that LANDED inside the next CHECKPOINT post.
|
|
19
|
+
|
|
20
|
+
CHECKPOINT mandate (load-bearing). Post `### [{{lane_tag}}] CHECKPOINT 2026-MM-DD HH:MM ET — Phase N / <name>` at every phase boundary AND at least every 15 minutes of active work. STATUS.md is the only substrate that survives panel compaction.
|
|
21
|
+
|
|
22
|
+
Tooling-failure fallback. If your shell tooling fails, post a TOOLING-FAILURE CHECKPOINT with what's verified so far.
|
|
23
|
+
|
|
24
|
+
Audit tasks (sprint-specific):
|
|
25
|
+
{{audit_tasks}}
|
|
26
|
+
|
|
27
|
+
Discipline — post `### [{{lane_tag}}] AUDIT-RED / AUDIT-CONCERN / CHECKPOINT / FINAL-VERDICT 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely.
|
|
28
|
+
|
|
29
|
+
Run `{{test_command}}` independently against worker LANDED claims — baseline is {{baseline_suite_result}}.
|
|
30
|
+
|
|
31
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`.
|
|
32
|
+
|
|
33
|
+
Then begin.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
You are {{lane_tag}} in {{sprint_name}}, running on the Gemini CLI in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence (Gemini does NOT have Mnestra MCP by default — the lane brief is self-contained; start there):
|
|
4
|
+
1. Run `date` to time-stamp.
|
|
5
|
+
2. Read ./GEMINI.md (Gemini's canonical project router — auto-generated mirror of CLAUDE.md via scripts/sync-agent-instructions.js).
|
|
6
|
+
3. Read {{sprint_dir}}/PLANNING.md
|
|
7
|
+
4. Read {{sprint_dir}}/STATUS.md
|
|
8
|
+
5. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative; this brief is self-contained because Gemini cannot recall memory).
|
|
9
|
+
|
|
10
|
+
{{cross_lane_intel}}
|
|
11
|
+
|
|
12
|
+
Discipline — post `### [{{lane_tag}}] FINDING / PROPOSE / LANDED / DONE 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely as you work. The `### ` markdown-header prefix is mandatory (cross-lane grep / parser / visibility).
|
|
13
|
+
|
|
14
|
+
Done-when (mandatory): your task is NOT complete when local tests pass. It is complete only when ALL of these are true:
|
|
15
|
+
(a) Tests green (`{{test_command}}` ≤ baseline {{baseline_suite_result}}).
|
|
16
|
+
(b) `### [{{lane_tag}}] LANDED 2026-MM-DD HH:MM ET — <gist>` posted to {{sprint_dir}}/STATUS.md with file:line evidence + the exact test command + result.
|
|
17
|
+
(c) Auditor has had a chance to react — do not idle for 10+ minutes after posting LANDED.
|
|
18
|
+
|
|
19
|
+
The TermDeck panel-status API does not refresh when you reach your Gemini completion banner. Your LANDED post on STATUS.md is the ONLY signal of done-ness reaching the orchestrator + auditor.
|
|
20
|
+
|
|
21
|
+
If you find a bug in another lane's code, post `### [{{lane_tag}}] FINDING 2026-MM-DD HH:MM ET → ROUTED TO T<m> — <file:line + reasoning>`. Do NOT silently work around it. Orchestrator adjudicates with `### [ORCH] RULING`.
|
|
22
|
+
|
|
23
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`. The orchestrator handles commit at sprint close.
|
|
24
|
+
|
|
25
|
+
Then begin.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
You are {{lane_tag}} (auditor) in {{sprint_name}}, running on the Grok CLI (SuperGrok Heavy) in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence (Grok does NOT have Mnestra MCP by default — the brief is self-contained; start there):
|
|
4
|
+
1. Run `date` to time-stamp.
|
|
5
|
+
2. Read ./AGENTS.md (Grok's canonical project router, shared with Codex).
|
|
6
|
+
3. Read {{sprint_dir}}/PLANNING.md
|
|
7
|
+
4. Read {{sprint_dir}}/STATUS.md
|
|
8
|
+
5. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative; this brief is self-contained because Grok cannot recall memory).
|
|
9
|
+
|
|
10
|
+
{{cross_lane_intel}}
|
|
11
|
+
|
|
12
|
+
Adversarial mindset (load-bearing — this is your single most important responsibility). You are the only model in this sprint NOT sharing training history with the worker lanes. Your audit ROI comes from independently reproducing every claim — do NOT borrow worker fixtures, do NOT trust worker self-tests, do NOT accept "tests green" as evidence the design is sound. Worker LANDED posts are claims; you verify with your own minimal payloads against the actual disk state.
|
|
13
|
+
|
|
14
|
+
Synchronize on LANDED (read this first). The build sprint produces code over time, not in one shot. Until ≥1 worker posts `### [T<n>] LANDED`, your AUDIT-REDs would be observations of the pre-build state, NOT failure findings. Do NOT issue FINAL-VERDICT until either: (a) the orchestrator closes the sprint explicitly, or (b) all worker lanes have posted DONE.
|
|
15
|
+
|
|
16
|
+
Audit cycle per worker LANDED:
|
|
17
|
+
1. Read the LANDED post + the file:line evidence it cites.
|
|
18
|
+
2. Reproduce from scratch — build a minimal payload yourself, do NOT borrow worker fixtures.
|
|
19
|
+
3. On broken: `### [{{lane_tag}}] AUDIT-RED 2026-MM-DD HH:MM ET — <file:line + repro + reasoning>` routed to the owning worker.
|
|
20
|
+
4. On sound: record verified-pass for that LANDED inside the next CHECKPOINT post.
|
|
21
|
+
|
|
22
|
+
CHECKPOINT mandate (load-bearing). Post `### [{{lane_tag}}] CHECKPOINT 2026-MM-DD HH:MM ET — Phase N / <name>` at every phase boundary AND at least every 15 minutes of active work. STATUS.md is the only substrate that survives panel compaction.
|
|
23
|
+
|
|
24
|
+
Tooling-failure fallback. If your shell tooling fails, post a TOOLING-FAILURE CHECKPOINT with what's verified so far. The orchestrator can spawn a fallback verification subagent.
|
|
25
|
+
|
|
26
|
+
Audit tasks (sprint-specific):
|
|
27
|
+
{{audit_tasks}}
|
|
28
|
+
|
|
29
|
+
Discipline — post `### [{{lane_tag}}] AUDIT-RED / AUDIT-CONCERN / CHECKPOINT / FINAL-VERDICT 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely.
|
|
30
|
+
|
|
31
|
+
Run `{{test_command}}` independently against worker LANDED claims — baseline is {{baseline_suite_result}}.
|
|
32
|
+
|
|
33
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`.
|
|
34
|
+
|
|
35
|
+
Then begin.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
You are {{lane_tag}} in {{sprint_name}}, running on the Grok CLI (SuperGrok Heavy) in {{project_name}} at {{project_path}}.
|
|
2
|
+
|
|
3
|
+
Boot sequence (Grok does NOT have Mnestra MCP by default — the lane brief is self-contained; start there):
|
|
4
|
+
1. Run `date` to time-stamp.
|
|
5
|
+
2. Read ./AGENTS.md (Grok's canonical project router; auto-generated mirror of CLAUDE.md, shared with Codex).
|
|
6
|
+
3. Read {{sprint_dir}}/PLANNING.md
|
|
7
|
+
4. Read {{sprint_dir}}/STATUS.md
|
|
8
|
+
5. Read {{sprint_dir}}/{{lane_brief}} (your full briefing — authoritative; this brief is self-contained because Grok cannot recall memory).
|
|
9
|
+
|
|
10
|
+
{{cross_lane_intel}}
|
|
11
|
+
|
|
12
|
+
Discipline — post `### [{{lane_tag}}] FINDING / PROPOSE / LANDED / DONE 2026-MM-DD HH:MM ET — <gist>` to {{sprint_dir}}/STATUS.md verbosely as you work. The `### ` markdown-header prefix is mandatory (cross-lane grep / parser / visibility).
|
|
13
|
+
|
|
14
|
+
Done-when (mandatory): your task is NOT complete when local tests pass. It is complete only when ALL of these are true:
|
|
15
|
+
(a) Tests green (`{{test_command}}` ≤ baseline {{baseline_suite_result}}).
|
|
16
|
+
(b) `### [{{lane_tag}}] LANDED 2026-MM-DD HH:MM ET — <gist>` posted to {{sprint_dir}}/STATUS.md with file:line evidence + the exact test command + result.
|
|
17
|
+
(c) Auditor has had a chance to react — do not idle for 10+ minutes after posting LANDED.
|
|
18
|
+
|
|
19
|
+
The TermDeck panel-status API does not refresh when you reach your Grok completion banner. Your LANDED post on STATUS.md is the ONLY signal of done-ness reaching the orchestrator + auditor.
|
|
20
|
+
|
|
21
|
+
If you find a bug in another lane's code, post `### [{{lane_tag}}] FINDING 2026-MM-DD HH:MM ET → ROUTED TO T<m> — <file:line + reasoning>`. Do NOT silently work around it. Orchestrator adjudicates with `### [ORCH] RULING`.
|
|
22
|
+
|
|
23
|
+
Don't bump versions, don't touch CHANGELOG, don't `git commit`. The orchestrator handles commit at sprint close.
|
|
24
|
+
|
|
25
|
+
Then begin.
|