pokertools-arena 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
  | **Package** | `npx pokertools-arena` |
18
18
  | **Runtime** | Node.js ≥ 24 for tooling; any modern browser for the app |
19
19
 
20
- > **Current release: 0.4.0.** This is the methodology and reproducibility release: a paired fixed-state corpus, separated family/sizing correctness, fragmentation-invariance metrics with confidence intervals, standardized counters, and a reorganized repository with one source of truth per report.
20
+ > **Current release: 0.4.1.** A maintenance release on top of the 0.4.0 methodology work: modal tooltips now float above overflow, the launcher starts exactly once when its default port is busy, and the real-API diagnostics skip cleanly when repository secrets are absent.
21
21
 
22
22
  ---
23
23
 
@@ -135,7 +135,7 @@ function safePath(urlPath) {
135
135
  return resolved.startsWith(root) ? resolved : null;
136
136
  }
137
137
 
138
- const server = createServer(async (req, res) => {
138
+ async function handleRequest(req, res) {
139
139
  try {
140
140
  const urlPath = (req.url || '/').split('?')[0];
141
141
  if (urlPath === '/arena-env.js') {
@@ -160,7 +160,7 @@ const server = createServer(async (req, res) => {
160
160
  res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
161
161
  res.end('Not found');
162
162
  }
163
- });
163
+ }
164
164
 
165
165
  function openBrowser(url) {
166
166
  const platform = process.platform;
@@ -176,6 +176,11 @@ function openBrowser(url) {
176
176
  }
177
177
 
178
178
  function listen(port) {
179
+ // A fresh Server per attempt. Reusing one Server and calling listen() again
180
+ // from inside its EADDRINUSE handler makes Node emit 'listening' twice, which
181
+ // printed the banner twice and opened two browser windows when the port was
182
+ // already in use.
183
+ const server = createServer(handleRequest);
179
184
  server.once('error', error => {
180
185
  if (error.code === 'EADDRINUSE' && port < requestedPort + 20) return listen(port + 1);
181
186
  console.error(`pokertools-arena: ${error.message}`);
@@ -1,4 +1,4 @@
1
- # pokertools-arena 0.4.0 — benchmark methodology & results
1
+ # pokertools-arena 0.4.1 — benchmark methodology & results
2
2
 
3
3
  Generated: 2026-09-19T18:19:58.352Z
4
4
  Methodology: paired fixed-state corpus; deterministic interleaving with recorded experiment seed.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "generatedAt": "2026-09-19T18:19:58.352Z",
5
5
  "experiments": [
6
6
  "paired"
@@ -1,5 +1,28 @@
1
1
  # Release notes
2
2
 
3
+ ## 0.4.1 — Maintenance
4
+
5
+ A maintenance release on top of the 0.4.0 methodology work.
6
+
7
+ ### Tooltips
8
+
9
+ - Modal tooltips are rendered by a single fixed-position element attached to the
10
+ topmost open `<dialog>`. They escape the modal's overflow clipping, flip above
11
+ the trigger when there is no room below, and stay inside the viewport, so every
12
+ information tooltip is fully visible.
13
+
14
+ ### Launcher
15
+
16
+ - The local launcher binds a fresh HTTP server per port attempt. When the default
17
+ port is already in use it now starts exactly once (one banner, one browser
18
+ window) on the next free port instead of starting twice.
19
+
20
+ ### CI
21
+
22
+ - Real-API diagnostics have a credential preflight. When the `OPENAI_*`
23
+ repository secrets are not configured the diagnostics job is skipped with a
24
+ notice instead of failing a published release.
25
+
3
26
  ## 0.4.0 — Methodology, reproducibility and repository organization
4
27
 
5
28
  This release does not redesign the 0.3.0 decision foundations. It makes the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pokertools-arena",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Browser-first AI poker benchmark powered by @pokertools/engine with generic OpenAI-compatible endpoints, optional OpenRouter/Jev Decisions routing, deterministic hierarchical decisions, paired fixed-state methodology, and reproducible reporting.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,7 +23,7 @@
23
23
  "check": "node --check src/app.js && node --check src/benchmark/scenarios.js && node --check build.mjs && node --check bin/pokertools-arena.mjs && node tests/release-check.mjs",
24
24
  "test": "npm run build && npm run check && npm run test:unit && npm run test:integration",
25
25
  "test:unit": "node tests/unit/decision-scenarios.mjs && node tests/unit/decision-diagnostics.mjs && node tests/unit/hierarchical-decision-tests.mjs && node tests/unit/methodology-tests.mjs && node tests/unit/size-bucket-tests.mjs && node tests/unit/paired-architecture-tests.mjs && node tests/unit/archive-content.mjs && node tests/unit/report-consistency.mjs",
26
- "test:integration": "node tests/integration/pokertools-integration.mjs && node tests/integration/env-bootstrap.mjs",
26
+ "test:integration": "node tests/integration/pokertools-integration.mjs && node tests/integration/env-bootstrap.mjs && node tests/integration/launcher-port-retry.mjs",
27
27
  "test:diagnostics": "node tests/real/real-decision-diagnostics.mjs",
28
28
  "test:diagnostics:dry": "node tests/real/real-decision-diagnostics.mjs --dry-run",
29
29
  "test:real": "node tests/real/real-decision-diagnostics.mjs && node tests/real/real-paired-corpus.mjs",