Datum: 6. april 2026. Osnova: Forenzička analiza SDLC pipeline-a (URL shortener task) + industrija standardi (Anthropic, Google, GitHub — april 2026.)
SDLC pipeline je ispravno orkestiran (Product Discovery → Architecture → Code Gen → PR Gate → CI/CD → Deploy), ali Code Generation Agent je pao na PR Gate dva puta sa skorovima 43 i 48 od 100. Glavni razlog: agenti nemaju pristup projektnim konvencijama, retry ne donosi nove informacije, i ne postoji deterministička verifikacija pre LLM ocene.
Problem: Code Gen agent generiše generički Next.js kod jer ne zna za @/generated/prisma, zabranu any tipova, logger umesto console.log, API response format { success, data/error }.
Rešenje: Novi node tip project_context koji čita projektne fajlove i ubacuje ih u kontekst za downstream agente.
1.1 — Novi NodeType: project_context
Fajlovi za kreiranje/izmenu:
src/types/index.ts— dodaj'project_context'u NodeType unionsrc/lib/validators/flow-content.ts— dodaj u NODE_TYPES nizsrc/lib/runtime/handlers/project-context-handler.ts— novi handlersrc/lib/runtime/handlers/index.ts— registruj handlersrc/components/builder/nodes/project-context-node.tsx— UI komponentasrc/components/builder/flow-builder.tsx— registruj u NODE_TYPES mapusrc/components/builder/node-picker.tsx— dodaj u pickersrc/components/builder/property-panel.tsx— property editorsrc/lib/runtime/handlers/__tests__/project-context-handler.test.ts— testovi
Handler logika:
1. Čita `node.data.contextFiles` (niz putanja, npr. ["CLAUDE.md", ".claude/rules/*.md"])
2. Za svaki fajl: čita sadržaj iz Knowledge Base ili iz file sistema
3. Spaja sve u jedan string sa jasnim sekcijama
4. Postavlja rezultat u `updatedVariables.projectContext`
5. Downstream agenti (Code Gen, PR Gate) čitaju `{{projectContext}}` iz varijabli
Node data schema:
{
contextFiles: string[]; // putanje do fajlova sa konvencijama
contextLabel: string; // npr. "TypeScript Rules" — za debug
maxTokens?: number; // limit koliko konteksta ubaciti (default: 4000)
outputVariable: string; // default: "projectContext"
}1.2 — Integracija sa Code Gen promptom
U SDLC pipeline flow-u, project_context node se stavlja ISPRED ai_response node-a koji pokreće Code Generation. System prompt Code Gen agenta treba da sadrži:
You MUST follow these project conventions:
{{projectContext}}
1.3 — Integracija sa PR Gate promptom
PR Gate agent takođe dobija {{projectContext}} da bi mogao da proverava konvencije koje su specifične za projekat — ne samo generičke best practices.
- Happy path: handler čita 3 fajla, postavlja varijablu
- Prazan contextFiles niz: vraća prazan string, ne puca
- Fajl ne postoji: loguje warning, preskače, nastavlja sa ostalim
Problem: Code Gen kreira kod koji nikad nije pokrenut. TypeScript greške, pogrešni importi, sintaksne greške — sve ovo se otkriva tek u PR Gate (koji je LLM, ne kompajler). LLM ocenjuje kod na osnovu "izgleda", ne na osnovu toga da li se kompajlira.
Rešenje: Novi node tip sandbox_verify koji pokreće deterministične provere nad generisanim kodom pre nego što stigne do PR Gate.
2.1 — Novi NodeType: sandbox_verify
Isti set fajlova kao u Fazi 1 (types, validators, handler, index, UI, tests).
Handler logika:
1. Čita `{{generatedCode}}` iz varijabli (output Code Gen agenta)
2. Piše fajlove u privremeni direktorijum
3. Pokreće provere po redu:
a. tsc --noEmit (TypeScript kompilacija)
b. eslint --quiet (lint provera)
c. Regex provere za zabranjene patterne:
- /@prisma\/client/ → FAIL ("Use @/generated/prisma")
- /: any\b/ → FAIL ("No any types")
- /console\.(log|error|warn)/ → FAIL ("Use logger")
4. Sakuplja sve greške u strukturiran output
5. Postavlja u updatedVariables:
- sandboxResult: "PASS" | "FAIL"
- sandboxErrors: string[] (lista grešaka)
- sandboxSummary: string (human-readable)
Node data schema:
{
inputVariable: string; // varijabla sa generisanim kodom
checks: string[]; // ["typecheck", "lint", "forbidden_patterns"]
forbiddenPatterns?: { // custom regex provere
pattern: string;
message: string;
}[];
outputVariable: string; // default: "sandboxResult"
}2.2 — Integracija u SDLC pipeline
Redosled u flow-u:
Code Gen → sandbox_verify → [PASS] → PR Gate → CI/CD
→ [FAIL] → Retry Code Gen sa sandboxErrors
Ovo znači da PR Gate nikad ne dobija kod koji se ne kompajlira. PR Gate se fokusira na subjektivne stvari: arhitektura, čitljivost, sigurnost.
- Kod sa
anytipom: FAIL sa jasnom porukom - Kod sa
@prisma/client: FAIL sa ispravnim importom u poruci - Čist kod: PASS
- Prazan input: FAIL gracefully
Problem: Code Gen agent vraća slobodan tekst (markdown sa code blokovima). PR Gate parsira taj tekst heuristički. Kad format varira između pokušaja, PR Gate može da propusti fajlove ili pogrešno parsira kod.
Rešenje: Definisati JSON schema za output svakog agenta u SDLC pipeline-u. Koristiti Vercel AI SDK structured output (generateObject) umesto generateText.
3.1 — Zod schemas za agent outpute
Fajl: src/lib/sdlc/schemas.ts
// Code Gen output
const CodeGenOutputSchema = z.object({
files: z.array(z.object({
path: z.string(), // "src/app/api/urls/route.ts"
content: z.string(), // pun sadržaj fajla
language: z.string(), // "typescript"
isNew: z.boolean(), // true = novi fajl, false = izmena postojećeg
})),
dependencies: z.array(z.object({
name: z.string(), // "zod"
version: z.string(), // "^3.0.0"
isDev: z.boolean(),
})),
envVariables: z.array(z.object({
key: z.string(), // "DATABASE_URL"
description: z.string(),
required: z.boolean(),
})),
prismaSchemaChanges: z.string().optional(), // ako ima schema izmena
summary: z.string(), // kratak opis šta je generisano
});
// PR Gate output
const PRGateOutputSchema = z.object({
decision: z.enum(["APPROVE", "APPROVE_WITH_NOTES", "BLOCK"]),
compositeScore: z.number().min(0).max(100),
securityScore: z.number().min(0).max(100),
qualityScore: z.number().min(0).max(100),
issues: z.array(z.object({
severity: z.enum(["CRITICAL", "HIGH", "MEDIUM", "LOW"]),
category: z.enum(["security", "quality", "convention", "performance"]),
file: z.string(),
line: z.number().optional(),
message: z.string(),
fix: z.string(), // KONKRETAN fix, ne dijagnoza
})),
summary: z.string(),
});3.2 — Izmena ai-response-handler-a
Kad node ima node.data.outputSchema definisan, handler koristi generateObject umesto generateText:
if (node.data.outputSchema) {
const { object } = await generateObject({
model,
schema: resolveSchema(node.data.outputSchema),
prompt: resolvedPrompt,
});
// object je već type-safe
}3.3 — Validacija između faza
Svaki node u pipeline-u validira input koji dobija od prethodnog node-a:
Code Gen (outputSchema: CodeGenOutput)
→ sandbox_verify (očekuje CodeGenOutput.files)
→ PR Gate (outputSchema: PRGateOutput, input: CodeGenOutput)
Ako validacija failuje, flow se zaustavlja sa jasnom greškom umesto da propagira bad data.
- Code Gen sa outputSchema: vraća valid JSON, ne markdown
- Invalid output (missing files field): Zod validation error, flow se zaustavlja
- PR Gate sa fix poljem: svaka issue ima konkretan fix
Problem: Kad PR Gate blokira, retry Code Gen dobija dijagnozu ("fix imports") ali ne dobija recept ("promeni X u Y"). Score raste sa 43 na 48 jer agent pogađa šta treba — umesto da zna.
Rešenje: PR Gate output (iz Faze 3) sadrži fix polje za svaku issue. Retry mehanizam konstruiše prompt sa svim fix-ovima kao konkretnim instrukcijama.
4.1 — Retry node unapređenje
Postojeći retry handler treba proširiti da podržava "escalating context" — svaki retry dodaje više informacija.
Izmena u: src/lib/runtime/handlers/retry-handler.ts
Nova logika:
Retry 1:
- Original prompt
- PR Gate issues sa fix poljima
- projectContext (iz Faze 1)
Retry 2:
- Sve od Retry 1
+ sandboxErrors (iz Faze 2)
+ Primer ispravnog koda iz projekta (few-shot examples)
+ Eksplicitna lista: "Ove greške si napravio, evo tačno kako izgleda ispravan kod"
4.2 — Few-shot examples iz Knowledge Base
Dodaj mogućnost da project_context node (iz Faze 1) učita i primere koda iz Knowledge Base — ne samo pravila, nego i 2-3 konkretna API route fajla koja služe kao referenca.
Node data proširenje:
{
contextFiles: string[],
exampleFiles?: string[], // ["src/app/api/agents/route.ts", "src/app/api/health/route.ts"]
maxExamples?: number, // default: 3
}- Retry 1 prompt sadrži PR Gate fix-ove
- Retry 2 prompt sadrži sandbox greške + primere koda
- Retry bez grešaka: standardni retry bez dodatnog konteksta
Problem: Agent Studio ima A2A protokol i marketplace, ali agenti nemaju standardizovane Agent Cards po Google A2A v0.3 specifikaciji. Ovo otežava discovery i interoperabilnost sa eksternim sistemima.
Rešenje: Svaki agent objavljuje Agent Card na well-known URL-u.
5.1 — Agent Card API ruta
Fajl: src/app/api/agents/[agentId]/.well-known/agent-card.json/route.ts
Ili alternativno (jednostavnije):
Fajl: src/app/api/a2a/[agentId]/agent-card/route.ts
Response format (A2A v0.3):
{
"name": "URL Shortener Agent",
"description": "Creates and manages short URLs",
"version": "1.0.0",
"url": "https://agent-studio.up.railway.app/api/a2a/agent-id",
"capabilities": {
"streaming": true,
"pushNotifications": false
},
"skills": [
{
"id": "shorten-url",
"name": "Shorten URL",
"description": "Creates a short URL from a long URL",
"inputModes": ["text/plain"],
"outputModes": ["application/json"]
}
],
"authentication": {
"schemes": ["bearer"]
}
}5.2 — Automatsko generisanje iz Prisma modela
Agent Card se generiše automatski iz postojećih Agent podataka (name, description, systemPrompt) + flow node-ova (skills = input/output node-ovi).
5.3 — Discovery endpoint
Fajl: src/app/.well-known/agent-cards/route.ts
Vraća listu svih javnih agenata sa linkovima do njihovih Agent Cards. Ovo omogućava eksternim sistemima da otkriju sve agente na platformi.
- Agent Card vraća valid JSON po A2A v0.3 specifikaciji
- Agent bez opisa: polje description ima fallback vrednost
- Privatni agent: nije u discovery listi
Problem: Inter-agent komunikacija koristi natural language bez schema validacije. Agent A može da pošalje malformiran output agentu B, i B će pokušati da ga interpretira umesto da failuje brzo.
Rešenje: Koristiti MCP (koji već postoji u projektu) kao enforcement layer — svaki tool call se validira pre izvršenja.
6.1 — Schema validacija na mcp-tool-handler
Izmena u: src/lib/runtime/handlers/mcp-tool-handler.ts
Dodati Zod validaciju za input/output svake tool operacije:
1. Pre tool call: validiraj input prema tool schema
2. Posle tool call: validiraj output prema expected schema
3. Ako validacija failuje: vrati strukturiranu grešku, ne propagiraj bad data
6.2 — Inter-agent message validation
Izmena u: src/lib/runtime/handlers/call-agent-handler.ts
Kad agent A pozove agenta B:
1. Proveri da B ima Agent Card sa definisanim input schema
2. Validiraj A-ov output prema B-ovom input schema
3. Ako ne odgovara: FAIL sa jasnom porukom ("Agent A output ne odgovara Agent B input schema")
- Valid input: tool call prolazi
- Invalid input: tool call se odbija sa jasnom greškom
- Missing schema: fallback na postojeće ponašanje (backward compatible)
| Faza | Zavisnosti | Procenjen effort | Uticaj |
|---|---|---|---|
| 1. Project Context | Nema | 1-2 dana | Kritičan — rešava root cause Code Gen failure |
| 2. Sandbox Verify | Faza 1 (kontekst za forbidden patterns) | 1-2 dana | Visok — deterministička verifikacija |
| 3. Typed Schemas | Nema (ali Faza 2 koristi schema) | 2-3 dana | Visok — eliminiše parsing greške |
| 4. Feedback Loop | Faze 1, 2, 3 | 1 dan | Srednji — poboljšava retry success rate |
| 5. A2A Agent Cards | Nema | 1 dan | Srednji — marketplace/discovery |
| 6. MCP Enforcement | Faza 3 (schemas) | 1-2 dana | Srednji — sprečava bad data propagation |
Ukupno: 7-11 dana rada
Faze 1 i 2 su kritične — one rešavaju tačno problem koji smo videli u URL shortener pipeline-u. Faza 3 je fundament za Faze 4 i 6. Faza 5 je nezavisna i može paralelno.