{
  "schema": "symbiont/audit-report@1",
  "audit_id": "2dca4170-8745-414d-94e6-2f203a189516",
  "host_id": "kebabkiller-studio",
  "display_name": "Kebabkiller Studio",
  "started_at": "2026-06-15T19:40:45.514Z",
  "finished_at": "2026-06-15T19:40:46.533Z",
  "duration_ms": 1019,
  "cost_usd": 0,
  "llm_used": false,
  "stats": {
    "files_scanned": 73,
    "findings_total": 54,
    "critical": 0,
    "high": 4,
    "medium": 36,
    "info": 14,
    "warn": 0
  },
  "checks_run": [
    "file_list",
    "ast_project_map",
    "secrets_scan",
    "todo_scan",
    "rg_console_log"
  ],
  "findings": [
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/index.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/canonPipeline.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/compositeStartFrame.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/director.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/directorPlanSync.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/kinematicsFromPrompt.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/memoryCompaction.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/models.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/queue.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/runComfyEngine.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/runcomfyWorkflowAudit.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/summarizeRender.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "backend/src/tests/wanConfig.test.js",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "ast_index",
      "severity": "info",
      "path": "frontend/src/main.jsx",
      "line": null,
      "message": "No exported functions/classes detected (may be entry or config)"
    },
    {
      "check": "secrets",
      "severity": "high",
      "path": "backend/src/tests/director.test.js",
      "line": 61,
      "message": "Potential secret pattern: api_key_assignment",
      "snippet": "API_KEY …key'"
    },
    {
      "check": "secrets",
      "severity": "high",
      "path": "backend/src/tests/director.test.js",
      "line": 110,
      "message": "Potential secret pattern: api_key_assignment",
      "snippet": "API_KEY …key'"
    },
    {
      "check": "secrets",
      "severity": "high",
      "path": "backend/src/tests/director.test.js",
      "line": 165,
      "message": "Potential secret pattern: api_key_assignment",
      "snippet": "API_KEY …key'"
    },
    {
      "check": "secrets",
      "severity": "high",
      "path": "backend/src/tests/runComfyEngine.test.js",
      "line": 21,
      "message": "Potential secret pattern: api_key_assignment",
      "snippet": "API_KEY:…key'"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 59,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('=== RunComfy smoke test ===');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 60,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`Deployment: ${deploymentId || '(nie rozpoznano UUID)'}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 61,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`Endpoint:   ${process.env.RUNCOMFY_ENDPOINT}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 62,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`API key:    ${maskSecret(process.env.RUNCOMFY_API_KEY)}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 63,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`WAN_LENGTH: ${WAN_QUALITY.length} (${WAN_QUALITY.width}×${WAN_QUALITY.height}, steps=${WAN_QUALITY.steps})`"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 64,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`Output dir: ${paths.outputDir}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 65,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 80,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('[dry-run] workflow_api_json OK');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 81,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  nodes (${nodes.length}): ${nodes.sort((a, b) => Number(a) - Number(b)).join(', ')}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 82,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  SaveWEBM node ${WEBM_OUTPUT_NODE_ID}: ${hasWebm ? 'tak' : 'BRAK — sprawdź wan_workflow_api.json'}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 83,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  node 54 length: ${payload.workflow_api_json['54']?.inputs?.length}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 84,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  node 59 image: base64 (${startFrame.data.length} znaków)`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 85,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 86,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('Konfiguracja wygląda poprawnie. Uruchom bez --dry-run po podmianie RUNCOMFY_ENDPOINT.');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 105,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`--- Render ${runIndex}/${totalRuns} (jobId=${jobId}) ---`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 120,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  [${payload.percent ?? '?'}%] ${payload.message}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 129,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  OK: ${result.outputPath}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 130,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  Rozmiar: ${stat.size} B, czas: ${elapsedSec}s, ext: ${ext}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 171,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('  Krótka pauza przed kolejnym renderem…');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 176,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 177,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`=== SUKCES: ${results.length}/${args.repeat} render(ów) ===`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/runcomfy-smoke.mjs",
      "line": 179,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('Powtarzalność OK — deployment nie zawiesił się po pierwszym jobie.');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 387,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('=== RunComfy audit (Serverless, bez GPU) ===\\n');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 390,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`── ${section.name} ──`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 393,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`  ${icon} [${f.level}] ${f.message}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 395,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`      ${JSON.stringify(f.details).slice(0, 200)}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 398,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 402,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`Podsumowanie: ${p} PASS, ${w} WARN, ${f} FAIL`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 431,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(JSON.stringify({"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 444,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`Bundle zapisany: ${bundleDir}`);"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 445,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('Wyślij report.txt + wan_workflow_api.json do supportu RunComfy.');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 450,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('\\nNastępny krok (GPU): npm run smoke:runcomfy -- --repeat 2');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/scripts/audit-runcomfy.mjs",
      "line": 451,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('Docs: docs/RUNCOMFY_DEPLOYMENT.md');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/src/video/compositeStartFrame.js",
      "line": 55,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('[StartFrame] Tylko postać (brak ref tła) — wysyłam oryginalny ref postaci.');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/src/video/compositeStartFrame.js",
      "line": 64,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log('[StartFrame] Tylko tło — wysyłam samo tło jako klatkę startową.');"
    },
    {
      "check": "rg",
      "severity": "medium",
      "path": "./backend/src/video/compositeStartFrame.js",
      "line": 69,
      "message": "Pattern \"console\\.log\" match",
      "snippet": "console.log(`[StartFrame] Składanie composite ${width}x${height}: tło + postać`);"
    }
  ],
  "exports_map_sample": {
    "backend/src/ai/canonPipeline.js": [
      "resolveStyleBible",
      "buildSkippedResult",
      "loadOrBuildRenderSummary",
      "processCanonAcceptance"
    ],
    "backend/src/ai/kinematicsFromPrompt.js": [
      "extractMotionBeatsFromPolish",
      "resolveDominantBeat",
      "inferVelocityFromPolish",
      "isKinematicsContradictory",
      "buildBeatSequenceMotion",
      "reconcileKinematicsWithPrompt",
      "inferKinematicsFromPolish",
      "deriveStoryboardFromBeats"
    ],
    "backend/src/ai/memoryCompaction.js": [
      "mergeSummariesRuleBased",
      "fetchWithTimeout",
      "callGroqCompaction",
      "callOpenAiCompaction",
      "formatSceneContextBlock",
      "buildCompactionUserMessage",
      "normalizeCompactionOutput",
      "compactSeriesMemory"
    ],
    "backend/src/ai/seriesContext.js": [
      "truncateToCharBudget",
      "estimateTokens",
      "buildSeriesContextBlock"
    ],
    "backend/src/ai/summarizeRender.js": [
      "parseDirectorJson",
      "deriveContinuityNotes",
      "deriveToneTags",
      "extractRenderSummary",
      "formatRenderSummaryForPrompt"
    ],
    "backend/src/api/auth.js": [
      "optionalApiKeyMiddleware"
    ],
    "backend/src/api/routes.js": [
      "formatJobResponse",
      "createApiRouter"
    ],
    "backend/src/app.js": [
      "createApp"
    ],
    "backend/src/db/init.js": [
      "getDb",
      "initDatabase",
      "purgeToxicRules",
      "seedDefaults",
      "closeDatabase"
    ],
    "backend/src/db/models.js": [
      "listCharacters",
      "getCharacter",
      "createCharacter",
      "updateCharacter",
      "deleteCharacter",
      "listBackgrounds",
      "getBackground",
      "createBackground",
      "updateBackground",
      "deleteBackground",
      "listRules",
      "getRule",
      "createRule",
      "updateRule",
      "deleteRule",
      "listVideoJobs",
      "listVideoJobsByStatus",
      "getVideoJob",
      "createVideoJob",
      "updateVideoJob",
      "getKnowledgeContext",
      "listProjects",
      "getProject",
      "serializeStyleBible",
      "createProject",
      "updateProject",
      "deleteProject",
      "listEpisodes",
      "getEpisode",
      "createEpisode",
      "updateEpisode",
      "deleteEpisode",
      "getRenderSummaryByJobId",
      "hasSeriesMemoryRevisionForJob",
      "countSeriesMemoryRevisionsForJob",
      "tryAcquireCanonAcceptanceLock",
      "releaseCanonAcceptanceLock",
      "isCanonAcceptanceComplete",
      "upsertRenderSummary",
      "listRenderSummariesForProject",
      "tryClaimJobCanon",
      "releaseJobCanonClaim",
      "setJobCanon",
      "updateProjectSeriesMemory",
      "archiveSeriesMemoryRevision",
      "commitCanonSeriesMemory",
      "parseStyleBible",
      "getSeriesContextForLlm",
      "getDirectorContextForEpisode"
    ],
    "backend/src/db/sqliteDriver.js": [
      "DatabaseSync"
    ],
    "backend/src/index.js": [],
    "backend/src/tests/api.integration.test.js": [
      "waitForJobCompletion"
    ],
    "backend/src/tests/canonPipeline.test.js": [],
    "backend/src/tests/compositeStartFrame.test.js": [],
    "backend/src/tests/director.test.js": [],
    "backend/src/tests/directorPlanSync.test.js": [],
    "backend/src/tests/helpers/imageFixtures.js": [
      "createUploadFixtures",
      "destroyUploadFixtures"
    ],
    "backend/src/tests/helpers/runComfyFetchMock.js": [
      "mockRunComfyFetch"
    ],
    "backend/src/tests/helpers/testApp.js": [
      "createTestApp"
    ],
    "backend/src/tests/helpers/testDatabase.js": [
      "createTestDatabase",
      "destroyTestDatabase"
    ],
    "backend/src/tests/jobLifecycle.test.js": [
      "minutesAgo"
    ],
    "backend/src/tests/kinematicsFromPrompt.test.js": [],
    "backend/src/tests/memoryCompaction.test.js": [],
    "backend/src/tests/models.test.js": [],
    "backend/src/tests/queue.test.js": [],
    "backend/src/tests/runComfyEngine.test.js": [],
    "backend/src/tests/runcomfyWorkflowAudit.test.js": [],
    "backend/src/tests/summarizeRender.test.js": [],
    "backend/src/tests/wanConfig.test.js": []
  }
}