Skip to content

test: remove assertion-free probes, copied inventories and export-shape checks - #23816

Merged
nwparker merged 1 commit into
mainfrom
nwparker/test-audit-wave2
Sep 29, 2026
Merged

nwparker merged 1 commit into
mainfrom
nwparker/test-audit-wave2

Conversation

@nwparker

@nwparker nwparker commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 18 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​5 $\color{#cf222e}{\Huge{\mathbf{−}}}$​478 $\color{#cf222e}{\Huge{\mathbf{−}}}$​473
Prod 1 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​1 $\color{#cf222e}{\Huge{\mathbf{−}}}$​1 0

ELI5

Stacked on #23815. That PR removed tests that read source code as text. This one removes three smaller categories: tests that run code and then check nothing at all, tests that retype a list the app already declares and check the two copies match, and tests that check "every export exists and is a function" — something the type checker already guarantees.

What Changed

Nothing changes for users. Test-suite only. 1 test file deleted, 16 trimmed.

  • Assertion-free cases. Blocks that call production code and then assert nothing. They pass whatever the code does, so they report a green result for a behavior nobody checked. Example: src/shared/priority-semaphore.test.ts had a "works with zero waiters" case with no assertion at all, and an "allows up to N" case whose only assertion was typeof release === 'function'.
  • Copied inventories. A string list re-typed from a production declaration, then compared back to it. The only edit that can fail such an assertion is editing one of the two copies; no behavior change can. The fix is to import the constant, and if the comparison was the test's only purpose, it has no purpose.
  • Export key-set and export-shape loops. Object.keys(module) compared to a hand-written list, and for (const fn of Object.values(mod)) expect(typeof fn).toBe('function'). TypeScript enforces both.

One production change: mobileWebCheckArgs in config/scripts/run-mobile-web-app-checks.mjs is de-exported. Once the inventory comparison went away, nothing outside the module read it.

Why

These three patterns share a failure mode with the source greps in #23815: the assertion cannot fail for a reason a user would notice. An assertion-free case is worse than no test, because it occupies the filename where real coverage would be and reports green.

Deliberately low yield. The assertion-free scanner flagged 144 files; only 17 needed edits. The rest were false positives I told the auditors to keep, in two shapes worth naming so the next sweep doesn't re-flag them:

  • The case asserts through a shared helper — expectRejected(...), a table-driven runner, a custom matcher — so no literal expect appears in the block.
  • The case's oracle is "this must not throw" or "this must not hang". A thrown error or a timeout is a real failure signal, so the case earns its place without an explicit assertion.

Alternatives considered: deleting every scanner hit unread would have been far faster and would have destroyed real coverage in both shapes above — so each flagged block was read and the helper followed before judging.

Linked Issue

N/A — test-suite hygiene, no pre-existing issue.

Visual Proof

N/A — no product code path changes. The single production edit only narrows a symbol's visibility.

Testing

Verified locally on macOS, on top of the rebased #23815:

  • pnpm tc — passes.
  • pnpm run check:code-quality:changed — passes, 0 findings across 36 changed files.
  • node config/scripts/check-reliability-gates.mjs — passes for 140 gates; confirmed no gate, cloud/package.json entry, or typecheck baseline names the deleted file.
  • 12 modified root test files: 286 passed.
  • 2 modified mobile test files: 23 passed.
  • 1 modified cloud node test: exit 0.
  • After rebasing onto current main, the 4 remaining consumers of agent-launch-caller-profiles-test-harness.ts (whose dead fields were pruned in test: remove junk tests that assert source text instead of behavior #23815): 275 passed.

Not run locally: e2e and the Windows/Linux/SSH jobs — left to CI.

  • I manually tested these changes locally
  • Automated tests added/updated, or explained why not below

Removal-only; no new tests. Verification is that the remaining suite passes and nothing references a removed file.

Review

Worth pushing back on: any case I classified as a legitimate "must not throw" oracle that you think was genuinely asserting nothing. That judgment call is the whole content of this PR, and it went the conservative way 127 times out of 144.

Agent skill upstream boundary

  • Not applicable, or this change follows docs/reference/agent-skill-sharing-upstream-boundary.md and copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

Notes

  • Security / cross-platform / SSH / mobile / back-compat / performance: no runtime code paths change. The one production edit removes an export keyword. src/shared/cross-platform-path-guards.test.ts and src/shared/process-table-snapshot.test.ts were trimmed of export-shape loops only; their platform behavior cases are intact.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

@nwparker
nwparker requested a review from Jinwoo-H as a September 29, 2026 07:55
@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[Low risk] Removes test files and assertion-free test probes.

The PR is not ready to merge while existing Codex homes without backfill tracking can lose bridged history.

Findings

  1. P2 Route grant coverage lost ▶
  2. P2 Auth bypass coverage removed ▶
  3. P2 Star source coverage removed ▶
  4. P2 WSL hook coverage narrowed ▶

Summary

The full PR removes test probes, copied inventories, and export-shape checks; changes since the previous review also add Codex history indexing and startup detection, host-stamped turn timing and native-chat turn UI, and an xterm image-decoder patch.

  • The new Codex bridge gate excludes existing databases without backfill tracking.
  • The native-chat timing merge can briefly associate a completed turn's duration with a newer prompt.

Reviews (3) · Last reviewed commit: "test: remove assertion-free probes, copi..."

@@ -131,24 +26,6 @@ describe('the page routes the manifest declares', () => {
expect(routePathnameFromKey('./h/[hostId]/_layout.tsx')).toBeNull()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Route grant coverage lost

Removing the comparisons with EXPECTED_PAGE_ROUTES leaves no independent check of every route’s grants in the built manifest. The remaining call-site tests catch missing grants but not extra ones. For example, adding native.clipboard.read to the tasks route would pass those checks, yet a shell without that capability would render the native screen instead. Please retain a check of the full route-grant contract.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

...fixture.args,
codexHomePath: null
})
})
})

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Auth bypass coverage removed

The deleted test checked that WSL, null-home, and custom-home launches complete without waiting for managed credentials. The remaining tests cover managed homes, so a change that makes one of these launches wait unnecessarily could pass the suite. Please keep a focused completion check for these three bypass paths.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@@ -55,31 +55,6 @@ describe('registerGitHubHandlers', () => {
})

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Star source coverage removed

This deleted test checked successful IPC calls and their telemetry payloads for all five accepted star sources. The remaining successful IPC test covers only settings. A future change could drop or misattribute another source without failing these tests, leaving star telemetry incomplete. Please retain a behavior test for each accepted source.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@@ -511,7 +500,6 @@ describe('Codex WSL runtime hook install', () => {
expect((await _internals.installManagedHooksIntoWslRuntime(plan)).state).toBe('installed')

const installed = JSON.parse(readFileSync(plan.configPath, 'utf-8')) as HooksConfig
expect(Object.keys(installed.hooks).sort()).toEqual([...managedEvents].sort())
const managedCommand = installed.hooks.UserPromptSubmit[0]?.hooks?.[0]?.command

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 WSL hook coverage narrowed

Removing the installed-event assertion leaves this WSL installation test checking only UserPromptSubmit. A WSL-specific change that omits another managed event could pass while that event’s hook no longer runs. Please keep a check that the installed WSL configuration contains all managed events.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

Removal-only test hygiene, stacked on #23815: it deletes three categories of test that cannot fail for a behavior reason and de-exports one now-internal symbol. Reviewed against nwparker/test-audit-wave1.

  • Assertion-free probes dropped — cdp-ws-proxy "rejects inflight requests on stop", daemon-server fire-and-forget write, ws-transport start/stop, and managed-codex-auth-readiness "does not gate system/WSL/unmanaged custom homes". The unmanaged-homes case is genuinely unfailable: that path returns undefined synchronously, and a regressed guard would resolve false after a 1.5s wait rather than throw.
  • Copied inventories dropped — Relay PRODUCTION_CAPACITY_CELL_IDS, xterm PNPM_DIFF_FLAGS, mobile EXPECTED_PAGE_ROUTES/SPELLED_COUNTS, BRIDGE_NATIVE_VERB_NAMES, BRIDGE_HAPTICS_KINDS, GitHub star sources, WSL managed hook events, and workspace-list-picker-options.test.ts (the deleted file). Each list is still covered by a test that imports the constant it pins.
  • Export key-set/shape loops dropped — opencode/hook-service module surface, the cross-platform-path-guards create-factory filter, and the process-table-snapshot index key set. The last duplicates the closed return type on ProcessTableIndexOf.
  • Env-gated benchmark blocks dropped — the ORCA_GIT_*_COALESCING_BENCH_JSON writers in status-read-coalescing.test.ts / upstream.test.ts.
  • Production — mobileWebCheckArgs in config/scripts/run-mobile-web-app-checks.mjs is de-exported.

I checked the failure modes a deletion-only PR usually introduces and found none: mobileWebCheckArgs has no other consumer; PNPM_DIFF_FLAGS still has in-file users; the ORCA_GIT_*_COALESCING_BENCH_JSON env vars are referenced nowhere else; the deleted file is absent from gates, ci-shard-timings.json, and unit-file lists; and every remaining import is still used. The persisted-sort-values pin that went with the deleted mobile file is type-backed by the MobileSortMode union plus SORT_VALUES, so no cross-version contract is lost.

Pullfrog  | Fix it ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

@nwparker
nwparker force-pushed the nwparker/test-audit-wave1 branch from 78ef9d7 to 469b2a0 Compare September 29, 2026 08:06
@nwparker
nwparker force-pushed the nwparker/test-audit-wave2 branch from 643e423 to f634805 Compare September 29, 2026 08:06
…pe checks

Second audit wave, targeting three more junk patterns:

- assertion-free cases that run code and assert nothing, so they pass no
  matter what the code does;
- inventory literals re-typed from a production declaration, where the only
  way the assertion can fail is someone editing one of the two copies;
- export key-set and export-shape loops (`typeof x === 'function'` over every
  export) that restate what TypeScript already enforces.

Yield is much smaller than wave 1 on purpose: the assertion-free scanner has
a high false-positive rate, because many flagged blocks assert through a
shared helper or their oracle is "this must not throw". Those were kept.

`mobileWebCheckArgs` in `config/scripts/run-mobile-web-app-checks.mjs` is
de-exported — after the inventory comparison went away, nothing outside the
module read it.
@nwparker
nwparker force-pushed the nwparker/test-audit-wave2 branch from f634805 to 0878d76 Compare September 29, 2026 08:31
@nwparker
nwparker changed the base branch from nwparker/test-audit-wave1 to main September 29, 2026 08:32
@greptile-apps

greptile-apps Bot commented Sep 29, 2026

Copy link
Copy Markdown

Comments Outside Diff

These findings could not be posted inline.

  • P1 Existing Codex history stays hidden src/main/codex/codex-account-session-bridge.ts:83 ▶

    If an existing managed home has a Codex state database without a backfill_state record, the status is not-tracked. This gate accepts only complete or missing, so it skips linking history on every launch where the database remains untracked. Conversations from the user's other homes then never appear in this account's /resume picker.

  • P2 Prior duration labels new turn src/renderer/src/components/native-chat/use-native-chat-terminal-turn-timing.ts:42 ▶

    If a new user prompt reaches the transcript before the hook status moves past the previous turn's done state, this code assigns the previous turn's recorded duration to the new prompt. The newest turn can briefly appear completed with the wrong duration, making the turn status misleading until the status update arrives.

@coderabbitai

coderabbitai Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

📝 Walkthrough

Walkthrough

This change removes selected tests across configuration scripts, mobile code, and main and shared modules. The removed tests covered exact values and shapes, selected runtime behavior, and optional Git coalescing benchmarks. The mobileWebCheckArgs constant is now module-local.

Priority: ⬇️ Low

Merge Risk: 🔵 Low · up to 0878d

Current behavior is unchanged, but future regressions in mobile routing, non-managed authentication workflows, or proxy cleanup could go undetected. These bounded test gaps are inexpensive to address, so merge risk is low.

Architecture Summary

Architecture risk: 🔵 Low · up to 0878d

The change affects 4 systems.

Changed systems: config, src, mobile, cloud

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — config (service) was modified; 4 changed files map to changed impact.
  • observed — src (service) was modified; 11 changed files map to changed impact.
  • observed — mobile (service) was modified; 3 changed files map to changed impact.
  • observed — cloud (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in cloud/dev/scripts/prepare-relay-production-capacity-canary.test.mjs: Removed the PRODUCTION_CAPACITY_CELL_IDS import; the test now imports only the argument parser and preparation function.
  • observed — Modified behavior in cloud/dev/scripts/prepare-relay-production-capacity-canary.test.mjs: Removed the assertion listing the approved production capacity cell IDs.
  • observed — Modified behavior in config/scripts/mobile-web-page-routes.test.mjs: The imports are reduced to the route schema, route resolver, and route-path parser; imports used by the removed setup and bundle integration tests are deleted.
  • observed — Modified behavior in config/scripts/mobile-web-page-routes.test.mjs: The test setup and hard-coded expected page-route table were removed, including the session grant lists and spelled-count data derived from that table.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately identifies the three main categories of tests removed: assertion-free probes, copied inventories, and export-shape checks.
Description check ✅ Passed The description is complete and well aligned with the template. It explains the change, rationale, alternatives, testing performed, scope impact, review focus, and checklist status. The N/A linked iss…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 5…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
config/scripts/mobile-web-page-routes.test.mjs (1)

77-80: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Compare the generated routes with the mapped declaration shape.

resolveMobileWebPageRoutes() omits empty optionalGrants fields. Therefore, compare manifest.routes with the same mapped shape instead of comparing it directly with MOBILE_WEB_PAGE_ROUTES. This detects omitted or mis-mapped path and grant values without adding a separate route inventory.

Suggested fix
+import { MOBILE_WEB_PAGE_ROUTES } from './mobile-web-page-routes.mjs'
+import { resolveMobileWebPageRoutes } from './build-mobile-web-app-bundle.mjs'
+
+it('writes the declared page routes to the manifest', async () => {
+  const { manifest } = await buildMobileWebAppBundle(...)
+  expect(manifest.routes).toEqual(
+    resolveMobileWebPageRoutes(
+      routeKeys,
+      MOBILE_WEB_PAGE_ROUTES
+    )
+  )
+})
src/main/codex-accounts/managed-codex-auth-readiness.test.ts (1)

223-238: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Restore explicit bypass assertions for non-managed Codex homes.

waitForManagedCodexAuthReady must return undefined for custom homes, WSL targets, and a missing home. The removed test awaited these calls but never asserted their return values, so it would pass even if the helper started retrying unavailable credentials. No remaining test covers these three bypass branches.

Suggested fix
   it('separates an absent credential from one that cannot be read', () => {
     const fixture = createFixture()
     expect(readStoredCodexCredentialState(join(fixture.home, 'auth.json'))).toBe('missing')

     if (process.platform === 'win32' || process.getuid?.() === 0) {
       return
     }
     writeAuth(fixture.home, testChatGptAuth)
     chmodSync(join(fixture.home, 'auth.json'), 0o000)
     expect(readStoredCodexCredentialState(join(fixture.home, 'auth.json'))).toBe('unreadable')
   })
+
+  it('does not gate system, WSL, or unmanaged custom homes', () => {
+    const fixture = createFixture()
+    expect(
+      waitForManagedCodexAuthReady({
+        ...fixture.args,
+        codexHomePath: join(fixture.root, 'custom-home')
+      })
+    ).toBeUndefined()
+    expect(
+      waitForManagedCodexAuthReady({
+        ...fixture.args,
+        target: { runtime: 'wsl', wslDistro: 'Ubuntu' }
+      })
+    ).toBeUndefined()
+    expect(
+      waitForManagedCodexAuthReady({
+        ...fixture.args,
+        codexHomePath: null
+      })
+    ).toBeUndefined()
+  })
 })
src/main/browser/cdp-ws-proxy.test.ts (1)

770-805: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add an invocation barrier before stopping the proxy.

The final resolveCommand!({}) call makes the test fail if sendCommand never runs. However, the 10 ms delay does not prove that sendCommand ran before proxy.stop() began. A delayed WebSocket message can start after shutdown begins, so the test may avoid the in-flight condition. Restore the test with a barrier resolved by the sendCommand mock.

Suggested fix
   it('rejects inflight requests on stop', async () => {
     let resolveCommand: (v: unknown) => void
+    let markCommandInvoked!: () => void
+    const commandInvoked = new Promise<void>((resolve) => {
+      markCommandInvoked = resolve
+    })
     mock.webContents.debugger.sendCommand.mockImplementation(
-      () =>
-        new Promise((r) => {
+      () => {
+        markCommandInvoked()
+        return new Promise((r) => {
           resolveCommand = r as (v: unknown) => void
         })
+      }
     )
 
     const client = await connect(endpoint)
     client.send(JSON.stringify({ id: 1, method: 'Page.enable', params: {} }))
 
-    await new Promise((r) => setTimeout(r, 10))
+    await commandInvoked
     await proxy.stop()

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 4ae27cc9-3f98-460e-86e2-bad2c9e7676c

📥 Commits

Reviewing files that changed from the base of the PR and between 4da485c and 0878d76.

📒 Files selected for processing (19)
  • cloud/dev/scripts/prepare-relay-production-capacity-canary.test.mjs
  • config/scripts/mobile-web-page-routes.test.mjs
  • config/scripts/pr-workflow-parallelism.test.mjs
  • config/scripts/regenerate-xterm-patches.test.mjs
  • config/scripts/run-mobile-web-app-checks.mjs
  • mobile/src/mobile-web-shell/bridge/bridge-native-verbs.test.ts
  • mobile/src/mobile-web-shell/page-haptics.test.ts
  • mobile/src/worktree/workspace-list-picker-options.test.ts
  • src/main/browser/cdp-ws-proxy.test.ts
  • src/main/codex-accounts/managed-codex-auth-readiness.test.ts
  • src/main/codex/hook-service-wsl-runtime.test.ts
  • src/main/daemon/daemon-server.test.ts
  • src/main/git/status-read-coalescing.test.ts
  • src/main/git/upstream.test.ts
  • src/main/ipc/github-star-telemetry.test.ts
  • src/main/opencode/hook-service.test.ts
  • src/main/runtime/rpc/ws-transport.test.ts
  • src/shared/cross-platform-path-guards.test.ts
  • src/shared/process-table-snapshot.test.ts
💤 Files with no reviewable changes (14)
  • src/main/runtime/rpc/ws-transport.test.ts
  • src/shared/cross-platform-path-guards.test.ts
  • mobile/src/worktree/workspace-list-picker-options.test.ts
  • src/main/codex-accounts/managed-codex-auth-readiness.test.ts
  • src/main/opencode/hook-service.test.ts
  • config/scripts/pr-workflow-parallelism.test.mjs
  • src/main/daemon/daemon-server.test.ts
  • src/shared/process-table-snapshot.test.ts
  • src/main/ipc/github-star-telemetry.test.ts
  • src/main/browser/cdp-ws-proxy.test.ts
  • config/scripts/regenerate-xterm-patches.test.mjs
  • mobile/src/mobile-web-shell/bridge/bridge-native-verbs.test.ts
  • src/main/codex/hook-service-wsl-runtime.test.ts
  • src/main/git/status-read-coalescing.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

@nwparker
nwparker merged commit 31012ae into main Sep 29, 2026
61 checks passed
brennanb2025 added a commit that referenced this pull request Sep 29, 2026
…3745, #23783, #22971, #22565, #22846, #23724, #23721, #23693, #23810) into #23059

#23671 (group chat rows by the turn that produced them) is ported onto
#23059's turn-scope model, so there is one grouping mechanism, not two:

- A host that states each row's turn scope groups by that scope, as
  before. #23671's journal-order derivation (rows between one turn record
  and the next belong to it) moves from the timing selector into
  src/shared/native-chat-turn-grouping.ts and runs only for a host that
  states no scope, replacing the positional fallback there.
- #23671's anchor rules live in structuredAgentTurnAnchors, which
  membership, settled timing and the live clock all read: a turn whose
  opener key nothing resolves yet takes the send still in flight ahead of
  its record (Codex before its echo), else its own record.
- The live turn is one key again. #23671 made row liveness follow the
  owning turn, so the bar key and the liveness key are always the same;
  nativeChatTurnMembership now returns only liveTurnKey (barTurnKey,
  activeTurnOpenedBy and turnKeysByItemId are gone).
- A turn with no user bubble draws its bar above its first row
  (nativeChatTurnBarRows, desktop and mobile), and a turn's diff rollup
  goes under its last row.
- The Codex full-history restore writes each record ahead of its items;
  that also fixes the derived turn scope on #23059's journal.

#23026 (Stop from the moment a message is sent) is ported onto #23059's
command turns: the cancel paths ask the translator for a command's
provider turn instead of the removed compaction tracker, and a Stop that
names no turn still ends a running /compact through its child.
performCancel moved to structured-agent-session-turns-cancel.ts to keep
the turns module under the line limit.

#22090's awaitingInput replaces showTurnStatus/showLiveTurnActivity; the
waiting-behind-/compact rows are kept.
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