/* ============================================================================
   DIVONCI WORLD — AGENT DEVELOPMENT (governance cockpit)
   (screens_agent_development.jsx)
   ----------------------------------------------------------------------------
   Agent Development is the evidence-governed path to EARN tool-execution
   authority. It is NOT the Arsenal (tool library) and NOT the Command Console
   (identity/personality). Here live: trust, restrictions, delegated owners,
   evidence gates, training, evaluations, and the development timeline.

   Data comes from the live Worker snapshot via window.DWSnapshot (Supabase
   mode) with a clearly-labelled fixture fallback. Every block derives from the
   snapshot — nothing is hardcoded into the views. Writes are Worker-gated.
   ========================================================================== */
const { useState: useStateAd, useMemo: useMemoAd, useEffect: useEffectAd } = React;

/* ── live snapshot hook ───────────────────────────────────────────────────── */
function useSnapshot() {
  const [, force] = useStateAd(0);
  useEffectAd(() => {
    const un = DWSnapshot.subscribe(() => force((n) => n + 1));
    DWSnapshot.load();
    return un;
  }, []);
  return { snap: DWSnapshot.get(), state: DWSnapshot.state(), source: DWSnapshot.source(), error: DWSnapshot.error() };
}

/* trust / level doctrine (taxonomy) lives in dev_data.js → DEVD */

/* ── tiny helpers ─────────────────────────────────────────────────────────── */
function agentFrom(snap, id) {
  return (snap.agents || []).find((a) => a.id === id) ||
    (typeof DW !== "undefined" && DW.agent ? DW.agent(id) : null) ||
    { id, name: id, accent: "var(--ink-3)", domain: "", role: "" };
}
const OWNER_LABEL = { diego: "Diego · Sovereign" };

function AgentAvatar({ agent, size = 30 }) {
  const ac = agent.accent || agent.ac || "var(--violet-bright)";
  const head = agent.head && typeof window.assetUrl === "function" ? window.assetUrl(agent.head) : agent.head;
  if (head) return <img src={head} alt={agent.name} style={{ width: size, height: size, borderRadius: 8, objectFit: "cover", border: `1px solid color-mix(in srgb, ${ac} 55%, transparent)`, flex: "none" }} />;
  return (
    <span style={{ width: size, height: size, borderRadius: 8, flex: "none", display: "grid", placeItems: "center",
      background: `color-mix(in srgb, ${ac} 20%, var(--panel-2))`, border: `1px solid color-mix(in srgb, ${ac} 45%, transparent)`,
      color: ac, fontFamily: "var(--font-display)", fontWeight: 700, fontSize: size * 0.42 }}>
      {(agent.name || "?").slice(0, 1).toUpperCase()}
    </span>
  );
}

function OwnerChip({ id, snap }) {
  if (OWNER_LABEL[id]) return <span className="evchip" style={{ borderColor: "color-mix(in srgb, var(--gold) 45%, transparent)", color: "var(--gold-bright)" }}><Icon name="crown" style={{ width: 11, height: 11 }} />{OWNER_LABEL[id]}</span>;
  const a = agentFrom(snap, id);
  return <span className="evchip" style={{ borderColor: `color-mix(in srgb, ${a.accent || a.ac} 40%, transparent)` }}><span style={{ width: 6, height: 6, borderRadius: 99, background: a.accent || a.ac, flex: "none" }} />{a.name}</span>;
}

function TrustBadge({ trust }) {
  const m = DEVD.trustMeta(trust);
  const c = DW.STATE_META[m.state].c;
  return <span className="sbadge" style={{ color: c, borderColor: `color-mix(in srgb, ${c} 40%, transparent)` }} title={m.blurb}><span className="led" style={{ background: c, color: c }} />{m.label}</span>;
}

function DevWarning({ text, icon = "shield", tone = "caution" }) {
  const c = "var(--state-" + tone + ")";
  return (
    <div style={{ display: "flex", alignItems: "center", gap: 11, padding: "11px 14px", borderRadius: 9,
      background: `color-mix(in srgb, ${c} 9%, var(--panel-2))`, border: `1px solid color-mix(in srgb, ${c} 34%, transparent)` }}>
      <Icon name={icon} style={{ width: 15, height: 15, color: c, flex: "none" }} />
      <span style={{ fontSize: 12.5, color: "var(--ink-2)", lineHeight: 1.45 }}>{text}</span>
    </div>
  );
}

function DevBlankRow({ icon = "skill", title, hint }) {
  return (
    <div style={{ padding: "20px 16px", textAlign: "center" }}>
      <Icon name={icon} style={{ width: 18, height: 18, color: "var(--ink-4)" }} />
      <div style={{ fontSize: 13, color: "var(--ink-2)", marginTop: 9, fontWeight: 500 }}>{title}</div>
      {hint && <div style={{ fontSize: 11.5, color: "var(--ink-4)", lineHeight: 1.5, maxWidth: 320, margin: "5px auto 0" }}>{hint}</div>}
    </div>
  );
}

/* ── competence ladder (0–5) ──────────────────────────────────────────────── */
function LevelLadder({ current, target, compact }) {
  const ci = current == null ? -1 : current, ti = target == null ? -1 : target;
  return (
    <div style={{ display: "grid", gridTemplateColumns: `repeat(${DEVD.LEVELS.length}, 1fr)`, gap: 6 }}>
      {DEVD.LEVELS.map((lv, i) => {
        const isCur = i === ci, isTgt = i === ti, inPath = ci >= 0 && ti >= 0 && i > ci && i <= ti;
        const accent = isCur ? "var(--state-active)" : isTgt ? "var(--state-caution)" : inPath ? "var(--violet-ink)" : "var(--ink-4)";
        return (
          <div key={lv.id} title={lv.label + " · " + lv.blurb} style={{
            padding: compact ? "6px 5px" : "9px 8px", borderRadius: 7, textAlign: "center",
            border: `1px solid ${isCur || isTgt ? `color-mix(in srgb, ${accent} 50%, transparent)` : "var(--hairline-2)"}`,
            background: isCur ? "color-mix(in srgb, var(--state-active) 12%, transparent)" : isTgt ? "color-mix(in srgb, var(--state-caution) 10%, transparent)" : "var(--panel-2)",
            opacity: ci < 0 && ti < 0 ? 0.5 : (isCur || isTgt || inPath || i <= ci ? 1 : 0.45) }}>
            <div style={{ fontFamily: "var(--font-mono)", fontSize: 11, fontWeight: 600, color: accent }}>{lv.id}</div>
            {!compact && <div style={{ fontSize: 9.5, color: "var(--ink-3)", marginTop: 3, overflowWrap: "anywhere", lineHeight: 1.25 }}>{lv.label}</div>}
            {isCur && <div style={{ fontFamily: "var(--font-mono)", fontSize: 7.5, color: "var(--state-active)", letterSpacing: "0.12em", marginTop: 3 }}>NOW</div>}
            {isTgt && <div style={{ fontFamily: "var(--font-mono)", fontSize: 7.5, color: "var(--state-caution)", letterSpacing: "0.12em", marginTop: 3 }}>TARGET</div>}
          </div>
        );
      })}
    </div>
  );
}

/* ── source badge + connect control ───────────────────────────────────────── */
function SourceControl({ state, source }) {
  const [open, setOpen] = useStateAd(false);
  const [base, setBase] = useStateAd(() => { try { return localStorage.getItem("dw_api_base") || "https://api.divonci.world"; } catch (e) { return "https://api.divonci.world"; } });
  const [token, setToken] = useStateAd("");
  const live = state === "live";
  const tone = live ? "clear" : state === "error" ? "crisis" : state === "loading" ? "active" : "caution";
  const c = DW.STATE_META[tone].c;
  const label = live ? "LIVE" : state === "loading" ? "LOADING" : state === "error" ? "API UNAVAILABLE" : "FIXTURE";
  return (
    <div style={{ position: "relative" }}>
      <button className="sbadge focusable" style={{ color: c, borderColor: `color-mix(in srgb, ${c} 40%, transparent)`, cursor: "pointer" }} onClick={() => setOpen((o) => !o)} title={"source: " + source}>
        <span className="led" style={{ background: c, color: c }} />{label}
        <span className="tag" style={{ marginLeft: 2 }}>{live ? "supabase" : "src"}</span>
      </button>
      {open && (
        <div style={{ position: "absolute", right: 0, top: "calc(100% + 8px)", zIndex: 40, width: 300, padding: 14, borderRadius: 11, background: "var(--panel)", border: "1px solid var(--hairline-2)", boxShadow: "var(--shadow-2)" }}>
          <div style={{ fontSize: 12.5, fontWeight: 600, marginBottom: 4 }}>Connect to live Worker</div>
          <div style={{ fontSize: 11, color: "var(--ink-3)", lineHeight: 1.5, marginBottom: 10 }}>Source: <span style={{ fontFamily: "var(--font-mono)" }}>{source}</span>. The token is stored only in this browser (localStorage) and never written into source.</div>
          <label className="dev-field"><span>Worker base URL</span>
            <input className="twk-field" value={base} onChange={(e) => setBase(e.target.value)} placeholder="https://api.divonci.world" />
          </label>
          <label className="dev-field" style={{ marginTop: 9 }}><span>API token</span>
            <input className="twk-field" type="password" value={token} onChange={(e) => setToken(e.target.value)} placeholder="DIVONCI_WORLD_API_TOKEN" />
          </label>
          <div style={{ display: "flex", gap: 8, marginTop: 12 }}>
            <button className="btn primary" style={{ flex: 1 }} disabled={!token} onClick={() => { DWSnapshot.setConfig(base, token); setToken(""); setOpen(false); }}>
              <Icon name="globe" className="glyph" style={{ width: 13, height: 13 }} /> Connect
            </button>
            <button className="btn ghost" onClick={() => { DWSnapshot.useFixture(); setOpen(false); }}>Use fixture</button>
          </div>
        </div>
      )}
    </div>
  );
}

/* ════════════════════════════════════════════════════════════════════════════
   TOOL AUTHORITY — use vs execute vs admin (governed access ≠ competence)
   ════════════════════════════════════════════════════════════════════════ */
function ToolAuthority({ agentId, snap }) {
  const cats = useMemoAd(() => { const m = {}; (snap.toolCategories || []).forEach((c) => (m[c.id] = c.name)); return m; }, [snap.toolCategories]);
  const tools = useMemoAd(() => { const m = {}; (snap.tools || []).forEach((t) => (m[t.id] = t)); return m; }, [snap.tools]);
  const perms = useMemoAd(() => (snap.toolPermissions || []).filter((p) => p.agent_id === agentId), [snap.toolPermissions, agentId]);

  const rank = (p) => (p.can_admin ? 0 : p.can_execute ? 1 : 2);
  const rows = useMemoAd(() => perms.slice().sort((a, b) => rank(a) - rank(b) || ((tools[a.tool_id] || {}).name || a.tool_id).localeCompare((tools[b.tool_id] || {}).name || b.tool_id)), [perms, tools]);
  const exec = perms.filter((p) => p.can_execute).length;
  const admin = perms.filter((p) => p.can_admin).length;
  const blocked = perms.filter((p) => p.can_use && !p.can_execute && !p.can_admin).length;

  const Cell = ({ on, kind }) => (
    <span style={{ display: "inline-flex", justifyContent: "center", width: "100%" }}>
      {on
        ? <span title={kind} style={{ fontFamily: "var(--font-mono)", fontSize: 10, fontWeight: 600, color: kind === "admin" ? "var(--violet-ink)" : "var(--state-clear)" }}>✓</span>
        : <span style={{ color: "var(--ink-5, var(--ink-4))", opacity: 0.4 }}>·</span>}
    </span>
  );

  return (
    <Panel className="tight" style={{ gridColumn: "1 / -1" }}>
      <PHead icon="chip" eyebrow="Tool authority · access vs execution"
        right={<span style={{ fontFamily: "var(--font-mono)", fontSize: 10.5, color: "var(--ink-3)" }}>{perms.length} accessible · {exec} exec · {admin} admin · <span style={{ color: "var(--state-caution)" }}>{blocked} exec-blocked</span></span>} />
      <div style={{ padding: "12px 16px 0" }}><DevWarning text={DEVD.COPY.accessTrust + " Use/inspect is granted; execution stays delegated until evidence gates pass."} icon="shield" /></div>
      {perms.length === 0
        ? <DevBlankRow icon="chip" title="No tool authority in this snapshot." hint="Tool permissions load per agent from the live snapshot." />
        : (
          <div className="ta-wrap">
            <div className="ta-row ta-head">
              <span>Tool</span><span className="ta-hide-sm">Category</span><span className="ta-hide-sm">Type</span>
              <span style={{ textAlign: "center" }}>Use</span><span style={{ textAlign: "center" }}>Exec</span><span style={{ textAlign: "center" }}>Admin</span>
            </div>
            {rows.map((p) => { const t = tools[p.tool_id] || { name: p.tool_id }; const isBlocked = p.can_use && !p.can_execute && !p.can_admin; return (
              <div key={p.id} className="ta-row">
                <span style={{ display: "inline-flex", alignItems: "center", gap: 8, minWidth: 0 }}>
                  <span style={{ fontSize: 12.5, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{t.name}</span>
                  {isBlocked && <span className="todochip" style={{ fontSize: 8, color: "var(--state-caution)" }}>exec-blocked</span>}
                </span>
                <span className="ta-hide-sm" style={{ fontFamily: "var(--font-mono)", fontSize: 10.5, color: "var(--ink-3)" }}>{cats[t.category_id] || t.category_id || "—"}</span>
                <span className="ta-hide-sm" style={{ fontFamily: "var(--font-mono)", fontSize: 10.5, color: "var(--ink-4)" }}>{t.tool_type || "—"}</span>
                <Cell on={p.can_use} kind="use" /><Cell on={p.can_execute} kind="execute" /><Cell on={p.can_admin} kind="admin" />
              </div>
            ); })}
          </div>
        )}
    </Panel>
  );
}

/* ════════════════════════════════════════════════════════════════════════════
   DELEGATION MAP — who performs the work this agent cannot
   ════════════════════════════════════════════════════════════════════════ */
function DelegationMap({ track, snap }) {
  const map = useMemoAd(() => {
    const m = {};
    const push = (owner, kind, label) => { (m[owner] || (m[owner] = { restrictions: [], gates: [] }))[kind].push(label); };
    (track.restrictions || []).forEach((r) => push(r.delegates_to, "restrictions", r.restriction));
    (track.gates || []).forEach((g) => push(g.owner, "gates", g.name));
    return m;
  }, [track]);
  const owners = Object.keys(map);
  return (
    <Panel className="tight">
      <PHead icon="branch" eyebrow="Delegation map" right={<span style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--ink-4)" }}>{owners.length} owners</span>} />
      <div className="pbody" style={{ display: "flex", flexDirection: "column", gap: 9 }}>
        {owners.map((o) => (
          <div key={o} style={{ padding: "11px 12px", borderRadius: 9, background: "var(--panel-2)", border: "1px solid var(--hairline)" }}>
            <div style={{ marginBottom: 8 }}><OwnerChip id={o} snap={snap} /></div>
            <div style={{ display: "flex", flexDirection: "column", gap: 5 }}>
              {map[o].restrictions.map((r, i) => (
                <div key={"r" + i} style={{ display: "flex", gap: 7, fontSize: 11.5, color: "var(--ink-2)" }}><Icon name="lock" style={{ width: 12, height: 12, color: "var(--state-crisis)", flex: "none", marginTop: 1 }} />{r}</div>
              ))}
              {map[o].gates.map((g, i) => (
                <div key={"g" + i} style={{ display: "flex", gap: 7, fontSize: 11.5, color: "var(--ink-2)" }}><Icon name="shield" style={{ width: 12, height: 12, color: "var(--state-caution)", flex: "none", marginTop: 1 }} />{g}</div>
              ))}
            </div>
          </div>
        ))}
      </div>
    </Panel>
  );
}

/* ── evidence gates checklist ─────────────────────────────────────────────── */
function EvidenceGates({ track, snap }) {
  const gates = track.gates || [];
  return (
    <Panel className="tight">
      <PHead icon="shield" eyebrow="Evidence gates" right={<span style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--ink-4)" }}>0 / {gates.length} passed</span>} />
      {gates.length === 0
        ? <DevBlankRow icon="shield" title="No gates defined." hint="Gates open once a track target is approved." />
        : <div className="pbody tight">{gates.map((g, i) => (
            <div key={i} style={{ display: "grid", gridTemplateColumns: "16px 1fr auto", gap: 10, alignItems: "center", padding: "11px 16px", borderBottom: i < gates.length - 1 ? "1px solid var(--hairline)" : "none" }}>
              <span style={{ width: 15, height: 15, borderRadius: 4, border: "1.5px solid var(--hairline-2)", background: "var(--panel-2)" }} title="pending" />
              <span style={{ fontSize: 12.5 }}>{g.name}{g.required && <span className="todochip" style={{ fontSize: 8, marginLeft: 7 }}>required</span>}</span>
              <OwnerChip id={g.owner} snap={snap} />
            </div>
          ))}</div>}
    </Panel>
  );
}

/* ── required evidence checklist ──────────────────────────────────────────── */
function RequiredEvidence({ track }) {
  const reqs = track.required_evidence || [];
  return (
    <Panel className="tight">
      <PHead icon="evidence" eyebrow="Required evidence" right={<span style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--state-caution)" }}>{DEVD.COPY.noPromo}</span>} />
      {reqs.length === 0
        ? <DevBlankRow icon="evidence" title={DEVD.COPY.noPromo} hint="Promotion requires filed evidence linked to passed evaluations." />
        : <div className="pbody tight">{reqs.map((r, i) => (
            <div key={i} style={{ display: "grid", gridTemplateColumns: "16px 1fr auto", gap: 10, alignItems: "center", padding: "10px 16px", borderBottom: i < reqs.length - 1 ? "1px solid var(--hairline)" : "none" }}>
              <span style={{ width: 15, height: 15, borderRadius: 4, border: "1.5px solid var(--hairline-2)", background: "var(--panel-2)" }} />
              <span style={{ fontSize: 12.5 }}>{typeof r === "string" ? r : r.label || r.name}</span>
              <span className="todochip" style={{ color: "var(--state-caution)" }}><Icon name="evidence" style={{ width: 10, height: 10 }} />{DEVD.COPY.evidenceReq}</span>
            </div>
          ))}</div>}
    </Panel>
  );
}

/* ── development timeline ─────────────────────────────────────────────────── */
function DevTimeline({ events }) {
  const sorted = useMemoAd(() => events.slice().sort((a, b) => (a.created_at < b.created_at ? 1 : -1)), [events]);
  const fmt = (s) => { try { const d = new Date(s); return d.toLocaleString(undefined, { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit" }); } catch (e) { return s; } };
  return (
    <Panel className="tight">
      <PHead icon="log" eyebrow="Development timeline" right={<span style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--ink-4)" }}>{events.length}</span>} />
      {sorted.length === 0
        ? <DevBlankRow icon="log" title="No development events yet." hint="Track creation, evaluations, promotions and restrictions appear here." />
        : <div className="pbody" style={{ display: "flex", flexDirection: "column", gap: 0 }}>
            {sorted.map((ev, i) => (
              <div key={ev.id || i} style={{ display: "grid", gridTemplateColumns: "14px 1fr", gap: 12, padding: "12px 4px", borderBottom: i < sorted.length - 1 ? "1px solid var(--hairline)" : "none" }}>
                <div style={{ display: "flex", flexDirection: "column", alignItems: "center" }}>
                  <Led state={DEVD.eventState(ev.event_type)} size={9} />
                  {i < sorted.length - 1 && <span style={{ flex: 1, width: 1, background: "var(--hairline-2)", marginTop: 4 }} />}
                </div>
                <div style={{ minWidth: 0 }}>
                  <div style={{ display: "flex", justifyContent: "space-between", gap: 10, alignItems: "baseline" }}>
                    <span className="sbadge" style={{ fontSize: 8.5, color: DW.STATE_META[DEVD.eventState(ev.event_type)].c }}>{ev.event_type}</span>
                    <span style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--ink-4)", flex: "none" }}>{fmt(ev.created_at)}</span>
                  </div>
                  <div style={{ fontSize: 13, color: "var(--ink)", marginTop: 6, fontWeight: 500 }}>{ev.summary}</div>
                  {ev.detail && <div style={{ fontSize: 11.5, color: "var(--ink-3)", marginTop: 4, lineHeight: 1.55 }}>{ev.detail}</div>}
                </div>
              </div>
            ))}
          </div>}
    </Panel>
  );
}

/* ════════════════════════════════════════════════════════════════════════════
   DEVELOPMENT RECORD — the full per-agent governance cockpit
   ════════════════════════════════════════════════════════════════════════ */
function AgentDevRecord({ agentId, snap, state, nav, embedded }) {
  const agent = agentFrom(snap, agentId);
  const track = (snap.agentDevelopmentTracks || []).find((t) => t.agent_id === agentId) || null;
  const events = (snap.agentDevelopmentEvents || []).filter((e) => e.agent_id === agentId);
  const evals = (snap.agentEvaluations || []).filter((e) => e.agent_id === agentId);
  const trust = track ? track.trust_state : "unproven";
  const lvlCur = DEVD.levelFromInt(track ? track.current_level : null);
  const lvlTgt = DEVD.levelFromInt(track ? track.target_level : null);
  const restrictions = track ? track.restrictions || [] : [];

  return (
    <div style={{ "--ac": agent.accent || agent.ac }}>
      {/* top summary band */}
      <Panel style={{ overflow: "hidden", marginBottom: "var(--s-6)" }}>
        <div style={{ height: 3, background: `linear-gradient(90deg, transparent, ${agent.accent || agent.ac}, transparent)` }} />
        <div className="dev-summary">
          <div className="dev-summary-id">
            <AgentAvatar agent={agent} size={52} />
            <div style={{ minWidth: 0 }}>
              <div style={{ fontFamily: "var(--font-display)", fontSize: 21, fontWeight: 600 }}>{agent.name}</div>
              <div className="mono" style={{ color: "var(--violet-ink)", fontSize: 10.5, letterSpacing: "0.08em", textTransform: "uppercase", marginTop: 3 }}>{agent.role}{agent.domain ? " · " + agent.domain : ""}</div>
              <div style={{ marginTop: 9 }}><TrustBadge trust={trust} /></div>
            </div>
          </div>
          <div className="dev-summary-grid">
            <div className="dev-stat"><div className="k">Track</div><div className="v" style={{ fontSize: 13 }}>{track ? track.name : "—"}</div></div>
            <div className="dev-stat"><div className="k">Level</div><div className="v" style={{ color: "var(--state-active)" }}>{lvlCur ? lvlCur.id : "—"}<span style={{ color: "var(--ink-4)" }}> → </span><span style={{ color: "var(--state-caution)" }}>{lvlTgt ? lvlTgt.id : "—"}</span></div></div>
            <div className="dev-stat"><div className="k">Priority</div><div className="v" style={{ color: track && track.priority === "critical" ? "var(--state-crisis)" : "var(--ink)", textTransform: "capitalize", fontSize: 14 }}>{track ? track.priority : "—"}</div></div>
            <div className="dev-stat"><div className="k">Restrictions</div><div className="v" style={{ color: restrictions.length ? "var(--state-crisis)" : "var(--ink)" }}>{restrictions.length}</div></div>
            <div className="dev-stat"><div className="k">Track owner</div><div className="v" style={{ fontSize: 13 }}>{track && track.owner_agent_id ? agentFrom(snap, track.owner_agent_id).name : "—"}</div></div>
            <div className="dev-stat"><div className="k">Status</div><div className="v" style={{ fontSize: 13, textTransform: "capitalize" }}>{track ? track.status : "no track"}</div></div>
          </div>
        </div>
        {track && (
          <div style={{ padding: "0 var(--s-7) var(--s-6)" }}>
            <div className="eyebrow" style={{ marginBottom: 9 }}>Competence ladder · current → target</div>
            <LevelLadder current={track.current_level} target={track.target_level} />
          </div>
        )}
      </Panel>

      {!track && (
        <div style={{ marginBottom: "var(--s-6)" }}>
          <DevWarning tone="caution" icon="branch" text={`${DEVD.COPY.noTrack} ${DEVD.COPY.createAfter}`} />
        </div>
      )}

      {/* next action */}
      {track && track.next_action && (
        <Panel style={{ marginBottom: "var(--s-6)", borderColor: "color-mix(in srgb, var(--state-active) 30%, var(--hairline-2))" }}>
          <div style={{ display: "flex", alignItems: "center", gap: 13, padding: "15px 18px" }}>
            <span style={{ width: 32, height: 32, borderRadius: 9, flex: "none", display: "grid", placeItems: "center", background: "color-mix(in srgb, var(--state-active) 16%, transparent)", border: "1px solid color-mix(in srgb, var(--state-active) 40%, transparent)" }}>
              <Icon name="arrow" style={{ width: 16, height: 16, color: "var(--state-active)" }} />
            </span>
            <div style={{ minWidth: 0 }}>
              <div className="eyebrow">Next action · training state {trust}</div>
              <div style={{ fontSize: 13.5, color: "var(--ink)", marginTop: 4, lineHeight: 1.5 }}>{track.next_action}</div>
            </div>
            <div style={{ marginLeft: "auto", flex: "none" }}><GatedWrite label="Log evaluation" icon="check" agentId={agentId} /></div>
          </div>
        </Panel>
      )}

      {/* governance grid */}
      <div className="cols c-2 dev-record-grid" style={{ gap: "var(--s-6)" }}>
        {track && <EvidenceGates track={track} snap={snap} />}
        {track && <RequiredEvidence track={track} />}
        {track && <DelegationMap track={track} snap={snap} />}

        {/* restrictions */}
        {track && (
          <Panel className="tight">
            <PHead icon="lock" eyebrow="Restrictions" right={<span style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--state-crisis)" }}>non-bypassable</span>} />
            <div className="pbody tight">{restrictions.map((r, i) => (
              <div key={i} style={{ display: "flex", justifyContent: "space-between", alignItems: "center", gap: 10, padding: "11px 16px", borderBottom: i < restrictions.length - 1 ? "1px solid var(--hairline)" : "none" }}>
                <span style={{ display: "inline-flex", gap: 8, alignItems: "center", minWidth: 0 }}><Icon name="lock" style={{ width: 13, height: 13, color: "var(--state-crisis)", flex: "none" }} /><span style={{ fontSize: 12.5 }}>{r.restriction}</span></span>
                <OwnerChip id={r.delegates_to} snap={snap} />
              </div>
            ))}</div>
          </Panel>
        )}

        {/* evaluations (empty state) */}
        <Panel className="tight">
          <PHead icon="check" eyebrow="Evaluations" right={<span style={{ fontFamily: "var(--font-mono)", fontSize: 10, color: "var(--ink-4)" }}>{evals.length}</span>} />
          {evals.length === 0
            ? <DevBlankRow icon="check" title="No evaluations recorded yet." hint={"Trust advances only on passed evaluations. " + agent.name + " stays " + DEVD.trustMeta(trust).label + " until evidence is filed."} />
            : <div className="pbody tight">{evals.slice(0, 6).map((e) => (
                <div key={e.id} style={{ display: "grid", gridTemplateColumns: "1fr auto", gap: 10, alignItems: "center", padding: "10px 16px", borderBottom: "1px solid var(--hairline)" }}>
                  <span style={{ fontSize: 12.5, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }} title={e.task}>{e.title}</span>
                  <span className="sbadge" style={{ color: DW.STATE_META[DEVD.verdictState(e.verdict)].c }}>{e.verdict}</span>
                </div>
              ))}</div>}
        </Panel>

        {/* timeline spans both columns */}
        <div style={{ gridColumn: "1 / -1" }}><DevTimeline events={events} /></div>

        {/* tool authority spans both columns */}
        <ToolAuthority agentId={agentId} snap={snap} />
      </div>

      {nav && (
        <div style={{ display: "flex", gap: 10, marginTop: "var(--s-6)" }}>
          <button className="btn ghost" onClick={() => nav("arsenal:agent:" + agentId)}><Icon name="chip" className="glyph" style={{ width: 13, height: 13 }} /> Open loadout in Arsenal</button>
          <button className="btn ghost" onClick={() => nav("vconsole")}><Icon name="shield" className="glyph" style={{ width: 13, height: 13 }} /> Command Console</button>
        </div>
      )}
    </div>
  );
}

/* embed used on council profile pages */
function AgentDevelopmentRecord({ agentId, nav }) {
  const { snap, state } = useSnapshot();
  const agent = agentFrom(snap, agentId);
  return (
    <Panel style={{ marginTop: "var(--s-6)", "--ac": agent.accent || agent.ac }} id="development-record">
      <PHead icon="skill" eyebrow="Development Record" title={`${agent.name} — competence & proof`}
        right={<div style={{ display: "flex", alignItems: "center", gap: 10 }}><SourceControl state={state} source={DWSnapshot.source()} /><button className="minilink" onClick={() => nav("agent-development")}>Development board →</button></div>} />
      <div className="pbody"><AgentDevRecord agentId={agentId} snap={snap} state={state} nav={nav} embedded /></div>
    </Panel>
  );
}

/* ════════════════════════════════════════════════════════════════════════════
   AGENT DEVELOPMENT BOARD — route "agent-development"
   ════════════════════════════════════════════════════════════════════════ */
function DevMetric({ k, v, state }) {
  const c = state ? DW.STATE_META[state].c : "var(--ink)";
  return <Panel><div className="metric"><div className="k">{k}</div><div className="v" style={{ color: c }}>{v}</div></div></Panel>;
}

/* ── roster OVERLAY: glides in over the tab content, staggered cards ───────────
   Flow: pick an agent → roster glides off → that agent's cockpit is revealed.
   The roster and the detail are never read at the same time. */
function DevRoster({ agents, trackByAgent, sel, open, onSelect, onClose }) {
  const [shown, setShown] = useStateAd(false);
  const [mounted, setMounted] = useStateAd(open);
  const [filter, setFilter] = useStateAd("all");
  useEffectAd(() => {
    let raf1, raf2, t;
    if (open) { setMounted(true); raf1 = requestAnimationFrame(() => { raf2 = requestAnimationFrame(() => setShown(true)); }); }
    else { setShown(false); t = setTimeout(() => setMounted(false), 640); }
    return () => { cancelAnimationFrame(raf1); cancelAnimationFrame(raf2); clearTimeout(t); };
  }, [open]);
  useEffectAd(() => {
    if (!open) return;
    const onKey = (e) => { if (e.key === "Escape") onClose(); };
    window.addEventListener("keydown", onKey);
    return () => window.removeEventListener("keydown", onKey);
  }, [open]);
  if (!mounted) return null;

  const trustOf = (a) => { const t = trackByAgent[a.id]; return t ? t.trust_state : "unproven"; };
  const FILTERS = [
    { id: "all", label: "All", test: () => true },
    { id: "training", label: "In training", test: (a) => trustOf(a) === "training" },
    { id: "active", label: "Active track", test: (a) => { const t = trackByAgent[a.id]; return t && t.status === "active"; } },
    { id: "restricted", label: "Restricted", test: (a) => { const t = trackByAgent[a.id]; return t && (t.restrictions || []).length > 0; } },
    { id: "awaiting", label: "Awaiting track", test: (a) => !trackByAgent[a.id] },
  ];
  const counts = {}; FILTERS.forEach((f) => (counts[f.id] = agents.filter(f.test).length));
  const active = FILTERS.find((f) => f.id === filter) || FILTERS[0];
  const list = agents.filter(active.test);
  const n = list.length;

  return (
    <div className={"dev-overlay" + (shown ? " show" : "")} role="dialog" aria-modal="true" aria-label="Pick an agent">
      <div className="dev-overlay-backdrop" onClick={onClose} />
      <div className="dev-overlay-panel">
        <div className="dev-overlay-head">
          <div className="dev-overlay-title"><Icon name="council" style={{ width: 16, height: 16, color: "var(--violet-ink)" }} /><b>Pick an agent</b><span className="cnt">{agents.length}</span></div>
          <div className="dev-filter">
            {FILTERS.map((f) => (
              <button key={f.id} className={filter === f.id ? "on" : ""} onClick={() => setFilter(f.id)}>{f.label}<span className="n">{counts[f.id]}</span></button>
            ))}
          </div>
          <button className="dev-modal-x focusable" onClick={onClose} aria-label="Close roster"><Icon name="close" style={{ width: 15, height: 15 }} /></button>
        </div>
        <div className="dev-cards">
          {list.map((a, i) => {
            const t = trackByAgent[a.id]; const trust = trustOf(a);
            const lvl = DEVD.levelFromInt(t ? t.current_level : null);
            const tgt = t ? DEVD.levelFromInt(t.target_level) : null;
            const rx = t && t.restrictions ? t.restrictions.length : 0;
            const delay = (shown ? i * 0.04 : (n - 1 - i) * 0.022) + "s";
            return (
              <button key={a.id} className={"dev-card focusable" + (sel === a.id ? " on" : "")} style={{ "--ac": a.accent || a.ac, transitionDelay: delay }} onClick={() => onSelect(a.id)}>
                <div className="dev-card-top">
                  <AgentAvatar agent={a} size={38} />
                  <div className="dev-card-id"><div className="nm">{a.name}</div><div className="rl">{a.role}</div></div>
                  <Led state={DEVD.trustMeta(trust).state} size={8} />
                </div>
                <div className="dev-card-chips">
                  <TrustBadge trust={trust} />
                  {lvl ? <span className="dev-lvlchip">{lvl.id}<span style={{ color: "var(--ink-4)" }}>→</span>{tgt.id}</span> : <span className="dev-lvlchip" style={{ color: "var(--ink-4)" }}>no level</span>}
                </div>
                <div className="dev-card-foot">
                  <span className="trk">{t ? t.name : "No track yet"}</span>
                  {rx > 0 && <span className="rxpill">{rx} restr.</span>}
                </div>
              </button>
            );
          })}
          {n === 0 && <div style={{ gridColumn: "1 / -1", padding: "28px 16px", textAlign: "center", color: "var(--ink-4)", fontSize: 12.5 }}>No agents match this filter.</div>}
        </div>
        <div className="dev-overlay-foot">{DEVD.COPY.noTrack} {DEVD.COPY.createAfter} {DEVD.COPY.noPromo}</div>
      </div>
    </div>
  );
}

/* ── slim bar above the cockpit — shows who you're viewing + reopen roster ── */
function SwitchBar({ agent, trust, track, count, onChange }) {
  const lvl = DEVD.levelFromInt(track ? track.current_level : null);
  const tgt = track ? DEVD.levelFromInt(track.target_level) : null;
  return (
    <div className="dev-switchbar" style={{ "--ac": agent.accent || agent.ac }}>
      <div className="who"><AgentAvatar agent={agent} size={34} />
        <div style={{ minWidth: 0 }}>
          <div style={{ fontFamily: "var(--font-display)", fontWeight: 600, fontSize: 14, lineHeight: 1.1 }}>{agent.name}</div>
          <div className="mono" style={{ fontSize: 9.5, color: "var(--ink-4)", letterSpacing: "0.05em", textTransform: "uppercase", marginTop: 3, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap" }}>{agent.role}</div>
        </div>
      </div>
      <TrustBadge trust={trust} />
      {lvl && <span className="dev-lvlchip">{lvl.id}<span style={{ color: "var(--ink-4)" }}>→</span>{tgt.id}</span>}
      <button className="btn ghost dev-change" onClick={onChange}><Icon name="council" className="glyph" style={{ width: 14, height: 14 }} /> Change agent <span className="dev-change-cnt">{count}</span></button>
    </div>
  );
}

function AgentDevelopmentScreen({ nav }) {
  const { snap, state, source } = useSnapshot();
  const agents = snap.agents || [];
  const tracks = snap.agentDevelopmentTracks || [];
  const evals = snap.agentEvaluations || [];
  const [sel, setSel] = useStateAd("viiera");
  const [rosterOpen, setRosterOpen] = useStateAd(true);
  const [view, setView] = useStateAd("develop");
  useEffectAd(() => { if (agents.length && !agents.some((a) => a.id === sel)) setSel((tracks[0] && tracks[0].agent_id) || agents[0].id); }, [snap]);

  const withTracks = new Set(tracks.map((t) => t.agent_id));
  const trackByAgent = useMemoAd(() => { const m = {}; tracks.forEach((t) => (m[t.agent_id] = t)); return m; }, [tracks]);
  const metrics = [
    { k: "Total agents", v: agents.length },
    { k: "Active tracks", v: tracks.filter((t) => t.status === "active").length, state: "active" },
    { k: "In training", v: tracks.filter((t) => t.trust_state === "training").length, state: "focus" },
    { k: "Awaiting first track", v: agents.filter((a) => !withTracks.has(a.id)).length, state: agents.length && tracks.length < agents.length ? "caution" : null },
    { k: "Passed evals", v: evals.filter((e) => e.verdict === "pass").length, state: "clear" },
    { k: "Failed evals", v: evals.filter((e) => e.verdict === "fail").length, state: evals.some((e) => e.verdict === "fail") ? "crisis" : null },
  ];

  return (
    <div className="screen">
      <div className="screen-head">
        <div>
          <div className="title"><span className="sub">Governance · Competence</span>Agent Development</div>
          <div className="meta">The evidence-governed path to earn tool-execution authority. Separate from Arsenal (tool library) and Command Console (identity). Trust is earned through evaluations — never assumed.</div>
        </div>
        <div className="screen-actions" style={{ display: "flex", alignItems: "center", gap: 12 }}>
          {window.DevBoardGuideButton ? <window.DevBoardGuideButton /> : null}
          <SourceControl state={state} source={source} />
          <GatedWrite label="New training target" />
        </div>
      </div>

      <div className="dev-tabs" role="tablist">
        <button role="tab" aria-selected={view === "develop"} className={view === "develop" ? "on" : ""} onClick={() => setView("develop")}><Icon name="skill" style={{ width: 14, height: 14 }} /> Development</button>
        <button role="tab" aria-selected={view === "routing"} className={view === "routing" ? "on" : ""} onClick={() => setView("routing")}><Icon name="branch" style={{ width: 14, height: 14 }} /> Model Routing</button>
      </div>

      {view === "routing" ? (
        window.AgentModelRouting ? <window.AgentModelRouting /> : null
      ) : (
      <React.Fragment>
      {state === "error" && <div style={{ marginBottom: "var(--s-6)" }}><DevWarning tone="crisis" icon="risk" text="Live Worker snapshot unavailable — showing the labelled fixture mirror. Use the source control to reconnect." /></div>}
      <div style={{ marginBottom: "var(--s-6)" }}><DevWarning text={DEVD.COPY.accessTrust} icon="shield" /></div>

      <div style={{ display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(150px, 1fr))", gap: "var(--s-5)", marginBottom: "var(--s-6)" }}>
        {metrics.map((m, i) => <DevMetric key={i} {...m} />)}
      </div>

      {/* reusable track template + clone-to-other-agents action (board-level) */}
      {window.TrackTemplatePanel ? <div style={{ marginBottom: "var(--s-6)" }}><window.TrackTemplatePanel snap={snap} /></div> : null}

      {/* switch-agent bar — who you're viewing + reopen the roster overlay */}
      {sel && <SwitchBar agent={agentFrom(snap, sel)} trust={(trackByAgent[sel] && trackByAgent[sel].trust_state) || "unproven"} track={trackByAgent[sel]} count={agents.length} onChange={() => setRosterOpen(true)} />}

      {/* selected agent cockpit (detail) */}
      {sel && <AgentDevRecord agentId={sel} snap={snap} state={state} nav={nav} />}

      {/* board-level governance: unknown mission-code escalations + protected execution */}
      {window.UnknownMissionEscalations ? <div style={{ marginTop: "var(--s-6)" }}><window.UnknownMissionEscalations snap={snap} /></div> : null}
      {window.ProtectedExecutionPanel ? <div style={{ marginTop: "var(--s-6)" }}><window.ProtectedExecutionPanel snap={snap} /></div> : null}

      {/* roster overlay — glides in over the content, staggered cards */}
      <DevRoster agents={agents} trackByAgent={trackByAgent} sel={sel} open={rosterOpen}
        onSelect={(id) => { setSel(id); setRosterOpen(false); }} onClose={() => setRosterOpen(false)} />
      </React.Fragment>
      )}
    </div>
  );
}

/* ════════════════════════════════════════════════════════════════════════════
   NEW TRAINING TARGET — composer (Worker-gated; drafts the row, no DB write)
   ════════════════════════════════════════════════════════════════════════ */
function GatedWrite({ label, icon = "plus", agentId }) {
  const [open, setOpen] = useStateAd(false);
  return (
    <div style={{ display: "inline-flex", flexDirection: "column", gap: 5, alignItems: "flex-start" }}>
      <button className="btn primary" onClick={() => setOpen(true)}><Icon name={icon} className="glyph" style={{ width: 13, height: 13 }} /> {label}</button>
      <span className="todochip"><Icon name="lock" style={{ width: 10, height: 10 }} /> Worker-gated · no direct DB write</span>
      <TrainingTargetDialog open={open} onClose={() => setOpen(false)} agentId={agentId} />
    </div>
  );
}

function TrainingTargetDialog({ open, onClose, agentId }) {
  const snap = DWSnapshot.get();
  const agents = snap.agents || [];
  const [f, setF] = useStateAd(() => ({ agent_id: agentId || (agents[0] && agents[0].id) || "viiera", name: "", domain: "", current_level: 0, target_level: 1, priority: "medium", required_evidence: "", next_action: "" }));
  const [queued, setQueued] = useStateAd(null);
  const set = (k, v) => setF((p) => ({ ...p, [k]: v, ...(k === "agent_id" ? { domain: (agentFrom(snap, v) || {}).domain || p.domain } : null) }));
  if (!open) return null;
  const a = agentFrom(snap, f.agent_id);
  const valid = f.name.trim() && f.target_level > f.current_level;
  const row = {
    agent_id: f.agent_id, name: f.name.trim(), domain: f.domain.trim(), status: "planned", trust_state: "training",
    current_level: f.current_level, target_level: f.target_level, priority: f.priority,
    required_evidence: f.required_evidence.split("\n").map((s) => s.trim()).filter(Boolean),
    gates: [], restrictions: [], next_action: f.next_action.trim() || null, owner_agent_id: "qa-agent", evidence_record_id: null,
  };
  const ROUTE = "POST /api/divonci-world/agent-development/tracks";
  return (
    <div className="dev-modal-scrim" onClick={onClose}>
      <div className="dev-modal" style={{ "--ac": a ? a.accent || a.ac : "var(--violet-bright)" }} onClick={(e) => e.stopPropagation()}>
        <div className="dev-modal-head">
          <div><div style={{ fontFamily: "var(--font-display)", fontWeight: 600, fontSize: 17 }}>New Training Target</div>
            <div style={{ fontSize: 11.5, color: "var(--ink-3)", marginTop: 3 }}>Drafts a development track. Submission routes to the Worker endpoint — the browser never writes to Supabase.</div></div>
          <button className="dev-modal-x focusable" onClick={onClose} aria-label="Close"><Icon name="close" style={{ width: 15, height: 15 }} /></button>
        </div>
        {queued ? (
          <div className="dev-modal-body">
            <div style={{ display: "flex", alignItems: "center", gap: 10, marginBottom: 14 }}>
              <span style={{ width: 30, height: 30, borderRadius: 9, display: "grid", placeItems: "center", background: "color-mix(in srgb, var(--state-caution) 16%, transparent)", border: "1px solid color-mix(in srgb, var(--state-caution) 40%, transparent)", flex: "none" }}><Icon name="lock" style={{ width: 15, height: 15, color: "var(--state-caution)" }} /></span>
              <div><div style={{ fontSize: 14, fontWeight: 600 }}>Queued — pending Worker endpoint</div><div style={{ fontFamily: "var(--font-mono)", fontSize: 10.5, color: "var(--ink-3)" }}>{ROUTE}</div></div>
            </div>
            <div style={{ fontSize: 12, color: "var(--ink-3)", marginBottom: 10, lineHeight: 1.5 }}>This is the exact row the endpoint will insert once wired:</div>
            <pre className="dev-payload">{JSON.stringify(queued, null, 2)}</pre>
            <div className="dev-modal-foot"><button className="btn ghost" onClick={() => setQueued(null)}>← Edit</button><button className="btn primary" onClick={onClose}>Done</button></div>
          </div>
        ) : (
          <div className="dev-modal-body">
            <label className="dev-field"><span>Agent</span>
              <select className="twk-field" value={f.agent_id} onChange={(e) => set("agent_id", e.target.value)} disabled={!!agentId}>{agents.map((ag) => <option key={ag.id} value={ag.id}>{ag.name} · {ag.domain}</option>)}</select></label>
            <label className="dev-field"><span>Track name</span><input className="twk-field" placeholder="e.g. Supabase Development" value={f.name} onChange={(e) => set("name", e.target.value)} /></label>
            <div className="dev-field-row">
              <label className="dev-field"><span>Domain</span><input className="twk-field" value={f.domain} onChange={(e) => set("domain", e.target.value)} /></label>
              <label className="dev-field"><span>Priority</span><select className="twk-field" value={f.priority} onChange={(e) => set("priority", e.target.value)}>{["low", "medium", "high", "critical"].map((p) => <option key={p} value={p}>{p}</option>)}</select></label>
            </div>
            <div className="dev-field-row">
              <label className="dev-field"><span>Current level</span><select className="twk-field" value={f.current_level} onChange={(e) => set("current_level", +e.target.value)}>{DEVD.LEVELS.map((l, i) => <option key={l.id} value={i}>{l.id} · {l.label}</option>)}</select></label>
              <label className="dev-field"><span>Target level</span><select className="twk-field" value={f.target_level} onChange={(e) => set("target_level", +e.target.value)}>{DEVD.LEVELS.map((l, i) => <option key={l.id} value={i}>{l.id} · {l.label}</option>)}</select></label>
            </div>
            <label className="dev-field"><span>Required evidence <em style={{ color: "var(--ink-4)", fontStyle: "normal" }}>· one per line</em></span>
              <textarea className="twk-field" rows={3} placeholder={"schema inspection summary\nRLS policy review\nmigration and rollback plan"} value={f.required_evidence} onChange={(e) => set("required_evidence", e.target.value)} /></label>
            <label className="dev-field"><span>Next action</span><input className="twk-field" placeholder="e.g. Run first dry-run RLS review with Codex executing" value={f.next_action} onChange={(e) => set("next_action", e.target.value)} /></label>
            {!valid && <div style={{ fontSize: 11.5, color: "var(--state-caution)" }}>{!f.name.trim() ? "Track name is required." : "Target level must be above the current level. " + DEVD.COPY.noPromo}</div>}
            <div className="dev-modal-foot"><button className="btn ghost" onClick={onClose}>Cancel</button>
              <button className="btn primary" disabled={!valid} style={!valid ? { opacity: 0.5, pointerEvents: "none" } : null} onClick={() => setQueued(row)}><Icon name="lock" className="glyph" style={{ width: 13, height: 13 }} /> Queue training target</button></div>
          </div>
        )}
      </div>
    </div>
  );
}

/* ── scoped styles ────────────────────────────────────────────────────────── */
(function injectDevStyles() {
  if (document.getElementById("dev-surface-styles")) return;
  const css = `
  .dev-tabs { display: inline-flex; gap: 5px; padding: 4px; margin-bottom: var(--s-6); border-radius: 11px; background: var(--panel-2); border: 1px solid var(--hairline-2); }
  .dev-tabs button { display: inline-flex; align-items: center; gap: 8px; padding: 8px 15px; border-radius: 8px; border: none; background: none; color: var(--ink-3); font: inherit; font-size: 13px; font-weight: 500; cursor: pointer; transition: all .15s; }
  .dev-tabs button svg { color: var(--ink-4); }
  .dev-tabs button:hover { color: var(--ink-2); }
  .dev-tabs button.on { color: var(--ink); background: color-mix(in srgb, var(--violet-bright) 16%, var(--panel)); box-shadow: 0 0 0 1px color-mix(in srgb, var(--violet-bright) 38%, transparent); }
  .dev-tabs button.on svg { color: var(--violet-ink); }
  .dev-switchbar { position: sticky; top: 0.5rem; z-index: 30; display: flex; align-items: center; gap: 12px; padding: 11px 14px; margin-bottom: var(--s-6); border-radius: 12px; background: color-mix(in srgb, var(--panel-2) 92%, transparent); backdrop-filter: blur(8px); border: 1px solid var(--hairline-2); border-left: 3px solid color-mix(in srgb, var(--ac) 70%, transparent); box-shadow: var(--shadow-1, 0 6px 18px rgba(0,0,0,.22)); flex-wrap: wrap; }
  .dev-switchbar .who { display: flex; align-items: center; gap: 10px; min-width: 0; }
  .dev-switchbar .dev-change { margin-left: auto; }
  .dev-switchbar .dev-change-cnt { font-family: var(--font-mono); font-size: 9.5px; color: var(--ink-4); background: var(--panel); border: 1px solid var(--hairline-2); padding: 0 6px; border-radius: 99px; margin-left: 6px; }
  /* roster overlay */
  .dev-overlay { position: fixed; inset: 0; z-index: 70; }
  .dev-overlay-backdrop { position: absolute; inset: 0; background: color-mix(in srgb, var(--obsidian) 56%, transparent); backdrop-filter: blur(5px); opacity: 0; transition: opacity .42s ease; }
  .dev-overlay.show .dev-overlay-backdrop { opacity: 1; }
  .dev-overlay-panel { position: absolute; left: 50%; top: 78px; width: min(1120px, 94vw); max-height: calc(100vh - 116px); display: flex; flex-direction: column; background: var(--panel); border: 1px solid var(--hairline-2); border-radius: 16px; box-shadow: var(--shadow-2, 0 30px 90px rgba(0,0,0,.55)); overflow: hidden; opacity: 0; transform: translateX(-50%) translateY(-30px) scale(.98); transition: opacity .42s ease, transform .5s cubic-bezier(.2,.85,.25,1); }
  .dev-overlay.show .dev-overlay-panel { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); }
  .dev-overlay-head { display: flex; align-items: center; gap: 14px; padding: 15px 18px; border-bottom: 1px solid var(--hairline); flex-wrap: wrap; }
  .dev-overlay-title { display: inline-flex; align-items: center; gap: 9px; font-size: 14px; }
  .dev-overlay-title .cnt { font-family: var(--font-mono); font-size: 10px; color: var(--ink-3); background: var(--panel-2); border: 1px solid var(--hairline-2); padding: 1px 7px; border-radius: 99px; }
  .dev-overlay .dev-filter { padding: 0; flex: 1; min-width: 200px; }
  .dev-filter { display: flex; gap: 7px; overflow-x: auto; scrollbar-width: none; }
  .dev-filter::-webkit-scrollbar { display: none; }
  .dev-filter button { flex: none; display: inline-flex; align-items: center; gap: 7px; padding: 7px 13px; border-radius: 99px; border: 1px solid var(--hairline-2); background: var(--panel-2); color: var(--ink-3); font: inherit; font-size: 12px; cursor: pointer; transition: all .15s; white-space: nowrap; }
  .dev-filter button:hover { color: var(--ink); background: var(--panel-3); }
  .dev-filter button.on { color: var(--ink); background: color-mix(in srgb, var(--violet-bright) 16%, var(--panel-2)); border-color: color-mix(in srgb, var(--violet-bright) 45%, transparent); }
  .dev-filter button .n { font-family: var(--font-mono); font-size: 9.5px; color: var(--ink-4); }
  .dev-filter button.on .n { color: var(--violet-ink); }
  .dev-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 12px; padding: 16px 18px; overflow-y: auto; }
  .dev-overlay-foot { padding: 12px 18px; border-top: 1px solid var(--hairline); font-size: 11px; color: var(--ink-4); line-height: 1.5; flex: none; }
  .dev-card { text-align: left; display: flex; flex-direction: column; gap: 11px; padding: 14px; border-radius: 13px; background: var(--panel-2); border: 1px solid var(--hairline-2); border-left: 3px solid color-mix(in srgb, var(--ac) 72%, transparent); cursor: pointer; font: inherit; color: inherit; opacity: 0; transform: translateY(14px); transition: opacity .4s ease, transform .46s cubic-bezier(.2,.85,.25,1), box-shadow .2s, background .2s; }
  .dev-overlay.show .dev-card { opacity: 1; transform: translateY(0); }
  .dev-card:hover { background: var(--panel-3); box-shadow: var(--shadow-1, 0 6px 18px rgba(0,0,0,.25)); }
  .dev-card.on { background: color-mix(in srgb, var(--ac) 11%, var(--panel-2)); box-shadow: 0 0 0 1px color-mix(in srgb, var(--ac) 50%, transparent), 0 0 22px color-mix(in srgb, var(--ac) 18%, transparent); }
  .dev-card-top { display: grid; grid-template-columns: auto 1fr auto; gap: 10px; align-items: center; }
  .dev-card-id { min-width: 0; }
  .dev-card-id .nm { font-family: var(--font-display); font-weight: 600; font-size: 14.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dev-card-id .rl { font-family: var(--font-mono); font-size: 9px; color: var(--ink-4); letter-spacing: 0.04em; text-transform: uppercase; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 3px; }
  .dev-card-chips { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
  .dev-lvlchip { font-family: var(--font-mono); font-size: 10px; color: var(--ink-2); padding: 3px 8px; border-radius: 99px; border: 1px solid var(--hairline-2); background: var(--panel); }
  .dev-card-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding-top: 11px; border-top: 1px solid var(--hairline); }
  .dev-card-foot .trk { font-size: 11.5px; color: var(--ink-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dev-card-foot .rxpill { flex: none; font-family: var(--font-mono); font-size: 9px; color: var(--state-crisis); background: color-mix(in srgb, var(--state-crisis) 12%, transparent); border: 1px solid color-mix(in srgb, var(--state-crisis) 35%, transparent); padding: 2px 7px; border-radius: 99px; }
  .dev-summary { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,2fr); gap: var(--s-7); padding: var(--s-7); align-items: center; }
  .dev-summary-id { display: flex; gap: 14px; align-items: flex-start; min-width: 0; }
  .dev-summary-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--hairline); border: 1px solid var(--hairline-2); border-radius: 10px; overflow: hidden; }
  .dev-stat { background: var(--panel); padding: 11px 13px; }
  .dev-stat .k { font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-4); }
  .dev-stat .v { font-family: var(--font-mono); font-weight: 600; font-size: 16px; margin-top: 5px; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .ta-wrap { display: flex; flex-direction: column; }
  .ta-row { display: grid; grid-template-columns: minmax(0,1.6fr) minmax(0,1fr) 90px 50px 50px 50px; gap: 10px; align-items: center; padding: 9px 16px; border-bottom: 1px solid var(--hairline); }
  .ta-head { font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-4); }
  @media (max-width: 920px) {
    .dev-summary { grid-template-columns: 1fr; gap: var(--s-6); }
    .dev-record-grid { grid-template-columns: 1fr; }
    .dev-row { grid-template-columns: minmax(0,1.5fr) 116px 78px; }
    .ta-row { grid-template-columns: minmax(0,1.5fr) 44px 44px 44px; }
    .dev-hide-sm, .ta-hide-sm { display: none; }
  }
  @media (max-width: 560px) { .dev-summary-grid { grid-template-columns: repeat(2, 1fr); } }
  .dev-modal-scrim { position: fixed; inset: 0; z-index: 80; background: color-mix(in srgb, var(--obsidian) 72%, transparent); backdrop-filter: blur(3px); display: grid; place-items: center; padding: 20px; }
  .dev-modal { width: min(560px, 100%); max-height: 88vh; overflow-y: auto; background: var(--panel); border: 1px solid var(--hairline-2); border-radius: 14px; box-shadow: var(--shadow-2), 0 0 0 1px color-mix(in srgb, var(--ac) 30%, transparent); }
  .dev-modal-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; padding: 18px 20px 14px; border-bottom: 1px solid var(--hairline); }
  .dev-modal-x { width: 30px; height: 30px; flex: none; display: grid; place-items: center; border-radius: 8px; border: 1px solid var(--hairline-2); background: var(--panel-2); color: var(--ink-3); cursor: pointer; }
  .dev-modal-x:hover { color: var(--ink); background: var(--panel-3); }
  .dev-modal-body { padding: 18px 20px 20px; display: flex; flex-direction: column; gap: 13px; }
  .dev-field { display: flex; flex-direction: column; gap: 6px; }
  .dev-field > span { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-3); }
  .dev-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 13px; }
  .dev-field .twk-field { width: 100%; box-sizing: border-box; padding: 9px 11px; border-radius: 8px; border: 1px solid var(--hairline-2); background: var(--panel-2); color: var(--ink); font-family: var(--font-ui); font-size: 13px; }
  .dev-field textarea.twk-field { resize: vertical; font-family: var(--font-mono); font-size: 12px; line-height: 1.5; }
  .dev-field .twk-field:focus { outline: none; border-color: color-mix(in srgb, var(--ac, var(--violet-bright)) 55%, transparent); }
  .dev-modal-foot { display: flex; justify-content: flex-end; gap: 10px; margin-top: 6px; }
  .dev-payload { margin: 0; padding: 13px 14px; border-radius: 9px; background: var(--obsidian); border: 1px solid var(--hairline); color: var(--ink-2); font-family: var(--font-mono); font-size: 11px; line-height: 1.55; overflow-x: auto; max-height: 260px; }
  @media (max-width: 560px) { .dev-field-row { grid-template-columns: 1fr; } }`;
  const el = document.createElement("style"); el.id = "dev-surface-styles"; el.textContent = css; document.head.appendChild(el);
})();

Object.assign(window, { AgentDevelopmentScreen, AgentDevelopmentRecord });
