…
.sp-opt{display:flex;gap:10px;align-items:flex-start;cursor:pointer;background:color-mix(in srgb,var(--lv) 9%,var(--card));border:1px solid color-mix(in srgb,var(--lv) 35%,var(--line));border-radius:12px;padding:12px 14px}
.sp-opt input{width:20px;height:20px;margin:2px 0 0;accent-color:var(--lv);flex:none}.sp-opt b{display:block}.sp-opt span{color:var(--soft);font-size:14px}
-.sp-go{border:0;cursor:pointer;padding:14px 30px;border-radius:999px;background:var(--lv);color:#111;font:800 1.3em/1.2 var(--body);box-shadow:0 2px 8px rgba(0,0,0,.18)}.sp-go:disabled{opacity:.6;cursor:default}
+.sp-go{border:0;cursor:pointer;padding:14px 30px;border-radius:999px;background:var(--lv);color:#111;font:800 1.3em/1.2 var(--body);box-shadow:0 2px 8px rgba(0,0,0,.18)}.sp-go:disabled,.sp-go[aria-disabled="true"]{opacity:1;cursor:default;box-shadow:none;background:color-mix(in srgb,var(--lv) 14%,var(--card));border:1.5px dashed color-mix(in srgb,var(--lv) 80%,var(--line));color:color-mix(in srgb,var(--ink) 80%,var(--card));pointer-events:none}
.sp-say{display:block;margin-top:8px;color:var(--rose);font-size:13px;min-height:1em}
.cards{display:grid;gap:12px;max-width:720px}
…
<p>Send ideas from <a href="/thoughts" data-go>Thoughts</a>: they go to your designer. See who is up, and on what, in <a href="/agents" data-go>Agents</a>; the work moves through the <a href="/pipeline" data-go>pipeline</a>.</p></div>
</div>
+<p style="margin-top:28px"><a class="sp-go" href="/" id="sp-dash" aria-disabled="true" title="Lights up when one of your agents connects" style="text-decoration:none;display:inline-block">ok, start playing →</a></p>
-<p style="margin-top:28px"><a class="sp-go" href="/" id="sp-dash" style="text-decoration:none;display:inline-block">ok, start playing →</a></p>
</div>
<script>
…
if(r.status===410){if(Date.parse(l.expires)>Date.now())l.claimed=true;else l.gone=true;ch=1}}catch(_){}}
try{const a=await api("GET","/api/v2/agents");const rows=(a&&(a.data||a.agents))||[];
+ rows.forEach(s=>{const r=s.role==="coder"?"builder":s.role;const l=links[r];if(l&&!l.up&&s.at>=since&&s.state!=="gone"){l.up=(s.agent||"")+" · "+s.state;ch=1;playOn()}})}catch(_){}
- rows.forEach(s=>{const r=s.role==="coder"?"builder":s.role;const l=links[r];if(l&&!l.up&&s.at>=since&&s.state!=="gone"){l.up=(s.agent||"")+" · "+s.state;ch=1}})}catch(_){}
if(ch)draw()};
setInterval(poll,5000);
…
if(Object.keys(links).length&&!P.door){made.roles=1;const d3=document.querySelector('#where [data-door="3"]');if(d3)d3.click();$("#step2").hidden=false;draw();poll()}
// Open my dashboard: the onboarding's end, the dashboard becomes home
+// ok, start playing waits for an AI: lit once one connects here (now, or already before: GET /api/v2/me aiConnected)
+const playOn=()=>{const b=document.getElementById("play")||document.getElementById("sp-dash");if(!b)return;b.disabled=false;b.removeAttribute("aria-disabled");b.title=""};
+api("GET","/api/v2/me").then(m=>{if(m&&m.aiConnected)playOn()},()=>{});
$("#sp-dash").onclick=async e=>{e.preventDefault();try{await api("POST","/api/v2/project/home",{to:"dashboard"})}catch(x){const t=String(x&&x.message||x);if(!/E_SCOPE|E_FORBIDDEN|E_NOT_FOUND|403/.test(t)){$("#sp-say").textContent=msg(x);return}}go("/")};
})();
…