Skip to content

feat(organizations): add sub-organization management - #5070

Merged
jrf0110 merged 1 commit into
mainfrom
sub-org-visibility
Aug 12, 2026
Merged

jrf0110 merged 1 commit into
mainfrom
sub-org-visibility

Conversation

@jrf0110

@jrf0110 jrf0110 commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

Closes #5009

Summary

Adds the ability for users to manage sub-organizations.

image image image image image image image image
  • add URL-addressable Overview, People, Usage, Credits, Distribute funds, Models, and Permissions destinations for direct sub-organizations
  • add server-authorized, paginated aggregate People search and filtering with parent memberships, pending invitations, roles, and URL-restorable state
  • add resilient credit and Kilo Pass reporting, model-policy visibility, SSO/permission reporting, and top-level hierarchy isolation
  • let organization owners and admins create direct sub-organizations while rejecting billing managers, ordinary members, and nested hierarchy creation
  • consolidate fund distribution under the sub-organization area and improve the organization overview card with compact child summaries and management actions
  • restore the CardLinkFooter liquid ripple with pointer-following hover behavior and reduced-motion support

Validation

  • pnpm --filter web test -- --runInBand apps/web/src/routers/organizations/organization-sub-organizations-router.test.ts apps/web/src/routers/organizations/organization-router.test.ts apps/web/src/routers/usage-analytics-router.test.ts apps/web/src/lib/organizations/sub-organizations/model-policy.test.ts apps/web/src/lib/organizations/organization-sso-policy.test.ts apps/web/src/lib/creditExpirationOrg.test.ts apps/web/src/tests/scripts/usage/generate-org-data.test.ts apps/web/src/components/ui/design-primitives.test.ts (129 tests)
  • pnpm --filter web typecheck
  • pnpm --filter web lint
  • pnpm format:check
  • git diff --check origin/main...HEAD

Comment thread apps/web/src/lib/creditExpiration.ts Resolved
@kilo-code-bot

kilo-code-bot Bot commented Aug 5, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

Incremental review of the rebased branch (fc81a99): the PR-owned changes since a9adfa9 are limited to three small fixes — the People search input is now remounted via a key tied to the URL search param (resolving the previous stale-text suggestion), calculateCatalogAccess passes the newly required groupIds: [] consistent with its empty groupPolicies, and reduced-motion CSS was adjusted — all verified correct, and every previous finding (stale nextCreditExpirationAt fallback, missing-parent error surfacing, credit-expiration retry exhaustion, uncontrolled search input) is confirmed fixed in the current HEAD.

Files Reviewed (3 files, incremental since a9adfa9)
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationSections.tsx
  • apps/web/src/app/globals.css
  • apps/web/src/lib/organizations/sub-organizations/model-policy.ts
Previous Review Summaries (3 snapshots, latest commit a9adfa9)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit a9adfa9)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

Incremental review of the rebased branch (a9adfa9): all three previous findings are fixed with test coverage — the stale nextCreditExpirationAt fallback now checks processed-state presence, the missing parent org surfaces a tRPC NOT_FOUND via shared management middleware, and credit-expiration retry exhaustion logs to Sentry and returns current states; the only remaining finding is a minor uncontrolled-input issue in the new People section.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationSections.tsx 246 Uncontrolled search input (defaultValue) shows stale text after the search filter is cleared via chip or "Clear filters"
Files Reviewed (20 files, incremental since bec71e9)
  • apps/storybook/stories/Sidebar.stories.tsx - 0 issues
  • apps/web/src/app/(app)/components/OrganizationAppSidebar.tsx - 0 issues
  • apps/web/src/app/(app)/components/OrganizationSwitcher.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationSections.tsx - 1 issue
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationsPage.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/layout.tsx - 0 issues
  • apps/web/src/app/api/organizations/hooks.ts - 0 issues
  • apps/web/src/app/globals.css - 0 issues
  • apps/web/src/components/organizations/OrganizationChildOrganizationsCard.tsx - 0 issues
  • apps/web/src/components/ui/card.client.tsx - 0 issues
  • apps/web/src/components/ui/design-primitives.test.ts - 0 issues
  • apps/web/src/lib/creditExpiration.ts - 0 issues (previous finding fixed)
  • apps/web/src/lib/creditExpirationOrg.test.ts - 0 issues
  • apps/web/src/lib/organizations/organization-hierarchy.ts - 0 issues
  • apps/web/src/routers/organizations/organization-admin-router.ts - 0 issues
  • apps/web/src/routers/organizations/organization-router.test.ts - 0 issues
  • apps/web/src/routers/organizations/organization-router.ts - 0 issues
  • apps/web/src/routers/organizations/organization-sub-organizations-router.test.ts - 0 issues
  • apps/web/src/routers/organizations/organization-sub-organizations-router.ts - 0 issues (previous findings fixed)
  • apps/web/src/routers/usage-analytics-router.ts - 0 issues

Fix these issues in Kilo Cloud

Previous review (commit bec71e9)

Status: 3 Issues Found | Recommendation: Address before merge

Executive Summary

The sub-organization credits query can emit a stale past "next expiration" date on the exact request that processes an expiration, and the batched credit-expiration processor turns optimistic-race exhaustion into a 500 instead of degrading gracefully as documented; the new fund-distribution tab wiring in the latest commit introduces no new issues.

Overview

Severity Count
CRITICAL 0
WARNING 3
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
apps/web/src/routers/organizations/organization-sub-organizations-router.ts 590 ?? fallback resurrects stale past nextCreditExpirationAt after expiry processing clears it
apps/web/src/routers/organizations/organization-sub-organizations-router.ts 650 Generic Error yields a tRPC 500 instead of NOT_FOUND for a missing/soft-deleted parent org
apps/web/src/lib/creditExpiration.ts 588 Retry exhaustion throws instead of returning current states, contradicting the documented graceful-degradation contract
Files Reviewed (35 files)
  • apps/storybook/src/mockData/organizations.ts - 0 issues
  • apps/storybook/stories/OrganizationSwitcher.stories.tsx - 0 issues
  • apps/storybook/stories/Sidebar.stories.tsx - 0 issues
  • apps/web/src/app/(app)/components/OrganizationAppSidebar.tsx - 0 issues
  • apps/web/src/app/(app)/components/OrganizationSwitcher.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/distribute-funds/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationSections.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationsPage.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/[section]/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/DistributeFundsPage.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/parseDollarInput.test.ts - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/parseDollarInput.ts - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/layout.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/sections.ts - 0 issues
  • apps/web/src/app/api/organizations/hooks.ts - 0 issues
  • apps/web/src/components/organizations/OrganizationChildOrganizationsCard.tsx - 0 issues
  • apps/web/src/components/usage-analytics/hooks.ts - 0 issues
  • apps/web/src/lib/creditExpiration.ts - 1 issue
  • apps/web/src/lib/creditExpirationOrg.test.ts - 0 issues
  • apps/web/src/lib/organizations/organization-sso-policy.test.ts - 0 issues
  • apps/web/src/lib/organizations/organization-sso-policy.ts - 0 issues
  • apps/web/src/lib/organizations/organization-types.ts - 0 issues
  • apps/web/src/lib/organizations/sub-organizations/model-policy.test.ts - 0 issues
  • apps/web/src/lib/organizations/sub-organizations/model-policy.ts - 0 issues
  • apps/web/src/routers/organizations/organization-router.test.ts - 0 issues
  • apps/web/src/routers/organizations/organization-router.ts - 0 issues
  • apps/web/src/routers/organizations/organization-sub-organizations-router.test.ts - 0 issues
  • apps/web/src/routers/organizations/organization-sub-organizations-router.ts - 2 issues
  • apps/web/src/routers/usage-analytics-router.test.ts - 0 issues
  • apps/web/src/routers/usage-analytics-router.ts - 0 issues
  • apps/web/src/routers/usage-analytics-schemas.ts - 0 issues
  • apps/web/src/scripts/usage/generate-org-data.ts - 0 issues
  • apps/web/src/tests/scripts/usage/generate-org-data.test.ts - 0 issues

Fix these issues in Kilo Cloud

Previous review

Status: 3 Issues Found | Recommendation: Address before merge

Executive Summary

The new sub-organization credits query can emit a stale past "next expiration" date on the exact request that processes an expiration, and the new batched credit-expiration processor turns optimistic-race exhaustion into a 500 instead of degrading gracefully as documented.

Overview

Severity Count
CRITICAL 0
WARNING 3
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
apps/web/src/routers/organizations/organization-sub-organizations-router.ts 590 ?? fallback resurrects stale past nextCreditExpirationAt after expiry processing clears it
apps/web/src/routers/organizations/organization-sub-organizations-router.ts 650 Generic Error yields a tRPC 500 instead of NOT_FOUND for a missing/soft-deleted parent org
apps/web/src/lib/creditExpiration.ts 588 Retry exhaustion throws instead of returning current states, contradicting the documented graceful-degradation contract
Files Reviewed (35 files)
  • apps/storybook/src/mockData/organizations.ts - 0 issues
  • apps/storybook/stories/OrganizationSwitcher.stories.tsx - 0 issues
  • apps/storybook/stories/Sidebar.stories.tsx - 0 issues
  • apps/web/src/app/(app)/components/OrganizationAppSidebar.tsx - 0 issues
  • apps/web/src/app/(app)/components/OrganizationSwitcher.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/distribute-funds/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationSections.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/SubOrganizationsPage.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/[section]/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/DistributeFundsPage.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/parseDollarInput.test.ts - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/distribute-funds/parseDollarInput.ts - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/layout.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/page.tsx - 0 issues
  • apps/web/src/app/(app)/organizations/[id]/sub-organizations/sections.ts - 0 issues
  • apps/web/src/app/api/organizations/hooks.ts - 0 issues
  • apps/web/src/components/organizations/OrganizationChildOrganizationsCard.tsx - 0 issues
  • apps/web/src/components/usage-analytics/hooks.ts - 0 issues
  • apps/web/src/lib/creditExpiration.ts - 1 issue
  • apps/web/src/lib/creditExpirationOrg.test.ts - 0 issues
  • apps/web/src/lib/organizations/organization-sso-policy.test.ts - 0 issues
  • apps/web/src/lib/organizations/organization-sso-policy.ts - 0 issues
  • apps/web/src/lib/organizations/organization-types.ts - 0 issues
  • apps/web/src/lib/organizations/sub-organizations/model-policy.test.ts - 0 issues
  • apps/web/src/lib/organizations/sub-organizations/model-policy.ts - 0 issues
  • apps/web/src/routers/organizations/organization-router.test.ts - 0 issues
  • apps/web/src/routers/organizations/organization-router.ts - 0 issues
  • apps/web/src/routers/organizations/organization-sub-organizations-router.test.ts - 0 issues
  • apps/web/src/routers/organizations/organization-sub-organizations-router.ts - 2 issues
  • apps/web/src/routers/usage-analytics-router.test.ts - 0 issues
  • apps/web/src/routers/usage-analytics-router.ts - 0 issues
  • apps/web/src/routers/usage-analytics-schemas.ts - 0 issues
  • apps/web/src/scripts/usage/generate-org-data.ts - 0 issues
  • apps/web/src/tests/scripts/usage/generate-org-data.test.ts - 0 issues

Fix these issues in Kilo Cloud


Reviewed by kimi-k3 · Input: 113.8K · Output: 6.3K · Cached: 530K

Review guidance: REVIEW.md from base branch main

@jrf0110
jrf0110 force-pushed the sub-org-visibility branch 3 times, most recently from f054b4f to a9adfa9 Compare August 10, 2026 15:46
@jrf0110
jrf0110 force-pushed the sub-org-visibility branch from a9adfa9 to fc81a99 Compare August 12, 2026 16:47
@jrf0110
jrf0110 merged commit bbccd5e into main Aug 12, 2026
18 checks passed
@jrf0110
jrf0110 deleted the sub-org-visibility branch August 12, 2026 18:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Parent org visibility into sub-organizations: people, usage, credits, models, permissions

2 participants