Skip to content

XERK-538: show 'QA Review' status while a QA/QA-delta subagent runs - #623

Merged
xerhab merged 1 commit into
mainfrom
XERK-538
Sep 1, 2026
Merged

XERK-538: show 'QA Review' status while a QA/QA-delta subagent runs#623
xerhab merged 1 commit into
mainfrom
XERK-538

Conversation

@xerhab

@xerhab xerhab commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

What

On the Sessions page (and the Dashboard host card), a session that is working because of a background QA pass now reads "QA Review" instead of the generic "N background agents".

  • A qa subagent (first QA pass) or qa-delta (every pass after) in the session's live-agent list flips the card's status text to "QA Review".
  • The session stays in the Active category — it is still working, so it does not move to Ready-for-review or Idle, and it fires no ready-for-review alert. Only the displayed label changes.
  • A QA agent wins even when an ordinary agent (e.g. Explore) is running alongside it — a QA pass is the thing the operator is waiting on.

Why

XERK-538. When QA is running, the operator's own change is being adversarially exercised — a distinct thing to watch for versus an ordinary fan-out. The bare agent count didn't say that.

How it works

Detection keys on the live agent's type (the subagent_type), which the transcript scan already carries onto session.agents[].type (_scan_agent_entry in hub-agent.py) and the hub preserves through sanitizeLiveAgents (server.js). No new wire field, no change to the "Working"/ready-for-review determination.

Label mirrors updated:

  • turma/public/sessions.htmlQA_AGENT_TYPES + qaReviewing(s) helper; agentWorkLabel(s).
  • turma/public/index.html — same helper; dashboard liveState background-agent branch.
  • android/.../ui/CommonUi.ktliveStateLabel(state, live) (Web ⇄ Android parity).

Glasses is unaffected — it renders a working glyph (!) with no text status label, so a QA session already shows correctly as working; there is no count text to mirror.

Deliberately out of scope (noted so it's a documented decision, not an oversight): chat.js's in-chat "Background agents…" working bar (shown inside an opened session's chat view) is a separate element and still reads the generic wording. XERK-538 targets the session card + dashboard host card; extending it to the chat bar can be a follow-up if wanted.

How verified

  • cd turma && node --test1702 pass, 0 fail, including new QA-Review cases in sessions.test.js and dashboard-livestate.test.js (real jsdom DOM render asserting the card innerHTML), plus retargeted count/pluralization tests.
  • Android: SessionsTest (Robolectric/JVM) with a new liveStateLabel reads QA Review for a QA agent case → BUILD SUCCESSFUL, 0 failures.
  • Adversarial QA agent: PASS. It drove the real render code for all six claims, traced the subagent_type → type → sanitizeLiveAgents seam, and mutation-tested both platforms: neutering qaReviewing fails 3 node tests; neutering the Android QA branch fails the Kotlin test. No defects found. Not directly verified: on-device Android rendering (no emulator; Robolectric + pure-function only) — the standing PARTIAL basis for every Android UI change.

A session card reads 'N background agents' whenever it is working because of a
delegated agent (XERK-245). When that agent is the oppositional QA pass (qa on
the first pass, qa-delta after), the operator's own change is being adversarially
exercised - a distinct thing to watch. The card now reads 'QA Review' instead,
while staying in the Active category (it is still working).

Mirrored across the label sites: sessions.html (agentWorkLabel), index.html's
dashboard liveState, and Android's liveStateLabel. Glasses renders a working
glyph only (no text label), so it is unaffected. Detection keys on the live
agent's subagent_type, which the transcript scan already carries onto
session.agents[].type and the hub preserves through sanitizeLiveAgents.
@xerhab
xerhab merged commit f049c4d into main Sep 1, 2026
6 checks passed
@xerhab
xerhab deleted the XERK-538 branch September 1, 2026 20:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant