Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .kyzn/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# kyzn — gitignored local data
history/
reports/
18 changes: 18 additions & 0 deletions .kyzn/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# kyzn configuration — commit this file
# Generated by: kyzn init
# Date: 2026-03-18T00:56:59Z

project:
name: pingdiff
type: node

preferences:
mode: deep
budget: 2.50
max_turns: 30
diff_limit: 2000
trust: guardian
on_build_fail: report

focus:
priorities: ["auto"]
3 changes: 3 additions & 0 deletions desktop/src/api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,9 @@ def get_servers(self, game_slug: str = "overwatch-2") -> Dict[str, List[Dict]]:
)
if response.status_code == 200:
servers = response.json()
if not isinstance(servers, dict):
logger.warning(f"Unexpected server response type: {type(servers).__name__}")
raise ValueError("API returned non-dict response")
total = sum(len(v) for v in servers.values())
logger.info(f"Loaded {total} servers from API")
return servers
Expand Down
2 changes: 2 additions & 0 deletions desktop/src/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ def results_to_csv(results: List[PingResult], best_only: bool = False) -> str:

def progress_callback(completed: int, total: int, result: PingResult) -> None:
"""Show progress during testing."""
if total == 0:
return
bar_width = 30
filled = int(bar_width * completed / total)
bar = "█" * filled + "░" * (bar_width - filled)
Expand Down
17 changes: 16 additions & 1 deletion desktop/src/ping_tester.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,22 @@ def test_all_servers(servers: List[Dict], ping_count: int = 10,
}

for future in as_completed(future_to_server):
result = future.result()
try:
result = future.result()
except Exception as e:
server = future_to_server[future]
logger.error(f"Unexpected error testing server {server.get('id', '?')}: {e}")
result = PingResult(
server_id=server.get("id", "unknown"),
server_location=server.get("location", "Unknown"),
ip_address=server.get("ip", ""),
ping_avg=0.0, ping_min=0.0, ping_max=0.0,
jitter=0.0, packet_loss=100.0,
successful_pings=0, total_pings=ping_count,
raw_times=[],
region=server.get("region", ""),
Comment on lines +257 to +261

Choose a reason for hiding this comment

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

P1 Badge Don't misreport malformed server entries as timeouts

When test_server() raises on bad server metadata (for example, the API/defaults omit ip or location), this fallback turns that exception into packet_loss=100.0. Both the CLI and GUI render any packet_loss >= 100 as a normal timeout/unreachable server (desktop/src/cli.py:134 and desktop/src/gui.py:797-800), so a backend/config regression gets presented as network data and can change which region is recommended. Please preserve a distinct error state instead of classifying these exceptions as packet loss.

Useful? React with 👍 / 👎.

error=str(e),
)
results.append(result)
completed += 1

Expand Down
Loading