Release feature-set-2 (August 17, 2026)

JF Bertrand • August 27, 2026

What's New

Noonan Investigation Agent

  • Full iterative investigation agent powered by GPT-5.6 Terra via the OpenAI Responses API.
  • 8 investigation tools: database schema search, SQL queries, code search (across 3 repos via Azure DevOps), code file reading, API calls, log search, endpoint search, and preset execution.
  • Automatic progress reporting — the frontend shows live investigation steps as Noonan works.
  • Evidence standards — the system prompt now enforces confirmed cause vs. observation vs. hypothesis in final answers.
  • Architectural knowledge seeded — 5 rows describing event structure, results pipelines, code layout, and data model for richer investigations.
  • Session continuity — Save and Update Report from investigation results, with report SQL flowing into future sessions.
  • Execute-over-advise rule — Noonan now prioritizes running tools and providing answers over suggesting the user do it themselves.

Enhanced Schema Discovery

  • search_database_schema  now returns semantic metadata (purpose, category, relationships, field notes) and auto-expands lookup table values when found.

Verification Before Awards

  • Points and money awards now require round verification before being applied. Cache cleared on verify to immediately reflect changes.

Restricted Event Registration (Invited-Only)

  • New enforcement layer: events can be marked as invited-only, blocking registration for non-invited players across web and mobile.
  • Qualification tab renamed from Registration, moved above Games in the event builder.

Member-Only Enforcement Hardened

  • Registration now properly blocks when all required items are member-only and the player is a non-member (previously allowed through).
  • Frontend shows restricted item backgrounds with updated messaging.

Mobile Results Improvements

  • Event date/time and player count shown on Ready to Play page.
  • Winning score displayed on skins tab next to hole number.
  • Winners tab separated by flights when game is flighted.
  • Game name + Flighted/Overall labels on scope pills.
  • Gross relative-to-par indicator + collapsible results header/footer.

What We Fixed

  • SQL validator now handles parameterized SQL and bumps max length to 4096 characters.
  • Results endpoints added to the Noonan API allowlist.
  • All bypass pipelines disabled (validation, reconciliation, results explainer) — everything goes through the investigation loop now.
  • Full player name (first + last) shown in skins results.
  • EventRound  course metadata fields made nullable to prevent deserialization crashes on incomplete course data.
  • "New" player status removed — all players added to groups now start as Member (status 1).
  • Registration now rejects when required pricing exists but no items are selected.
  • member_only=0  enforced on entry/admin fees (can't accidentally make event-level fees member-only).
  • Pairing requests now query master event ID instead of child round.
  • Noonan context integration tests skipped pending investigate() mock update (tech debt acknowledged).
  • Mobile: full API URL used in production builds.
  • Mobile: Nassau bet-memory pre-population + prod proxy mode fix.


By JF Bertrand August 27, 2026
What's New Noonan Chat Agent — Full Launch AI-powered data assistant for league administrators, embedded directly in the web app. Natural language queries → SQL generation → formatted results with CSV export. Thumbs up/down rating on responses, building a semantic query library. Pipeline tracing for debugging and observability. Token usage tracking, auto-CSV for 5+ row results, SQL retry on validation failure. Noonan Page-Aware Presets AI icon on key pages (Players, Pairings, Standings, Financial Report) with contextual suggested prompts. Intent router, preset registry, deterministic SQL implementations for known queries. Follow-up modification — "also add phone numbers" works after a preset export. Expandable chat panel (380px → 700px), markdown rendering in responses. Noonan Results Explainer Answers "why did X win?" and "how were payouts calculated?" questions. Per-game GPT-4o calls with structured context, then combined for accuracy. Session awareness — follow-up questions stay in explainer context. Noonan Saved Reports Save any query result as a named report. Execute later with parameterized placeholders. Backend service, API endpoints, frontend dialog and chat integration. Noonan Context-Free Chat Soft page context — Noonan works from any page, not just event-specific views. Flight resolver reads from game_config_json (correct source of truth). Saved reports accessible from any page. Deterministic Validation Report Zero-AI validation pipeline — structured JSON response showing registration vs. payment integrity per game. Shows actual collected vs. expected amounts per leaderboard. Expandable card UI in the chat panel. Financial Report Overhaul Noonan integrated into financial report page. Reconciliation CSV export with Credits Used and Payment columns. Stripe receipt URLs fetched fresh from the API (no more expired links). Stripe charge = subtotal - credits (don't trust stored payment_cents ). Exclude wait list and cancelled players from summary. Wait List Full wait list system: automatic detection when event is full, join button, position display. Admin section for managing wait list, promoting players (with audit trail). Wait list badge on mobile home screen, leave button on event info page. Wait list for all registration states with distinct messages (not open, full, closed). Member-Only Enforcement Pricing items can be marked member-only — non-members see them but can't select them. Backend persistence, API guard, and frontend UI across web and mobile. Invited-Only Events (Backend) Backend enforcement layer for restricted registration (frontend wired in feature-set-2). Scorecard Upload Agent AI-powered scorecard image extraction — take a photo of a paper scorecard, AI reads it. Multi-step dialog with real-time progress polling. Course name validation, partial success with skip/copy, combination tee support. AVIF support, 9-hole support, and observability logging. Event Snapshot Tab New Organize step showing registered players per game/fee. Required fees show missing players, optional fees show who opted in. Displays handicap index from round data. Overall Round Scoping Per-round inclusion controls for leaderboards — choose which rounds count toward overall standings. Dual-Win Exclusion Full implementation: when a player wins both gross and net, they're excluded from one board and payouts redistribute. Iterative exclusion algorithm re-checks after redistribution. Tie-group pooling, USGA Cascade tiebreaker resolution. Multi-flavor API, award_position field for resolved payout order. Frontend combined boards showing exclusion results. Mobile — Multi-Round Leaderboard Game/scope/flavor navigation on results. Smart active round detection. Per-game visible scope filtering. Flighted leaderboard display grouped by flight. Winners grouped by game and flight with conditional money/points columns. Mobile — Nassau Bets LocalStorage persistence, correct round_id resolution. Detailed results with presses, inline edit for existing bets. Round picker for multi-round events. Mobile — Live Scoring Enhancements Block scoring on verified rounds + time-window enforcement with admin bypass. Playing handicap calculated client-side using WHS formula. Skins tab uses selected round scope with round selector pills. Admin UX Improvements Invoice optional when admin adds player — "Register Only" + "Register & Invoice" buttons. Send Invoice checkbox on Edit Registration (prevents accidental billing). Disable game deletion when players are registered. Rounds Played column in roster CSV export. Credit refund option when dropping a player (mobile). Pairings CSV export with flight labels, game-based course handicap, and registration audit columns. What We Fixed Idempotency check on registerAfterPaymentNew prevents duplicate registration. Deduplicate registration_payment_audit — only latest record per player returned. Reconciliation CC charge derived from items_total - credits_used (not unreliable payment_cents ). Best ball reads allowancePct from GGK+ gameConfig.handicap when legacy fields empty. Always use round.player_index as source of truth — removed playerHandicaps override (was incorrect for multi-round). Best ball leaderboard only matches net flavor requests (prevents duplicate gross/net). Nullable EventRound ratings prevent crashes on incomplete course data. Round scoping persisted through normalize/sanitize functions. Deduplicate players in team generator for multi-round events. Quota proration uses holes_completed during live play. Sort live leaderboards by to-par instead of raw score. Legacy-to-GGK+ conversion sets event_type = 3 on master event. Calendar split: getCalendarEvents reverted to legacy behavior, new ggkGetCalendarEvents for GGK+ apps. Orphan player resolution — integrity detection, fix endpoints, tee time fix. updateRound propagates use_hcp to round.hcp_used and recalculates group handicaps. Team games (Scramble, Chapman) set hcp_used=0 for single-score rounds. Awards only run when all rounds are saved + verified. Apply allowancePct from game config in all providers (Chicago/Quota/Stableford/Skins). Only deduct handicap strokes on holes with scores (live results accuracy). Points assigned to both gross and net for quota/chicago/stableford games. Skip paid-player filtering when buyIn is disabled (sponsored money awards apply to all). Cancelled player reinstate warning in registration. Mobile: proper round resolution for play/admin pages, skins uses correct field names, flight label off-by-one fixed.
By JF Bertrand August 27, 2026
What's New