From 86f0b4bd20cdec86dfb5bdb7978d1f6ff4af111a Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Fri, 14 Aug 2026 22:41:54 +0800
Subject: [PATCH] [verified] feat: export performance diagnostics

---
 C3.tools/round1-app-column-alignment-fixture-qa.sh |   64 ++++++++++++++++++++++---------
 1 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/C3.tools/round1-app-column-alignment-fixture-qa.sh b/C3.tools/round1-app-column-alignment-fixture-qa.sh
index 9dd6692..73a3bd5 100755
--- a/C3.tools/round1-app-column-alignment-fixture-qa.sh
+++ b/C3.tools/round1-app-column-alignment-fixture-qa.sh
@@ -28,9 +28,11 @@
 
 aligner_pids_for_current_app() {
   ps -axo pid=,args= | while read -r pid command; do
-    case "$command" in
-      "$APP/Contents/MacOS/Aligner"*) echo "$pid" ;;
-    esac
+    if [[ "$command" == "$APP/Contents/MacOS/Aligner"* ]] \
+      || [[ "$command" == "/Applications/Aligner.app/Contents/MacOS/Aligner"* ]] \
+      || [[ "$command" == "$HOME/Applications/Aligner.app/Contents/MacOS/Aligner"* ]]; then
+      echo "$pid"
+    fi
   done
 }
 
@@ -56,19 +58,40 @@
   stop_current_aligner
 }
 
-keyboard_right_sequence() {
+keyboard_index_sequence() {
   local target_index="$1"
-  local sequence=""
+  local symbols="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
-  for ((index = 0; index < target_index; index++)); do
-    if [ -n "$sequence" ]; then
-      sequence="$sequence,right"
+  if [ "$target_index" -ge "${#symbols}" ]; then
+    fail "keyboard index sequence does not support target index $target_index"
+  fi
+
+  echo "${symbols:$target_index:1}"
+}
+
+normalize_keyboard_sequence() {
+  local sequence="$1"
+  local symbols="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+  local normalized=""
+  local IFS=,
+
+  for raw_part in $sequence; do
+    local part
+    part="$(printf "%s" "$raw_part" | tr '[:lower:]' '[:upper:]')"
+    if [ "${#part}" -eq 1 ] && [[ "$symbols" == *"$part"* ]]; then
+      part="app:$part"
     else
-      sequence="right"
+      part="$raw_part"
+    fi
+
+    if [ -n "$normalized" ]; then
+      normalized="$normalized,$part"
+    else
+      normalized="$part"
     fi
   done
 
-  echo "$sequence"
+  echo "$normalized"
 }
 
 wait_for_report() {
@@ -194,12 +217,14 @@
 elif mode == "keyboard":
     require(root.get("keyboardCommandsApplied") == expected_key_sequence, "debug key sequence must be applied in order")
     require(root.get("lastKeyboardCommand") == expected_key_sequence[-1], "last keyboard command must match the alignment target")
-    require(root.get("selectedAppGroupIndex") == target_app_index, "keyboard focus must select the target appGroupIndex")
-    require(item.get("isSelected") is True, "target App Shelf item must expose selected state")
-    require("selectedVisualSuppressed" in item.get("visualStates", []), "non-hovered keyboard-selected App Shelf item must suppress selected visual state")
-    cards = column.get("cards", [])
-    require(cards, "target Waterfall column must include cards")
-    require(root.get("selectedWindowID") == cards[0].get("windowID"), "right-arrow focus into target column must select its first window")
+    require(root.get("keyboardFocusedAppGroupIndex") == target_app_index, "keyboard App focus must target the requested App")
+    require(root.get("hoveredAppGroupIndex") == target_app_index, "keyboard App focus must become hovered appGroupIndex")
+    require(root.get("hoverTargetKind") == "app", "keyboard App focus must expose an App hover target")
+    require(root.get("hoverTargetSource") == "keyboard", "keyboard App focus must be reported as keyboard sourced")
+    require(item.get("isHovered") is True, "target App Shelf item must expose hover state")
+    require("hover" in item.get("visualStates", []), "target App Shelf item must expose hover visual state")
+    require(item.get("isSelected") is False, "keyboard App focus must not immediately move selected window")
+    require(root.get("selectionChangedByLastCommand") is False, "keyboard App focus must not change selected window")
     require(root.get("lastCommittedWindowID") is None, "keyboard alignment without Enter must not commit a window")
 else:
     require(False, f"unknown alignment mode {mode!r}")
@@ -254,6 +279,7 @@
   local args=(
     --round0-skip-permissions
     --round01-open-quick-switch
+    --round01-waterfall-view-mode=vertical
     --round01-fixture-app-count="$app_count"
     --round01-fixture-windows-per-app="$windows_per_app"
     --round01-debug-overlay-width="$overlay_width"
@@ -265,7 +291,7 @@
     expected_mouse_sequence="$sequence"
     args+=(--round01-debug-mouse-sequence="$sequence")
   elif [ "$mode" = "keyboard" ]; then
-    expected_key_sequence="$sequence"
+    expected_key_sequence="$(normalize_keyboard_sequence "$sequence")"
     args+=(--round01-debug-key-sequence="$sequence")
   else
     fail "unknown fixture mode: $mode"
@@ -305,8 +331,8 @@
 REGULAR_RIGHT_INDEX=$((FIXTURE_APP_COUNT - 1))
 NARROW_MIDDLE_INDEX=$((NARROW_FIXTURE_APP_COUNT / 2))
 NARROW_RIGHT_INDEX=$((NARROW_FIXTURE_APP_COUNT - 1))
-REGULAR_KEY_SEQUENCE="$(keyboard_right_sequence "$REGULAR_RIGHT_INDEX")"
-NARROW_KEY_SEQUENCE="$(keyboard_right_sequence "$NARROW_RIGHT_INDEX")"
+REGULAR_KEY_SEQUENCE="$(keyboard_index_sequence "$REGULAR_RIGHT_INDEX")"
+NARROW_KEY_SEQUENCE="$(keyboard_index_sequence "$NARROW_RIGHT_INDEX")"
 
 trap cleanup EXIT
 stop_current_aligner

--
Gitblit v1.9.3