debug-fe-be-integration — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited debug-fe-be-integration (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Systematic approach to debugging frontend-backend integration issues by analyzing backend logs, production errors, and source code to identify root causes and fix both sides.
Before debugging, discover the project's architecture.
Read package.json and look for:
| Signal | Framework |
|---|---|
next | Next.js |
nuxt | Nuxt |
@remix-run/react | Remix |
@sveltejs/kit | SvelteKit |
vite + react | Vite React SPA |
@angular/core | Angular |
Glob: **/app/api/**/route.ts → Next.js App Router
Glob: **/pages/api/**/*.ts → Next.js Pages Router
Glob: **/server/api/**/*.ts → Nuxt server
Glob: **/src/routes/**/*.ts → Express/Hono/Fastify
Glob: **/src/app.ts or **/src/index.ts → Node backend entry
Glob: **/main.py or **/app.py → Python backend
Glob: **/main.go → Go backend| Signal | Technology |
|---|---|
@trpc/server | tRPC (type-safe, no REST audit needed) |
graphql or @apollo/server | GraphQL |
zod in BE dependencies | Zod validation |
joi in BE dependencies | Joi validation |
yup in BE dependencies | Yup validation |
class-validator | NestJS-style validation |
pydantic | Python Pydantic validation |
Grep: pattern "router\.(get|post|patch|put|delete)" glob "*.{ts,js}" — Express-style
Grep: pattern "app\.(get|post|patch|put|delete)" glob "*.{ts,js}" — Hono/Express
Grep: pattern "export (async function |const )(GET|POST|PATCH|PUT|DELETE)" glob "**/route.ts" — Next.js
Grep: pattern "defineEventHandler" glob "*.{ts,js}" — Nuxt/H3STACK DISCOVERY:
- Frontend: [framework + version]
- Backend: [framework + version]
- API style: [REST / GraphQL / tRPC]
- Validation: [Zod / Joi / Yup / Pydantic / none]
- Route files: [pattern and locations]
- Controller files: [pattern and locations]
- Schema files: [pattern and locations]CallMcpTool(server: "user-firecrawl", toolName: "firecrawl_search", arguments: {
"query": "<FE_FRAMEWORK> <BE_FRAMEWORK> API integration debugging best practices [current year]",
"limit": 5,
"sources": [{ "type": "web" }]
})Additional targeted searches:
| Topic | Query |
|---|---|
| Validation errors | <VALIDATION_LIB> error handling API response best practices |
| CORS issues | <BE_FRAMEWORK> CORS configuration debugging |
| Type mismatches | TypeScript API type safety frontend backend shared types |
CallMcpTool(server: "context7", toolName: "resolve-library-id", arguments: {
"libraryName": "<VALIDATION_LIB>",
"query": "error handling error messages custom errors"
})CallMcpTool(server: "plugin-sentry-sentry", toolName: "search_issues", arguments: {
"organizationSlug": "<ORG_SLUG>",
"naturalLanguageQuery": "API integration errors 4xx 5xx validation from the last 7 days",
"projectSlugOrId": "<PROJECT_SLUG>",
"regionUrl": "<REGION_URL>",
"limit": 25
})If the project has separate FE and BE Sentry projects, check both:
Read the terminal files for the running backend process:
Read: terminals/*.txt — find the terminal running the backend (npm run dev, etc.)Look for errors in the last 3-5 minutes:
4xx errors (400, 401, 403, 404, 422)5xx errors (500, 502, 503)ZodError / ValidationError — validation failuresAppError / custom error classes| Category | Log Pattern | Root Cause |
|---|---|---|
| Missing parameter | ZodError: expected string, received undefined | FE not sending required param |
| Wrong type | ZodError: invalid_type | FE sending wrong type |
| Endpoint not found | 404 /api/... | FE calling non-existent endpoint |
| Auth error | 401 Unauthorized | Missing or invalid token |
| Permission error | 403 Forbidden | User lacks permission |
| Validation error | 422 Unprocessable | Invalid request body |
| Server error | 500 Internal | Backend bug |
| CORS error | CORS policy | Missing CORS configuration |
For each error found, use Grep to locate:
Frontend call:
Grep: pattern "<ERROR_ENDPOINT>" glob "*.{ts,tsx,js,jsx}"Backend route:
Grep: pattern "<ERROR_ENDPOINT>" glob "*.{ts,js,py,go,rb}" — in backend sourceValidation schema:
Grep: pattern "z\.object|z\.string|z\.number" in the controller/route file
SemanticSearch: "validation schema for <ENDPOINT>" target: [backend directory]For each error, read the complete request chain:
If the error might be data-related:
CallMcpTool(server: "plugin-supabase-supabase", toolName: "execute_sql", arguments: {
"project_id": "<PROJECT_ID>",
"query": "SELECT * FROM <TABLE> WHERE <CONDITION> LIMIT 5"
})Check:
For each error, provide:
### Issue: [Endpoint] — [Error Type]
**Current FE Call:**
[show the actual code from Grep results]
**Correct FE Call:**
[show the fixed code]
**Why:** [explanation of required parameter/type/format]
**Files to Update:** [list specific files]For each error, consider backend improvements:
### Backend Enhancement: [Endpoint]
**Current Behavior:** Returns 500 with cryptic validation error
**Recommended Enhancement:**
- Add default value for optional params
- Add clear error message for required params
- Add type coercion where appropriate
- Return helpful 422 instead of 500Example backend enhancement pattern:
// Before: bare schema, cryptic error on missing param
const schema = z.object({
year: z.string(),
});
// After: defaults, coercion, clear errors
const schema = z.object({
year: z.string({
required_error: "year is required (format: YYYY)"
}).default(() => new Date().getFullYear().toString()),
page: z.coerce.number().default(1).int().positive(),
limit: z.coerce.number().default(10).int().max(100),
});{ data } or { error })## Frontend-Backend Integration Debug Report
**Analyzed:** [timestamp range]
**Frontend:** [framework]
**Backend:** [framework]
**API style:** [REST/GraphQL/tRPC]
---
### Production Errors (Sentry)
| Endpoint | Error | Events (7d) | Root Cause |
|----------|-------|-------------|------------|
| [endpoint] | [error msg] | [count] | [FE/BE/Data] |
---
### Backend Log Errors
| Endpoint | Method | Status | Error Type | Root Cause |
|----------|--------|--------|------------|------------|
| `/api/...` | GET | 500 | ZodError | Missing `year` param |
| `/api/...` | GET | 404 | Not Found | Endpoint not implemented |
---
### Critical Issues (Must Fix)
#### 1. [Endpoint] — [Status Code]
- **Error:** [error message]
- **Root Cause:** [explanation]
- **Frontend Fix:** [what FE needs to change, with code]
- **Backend Enhancement:** [optional BE improvement, with code]
- **Files:** FE: [path], BE: [path]
---
### Warnings (Should Fix)
#### 1. [Issue description]
- **Impact:** [what happens if not fixed]
- **Recommendation:** [how to fix]
---
### Backend Enhancements (Robustness)
#### 1. [Enhancement description]
- **Current:** [current behavior]
- **Recommended:** [better approach]
- **Benefit:** [why this helps]
---
### Research Findings Applied
- [Pattern from research]: [how it applies]
- [Best practice]: [gap identified]
---
### Summary Table
| Endpoint | Issue | Fix Required | Priority |
|----------|-------|--------------|----------|
| `/api/...` | Missing param | Frontend | HIGH |
| `/api/...` | No error handling | Both | MEDIUM |
| `/api/...` | Endpoint 404 | Remove or implement | LOW |
---
### Next Steps
1. [ ] Frontend fixes: [action items with files]
2. [ ] Backend enhancements: [action items with files]
3. [ ] Re-test: [verification steps]
4. [ ] Monitor: Check Sentry after deploy for regressionSymptom: ZodError: expected string, received undefined
FE Fix: Add the missing parameter to the API call.
BE Fix: Add a default value or a clear error message.
Symptom: 404 /api/endpoint-name
Debug steps:
Grep for the endpoint path in backend route filesSymptom: 500 Internal Server Error with no useful message
Debug steps:
Symptom: CORS policy: No 'Access-Control-Allow-Origin'
Debug steps:
Symptom: Same API called multiple times, or stale data shown
Debug steps:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.