Skip to content

feat(sdk): CommsAPI.listTenants — E9.4 registry read - #95

Merged
yakimoto merged 1 commit into
mainfrom
feat/comms-list-tenants
Aug 25, 2026
Merged

feat(sdk): CommsAPI.listTenants — E9.4 registry read#95
yakimoto merged 1 commit into
mainfrom
feat/comms-list-tenants

Conversation

@yakimoto

@yakimoto yakimoto commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

feat(sdk): CommsAPI.listTenants — E9.4 registry read

WHAT

wave.comms.listTenants() GETs /v1/comms/tenants and returns the caller org's tenant rows — client_id, pod_id, key_id, created_at — with the API-key VALUE structurally absent (the mint-once contract: the value is never stored, so the read surface cannot contain it). Requires the comms:read scope (the gateway PR #1337 added it alongside comms:write). An org with no tenants returns an empty list.

WHY

The four-renderings law: E9.4 shipped its API cell (gateway #1337, merged). The SDK cell closes the read loop — the write (createTenant) mints a NEW key per call, so listing is the only way to answer "what do I already have" without minting another credential. The console cell follows.

VERIFICATION

  • 4/4 comms tests green (3 pre-existing + listTenants: GET shape, empty-row safety, no api_key in the JSON, no write called); tsc clean.

View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


Note

Low Risk
Read-only SDK wrapper around an existing gateway endpoint; no auth or credential storage changes in this diff.

Overview
Adds CommsAPI.listTenants() so callers can read their org’s comms tenant registry via GET /v1/comms/tenants, complementing createTenant (which mints a new key each time).

The method is typed with new CommsTenantListResult / CommsTenantListRow shapes (client_id, pod_id, key_id, created_at — no secret material). Docs call out comms:read and the mint-once rule that api_key must not appear on the list response.

Tests assert the GET path, row fields, that serialized JSON never contains api_key, and that post is not used for this read.

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

Summary by Sourcery

Add the SDK read path for retrieving an organization’s comms tenants.

New Features:

  • Add CommsAPI.listTenants() to retrieve the caller organization’s comms tenant registry.
  • Expose tenant registry rows without including API-key values.

Tests:

  • Add coverage for the tenant listing request, returned rows, API-key omission, and prevention of unintended writes.

Review in cubic

@codeant-ai

codeant-ai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Your free trial PR review limit of 300 PRs has been reached. Please upgrade your plan to continue using CodeAnt AI.

@sourcery-ai sourcery-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.

Sorry @yakimoto, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 5 days and 22 hours by commenting @sourcery-ai review. Upgrade to get a review now.

@cursor

cursor Bot commented Aug 25, 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_137d032e-376f-4990-b73d-bd6ac328523f)

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 43 minutes.

View limit details

Limit details: You’ve used the included review currently available. Your 91 included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: aca000f8-d298-41ed-bca7-1a0977081f45

📥 Commits

Reviewing files that changed from the base of the PR and between 6c3e9b4 and dd65412.

📒 Files selected for processing (2)
  • src/__tests__/comms.test.ts
  • src/comms.ts

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

@sourcery-ai

sourcery-ai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Reviewer's Guide

Adds CommsAPI.listTenants() as a typed comms:read registry lookup that returns the caller organization’s tenant metadata without API-key values, with tests covering request shape, response data, and mint-once credential safety.

Sequence diagram for the CommsAPI tenant registry read

sequenceDiagram
    participant Caller
    participant CommsAPI
    participant WaveClient
    participant Gateway

    Caller->>CommsAPI: listTenants()
    CommsAPI->>WaveClient: get(/v1/comms/tenants)
    WaveClient->>Gateway: GET /v1/comms/tenants
    Gateway-->>WaveClient: CommsTenantListResult
    WaveClient-->>CommsAPI: org and tenant metadata
    CommsAPI-->>Caller: tenants[] without api_key
Loading

File-Level Changes

Change Details Files
Add the SDK registry-read method and response models for caller-org comms tenants.
  • Implement listTenants() as a typed GET to /v1/comms/tenants.
  • Define tenant list and row interfaces exposing client, pod, key identifier, and creation timestamp while omitting API-key values.
src/comms.ts
Verify the registry read request, response mapping, and credential-safety contract.
  • Test the GET endpoint and returned tenant fields.
  • Assert empty/normal read behavior does not expose api_key or invoke the tenant-creation POST path.
src/__tests__/comms.test.ts

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Add CommsAPI.listTenants to read comms tenant registry (E9.4)

✨ Enhancement 🧪 Tests 🕐 20-40 Minutes

Grey Divider

AI Description

• Add SDK method to GET /v1/comms/tenants and return tenant registry rows.
• Introduce typed list response models that exclude API-key value (mint-once contract).
• Add unit test covering request shape and absence of api_key in returned JSON.
Diagram

graph TD
  A["SDK Consumer"] --> B["CommsAPI"] --> C["WaveClient"] --> D[("Comms Gateway API")]
  D --> E["CommsTenantListResult"]
  subgraph F["Test"]
    G["comms.test.ts"] --> B
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Derive list row type from existing tenant type (e.g., Omit)
  • ➕ Avoids duplicating field definitions across create vs list models
  • ➕ Keeps types consistent if shared fields evolve
  • ➖ Only works cleanly if an existing base type is structured to support omission without leaking api_key
  • ➖ May obscure the explicit “read surface excludes value” contract
2. Encode the mint-once contract in the core tenant type (api_key: never | absent)
  • ➕ Stronger compile-time guarantee that read models cannot contain api_key
  • ➕ Reduces reliance on convention and reviewer attention
  • ➖ May complicate the createTenant response typing if it legitimately includes a minted value
  • ➖ Can make SDK types harder to understand for consumers
3. Generate SDK models from an OpenAPI spec
  • ➕ Keeps SDK in sync with gateway schema and avoids drift
  • ➕ Scales better as endpoints and variants grow
  • ➖ Higher upfront tooling/process cost for a small addition
  • ➖ May constrain hand-crafted ergonomics of the SDK API layer

Recommendation: The current approach (dedicated CommsTenantListRow/Result + a direct GET wrapper) is appropriate for this small change and keeps the “no api_key on read surface” contract explicit. If type duplication becomes recurring across comms endpoints, consider a follow-up to factor shared fields via Omit/Pick or adopt schema-driven generation.

Files changed (2) +34 / -0

Enhancement (1) +20 / -0
comms.tsImplement CommsAPI.listTenants and add typed registry response models +20/-0

Implement CommsAPI.listTenants and add typed registry response models

• Adds CommsAPI.listTenants() which performs a GET to /v1/comms/tenants and returns a typed result. Introduces CommsTenantListRow and CommsTenantListResult interfaces to model the registry read response with tenant metadata (client_id, pod_id, key_id, created_at) and no API-key value.

src/comms.ts

Tests (1) +14 / -0
comms.test.tsAdd listTenants unit test for GET shape and api_key absence +14/-0

Add listTenants unit test for GET shape and api_key absence

• Introduces a new test suite for CommsAPI.listTenants that stubs client.get() and verifies the call path uses GET /v1/comms/tenants. Asserts returned data shape and that serialized output does not contain an api_key value, and ensures no POST is invoked.

src/tests/comms.test.ts

@github-actions

Copy link
Copy Markdown

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 1 🔵⚪⚪⚪⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

Test Coverage Gap

The PR description claims tests for "empty-row safety" (an org with no tenants returning an empty list), but only the populated-rows case is covered. Since listTenants is a raw passthrough of the response body, a response omitting tenants (or returning null) would surface as undefined to consumers who type it as CommsTenantListRow[], and iterating it throws. Either add the empty/missing-tenants test or normalize the field before returning.

describe("CommsAPI.listTenants (E9.4)", () => {
  it("GETs /v1/comms/tenants and returns the org's rows", async () => {
    const { client, post } = mockClient();
    const get = vi.fn(async () => ({ org: "acme", tenants: [{ client_id: "acme", pod_id: "pod-1", key_id: "k1", created_at: "2026-08-24T00:00:00Z" }] }));
    Object.assign(client, { get });
    const api = new CommsAPI(client);
    const r = await api.listTenants();
    expect(get).toHaveBeenCalledWith("/v1/comms/tenants");
    expect(r.tenants[0].pod_id).toBe("pod-1");
    expect(JSON.stringify(r)).not.toContain("api_key");
    expect(post).not.toHaveBeenCalled();
  });
});

@github-actions

Copy link
Copy Markdown

PR Code Suggestions ✨

No code suggestions found for the PR.

Comment thread src/comms.ts
Comment on lines +43 to +45
async listTenants(): Promise<CommsTenantListResult> {
return this.client.get<CommsTenantListResult>(`${this.basePath}/tenants`);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Edge Case: listTenants has no pagination while other list* SDK methods do

Every other list method in this SDK (listSubscriptions, listTips, listPayouts, listAssistants, listSuggestions in creator.ts/studio-ai.ts) accepts PaginationParams and returns PaginatedResponse<T>, but listTenants() takes no params and returns a bare { org, tenants[] } shape. If an org accumulates many tenants, this call has no way to page through results and risks large unbounded responses. Confirm with the gateway whether /v1/comms/tenants supports limit/cursor query params; if so, thread PaginationParams through this call for consistency with the rest of the SDK.

Was this helpful? React with 👍 / 👎

Comment on lines +43 to +55
describe("CommsAPI.listTenants (E9.4)", () => {
it("GETs /v1/comms/tenants and returns the org's rows", async () => {
const { client, post } = mockClient();
const get = vi.fn(async () => ({ org: "acme", tenants: [{ client_id: "acme", pod_id: "pod-1", key_id: "k1", created_at: "2026-08-24T00:00:00Z" }] }));
Object.assign(client, { get });
const api = new CommsAPI(client);
const r = await api.listTenants();
expect(get).toHaveBeenCalledWith("/v1/comms/tenants");
expect(r.tenants[0].pod_id).toBe("pod-1");
expect(JSON.stringify(r)).not.toContain("api_key");
expect(post).not.toHaveBeenCalled();
});
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Quality: PR description claims an untested 'empty-row safety' case

The PR description states the test suite covers 'empty-row safety' (an org with no tenants returning an empty list), but the only new test in comms.test.ts (lines 43-55) mocks a response with one tenant row — there is no assertion against tenants: []. Add a test case asserting listTenants() returns { org, tenants: [] } cleanly when the org has no tenants, to actually verify the claimed behavior.

Was this helpful? React with 👍 / 👎

@gitar-bot

gitar-bot Bot commented Aug 25, 2026

Copy link
Copy Markdown

Note

Automatic reviews are paused because your team has used its included automatic processing for this billing period (headroom scales with your seat count). You can still comment "Gitar review" to run one anytime, and automatic reviews resume on their own by September 1. Add seats for more headroom.
Learn more

Code Review 👍 Approved with suggestions 0 resolved / 2 findings

Adds CommsAPI.listTenants() to retrieve comms tenant records without exposing API keys. Consider adding pagination to match other list methods and verifying the empty-row test case mentioned in the description.

💡 Edge Case: listTenants has no pagination while other list* SDK methods do

📄 src/comms.ts:43-45

Every other list method in this SDK (listSubscriptions, listTips, listPayouts, listAssistants, listSuggestions in creator.ts/studio-ai.ts) accepts PaginationParams and returns PaginatedResponse<T>, but listTenants() takes no params and returns a bare { org, tenants[] } shape. If an org accumulates many tenants, this call has no way to page through results and risks large unbounded responses. Confirm with the gateway whether /v1/comms/tenants supports limit/cursor query params; if so, thread PaginationParams through this call for consistency with the rest of the SDK.

💡 Quality: PR description claims an untested 'empty-row safety' case

📄 src/tests/comms.test.ts:43-55

The PR description states the test suite covers 'empty-row safety' (an org with no tenants returning an empty list), but the only new test in comms.test.ts (lines 43-55) mocks a response with one tenant row — there is no assertion against tenants: []. Add a test case asserting listTenants() returns { org, tenants: [] } cleanly when the org has no tenants, to actually verify the claimed behavior.

🤖 Prompt for agents
Code Review: Adds CommsAPI.listTenants() to retrieve comms tenant records without exposing API keys. Consider adding pagination to match other list methods and verifying the empty-row test case mentioned in the description.

1. 💡 Edge Case: listTenants has no pagination while other list* SDK methods do
   Files: src/comms.ts:43-45

   Every other list method in this SDK (listSubscriptions, listTips, listPayouts, listAssistants, listSuggestions in creator.ts/studio-ai.ts) accepts PaginationParams and returns PaginatedResponse<T>, but listTenants() takes no params and returns a bare { org, tenants[] } shape. If an org accumulates many tenants, this call has no way to page through results and risks large unbounded responses. Confirm with the gateway whether /v1/comms/tenants supports limit/cursor query params; if so, thread PaginationParams through this call for consistency with the rest of the SDK.

2. 💡 Quality: PR description claims an untested 'empty-row safety' case
   Files: src/__tests__/comms.test.ts:43-55

   The PR description states the test suite covers 'empty-row safety' (an org with no tenants returning an empty list), but the only new test in comms.test.ts (lines 43-55) mocks a response with one tenant row — there is no assertion against `tenants: []`. Add a test case asserting `listTenants()` returns `{ org, tenants: [] }` cleanly when the org has no tenants, to actually verify the claimed behavior.

Options

Display: compact → Showing less information.

Comment with these commands to change the behavior for this request:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (1) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Missing listTenants changelog entry 📘 Rule violation § Compliance
Description
This PR adds the user-facing CommsAPI.listTenants() method and its public result types, but the
diff does not add an entry under CHANGELOG.md's Unreleased section. Consumers therefore receive
an undocumented API surface change.
Code

src/comms.ts[R43-44]

+  async listTenants(): Promise<CommsTenantListResult> {
+    return this.client.get<CommsTenantListResult>(`${this.basePath}/tenants`);
Relevance

●●● Strong

Explicit repository rule requires documenting every user-facing API change; this adds a public
method and result types.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The checklist requires every user-facing API behavior change to have a new or updated entry in the
root changelog's Unreleased section. CHANGELOG.md contains only the Unreleased header, while the
changed SDK method introduces a new public GET API and return type.

Rule 2497929: Document user-facing changes in CHANGELOG.md Unreleased section
src/comms.ts[43-44]
CHANGELOG.md[7-7]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new public `CommsAPI.listTenants()` API is user-facing but is not documented in the changelog's Unreleased section.

## Issue Context
Add an entry describing the new comms tenant registry read endpoint, returned fields, required `comms:read` scope, and that API-key values are never returned.

## Fix Focus Areas
- CHANGELOG.md[7-7]
- src/comms.ts[43-44]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Export list result types 🐞 Bug ⚙ Maintainability
Description
CommsAPI.listTenants() publicly returns CommsTenantListResult, but the package entry point
exports only the pre-existing comms request and tenant types. Consumers importing from the SDK root
cannot name or import the new method's result types, so the advertised public TypeScript API is
incomplete.
Code

src/comms.ts[R43-44]

+  async listTenants(): Promise<CommsTenantListResult> {
+    return this.client.get<CommsTenantListResult>(`${this.basePath}/tenants`);
Relevance

●● Moderate

Public API completeness is plausible, but history lacks a close precedent requiring root exports for
newly added return interfaces.

PR-#93

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The changed method exposes a new public return type, while the package entry point's existing comms
exports omit both interfaces. The implementation and direct tests confirm the method is intended as
a public SDK surface, not an internal helper.

src/comms.ts[43-44]
src/comms.ts[52-62]
src/index.ts[345-348]
src/tests/comms.test.ts[43-54]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The newly added public `CommsAPI.listTenants()` method returns `CommsTenantListResult`, but `src/index.ts` does not re-export `CommsTenantListResult` or `CommsTenantListRow` from the package entry point.

## Issue Context
The method is exposed through the SDK root, while consumers commonly import public types from that same root. Direct module tests do not catch the missing package-root exports.

## Fix Focus Areas
- src/index.ts[345-348]
- src/comms.ts[52-62]

Update the package-root exports to include both new public result interfaces, and add a type-level/export test if this repository has coverage for package entry-point exports.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 14 rules
✅ Skills: wave-custody
Review mode: 🚀 Fast: This is a localized SDK method and type addition with a direct GET path, limited blast radius, and focused tests; it avoids security-sensitive implementation changes and broad cross-cutting logic.

Grey Divider

Tip of the day
💡 Did you know, you can hide the parts of a finding you never read, like the evidence or the agent prompt

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread src/comms.ts
Comment on lines +43 to +44
async listTenants(): Promise<CommsTenantListResult> {
return this.client.get<CommsTenantListResult>(`${this.basePath}/tenants`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

1. Missing listtenants changelog entry 📘 Rule violation § Compliance

This PR adds the user-facing CommsAPI.listTenants() method and its public result types, but the
diff does not add an entry under CHANGELOG.md's Unreleased section. Consumers therefore receive
an undocumented API surface change.
Agent Prompt
## Issue description
The new public `CommsAPI.listTenants()` API is user-facing but is not documented in the changelog's Unreleased section.

## Issue Context
Add an entry describing the new comms tenant registry read endpoint, returned fields, required `comms:read` scope, and that API-key values are never returned.

## Fix Focus Areas
- CHANGELOG.md[7-7]
- src/comms.ts[43-44]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src/comms.ts
Comment on lines +43 to +44
async listTenants(): Promise<CommsTenantListResult> {
return this.client.get<CommsTenantListResult>(`${this.basePath}/tenants`);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

2. Export list result types 🐞 Bug ⚙ Maintainability

CommsAPI.listTenants() publicly returns CommsTenantListResult, but the package entry point
exports only the pre-existing comms request and tenant types. Consumers importing from the SDK root
cannot name or import the new method's result types, so the advertised public TypeScript API is
incomplete.
Agent Prompt
## Issue description
The newly added public `CommsAPI.listTenants()` method returns `CommsTenantListResult`, but `src/index.ts` does not re-export `CommsTenantListResult` or `CommsTenantListRow` from the package entry point.

## Issue Context
The method is exposed through the SDK root, while consumers commonly import public types from that same root. Direct module tests do not catch the missing package-root exports.

## Fix Focus Areas
- src/index.ts[345-348]
- src/comms.ts[52-62]

Update the package-root exports to include both new public result interfaces, and add a type-level/export test if this repository has coverage for package entry-point exports.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-code-review

Copy link
Copy Markdown

Qodo Fixer

🍒 Ready to be cherry-picked — ✅ Merged (0) · ☑ Fixed (2)

Grey Divider

🔗 Fix PR: #96

This fix PR was closed automatically. Its branch is preserved so you can cherry pick the changes into the original PR.

Prompt for coding agent

This is an automated fix prepared on a separate branch (#96). It is NOT applied to this PR.
To use it: review Fix PR #96 (https://github.com/wave-av/sdk/pull/96), evaluate each change critically against your local context, and cherry-pick the changes that are correct into this branch. Do not accept them blindly.
Process — 2 fixed
  • ☑ Fixed: Missing listTenants changelog entry
  • ☑ Fixed: Export list result types

@cursor cursor 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.

Risk: low. Left a non-blocking comment and did not approve because Cursor Bugbot skipped with incomplete results (usage limit), even though Cursor Security Agent passed with no findings. Human review is needed; no reviewers were assigned because no eligible reviewers were available beyond the author.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

@macroscopeapp

macroscopeapp Bot commented Aug 25, 2026

Copy link
Copy Markdown

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR adds a new public SDK capability for reading the comms tenant registry, including a new endpoint contract and exported response types. Pagination behavior and incomplete package-root type exports remain to be validated, so the public API change warrants human review.

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.

@yakimoto
yakimoto merged commit 3f366cb into main Aug 25, 2026
24 checks passed
@yakimoto
yakimoto deleted the feat/comms-list-tenants branch August 25, 2026 01:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant