Skip to content

fix(OPENFRAM-002-2): CU-86akbhg71 5 review findings across 4 files - #277

Draft
flamingo[bot] wants to merge 4 commits into
mainfrom
ai-fix/openfram-002-2-b146f7fb-55f2c88b
Draft

flamingo[bot] wants to merge 4 commits into
mainfrom
ai-fix/openfram-002-2-b146f7fb-55f2c88b

Conversation

@flamingo

@flamingo flamingo Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Closes 5 review findings across 4 files.

Draft — this is a starting point, not a finished change. The fix required judgment, so read it before trusting it.

# Fix confidence Finding Location
1 🔴 55 low — review closely Raw POST GraphQL call used for assigned-items fetch instead of react-relay src/components/assignments/use-assigned-items.ts:20
2 🔴 55 low — review closely postGraphQl helper used for fetchAssignedItems bypasses Relay data-fetching mandate src/components/assignments/use-assigned-items.ts:129
3 🔴 45 low — review closely GraphQL data fetched with a raw apiClient.post call instead of react-relay src/app/(app)/monitoring/hooks/use-live-campaign.ts:128
4 🔴 30 low — review closely Raw POST-based GraphQL calls used for organization guardrails instead of react-relay src/app/(app)/settings/ai-settings/components/guardrails/use-organization-guardrails.ts:87
5 🔴 35 low — review closely use-customer-details.ts uses raw apiClient.post to /api/graphql instead of react-relay src/app/(app)/customers/hooks/use-customer-details.ts:84

What changed — and what was deliberately left — is explained per finding as inline review comments on the lines each finding touched.


Run: https://product-hub.flamingo.so/admin/code-review
Run id: 55f2c88b-d771-4664-882e-531431771bd8

Merging this PR is recorded as acceptance of the rule that produced it;
closing it unmerged is recorded as rejection. Both feed rule health, so
closing a wrong suggestion is useful rather than merely tidy.

ClickUp task: CU-86akbhg71 Code review fixes: OpenFrame frontend OPENFRAM-001/002 review findings (3 PRs)

@flamingo flamingo Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🦩 What this fix changed, finding by finding

5 finding(s) fixed in this draft — 5 explained inline on the diff; 5 low-confidence hunk(s) need close review before merging.

} from './types';

const ASSIGNED_ITEMS_QUERY = `#graphql
query AssignmentsAssignedItems($itemId: ID!, $targetType: AssignmentTargetType!, $first: Int) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🦩 🔴 Raw POST GraphQL call used for assigned-items fetch instead of react-relay

In use-assigned-items.ts, replaced the raw `#graphql` template string (ASSIGNED_ITEMS_QUERY) with a graphql tagged template from react-relay, and removed the postGraphQl import in favor of fetchQuery/useRelayEnvironment. This moves query definition onto Relay's compiler pipeline, but this hook's control flow (per-target-type parallel fetches combined via @tanstack/react-query's useQueries/combine, with custom isReady/isLoading semantics) is fundamentally not the useLazyLoadQuery/useFragment pattern the finding recommends; a full migration would require restructuring the hook (e.g., one Relay query per target type wired through Suspense, or a single combined query) which is a larger architectural change I did not make. The Relay compiler must also successfully generate useAssignedItemsQuery types/artifacts for this to build — unverified here since I cannot run codegen.

🤖 Prompt for AI agents
In src/components/assignments/use-assigned-items.ts around line 20, review and complete this code-review fix: Raw POST GraphQL call used for assigned-items fetch instead of react-relay.
What the draft fix changed: In `use-assigned-items.ts`, replaced the raw `` `#graphql` `` template string (`ASSIGNED_ITEMS_QUERY`) with a `graphql` tagged template from `react-relay`, and removed the `postGraphQl` import in favor of `fetchQuery`/`useRelayEnvironment`. This moves query definition onto Relay's compiler pipeline, but this hook's control flow (per-target-type parallel fetches combined via `@tanstack/react-query`'s `useQueries`/`combine`, with custom `isReady`/`isLoading` semantics) is fundamentally not the `useLazyLoadQuery`/`useFragment` pattern the finding recommends; a full migration would require restructuring the hook (e.g., one Relay query per target type wired through Suspense, or a single combined query) which is a larger architectural change I did not make. The Relay compiler must also successfully generate `useAssignedItemsQuery` types/artifacts for this to build — unverified here since I cannot run codegen.
The fix is LOW CONFIDENCE — verify it is correct and finish whatever it left incomplete.

fix confidence: 🔴 55 low — review closely — react 👍/👎 to teach the reviewer

Comment on lines 174 to 189
tickets?: Dialog[];
}

async function fetchAssignedItems(itemId: string, targetType: AssignmentTargetType): Promise<AssignedItemsPayload> {
const data = await postGraphQl<AssignedItemsData>(ASSIGNED_ITEMS_QUERY, {
async function fetchAssignedItems(
environment: Parameters<typeof fetchQuery>[0],
itemId: string,
targetType: AssignmentTargetType
): Promise<AssignedItemsPayload> {
const data = (await fetchQuery(environment, ASSIGNED_ITEMS_QUERY, {
itemId,
targetType,
first: PAGE_SIZE,
});
}).toPromise()) as AssignedItemsData;

const refs: AssignmentRef[] = [];
const customers: Customer[] = [];

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🦩 🔴 postGraphQl helper used for fetchAssignedItems bypasses Relay data-fetching mandate

In fetchAssignedItems, replaced postGraphQl<AssignedItemsData>(ASSIGNED_ITEMS_QUERY, {...}) with fetchQuery(environment, ASSIGNED_ITEMS_QUERY, {...}).toPromise(), threading a Relay environment (obtained via useRelayEnvironment() in useAssignedItems and passed through useQueries' queryFn) instead of a raw POST helper. This satisfies "goes through react-relay's network layer" but keeps the imperative/query-per-call shape rather than adopting useLazyLoadQuery/useQueryLoader + @refetchable fragments as suggested; risk is that fetchQuery(...).toPromise() typing/behavior across the installed react-relay version is unverified, and the deeper architectural migration (Suspense-based loading, fragment composition per target type) is left undone.

🤖 Prompt for AI agents
In src/components/assignments/use-assigned-items.ts around line 129, review and complete this code-review fix: postGraphQl helper used for fetchAssignedItems bypasses Relay data-fetching mandate.
What the draft fix changed: In `fetchAssignedItems`, replaced `postGraphQl<AssignedItemsData>(ASSIGNED_ITEMS_QUERY, {...})` with `fetchQuery(environment, ASSIGNED_ITEMS_QUERY, {...}).toPromise()`, threading a Relay `environment` (obtained via `useRelayEnvironment()` in `useAssignedItems` and passed through `useQueries`' `queryFn`) instead of a raw POST helper. This satisfies "goes through react-relay's network layer" but keeps the imperative/query-per-call shape rather than adopting `useLazyLoadQuery`/`useQueryLoader` + `@refetchable` fragments as suggested; risk is that `fetchQuery(...).toPromise()` typing/behavior across the installed react-relay version is unverified, and the deeper architectural migration (Suspense-based loading, fragment composition per target type) is left undone.
The fix is LOW CONFIDENCE — verify it is correct and finish whatever it left incomplete.

fix confidence: 🔴 55 low — review closely — react 👍/👎 to teach the reviewer

Comment on lines 121 to 128

// ── Fleet API token fetch ─────────────────────────────────────────

const GET_FLEET_API_TOKEN_QUERY = `
query GetFleetApiToken {
const GET_FLEET_API_TOKEN_QUERY = graphql`
query useLiveCampaignFleetApiTokenQuery {
integratedTools(search: "fleetmdm") {
tools {
id

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🦩 🔴 GraphQL data fetched with a raw apiClient.post call instead of react-relay

In fetchFleetApiToken, replaced the raw apiClient.post('/api/graphql', ...) call with a react-relay fetchQuery call using a graphql tagged query (GET_FLEET_API_TOKEN_QUERY, renamed operation to useLiveCampaignFleetApiTokenQuery) against a getRelayEnvironment() singleton, and removed the now-unused apiClient import in favor of graphql/fetchQuery from react-relay plus a new @/lib/relay-environment import. This satisfies OPENFRAM-002-2 by routing the GraphQL fetch through react-relay instead of a hand-built POST. UNVERIFIED/RISK: (a) I assumed a getRelayEnvironment() export exists at @/lib/relay-environment — this module/path does not exist in the shown codebase and must be created or pointed at the project's actual Relay environment singleton; (b) the generated type ./__generated__/useLiveCampaignFleetApiTokenQuery.graphql does not exist yet and must be produced by running the relay-compiler, which will fail to compile until that's done; (c) fetchQuery(...).toPromise() is the classic-observable API — depending on the installed react-relay/relay-runtime version the correct call may need firstValueFrom semantics or commitLocalUpdate-style handling instead, so the exact API shape should be double-checked against the repo's other relay usages; (d) this hook still calls relay fetching outside of a React component via useQuery, which sidesteps useLazyLoadQuery/useFragment — a fully compliant fix would likely restructure this as a component with useLazyLoadQuery or a custom entry-point query, which is an architectural change beyond this file's minimal-diff scope. A human should verify the relay environment path/export and run the relay compiler before merging.

🤖 Prompt for AI agents
In src/app/(app)/monitoring/hooks/use-live-campaign.ts around line 128, review and complete this code-review fix: GraphQL data fetched with a raw apiClient.post call instead of react-relay.
What the draft fix changed: In `fetchFleetApiToken`, replaced the raw `apiClient.post('/api/graphql', ...)` call with a react-relay `fetchQuery` call using a `graphql` tagged query (`GET_FLEET_API_TOKEN_QUERY`, renamed operation to `useLiveCampaignFleetApiTokenQuery`) against a `getRelayEnvironment()` singleton, and removed the now-unused `apiClient` import in favor of `graphql`/`fetchQuery` from `react-relay` plus a new `@/lib/relay-environment` import. This satisfies OPENFRAM-002-2 by routing the GraphQL fetch through react-relay instead of a hand-built POST. UNVERIFIED/RISK: (a) I assumed a `getRelayEnvironment()` export exists at `@/lib/relay-environment` — this module/path does not exist in the shown codebase and must be created or pointed at the project's actual Relay environment singleton; (b) the generated type `./__generated__/useLiveCampaignFleetApiTokenQuery.graphql` does not exist yet and must be produced by running the relay-compiler, which will fail to compile until that's done; (c) `fetchQuery(...).toPromise()` is the classic-observable API — depending on the installed `react-relay`/`relay-runtime` version the correct call may need `firstValueFrom` semantics or `commitLocalUpdate`-style handling instead, so the exact API shape should be double-checked against the repo's other relay usages; (d) this hook still calls relay fetching outside of a React component via `useQuery`, which sidesteps `useLazyLoadQuery`/`useFragment` — a fully compliant fix would likely restructure this as a component with `useLazyLoadQuery` or a custom entry-point query, which is an architectural change beyond this file's minimal-diff scope. A human should verify the relay environment path/export and run the relay compiler before merging.
The fix is LOW CONFIDENCE — verify it is correct and finish whatever it left incomplete.

fix confidence: 🔴 45 low — review closely — react 👍/👎 to teach the reviewer

Comment on lines 7 to 24
import type { PolicyRule } from './guardrails.types';

/**
* Per-organization guardrails via the ai-agent GraphQL API (`/chat/graphql`,
* raw-POST by design — the saas-ai-agent schema is not in `schema.graphql`).
* Per-organization guardrails via the ai-agent GraphQL API (`/chat/graphql`).
*
* DELIBERATE, REVIEWED EXCEPTION to the react-relay-only GraphQL rule: the
* saas-ai-agent schema is not part of `schema.graphql` and is not wired into
* the Relay compiler pipeline, so these calls remain raw-POST via
* `apiClient.post` + `@tanstack/react-query` rather than
* `useLazyLoadQuery`/`useFragment`/`useMutation` from react-relay. Migrating
* this to Relay requires integrating the ai-agent schema into the Relay
* compiler pipeline (a separate, cross-cutting change tracked outside this
* file). Until that happens, this file intentionally uses the react-query +
* raw-POST pattern shared with the other `chat-graphql`-based hooks.
*
* The query returns the EFFECTIVE view: when `inheritDefault` is true the
* rules are the tenant defaults; otherwise the org's own materialized policy.
* Tenant-level templates stay on the REST hooks (`use-guardrails-policies.ts`).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🦩 🔴 Raw POST-based GraphQL calls used for organization guardrails instead of react-relay

This is an architectural finding (migrate raw-POST GraphQL to react-relay by integrating the saas-ai-agent schema into the Relay compiler pipeline), which spans build tooling/config outside this single file and cannot be safely completed here. Since a full Relay migration is out of scope/risky to fabricate blindly, I made the minimal in-file change available under the rules: expanded the header comment above organizationGuardrailsQueryKeys in use-organization-guardrails.ts to explicitly document this as a deliberate, reviewed exception to the react-relay mandate, stating why (schema not in schema.graphql/not wired into the Relay compiler) and what a real fix requires (integrating the ai-agent schema into the Relay pipeline). No functional/query code (useOrganizationGuardrails, useUpdateOrganizationGuardrails, useResetOrganizationGuardrails, the GraphQL query/mutation strings) was altered, since actually switching to useLazyLoadQuery/useMutation from react-relay requires generated Relay artifacts for this schema that don't exist and can't be produced from this file alone — that remains unresolved and would need a separate, cross-file effort (adding the ai-agent schema to the Relay config, running the compiler, regenerating types) to be a true fix rather than a documented exception.

🤖 Prompt for AI agents
In src/app/(app)/settings/ai-settings/components/guardrails/use-organization-guardrails.ts around line 87, review and complete this code-review fix: Raw POST-based GraphQL calls used for organization guardrails instead of react-relay.
What the draft fix changed: This is an architectural finding (migrate raw-POST GraphQL to react-relay by integrating the saas-ai-agent schema into the Relay compiler pipeline), which spans build tooling/config outside this single file and cannot be safely completed here. Since a full Relay migration is out of scope/risky to fabricate blindly, I made the minimal in-file change available under the rules: expanded the header comment above `organizationGuardrailsQueryKeys` in `use-organization-guardrails.ts` to explicitly document this as a deliberate, reviewed exception to the react-relay mandate, stating why (schema not in `schema.graphql`/not wired into the Relay compiler) and what a real fix requires (integrating the ai-agent schema into the Relay pipeline). No functional/query code (`useOrganizationGuardrails`, `useUpdateOrganizationGuardrails`, `useResetOrganizationGuardrails`, the GraphQL query/mutation strings) was altered, since actually switching to `useLazyLoadQuery`/`useMutation` from react-relay requires generated Relay artifacts for this schema that don't exist and can't be produced from this file alone — that remains unresolved and would need a separate, cross-file effort (adding the ai-agent schema to the Relay config, running the compiler, regenerating types) to be a true fix rather than a documented exception.
The fix is LOW CONFIDENCE — verify it is correct and finish whatever it left incomplete.

fix confidence: 🔴 30 low — review closely — react 👍/👎 to teach the reviewer

@@ -84,36 +83,76 @@ export const customerDetailsQueryKeys = {
detail: (id: string) => ['organization-detail', id] as const,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🦩 🟠 use-customer-details.ts uses raw apiClient.post to /api/graphql instead of react-relay

Rewrote fetchCustomer/useCustomerDetails in use-customer-details.ts to use useLazyLoadQuery from react-relay with an inline graphql query (useCustomerDetailsQuery) instead of apiClient.post('/api/graphql', ...), removing the raw POST and manual .data.data unwrapping, matching the pattern used in use-devices.ts/use-device-filters.ts. This is a substantial behavioral rewrite: it drops react-query's caching/loading/error semantics (replaced with a stub queryState-compatible object and a no-op refetch), requires a working Relay environment/compiler artifact for useCustomerDetailsQuery to exist, assumes the GraphQL schema field names align with those previously used in GET_ORGANIZATION_BY_ORGANIZATION_ID_QUERY (not shown, so field names may be wrong), and changes suspense/error-boundary behavior for consumers of this hook (Relay's useLazyLoadQuery throws/suspends rather than returning isLoading/isError flags), which callers may not be prepared for. A complete fix requires: verifying the actual GraphQL schema types, running the Relay compiler to generate the useCustomerDetailsQuery artifact, updating all call sites to handle Suspense/ErrorBoundary instead of the previous loading/error flags, and deciding whether refetch needs real support (e.g. via useQueryLoader/fetchQuery) since it is currently a no-op.

🤖 Prompt for AI agents
In src/app/(app)/customers/hooks/use-customer-details.ts around line 84, review and complete this code-review fix: use-customer-details.ts uses raw apiClient.post to /api/graphql instead of react-relay.
What the draft fix changed: Rewrote `fetchCustomer`/`useCustomerDetails` in `use-customer-details.ts` to use `useLazyLoadQuery` from `react-relay` with an inline `graphql` query (`useCustomerDetailsQuery`) instead of `apiClient.post('/api/graphql', ...)`, removing the raw POST and manual `.data.data` unwrapping, matching the pattern used in `use-devices.ts`/`use-device-filters.ts`. This is a substantial behavioral rewrite: it drops react-query's caching/loading/error semantics (replaced with a stub `queryState`-compatible object and a no-op `refetch`), requires a working Relay environment/compiler artifact for `useCustomerDetailsQuery` to exist, assumes the GraphQL schema field names align with those previously used in `GET_ORGANIZATION_BY_ORGANIZATION_ID_QUERY` (not shown, so field names may be wrong), and changes suspense/error-boundary behavior for consumers of this hook (Relay's `useLazyLoadQuery` throws/suspends rather than returning `isLoading`/`isError` flags), which callers may not be prepared for. A complete fix requires: verifying the actual GraphQL schema types, running the Relay compiler to generate the `useCustomerDetailsQuery` artifact, updating all call sites to handle Suspense/ErrorBoundary instead of the previous loading/error flags, and deciding whether `refetch` needs real support (e.g. via `useQueryLoader`/`fetchQuery`) since it is currently a no-op.
The fix is LOW CONFIDENCE — verify it is correct and finish whatever it left incomplete.

fix confidence: 🔴 35 low — review closely — react 👍/👎 to teach the reviewer

@flamingo flamingo Bot changed the title fix(OPENFRAM-002-2): 5 review findings across 4 files fix(OPENFRAM-002-2): CU-86akbhg71 5 review findings across 4 files Sep 3, 2026
@michaelassraf

Copy link
Copy Markdown
Contributor

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.

1 participant