Skip to content

fix(realtime): remove NXDOMAIN server override (minimal cherry-pick, pin-stability target) - #110

Open
yakimoto wants to merge 2 commits into
mainfrom
fix/ga-contract-001-realtime-pin
Open

yakimoto wants to merge 2 commits into
mainfrom
fix/ga-contract-001-realtime-pin

Conversation

@yakimoto

@yakimoto yakimoto commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

User description

What this is

A minimal, isolated alternative consumption path for #109's realtime fix (fix(realtime): remove NXDOMAIN server override on the 4 /realtime/* operations, commit f2aadf1).

This branch (fix/ga-contract-001-realtime-pin) is a cherry-pick of f2aadf1 onto the commit
this spec was pinned to at the time by a downstream consumer
(963712a), pushed as its own
branch. It does not touch #109's branch or history — that PR is untouched and still correct
on its own terms (it targets main, where 963712a is an ancestor).

Why this exists

A downstream service vendors this repo's openapi.yaml at a SHA pin rather than reading it live
— its served spec endpoint and its generated tool list are both derived from that vendored copy.
A review on the downstream repair PR correctly flagged that pulling #109's realtime fix through
needs a pin bump + resync + regenerate on that side.

Bumping that pin straight to f2aadf1 (this repo's main tip at the time) was tried first and
rejected: main had drifted 3+ weeks past the downstream pin (963712a → f2aadf1 is 40 files
/ ~7.2k lines — git diff --stat 963712a...f2aadf1), and all of that would have landed in the
downstream repair PR as an unreviewed side effect of a one-line NXDOMAIN fix:

  • New /compose, /leaderboard, /platform paths, including a /leaderboard//platform
    gateway-root servers override the downstream pin gate correctly didn't yet know about.
  • /compose colliding with a gateway-native /compose declaration on the downstream side —
    caught live by that repo's own collision guard test.
  • 2 new, genuinely unclassified {param} identity routes under /videos/{videoId}/chapters/ detect/{jobId} and /videos/{videoId}/chapters/{chapterId}, which a downstream
    metered-before-existence census correctly flagged as needing a real security classification —
    existence-gated vs. open, with evidence — that a contract-drift repair PR has no business
    guessing at.

None of that belongs riding in on a realtime NXDOMAIN fix's coattails. This branch gives the
downstream consumer a pin target whose diff against its prior pin is exactly the 41-line
realtime fix — verified: git diff --stat 963712a...1dbac71 (this branch's tip) matches
git diff --stat 963712a...f2aadf1's openapi.yaml hunk byte-for-byte; nothing else changed.

Disposition

Once #109 merges to main and a future pin bump legitimately carries the downstream consumer
past the compose/leaderboard/platform/video-chapters drift (with that drift properly reviewed on
its own terms — collision resolution, override classification, identity-route census entries),
this branch's SHA becomes redundant and can be deleted; #109's fix is already fully contained in
main at that point. This branch is a stepping stone, not a permanent fork of the realtime
fix.

No code review needed here beyond confirming the cherry-pick is exactly what it claims to be —
happy to close this in favor of #109 once the downstream pin naturally advances past the current
drift.

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com

Note

Low Risk
Documentation and generated types only; corrects client-facing base URLs without changing server implementation in this diff.

Overview
Aligns the Realtime OpenAPI contract with the live gateway by dropping per-operation servers overrides that pointed clients at https://realtime.wave.online (NXDOMAIN) and documenting that all four Realtime operations are called at https://api.wave.online/v1/realtime/* like other /v1 routes.

Operation descriptions no longer tell callers to use internal forward paths (e.g. “the real path is /v1/connect…”); they describe behavior only. The Realtime tag text and inline GA-CONTRACT-001 notes record the fix. generated/api-types.d.ts is regenerated to match the updated JSDoc on those paths.

Reviewed by Cursor Bugbot for commit 2a06fc9. Bugbot is set up for automated code reviews on this repo. Configure here.

Review in cubic


CodeAnt-AI Description

Route realtime operations through the working gateway endpoint

What Changed

  • Realtime WebSocket, publish, presence, and history operations now use the documented https://api.wave.online/v1/realtime/* gateway route instead of the unresolved realtime.wave.online host
  • Removed misleading internal forwarding-path details from the API descriptions
  • Updated generated API type documentation to match the corrected realtime contract

Impact

✅ Fewer realtime connection failures
✅ Correct gateway routing for realtime requests
✅ Clearer API integration guidance

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

…perations (GA-CONTRACT-001)

realtimeConnect, realtimePublish, realtimePresence and realtimeHistory carried a
per-operation `servers` override to the bare host `https://realtime.wave.online`, which does
not resolve (NXDOMAIN, confirmed via dig against 1.1.1.1 and 8.8.8.8, 2026-09-28). The real,
live route is served THROUGH the gateway at https://api.wave.online/v1/realtime/* — the
gateway authenticates, meters, then forwards internally to the wave-realtime-edge worker
(wave-gateway src/realtime-channel.ts) at rt.wave.online, a detail no caller of this contract
needs or should see. The override is removed so these four operations resolve to the
documents default server like every other /v1 route; the per-operation `description` fields
that leaked the internal forward-target path ("the real path is /v1/connect...") are also
removed, since that internal shape is not what a caller of this API calls.

Local receipts: `npx redocly lint openapi.yaml` — valid, 58 warnings both before and after
this change (diffed against origin/main baseline, zero new warnings); `node --test
"scripts/ga/**/*.test.mjs"` — 35/35 passing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@codeant-ai

codeant-ai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

🤖 CodeAnt AI — Review Status

Status Commit Started (UTC) Finished (UTC)
✅ Incremental review completed 2a06fc9 Sep 28, 2026 · 14:37 14:37
✅ Reviewed your PR 1dbac71 Sep 28, 2026 · 10:23 10:24

@codeant-ai

codeant-ai Bot commented Sep 28, 2026

Copy link
Copy Markdown

Thanks for using CodeAnt! 🎉

We're free for open-source projects. if you're enjoying it, help us grow by sharing.

Share on X ·
Reddit ·
LinkedIn

@coderabbitai

coderabbitai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

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

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 0eae99bd-c4ce-421c-b0bd-0575ed1846b6

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 1274c851-3812-4a68-b216-72bc9bf3ee75

📥 Commits

Reviewing files that changed from the base of the PR and between 3bed828 and 1dbac71.

📒 Files selected for processing (1)
  • openapi.yaml

Included review availability: This review used your included allowance. 0 included reviews remain after this review. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: Body content policy
  • GitHub Check: Secrets + content policy
  • GitHub Check: Greptile Review
  • GitHub Check: semgrep-cloud-platform/scan
  • GitHub Check: Macroscope - Approvability Check
🧰 Additional context used
🪛 Checkov (3.3.16)
openapi.yaml

[high] 1-13825: Ensure that security operations is not empty.

(CKV_OPENAPI_5)

🔇 Additional comments (2)
openapi.yaml (2)

3490-3490: LGTM!

Also applies to: 3512-3512, 3547-3547, 3573-3573


3470-3471: 🗄️ Data Integrity & Integration

Gateway route mapping remains undecided.

The OpenAPI document resolves these operations under https://api.wave.online/v1, but the gateway implementation needed to establish the four route mappings and WebSocket proxy behavior is unavailable.


📝 Summary

Summary by CodeRabbit

  • Documentation
    • Clarified that Realtime API routes use the WAVE gateway at /v1/realtime/*, which authenticates and meters requests before forwarding them.
    • Distinguished WebSocket subscriptions from REST-based publish, presence, and history operations.
    • Updated Realtime operations to use the API document’s default server.

Walkthrough

The OpenAPI document now describes Realtime operations as routes through the WAVE gateway. It removes endpoint-specific server overrides and alternate path instructions, and clarifies that the gateway authenticates and meters requests before forwarding them internally.

Changes

Realtime gateway routing documentation

Layer / File(s) Summary
Document gateway routing
openapi.yaml
The Realtime descriptions specify gateway routing and the authentication and metering boundary. The document removes four operation-specific server overrides and alternate path instructions, and distinguishes WebSocket subscription from REST operations.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~4 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 1dbac

The specification directs Realtime clients through the gateway. Gateway routing remains unverified, but no concrete failure has been found that blocks merging.

Architecture Summary

Architecture risk: 🔵 Low · up to 1dbac

The change affects 1 system.

Changed systems: openapi.yaml

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — openapi.yaml (service) was modified; 1 changed file maps to changed impact.

Before / after behavior

  • observed — Modified behavior in openapi.yaml: The Realtime tag description changes from saying the service is hosted at realtime.wave.online to specifying gateway routing at https://api.wave.online/v1/realtime/*, with gateway authentication and metering before forwarding. It also records that the prior per-operation override targeted a non-resolving hostname.
  • observed — Modified behavior in openapi.yaml: The Realtime API comment now documents gateway routing, removal of the four endpoint-specific server overrides, and the internal forwarding boundary. It distinguishes the caller-facing /v1/realtime/* routes from internal forwarding paths and describes WebSocket subscription and REST operations.
  • observed — Modified behavior in openapi.yaml: The connect description retains the presence frame description but removes the instruction that clients use the alternate /v1/connect path. Its operation-specific server override to realtime.wave.online is also removed.
  • observed — Modified behavior in openapi.yaml: The publish description no longer directs callers to /v1/channels/{channel}/publish; the operation-specific server override to realtime.wave.online is removed.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main change: removing the Realtime NXDOMAIN server override. The cherry-pick and pin-stability context is relevant.
Description check ✅ Passed The description directly explains the isolated Realtime API fix, its downstream pinning purpose, scope, validation, and temporary disposition.
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 0…
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 💡 1
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
✨ Simplify code
  • Commit to this branch
  • Create a new PR

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

@cursor

cursor Bot commented Sep 28, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_83e34c4a-b532-4df5-87d5-1bdf53718f3b)

@codeant-ai codeant-ai Bot added the size:S This PR changes 10-29 lines, ignoring generated files label Sep 28, 2026

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Devin Review found 2 potential issues.

Devin Review

Comment thread openapi.yaml Outdated
Comment thread openapi.yaml

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

No issues found across 1 file

Confidence score: 5/5

  • Automated review surfaced no issues in the provided summaries.
  • No files require special attention.
Architecture diagram
sequenceDiagram
    participant Client as API Client
    participant GW as API Gateway (api.wave.online)
    participant RT as Realtime Service
    participant Auth as Auth/Metering

    Note over Client,RT: Realtime Operations via Gateway (Current State)

    Client->>GW: WebSocket connect /v1/realtime/*
    GW->>Auth: Authenticate & meter request
    Auth-->>GW: Authorized
    GW->>RT: Forward realtime traffic
    RT-->>GW: Realtime events
    GW-->>Client: Established connection

    Client->>GW: Publish /v1/realtime/publish
    GW->>Auth: Authenticate & meter request
    Auth-->>GW: Authorized
    GW->>RT: Forward publish operation
    RT-->>GW: Acknowledgment
    GW-->>Client: Success response

    Client->>GW: Presence /v1/realtime/presence
    GW->>Auth: Authenticate & meter request
    Auth-->>GW: Authorized
    GW->>RT: Forward presence operation
    RT-->>GW: Presence data
    GW-->>Client: Presence state

    Client->>GW: History /v1/realtime/history
    GW->>Auth: Authenticate & meter request
    Auth-->>GW: Authorized
    GW->>RT: Forward history operation
    RT-->>GW: Historical messages
    GW-->>Client: Message history
Loading

Re-trigger cubic

@greptile-apps

greptile-apps Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Critical risk] Changes the public API contract for realtime endpoints.

The reviewed changes appear safe to merge.

Summary

The PR removes the unreachable Realtime server override so four operations inherit the API gateway URL, and updates their descriptions in the generated TypeScript artifact.

  • The changes since the previous review align the generated descriptions with the OpenAPI source and simplify the Realtime explanatory text.

Reviews (2) · Last reviewed commit: "fix(realtime): regenerate SDK types, rem..."

Comment thread openapi.yaml
@macroscopeapp

macroscopeapp Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a narrowly scoped OpenAPI contract fix that replaces an unresolvable realtime host with the document’s gateway server and synchronizes generated descriptions. The unresolved changelog and regression-test requirements leave the user-facing change incomplete for automatic approval.

Not approved because:

  • Credit balance exhausted. Approvability relies on correctness review in order to determine eligibility

Review your spending limits in Billing settings. You can add or adjust custom eligibility rules. Learn more.

@wave-bugbot

wave-bugbot Bot commented Sep 28, 2026

Copy link
Copy Markdown

🟢 WAVE BugBot — clear

No confident findings on the changed lines.

Local review · $0 inference · wave-dispatch

…spec

Two independent gate failures on this branch:

- sdk-types (foundation-gate): the 4 realtime operation descriptions were
  edited in openapi.yaml (removing "the real path is ..." internal-forward
  wording) but generated/api-types.d.ts was never regenerated, so the
  committed artifact drifted from source. `npm run gen:types` regenerates
  it; `git diff --exit-code -- generated/api-types.d.ts` now passes.

- Secrets + content policy (public-repo-guard): the new tag description and
  operations-block comment named the private wave-gateway repo and an
  internal file path (wave-gateway/src/realtime-channel.ts) and an internal
  worker name (wave-realtime-edge) in this PUBLIC repo's spec. Removed;
  the explanatory comments keep their substance (NXDOMAIN removal rationale,
  GA-CONTRACT-001 context) without naming private internals.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Sep 28, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_2eef675e-c91c-48d6-96d9-393d17f9af6e)

yakimoto added a commit that referenced this pull request Sep 28, 2026
…cumented GA routes

Cross-checked this lane's classification against the adversarial verifier's readiness spot-check
for "WAVE Media Engine: live transport, protocol bridges, mesh and delivery" (readiness-partial.json
verifs), plus fresh unauthenticated probes of my own:

- /dante was mislabeled: its x-price.meter (wave_dante_observe_ingests) is the "dante observe" GA
  capability's meter, but the path itself 404s ROUTE_NOT_FOUND live (confirmed independently by
  this PR's probe and the verifier's spot-check). The real live route is POST /v1/dante/observe
  (402, amount 3000, confirmed by both). Adds /dante/observe as a new GA path carrying that meter
  and price; resets /dante's meter to null since it no longer owns that capability. This is the
  literal "dante/observe" GA target this lane's brief names, not an invented capability.

- moq/publish, moq/subscribe, braid/publish and engine/capabilities were already hand-documented
  with real schemas but had no x-price block at all. A direct probe confirms all four ARE
  gateway-paywalled (402) at exactly the ops-ruled interim amounts this lane's brief lists (moq
  4000, braid 1000, engine/capabilities 1000) — matching the verifier's own measured numbers.
  Adds the missing x-price + x-wave-availability: ga rather than leave a real paywall undocumented.

- realtime/connect and siblings are deliberately left untouched: they carry their own `servers:`
  override to realtime.wave.online (owned by #110), and the 402 the verifier measured was on a
  different, gateway-proxied /v1/realtime/connect at api.wave.online — attaching that price to the
  direct-edge operation this repo documents would misattribute it to the wrong host.

- av/remux and av/demux are also left untouched. The verifier found a live, priced
  /v1/av/transform (50000) with no counterpart anywhere in this spec — a real gap, documented in
  the CHANGELOG for a follow-up lane, not invented here.

live-probe.mjs now reports 17/17 (was 16/16) media-engine GA operations live, 0 failures within
scope; redocly lint still 58 warnings (pre-existing baseline, unchanged); both test suites green.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S This PR changes 10-29 lines, ignoring generated files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant