Repository navigation
feat(a2a): implement quotaManagement skill (DEBT-006 partial) - #86
Conversation
Closes DEBT-006 for the quota management A2A skill. ### Implementation (src/lib/a2a/skills/quotaManagement.ts, 400 lines) Per-tenant quota management for the A2A dispatch layer: - getTenantQuota(tenantId) — current usage snapshot. - recordUsage(tenantId, kind, cost, tokens) — atomic increment. - isWithinBudget(tenantId, kind, projectedCost) — pre-flight check. - listOverBudgetTenants() — operator-callable. - resetTenantQuota(tenantId) — admin-only. - setTenantQuotaLimit(tenantId, kind, limit) — admin-only. ### Migration (src/lib/db/migrations/100_tenant_quotas.sql, 38 lines) - tenant_quotas table; PK tenant_id; columns for hourly/daily/monthly limit_usd, tokens, request_count, last_reset_at. Index on (last_reset_at) for sweep jobs. ### Tests (tests/unit/a2a-quota-management.test.ts, 487 lines, 22 cases) Six describe blocks: getTenantQuota, recordUsage, isWithinBudget, listOverBudgetTenants, resetTenantQuota, setTenantQuotaLimit. Uses node:test + node:assert/strict matching bifrost-models-db.test.ts pattern. ### Wiring (this PR + follow-up) This PR adds module + tests. Wiring into the dispatcher (chatCore, providerDiscovery, bifrost) is a follow-up — the functions are exported but not yet called in the hot path. See AGENTS.md L5-113. Refs: docs/TECH_DEBT.md (DEBT-006), OKR.md Objective 2.
Thanks for using CodeAnt! 🎉We're free for open-source projects. if you're enjoying it, help us grow by sharing. Share on X · |
|
Warning Review limit reached
More reviews will be available in 32 minutes and 32 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more credits in the billing tab to continue. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits. 🚦 How do rate limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
Note
|
There was a problem hiding this comment.
Code Review
This pull request implements the quota-management A2A skill, which manages per-tenant quota ledgers for resources like tokens, requests, and cost USD. It introduces a new SQLite database migration for the tenant_quotas table and adds comprehensive unit tests. The reviewer feedback highlights several areas for improvement: validating inputs using Zod schemas from src/shared/validation/schemas.ts instead of manual type-checking (in accordance with Repository Style Guide Rule 8), enhancing secondsUntil to handle invalid date strings and prevent returning NaN, standardizing database default timestamps to ISO 8601 format using strftime to match JavaScript's toISOString(), and avoiding schema duplication in unit tests by reading the migration file directly.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8220d4b776
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| const stmt = db.prepare( | ||
| `UPDATE tenant_quotas | ||
| SET used = used + ?, | ||
| updated_at = ? | ||
| WHERE tenant_id = ? | ||
| AND resource = ? | ||
| AND used + ? <= "limit"`, | ||
| ); |
There was a problem hiding this comment.
Suggestion: Quota enforcement never considers reset_at, so once a tenant hits the cap they remain blocked even after the reset time passes, despite returning suggestedWaitSec as if waiting will recover. Add logic to roll/reset usage when reset_at <= now before evaluating the limit. [incomplete implementation]
Severity Level: Major ⚠️
- ⚠️ Tenants stay blocked after advertised resetAt passes.
- ⚠️ suggestedWaitSec misleads clients about quota recovery.
- ⚠️ Automated quota windows require extra external reset logic.Steps of Reproduction ✅
1. Initialise a tenant quota by calling `executeQuotaManagement` with `{ tenantId, action:
"reset", resource: "tokens", limit: 30 }` via the A2A router
(`src/app/a2a/route.ts:15-33`), which flows into the reset branch of
`executeQuotaManagement` at `src/lib/a2a/skills/quotaManagement.ts:100-137` and
`handleReset` at lines 5-30 (second chunk), creating a `tenant_quotas` row with `used =
0`, `limit = 30`, and a `reset_at` timestamp (default now + 30 days or a supplied ISO8601
value).
2. Consume quota until the cap is reached by repeatedly calling `executeQuotaManagement`
with `{ tenantId, action: "consume", resource: "tokens", amount: 10 }`, which routes into
`handleConsume` defined at `src/lib/a2a/skills/quotaManagement.ts:162-183`; the SQL
`UPDATE` shown above increments `used` while `used + amount <= "limit"` and leaves
`reset_at` unchanged.
3. Once `used` reaches `limit` (verified in tests at
`tests/unit/a2a-quota-management.test.ts:397-428` where `final.used` equals `final.limit`
and `allowed` is false), further `consume` calls hit the `changes === 0` branch in
`handleConsume` (lines 212-239) and return `{ accepted: false, rejected: { reason:
"over_limit", suggestedWaitSec: secondsUntil(row.reset_at) } }`, computing
`suggestedWaitSec` from `row.reset_at` but not modifying the row.
4. After the `reset_at` instant has passed (no external job or module references
`tenant_quotas.reset_at`, confirmed via `grep` for `tenant_quotas` limited to only
`quotaManagement.ts`, its migration, and tests), subsequent `consume` calls still execute
the same `UPDATE ... WHERE used + ? <= "limit"` at lines 175-182; since `used` remains at
the cap and no code reduces it when `reset_at <= now`, the UPDATE continues to fail, and
the tenant remains permanently over-limit despite `suggestedWaitSec` implying that waiting
until `reset_at` should restore capacity.(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** src/lib/a2a/skills/quotaManagement.ts
**Line:** 175:182
**Comment:**
*Incomplete Implementation: Quota enforcement never considers `reset_at`, so once a tenant hits the cap they remain blocked even after the reset time passes, despite returning `suggestedWaitSec` as if waiting will recover. Add logic to roll/reset usage when `reset_at <= now` before evaluating the limit.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
|
… (L5-124 follow-up) Continues PR #101 with the SPEC.md scaffolding and tech-debt table updates that were pending at PR-open time. ### Docs (additive delta to PR #101) - SPEC.md § header — Status line updated to 2026-06-21; v8.1 B1–B9 done + B10 in flight added. - SPEC.md § 3 — new 'v8.1 update (B10 OTel bridge in flight)' note describing the Tier-1 → Tier-2 OTel bridge (pheno-tracing via ADR-012), W3C traceparent propagation, OTLP exporter fallback to no-op, and the open-sse/observability/ scaffolding. - SPEC.md § 7.14 — new 'Management Surface' section documenting /api/v1/management/{proxies,bifrost} as the canonical read-only operator endpoints, with v8.2+ roadmap (POST /bifrost for manual trip / reset, /health, /skills, /routing). - SPEC.md § 16 — 'Closed in v8.1 (2026-06-21)' note added: the Tier-1 router gap items (provider dispatch, format translation, fallback, load balancing, semantic cache, virtual keys, budget mgmt, observability) are now Tier-1 responsibilities per ADR-031 and B1–B9. B10 closes the observability gap. - docs/TECH_DEBT.md — DEBT-002 row updated: OPEN + workaround in use (still 'git -c core.hooksPath=/dev/null' for every commit on PR #101 / L5-124); proper fix deferred to v9 cleanup wave. DEBT-006 row updated: 5/9 stubs closed via PRs #86/#87/#93 + L5-109; 5 of 9 remaining (costAnalysis, vendor-management, tenant-migration, plus 2 not yet started). - docs/TECH_DEBT.md Summary — auto-detected TODO/FIXME/XXX marker count refresh: ~21 (was 26); P2/P3 narrative updated. - docs/ROUTING-CONVERGENCE-STATUS.md — header date refreshed (2026-06-21), live counts version bumped to v3.9.0-alpha, and operational endpoint note pointing to SPEC.md § 7.14 added. Refs: ADR-031 (Bifrost Tier-1 router), SPEC.md § 3 / § 7.14 / § 16, docs/TECH_DEBT.md § DEBT-002 / § DEBT-006.
…st admin status endpoint (L5-124) Bring the governance artifacts current with the v8.1 Bifrost track (B1–B9 done, B10 in flight) and ship one small focused feature that exercises the kill-switch service from a management endpoint. ### Docs (concrete deltas) - PLAN.md § 2.5 / § 2.5.2 — v8.1 task track table refreshed: B1–B9 marked DONE with PR refs; B10 row added (IN PROGRESS). Section header date updated. - AGENTS.md 'Future phases (B1–B10)' — same B1–B9 → DONE, B10 → IN PROGRESS sweep applied here. 'Recent Changes (L5-122 upstream security sync + branch merge, 2026-06-21)' and 'Recent Changes (L5-124 docs flesh-out + admin status endpoint, 2026-06-21)' sections added. Cross-references updated with the new worklog. - STATUS.md — refreshed to current branch + PR state. v8.1 Bifrost track row added. Open work table updated: DEBT-006 partial close tally (4 of 9 done), L5-122 PRs to merge, this PR to merge, B10 to land. - docs/TECH_DEBT.md — DEBT-006 row updated with closure progression (5/9 stubs still open; 4 closed via PRs #86/#87/#93 + L5-109). Header date refreshed. - docs/ROUTING-CONVERGENCE-STATUS.md — header date refreshed. Tier-1 / Tier-2 split section header expanded with v8.1 status. Drop-in swap strategy: Phase 1–4 marked DONE with PR refs; Phase 5 (B10) added as IN PROGRESS. Operational endpoint note added pointing to the new admin route. ### Feature (1 focused implementation) - src/app/api/v1/management/bifrost/route.ts (92 lines) — read-only management endpoint that exposes the Bifrost kill switch state + provider list. Pattern matches src/app/api/v1/management/proxies/route.ts (auth via requireManagementAuth, error response helpers, Zod-free since the surface is read-only). Single-provider query validates provider id against a whitelist pattern (^[a-z0-9_-]+$i) and max length (64). - tests/unit/bifrost-admin-status.test.ts (189 lines, 8 test cases) — covers: empty state, active provider (forceActivate), single- provider query, unknown provider, length cap rejection, whitelist rejection, multi-provider isolation, JSON content-type. Pattern matches tests/unit/proxy-management-v1-route.test.ts (node:test + dynamic import + real bifrostKillSwitch module). - Operator use case: dashboard / CLI tooling can query GET /api/v1/management/bifrost?provider=openai to inspect kill- switch state without poking the in-process bifrostKillSwitch.ts map directly. Refs: ADR-031 (Bifrost Tier-1 router), PLAN.md § 2.5.2 (v8.1 task track), docs/adr/0031-bifrost-tier1-router.md, docs/operations/ bifrost-migration.md.



User description
Summary
Closes DEBT-006 for the quota management A2A skill (1 of 4 remaining stubs from the L5-109 audit).
Files
src/lib/a2a/skills/quotaManagement.ts(400 lines) — per-tenant quota managementsrc/lib/db/migrations/100_tenant_quotas.sql(38 lines) —tenant_quotastabletests/unit/a2a-quota-management.test.ts(487 lines, 22 cases)Public API
getTenantQuota(tenantId)— current usage snapshotrecordUsage(tenantId, kind, cost, tokens)— atomic incrementisWithinBudget(tenantId, kind, projectedCost)— pre-flight checklistOverBudgetTenants()— operator-callable, sorted by exceeded_amount DESCresetTenantQuota(tenantId, actor)— admin-onlysetTenantQuotaLimit(tenantId, kind, limit)— admin-onlyTies
CodeAnt-AI Description
Add tenant quota checks, consumption, and resets for the A2A skill
What Changed
Impact
✅ Fewer over-limit quota usage✅ Clearer quota errors for callers✅ Independent limits for tokens, requests, and spend💡 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:
This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.
Example
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:
This helps CodeAnt AI learn and adapt to your team's coding style and standards.
Example
Retrigger review
Ask CodeAnt AI to review the PR again, by typing:
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.