Frontend bff boundary review
Skill Raishin/vanguard-frontier-agentic/skills/frontend/frontend-bff-boundary-review
Determines and reviews whether aggregation/shaping logic belongs in a Backend-for-Frontend layer versus client-side composition, and audits existing BFF boundaries for scope creep, duplicated aggregation logic, and leaked backend topology or pass-through authorization.From its SKILL.md
npx -y skills add Raishin/vanguard-frontier-agentic --skill frontend-bff-boundary-reviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 20 stars20 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.9 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Frontend BFF Boundary Review
Purpose
Decide whether a multi-backend data need belongs in a Backend-for-Frontend (BFF) route or in client-side composition, and audit an existing BFF layer for the two failure modes that matter most: organic scope creep (duplicated or one-off aggregation logic scattered across routes) and trust-boundary erosion (a BFF that forwards client-supplied authorization claims or credentials without re-verifying them, or that leaks internal backend topology into its responses). This skill exists so the boundary decision and the trust-boundary audit stay the focus, and so field-level contract review of an already-scoped endpoint, or client-side cache/store design once data has landed in the browser, stay out of scope.
When to use
Use this skill when the user asks to:
- decide whether a feature needing data from multiple backend services should aggregate server-side (a BFF route) or client-side (parallel query-library calls),
- audit an existing BFF layer, or a specific BFF route, that has grown organically over time,
- review whether a proposed new BFF route or service duplicates an existing one's aggregation logic,
- check whether a BFF route re-authenticates/re-authorizes the caller or merely passes through client-supplied claims/tokens to backend services.
Do not use this skill for:
- reviewing the field-level shape, versioning, or authorization contract of a single already-scoped API endpoint — that is
api-integration-contract-review, - client-side cache/store design (query-library cache keys, state colocation) once data has already been fetched — that is
state-management-decision-review, - rendering-mode or
fetch()cache-directive selection for a Next.js route with no cross-service aggregation involved — that isnextjs-rendering-caching-review, - Server Action authorization or
'use client'/'use server'boundary review with no BFF-scope question involved — that isnextjs-app-router-data-fetching-review.
Context7 Documentation Protocol
- Resolve
/vercel/next.jswithresolve-library-idbefore citing any Route Handler capability, caching directive, or runtime behavior as grounds for a BFF-vs-client-composition recommendation. - Before recommending a Next.js Route Handler as the BFF implementation vehicle, read the repo's
package.jsonto confirm the installed Next.js major version, then callquery-docsscoped to that version for "Route Handler caching" and "route segment config revalidate fetchCache." Caching semantics changed materially across major versions — Route HandlerGETmethods are cached by default through Next.js 14 but are not cached by default starting in Next.js 15, requiring an explicitexport const dynamic = 'force-static'to opt back in. A BFF route assumed to cache aggregated responses on an unverified version can silently hit every backend on every request instead of reducing round-trips as intended. - If the version cannot be confirmed, or Context7 is unavailable, state the caching claim as
documentation-based, version-unconfirmedand recommend the user verifyexport const dynamic/export const revalidate/export const fetchCachebehavior against their installed version before relying on it for load-reduction claims. - Do not assume a Route Handler behaves like a
fetch()call inside a Server Component; segment-level config (dynamic,revalidate,fetchCache) governs the Route Handler's own caching, and it is set independently of caching used for calls the handler itself makes.
Lean operating rules
- A BFF is a trust boundary, not a convenience layer for reshaping JSON. The default posture for any BFF route is that it terminates the client's authentication context and establishes its own — it does not relay whatever the client sent forward.
- Default toward BFF aggregation when a feature needs data from two or more backend services with different authorization models or error shapes. Default toward client-side composition only when the backends involved are already safe to call directly from the browser (same trust level as the client, already CORS-exposed, no internal-only topology).
- Before proposing a new BFF route, search for an existing route already serving an overlapping need. A second BFF route re-implementing the same aggregation is a maintenance and drift risk, not a fresh feature.
- Treat any BFF route that reads a client-supplied authorization claim (a role, user ID, or permission flag taken from a request body, query string, or an unverified header) and uses it directly to gate a backend call as a HIGH-severity finding — this is pass-through authorization, not delegation.
- Treat any BFF route that forwards a client-supplied bearer token or credential straight to a downstream backend, in place of the BFF re-authenticating the session and minting its own downstream credential, as a HIGH-severity finding, unless the system is an explicit, documented token-exchange/delegation design (e.g. OAuth token exchange) with its own re-verification step.
- Treat any BFF response that exposes internal-only backend hostnames, service names, stack traces, or service-specific error codes/shapes verbatim to the browser as a MEDIUM-to-HIGH finding depending on sensitivity — the BFF exists in part to prevent this leak, and a thin pass-through response defeats that purpose.
- Do not recommend client-side composition when it would require the browser to hold credentials for, or make direct network calls to, a backend that is not already intended to be internet-reachable — that is a bigger security regression than the aggregation-placement question being asked.
- Do not flag every multi-call client-side data-fetching pattern as a problem. Client-side composition of two or three already-public, already-authorized endpoints is a legitimate, lower-latency choice; only escalate when trust boundaries or topology are actually crossed.
- Never execute, build, or run application code as part of this review; this is a static-review skill (Read/Grep/Glob only).
- Treat any hardcoded API key, service token, or credential found in BFF route source, environment file references, or example data as a HIGH-severity finding requiring immediate escalation, separate from the boundary-scope verdict.
References
Load these only when needed:
- Review workflow and findings contract — use for the step-by-step boundary-decision procedure, the existing-BFF audit method, and the required output shape.
- OWASP API Security — trust-boundary risks — load only when a pass-through-authorization or topology-leak finding is present, to ground the finding's OWASP API Security Top 10 classification and severity framing.
Response minimum
Return, at minimum:
- the boundary decision (BFF aggregation vs. client-side composition) with justification tied to the number of backends, their auth models, and their reachability from the browser,
- for any new/extended BFF route: an explicit scope statement and a check for an existing overlapping route,
- a trust-boundary audit result (pass-through-authorization check, credential-forwarding check, topology-leak check) for any BFF route in scope,
- ranked findings with file:line evidence, risk class, and fix,
- the Next.js major version the caching claims were verified against, if a Route Handler is the proposed implementation,
- verdict: approve / approve-with-notes / block,
- evidence level and open questions.
What ships with it: 3 files
17.9 KB alongside SKILL.md
references/
- owasp-api-trust-boundary.md5.8 KB
- workflow-and-output.md10.3 KB
- metadata.json1.7 KB
Gives 0 of the 12 instructions most design frontend skills give in ~1.5k tokens
Counted across 1,169 of the 1,878 authors here whose files we hold, read 2026-08-07
- Use CSS variables for color consistencyin 72 of 1169, across 23 files
- Commit to one bold aesthetic direction before codingin 72 of 1169, across 27 files
- Match implementation complexity to the aesthetic visionin 70 of 1169, across 20 files
- Add atmospheric background effects and texturesin 57 of 1169, across 9 files
- Use unexpected spatial compositions and layoutsin 56 of 1169, across 8 files
- Implement real working codein 55 of 1169, across 7 files
- Vary themes and aesthetics across different designsin 48 of 1169, across 7 files
- Launch chromium in headless modein 47 of 1169, across 4 files
- Close the browser when donein 47 of 1169, across 4 files
- Run provided scripts with help flag firstin 47 of 1169, across 4 files
- Wait for network idle statein 47 of 1169, across 4 files
- Use descriptive selectors for elementsin 47 of 1169, across 4 files
Said here and by no other author read
- Return a boundary decision with justification tied to backend reachability
- Search for overlapping existing routes before proposing a new BFF route
- Verify installed Next.js major version before making Route Handler caching claims
- Call Context7 query-docs scoped to the confirmed version for Route Handler caching
- Flag client-supplied authorization claims gating backend calls as HIGH severity
- Flag forwarded client bearer tokens as HIGH severity findings
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.