feat(assets): add ownership navigation - #176
Conversation
|
Warning Review limit reached
Next review available in: 21 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?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 reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. 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, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (12)
📒 Files selected for processing (7)
📝 WalkthroughWalkthroughThe change adds an authenticated owned-assets API, active-owner filtering, pagination, and sorting. The web catalog adds All Assets/My Assets scopes, scope-specific sorting, owned-asset rendering, governance links, responsive controls, and related integration, unit, E2E, and QA coverage. ChangesOwned asset catalog
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
actor User
participant AssetCatalogPage
participant AssetRegistryController
participant AssetRegistryService
participant AssetRegistryCoordinator
participant AssetRepository
User->>AssetCatalogPage: Select My Assets
AssetCatalogPage->>AssetRegistryController: Request owned assets
AssetRegistryController->>AssetRegistryService: Pass filters and pagination
AssetRegistryService->>AssetRegistryCoordinator: Resolve authorized owned assets
AssetRegistryCoordinator->>AssetRepository: Query summaries and count
AssetRepository-->>AssetRegistryCoordinator: Return page data
AssetRegistryCoordinator-->>AssetRegistryController: Return AssetSummaryPage
AssetRegistryController-->>AssetCatalogPage: Render owned assets
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
TegamiThis repository uses Tegami to manage releases. When your changes affect published packages, add a changelog file under Create a changelog → · Changelog format Release preview
Changelogs in this PR
Run Managed by Tegami. |
There was a problem hiding this comment.
Actionable comments posted: 8
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/web/src/features/assets/components/asset-catalog-page.tsx`:
- Around line 226-284: Refactor AssetGrid and OwnedAssetGrid to share a single
presentational asset-card component, parameterizing only the top-right badge,
coordinate display, link component, and action label. Extract a shared column
factory used by catalogColumns and ownedColumns, preserving all existing
headerClassName and cellClassName values and scope-specific behavior. Keep the
existing design tokens, shadcn primitives, and responsive layout unchanged.
- Around line 73-83: Update isOwnedAsset to accept summary values that are empty
strings by checking only for null or undefined, while retaining the existing
required-field checks. Validate portfolioState against the four supported
OwnedAsset states rather than relying on truthiness, and update portfolioLabel
to include an explicit exhaustive fallback for unsupported states.
In `@apps/web/src/features/assets/components/asset-type-filter.test.tsx`:
- Around line 8-14: Update the test “exposes every governed Asset profile and
the active selection” to open the combobox and assert every option declared by
AssetTypeFilter, including the active “Skills” selection; do not limit coverage
to the collapsed trigger text.
In `@apps/web/test/e2e/asset-registry-golden-poc.spec.ts`:
- Around line 308-318: Update the /api/assets/owned handler in the test mock to
inspect url.searchParams and validate the received page, sort, q, and type
values. Return page-appropriate data or record these parameters for assertions,
including verifying the MINE scope uses the expected sort and resets page after
a scope change.
In
`@core/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.java`:
- Around line 261-278: The owner asset filtering used by
AssetRegistryCoordinator and the shared recommendationPage/summaries paths
passes an unbounded ids collection into searchOwnedSummaries, causing oversized
IN predicates per page. Replace this pattern with a database-side ownership
predicate using a join or exists against AssetRoleAssignment, or apply a
documented owner-set limit if that is the established capacity strategy, while
preserving the active OWNER and can_view intersection and pagination behavior.
In `@core/src/main/java/com/orgmemory/core/assetregistry/AssetRepository.java`:
- Around line 149-186: Extract the duplicated FROM and WHERE predicates used by
searchAuthorized, searchOwnedSummaries, and its countQuery into a single shared
constant, following the existing CATALOG_FROM_AND_PREDICATES pattern. Replace
all three inline blocks with that constant while preserving their existing
joins, filters, parameters, and query behavior.
In `@core/src/main/java/com/orgmemory/core/assetregistry/AssetSummary.java`:
- Around line 14-15: Update the MCP AssetSummary record in
AssetDeliveryApiClient to include the updatedAt field, then update every new
AssetDeliveryApiClient.AssetSummary construction in the assets tests to pass the
ninth argument using the appropriate timestamp value.
In `@design-qa.md`:
- Around line 5-11: Update the artifact references in the design-qa document to
match the outputs generated by asset-registry-golden-poc.spec.ts: use the
../output/design-qa/ directory, rename the mine capture to
asset-catalog-mine.png, remove or replace the unsupported
asset-catalog-all-desktop.png reference, and add the directory prefix to the two
bare filenames.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 6950eefc-4afb-410c-9d52-6692f0fd7e8a
⛔ Files ignored due to path filters (11)
contracts/openapi.jsonis excluded by!contracts/openapi.jsondocs/increments/active/2026-07-31-asset-ownership-navigation/asset-catalog-all-desktop.pngis excluded by!**/*.png,!docs/**docs/increments/active/2026-07-31-asset-ownership-navigation/asset-catalog-mine-desktop.pngis excluded by!**/*.png,!docs/**docs/increments/active/2026-07-31-asset-ownership-navigation/asset-catalog-mobile.pngis excluded by!**/*.png,!docs/**docs/increments/active/2026-07-31-asset-ownership-navigation/asset-layout-comparison.pngis excluded by!**/*.png,!docs/**docs/increments/active/2026-07-31-asset-ownership-navigation/design.mdis excluded by!docs/**docs/increments/active/2026-07-31-asset-ownership-navigation/onyx-agents-layout-reference.pngis excluded by!**/*.png,!docs/**docs/increments/active/2026-07-31-asset-ownership-navigation/plan.mdis excluded by!docs/**docs/roadmap.mdis excluded by!docs/**docs/specs/domains/asset-registry.mdis excluded by!docs/**docs/tests/domains/asset-registry.mdis excluded by!docs/**
📒 Files selected for processing (19)
apps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.javaapps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.javaapps/web/src/features/assets/asset-catalog-state.test.tsapps/web/src/features/assets/asset-catalog-state.tsapps/web/src/features/assets/components/asset-catalog-page.tsxapps/web/src/features/assets/components/asset-type-filter.test.tsxapps/web/src/features/assets/components/asset-type-filter.tsxapps/web/src/routes/_authenticated/assets/index.tsxapps/web/test/e2e/asset-registry-golden-poc.spec.tsapps/web/test/setup.tscore/src/main/java/com/orgmemory/core/assetregistry/AssetOwnedSort.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryService.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRepository.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRoleAssignmentRepository.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetSummary.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetSummaryPage.javacore/src/test/java/com/orgmemory/core/assetregistry/AssetRegistryServiceTests.javadesign-qa.md
📜 Review details
⏰ Context from checks skipped due to timeout. (2)
- GitHub Check: Backend · Java 25
- GitHub Check: Web · Node 24
🧰 Additional context used
📓 Path-based instructions (9)
**/*
📄 CodeRabbit inference engine (CLAUDE.md)
**/*: Always read the repository guidance and relevant sections ofARCHITECTURE.md; before changing a domain, read its specification, test-coverage document, and binding decision filenames.
Treat the repository as the engineering system of record; current repository and runtime evidence take precedence over chat or Northstar.
Readdocs/guidelines/agent-safety.mdbefore retrieval, AI, MCP, permission, upload, graph, or export work. Never commit secrets or customer data.
Files:
apps/web/test/setup.tscore/src/main/java/com/orgmemory/core/assetregistry/AssetSummaryPage.javaapps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryService.javaapps/web/src/features/assets/components/asset-type-filter.test.tsxdesign-qa.mdapps/web/test/e2e/asset-registry-golden-poc.spec.tscore/src/main/java/com/orgmemory/core/assetregistry/AssetSummary.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.javaapps/web/src/features/assets/asset-catalog-state.test.tsapps/web/src/routes/_authenticated/assets/index.tsxcore/src/test/java/com/orgmemory/core/assetregistry/AssetRegistryServiceTests.javaapps/web/src/features/assets/asset-catalog-state.tscore/src/main/java/com/orgmemory/core/assetregistry/AssetRepository.javaapps/web/src/features/assets/components/asset-type-filter.tsxcore/src/main/java/com/orgmemory/core/assetregistry/AssetOwnedSort.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRoleAssignmentRepository.javaapps/web/src/features/assets/components/asset-catalog-page.tsxapps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java
**/*.{js,jsx,ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{js,jsx,ts,tsx}: Frontend verification must include lint, typecheck, tests, production build, and browser verification when the flow matters.
Before using unfamiliar React, Vite, Tailwind, TypeScript, Next.js, or Fumadocs APIs, consult current official documentation, Context7, and the relevant project verification skill.
Files:
apps/web/test/setup.tsapps/web/src/features/assets/components/asset-type-filter.test.tsxapps/web/test/e2e/asset-registry-golden-poc.spec.tsapps/web/src/features/assets/asset-catalog-state.test.tsapps/web/src/routes/_authenticated/assets/index.tsxapps/web/src/features/assets/asset-catalog-state.tsapps/web/src/features/assets/components/asset-type-filter.tsxapps/web/src/features/assets/components/asset-catalog-page.tsx
apps/web/**/*.{ts,tsx}
📄 CodeRabbit inference engine (apps/web/CLAUDE.md)
apps/web/**/*.{ts,tsx}: Extend the established OrgMemory product shell, design tokens, shadcn/Radix primitives, and existing layout patterns; do not introduce a separate visual system in the web application.
Generate ordinary REST clients fromcontracts/openapi.jsonusing Hey API.
Use TanStack Query for server state, TanStack Router for navigation, and limit Zustand to durable or high-frequency UI state.
Preserve keyboard accessibility, light/dark theme support, loading and error states, and responsive behavior in the web application.
Files:
apps/web/test/setup.tsapps/web/src/features/assets/components/asset-type-filter.test.tsxapps/web/test/e2e/asset-registry-golden-poc.spec.tsapps/web/src/features/assets/asset-catalog-state.test.tsapps/web/src/routes/_authenticated/assets/index.tsxapps/web/src/features/assets/asset-catalog-state.tsapps/web/src/features/assets/components/asset-type-filter.tsxapps/web/src/features/assets/components/asset-catalog-page.tsx
**/*.{java,gradle,gradle.kts,properties,yml,yaml}
📄 CodeRabbit inference engine (CLAUDE.md)
Before using unfamiliar Spring Boot 4, Spring Modulith 2, Spring AI 2, or Gradle APIs, consult current official documentation, Context7, and the relevant project verification skill.
Files:
core/src/main/java/com/orgmemory/core/assetregistry/AssetSummaryPage.javaapps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryService.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetSummary.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.javacore/src/test/java/com/orgmemory/core/assetregistry/AssetRegistryServiceTests.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRepository.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetOwnedSort.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRoleAssignmentRepository.javaapps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java
**/*.{java,sql}
📄 CodeRabbit inference engine (CLAUDE.md)
Keep
ddl-auto=validateand pair every persisted-model change with a Flyway migration.
Files:
core/src/main/java/com/orgmemory/core/assetregistry/AssetSummaryPage.javaapps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryService.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetSummary.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.javacore/src/test/java/com/orgmemory/core/assetregistry/AssetRegistryServiceTests.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRepository.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetOwnedSort.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRoleAssignmentRepository.javaapps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java
**/*.{java,gradle,gradle.kts}
📄 CodeRabbit inference engine (CLAUDE.md)
Use the testing harness; a terminating clean test is the JVM context gate, and
bootRunis not verification. IDE inspection applies only to edited backend Java.
Files:
core/src/main/java/com/orgmemory/core/assetregistry/AssetSummaryPage.javaapps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryService.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetSummary.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.javacore/src/test/java/com/orgmemory/core/assetregistry/AssetRegistryServiceTests.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRepository.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetOwnedSort.javacore/src/main/java/com/orgmemory/core/assetregistry/AssetRoleAssignmentRepository.javaapps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java
apps/api/src/main/java/**/*.java
⚙️ CodeRabbit configuration file
apps/api/src/main/java/**/*.java: Enforce the browser-BFF and resource-server boundaries. Authentication
must resolve an active internal actor through the explicit issuer and
subject binding. Reject identity, tenant, roles, or permissions supplied
by request payloads, JWT email, or untrusted JWT role claims.
Files:
apps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.java
apps/web/**/*.{test,spec}.{ts,tsx}
📄 CodeRabbit inference engine (apps/web/CLAUDE.md)
Preserve the existing browser test suite when changing the web application.
Files:
apps/web/src/features/assets/components/asset-type-filter.test.tsxapps/web/test/e2e/asset-registry-golden-poc.spec.tsapps/web/src/features/assets/asset-catalog-state.test.ts
apps/web/src/**/*.{ts,tsx}
⚙️ CodeRabbit configuration file
apps/web/src/**/*.{ts,tsx}: OAuth access and refresh tokens must never enter browser JavaScript or
browser storage. Use the HttpOnly BFF session, CSRF-protected mutations,
generated Hey API data clients, accessible states, and both light and
dark themes. Handwritten transport is reserved for documented protocol
flows such as navigation redirects and streaming.
Files:
apps/web/src/features/assets/components/asset-type-filter.test.tsxapps/web/src/features/assets/asset-catalog-state.test.tsapps/web/src/routes/_authenticated/assets/index.tsxapps/web/src/features/assets/asset-catalog-state.tsapps/web/src/features/assets/components/asset-type-filter.tsxapps/web/src/features/assets/components/asset-catalog-page.tsx
🧠 Learnings (1)
📚 Learning: 2026-07-26T05:46:47.443Z
Learnt from: kl3inIT
Repo: kl3inIT/OrgMemory PR: 61
File: apps/mcp/src/main/java/com/orgmemory/mcp/McpSecurityConfiguration.java:50-52
Timestamp: 2026-07-26T05:46:47.443Z
Learning: In OrgMemory, treat the `apps/mcp` and `apps/api` as independent protocol adapter modules. When adjusting OAuth/wire-level scopes, do not introduce a shared Java constant or create a code dependency from `apps/mcp` to `apps/api` solely to deduplicate scope values. Instead, keep OAuth/scope constants adapter-local (e.g., in the relevant adapter/security configuration classes) and ensure cross-adapter consistency via automated realm/OAuth/authorization tests, rather than via shared wiring-level constants or cross-module references.
Applied to files:
apps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.java
🔇 Additional comments (14)
core/src/main/java/com/orgmemory/core/assetregistry/AssetOwnedSort.java (1)
3-6: LGTM!apps/web/test/setup.ts (1)
5-13: LGTM!core/src/main/java/com/orgmemory/core/assetregistry/AssetRoleAssignmentRepository.java (1)
26-27: 🎯 Functional CorrectnessNo change needed.
AssetRoleAssignmentstoresPrincipalRef.type()forprincipalType, so the inline'user'query literal matches user assignments;UserPrincipalIDs are stored as raw UUID strings.apps/web/src/features/assets/components/asset-catalog-page.tsx (1)
330-344: 🎯 Functional CorrectnessNo change needed. The assets catalog route resets
pagetoundefinedduringonScopeChange, which defaults to page 1.core/src/main/java/com/orgmemory/core/assetregistry/AssetRepository.java (1)
164-167: 🎯 Functional CorrectnessNo change needed; draft updates do not advance
asset.updatedAt.
Assetstores the asset-level updated timestamp, whileAssetDraftstores the draft-level updated timestamp.updateDraftmutates and saves only the draft, so draft edits are not asset edits. If draft edits need to appear in “RECENTLY_UPDATED,” define separate “last activity” behavior for drafts or propagate the draft timestamp to the asset.core/src/main/java/com/orgmemory/core/assetregistry/AssetSummaryPage.java (1)
5-20: LGTM!core/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryService.java (1)
155-176: LGTM!apps/api/src/main/java/com/orgmemory/api/assetregistry/AssetRegistryController.java (1)
7-12: LGTM!Also applies to: 174-187
core/src/test/java/com/orgmemory/core/assetregistry/AssetRegistryServiceTests.java (1)
6-71: LGTM!apps/web/src/features/assets/asset-catalog-state.ts (1)
3-4: LGTM!Also applies to: 17-17, 28-45
apps/web/src/features/assets/asset-catalog-state.test.ts (1)
10-10: LGTM!Also applies to: 22-30, 39-50
apps/web/src/routes/_authenticated/assets/index.tsx (1)
14-25: LGTM!Also applies to: 44-54
apps/web/src/features/assets/components/asset-type-filter.tsx (1)
1-8: LGTM!Also applies to: 22-40
apps/api/src/test/java/com/orgmemory/api/assetregistry/AssetRegistryIntegrationTests.java (1)
384-415: 🎯 Functional CorrectnessNo change needed.
ownedSummaryPage(...)already checks whetherauthor_idactually has the currentownerrole during owned aggregation, and this test case already exercises a different actor’s assignment being excluded.> Likely an incorrect or invalid review comment.
| var ids = new java.util.LinkedHashSet<>(roles.findActiveAssetIdsForUserRole( | ||
| organizationId, | ||
| userId.toString(), | ||
| AssetRole.OWNER, | ||
| Instant.now())); | ||
| ids.retainAll(visibleIds); | ||
| if (ids.isEmpty()) { | ||
| return AssetSummaryPage.empty(page, pageSize, sort); | ||
| } | ||
| String normalizedQuery = | ||
| query == null ? "" : query.trim().toLowerCase(java.util.Locale.ROOT); | ||
| Page<AssetSummary> result = assets.searchOwnedSummaries( | ||
| organizationId, | ||
| ids, | ||
| normalizedQuery, | ||
| type, | ||
| sort.name(), | ||
| PageRequest.of(page - 1, pageSize)); |
There was a problem hiding this comment.
🚀 Performance & Scalability | 🔵 Trivial
Plan for large owner sets in the in :ids predicate.
The intersection order is correct: active OWNER assignments are filtered down to the can_view set, so the endpoint cannot widen visibility. The remaining concern is size. ids is unbounded, and it is bound to asset.id in :ids in searchOwnedSummaries. A user who owns a large number of assets produces a very large IN list on every page request. PostgreSQL bind-parameter limits and plan quality both degrade at that scale, and the whole set is sent for each page even though one page returns at most 60 rows.
recommendationPage and summaries share this shape, so treat this as a registry-wide capacity item rather than a defect in this method. Options: cap the owner set with a documented limit, or push the ownership predicate into the query as a join or exists subquery against AssetRoleAssignment so the database performs the intersection and the pagination in one plan.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@core/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.java`
around lines 261 - 278, The owner asset filtering used by
AssetRegistryCoordinator and the shared recommendationPage/summaries paths
passes an unbounded ids collection into searchOwnedSummaries, causing oversized
IN predicates per page. Replace this pattern with a database-side ownership
predicate using a join or exists against AssetRoleAssignment, or apply a
documented owner-set limit if that is the established capacity strategy, while
preserving the active OWNER and can_view intersection and pagination behavior.
There was a problem hiding this comment.
Confirmed as a registry-wide capacity concern, not an owner-workspace-specific regression. The same live OpenFGA authorized-ID set feeds the existing catalog and summary paths; replacing only the owner predicate with a database join would not remove the unbounded can_view intersection and would create inconsistent capacity behavior. Deferring this to a registry-wide capacity increment that can introduce a paged/cursored authorization-set contract or one documented global bound across every authorized collection.
There was a problem hiding this comment.
@kl3inIT, agreed. The concern remains valid, but this PR does not introduce the underlying unbounded can_view authorization-set pattern.
A targeted ownership join would leave the larger authorized-ID intersection unbounded and would create inconsistent behavior across registry collection paths. A registry-wide capacity increment should define one strategy for all authorized collections, such as a paged/cursored authorization-set contract or a documented global bound.
Would you like me to create a GitHub follow-up issue for this work?
✏️ Learnings added
Learnt from: kl3inIT
Repo: kl3inIT/OrgMemory PR: 176
File: core/src/main/java/com/orgmemory/core/assetregistry/AssetRegistryCoordinator.java:261-278
Timestamp: 2026-07-31T15:55:49.093Z
Learning: In the Asset Registry, `AssetRegistryCoordinator.ownedSummaryPage`, `AssetRegistryCoordinator.recommendationPage`, and `AssetRegistryCoordinator.summaries` consume the same live OpenFGA `can_view` authorized-ID set. This set can be unbounded. Capacity remediation must apply one registry-wide strategy, such as a paged/cursored authorization-set contract or a documented global bound. Replacing only the owned-assets predicate with a database join does not resolve the unbounded `can_view` intersection and would create inconsistent capacity behavior.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
You are interacting with an AI system.
…layout # Conflicts: # docs/roadmap.md
|
CodeRabbit docstring coverage warning reviewed: the changed TypeScript helpers and package-private Java repository constants follow the repository's existing self-describing-code convention and are covered by focused tests. Adding docstrings solely to satisfy the generic percentage would create non-contract commentary, so no code change is applied for that warning. |
Summary
My Assetsworkspace derived from active directOWNERassignments and capped by livecan_view/assetsaround the Onyx information hierarchy: page identity/CTA, search plusAll Assets | My Assets, then compact secondary filtersDocumentation impact
GET /api/assets/ownedReader-visible behavior changes in the authenticated product and API reference. The public product-guide information architecture does not change.
Verification
./gradlew.bat --no-daemon testpnpm --dir apps/web test:unit(30 tests)pnpm --dir apps/web buildpnpm --dir apps/web test:e2e(13 tests)pnpm --filter @orgmemory/docs checkpnpm release:checkgit diff --checkDesign evidence
See
docs/increments/completed/2026-07-31-asset-ownership-navigation/and rootdesign-qa.md.