{"reviewRunId":"18efb318-a8ce-485c-8dec-05ca18898931","artifactId":"15c3af2d-68a4-4bac-890d-64b83868e9a0","artifactType":"treesitter","storageKey":"tree-sitter-artifact/v1","metadata":{"artifact":{"files":[{"path":"apps/api/src/infrastructure/database/migrations.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"./migrations/001_initial_review_schema","symbols":["initialReviewSchemaMigration"]},{"line":2,"source":"./migrations/002_dry_run_published_comments","symbols":["dryRunPublishedCommentsMigration"]},{"line":3,"source":"./migrations/003_dashboard_auth_retry_state","symbols":["dashboardAuthRetryStateMigration"]},{"line":4,"source":"./migrations/004_repository_review_configuration","symbols":["repositoryReviewConfigurationMigration"]},{"line":5,"source":"./migrations/005_github_oauth_and_sync","symbols":["githubOAuthAndSyncMigration"]},{"line":6,"source":"./migrations/006_review_policies","symbols":["reviewPoliciesMigration"]},{"line":7,"source":"./migrations/007_ci_failure_artifacts","symbols":["ciFailureArtifactsMigration"]}],"symbols":[{"kind":"method","name":"query","range":{"endLine":14,"startLine":14},"changed":false,"byteRange":{"endByte":850,"startByte":753}},{"kind":"function","name":"runDatabaseMigrations","range":{"endLine":75,"startLine":37},"changed":false,"byteRange":{"endByte":2461,"startByte":1337}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/src/infrastructure/database/migrations.ts","hunkNewEnd":10,"hunkNewStart":4,"enclosingSymbol":null},{"path":"apps/api/src/infrastructure/database/migrations.ts","hunkNewEnd":33,"hunkNewStart":26,"enclosingSymbol":null}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/api/src/infrastructure/database/migrations/007_ci_failure_artifacts.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"../migrations","symbols":["DatabaseMigration"]}],"symbols":[],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/src/infrastructure/database/migrations/007_ci_failure_artifacts.ts","hunkNewEnd":15,"hunkNewStart":1,"enclosingSymbol":null}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/api/src/modules/app.module.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"@nestjs/common","symbols":["Module"]},{"line":2,"source":"./billing/billing.module","symbols":["BillingModule"]},{"line":3,"source":"./ci-failures/ci-failures.module","symbols":["CiFailuresModule"]},{"line":4,"source":"./github/github.module","symbols":["GitHubDashboardModule"]},{"line":5,"source":"./health/health.module","symbols":["HealthModule"]},{"line":6,"source":"./pull-requests/pull-requests.module","symbols":["PullRequestsModule"]},{"line":7,"source":"./repositories/repositories.module","symbols":["RepositoriesModule"]},{"line":8,"source":"./review-runs/review-runs.module","symbols":["ReviewRunsModule"]},{"line":9,"source":"./rules/rules.module","symbols":["RulesModule"]},{"line":10,"source":"./settings/settings.module","symbols":["SettingsModule"]},{"line":11,"source":"./webhooks/github/github-webhook.module","symbols":["GitHubWebhookModule"]}],"symbols":[{"kind":"class","name":"AppModule","range":{"endLine":27,"startLine":27},"changed":false,"byteRange":{"endByte":969,"startByte":951}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/src/modules/app.module.ts","hunkNewEnd":6,"hunkNewStart":1,"enclosingSymbol":null},{"path":"apps/api/src/modules/app.module.ts","hunkNewEnd":21,"hunkNewStart":15,"enclosingSymbol":null}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/api/src/modules/ci-failures/ci-failures.controller.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"@nestjs/common","symbols":["BadRequestException","Controller","Get","Headers","Inject","NotFoundException","Param","Query","UnauthorizedException"]},{"line":12,"source":"@firmcode/shared","symbols":["REVIEW_RUN_STATUSES","CiFailureDetailResponse","CiFailureListFilters","CiFailureListResponse"]},{"line":13,"source":"../review-runs/dashboard-auth.store","symbols":["DASHBOARD_AUTH_STORE","roleHasDashboardCapability","DashboardAuthStore","DashboardMembership"]},{"line":19,"source":"./ci-failures.store","symbols":["CI_FAILURES_STORE","CiFailuresStore"]}],"symbols":[{"kind":"class","name":"CiFailuresController","range":{"endLine":85,"startLine":22},"changed":true,"byteRange":{"endByte":2882,"startByte":584}},{"kind":"method","name":"constructor","range":{"endLine":26,"startLine":23},"changed":true,"byteRange":{"endByte":806,"startByte":615}},{"kind":"method","name":"listCiFailures","range":{"endLine":41,"startLine":29},"changed":true,"byteRange":{"endByte":1429,"startByte":819}},{"kind":"method","name":"getCiFailureDetail","range":{"endLine":62,"startLine":44},"changed":true,"byteRange":{"endByte":2156,"startByte":1447}},{"kind":"method","name":"requireMembership","range":{"endLine":84,"startLine":64},"changed":true,"byteRange":{"endByte":2880,"startByte":2160}},{"kind":"function","name":"parseCiFailureListFilters","range":{"endLine":120,"startLine":87},"changed":true,"byteRange":{"endByte":4133,"startByte":2884}},{"kind":"function","name":"parseBooleanFilter","range":{"endLine":136,"startLine":122},"changed":true,"byteRange":{"endByte":4432,"startByte":4135}},{"kind":"function","name":"validateIsoDateFilter","range":{"endLine":142,"startLine":138},"changed":true,"byteRange":{"endByte":4650,"startByte":4434}},{"kind":"function","name":"parseLimit","range":{"endLine":156,"startLine":144},"changed":true,"byteRange":{"endByte":4979,"startByte":4652}},{"kind":"function","name":"readSingleValue","range":{"endLine":164,"startLine":158},"changed":true,"byteRange":{"endByte":5166,"startByte":4981}},{"kind":"function","name":"assertCiFailureId","range":{"endLine":174,"startLine":166},"changed":true,"byteRange":{"endByte":5497,"startByte":5168}},{"kind":"function","name":"assertUuid","range":{"endLine":182,"startLine":178},"changed":true,"byteRange":{"endByte":5759,"startByte":5599}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/src/modules/ci-failures/ci-failures.controller.ts","hunkNewEnd":182,"hunkNewStart":1,"enclosingSymbol":"assertUuid"}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/api/src/modules/ci-failures/ci-failures.module.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"@nestjs/common","symbols":["Module"]},{"line":2,"source":"pg","symbols":["Pool"]},{"line":3,"source":"@firmcode/shared","symbols":["ApiRuntimeConfig"]},{"line":4,"source":"../../config/api-config.provider","symbols":["API_RUNTIME_CONFIG","apiRuntimeConfigProvider"]},{"line":5,"source":"../review-runs/dashboard-auth.store","symbols":["DASHBOARD_AUTH_STORE","EmptyDashboardAuthStore","PostgresDashboardAuthStore"]},{"line":10,"source":"./ci-failures.controller","symbols":["CiFailuresController"]},{"line":11,"source":"./ci-failures.store","symbols":["CI_FAILURES_STORE","EmptyCiFailuresStore","PostgresCiFailuresStore"]}],"symbols":[{"kind":"class","name":"CiFailuresModule","range":{"endLine":51,"startLine":51},"changed":true,"byteRange":{"endByte":1579,"startByte":1554}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/src/modules/ci-failures/ci-failures.module.ts","hunkNewEnd":51,"hunkNewStart":1,"enclosingSymbol":"CiFailuresModule"}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/api/src/modules/ci-failures/ci-failures.store.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"@firmcode/shared","symbols":["CiFailureDetailResponse","CiFailureFailedJob","CiFailureListFilters","CiFailureListItem","CiFailureListResponse","CiFailureRelatedReviewRun","CiFailureSuggestedFix","ReviewRunArtifact","ReviewRunArtifactType","ReviewRunLogExcerpt","ReviewRunStatus"]},{"line":14,"source":"../../infrastructure/database/migrations","symbols":["DatabaseExecutor"]}],"symbols":[{"kind":"method","name":"listCiFailures","range":{"endLine":19,"startLine":19},"changed":true,"byteRange":{"endByte":557,"startByte":484}},{"kind":"method","name":"getCiFailureDetail","range":{"endLine":20,"startLine":20},"changed":true,"byteRange":{"endByte":650,"startByte":561}},{"kind":"class","name":"EmptyCiFailuresStore","range":{"endLine":85,"startLine":70},"changed":true,"byteRange":{"endByte":2549,"startByte":2097}},{"kind":"method","name":"listCiFailures","range":{"endLine":80,"startLine":71},"changed":true,"byteRange":{"endByte":2424,"startByte":2155}},{"kind":"method","name":"getCiFailureDetail","range":{"endLine":84,"startLine":82},"changed":true,"byteRange":{"endByte":2547,"startByte":2428}},{"kind":"class","name":"PostgresCiFailuresStore","range":{"endLine":151,"startLine":87},"changed":true,"byteRange":{"endByte":4695,"startByte":2558}},{"kind":"method","name":"constructor","range":{"endLine":88,"startLine":88},"changed":true,"byteRange":{"endByte":2678,"startByte":2619}},{"kind":"method","name":"listCiFailures","range":{"endLine":106,"startLine":90},"changed":true,"byteRange":{"endByte":3260,"startByte":2682}},{"kind":"method","name":"getCiFailureDetail","range":{"endLine":117,"startLine":108},"changed":true,"byteRange":{"endByte":3677,"startByte":3264}},{"kind":"method","name":"loadCandidateRows","range":{"endLine":150,"startLine":119},"changed":true,"byteRange":{"endByte":4693,"startByte":3681}},{"kind":"function","name":"buildCiFailureWhereClause","range":{"endLine":191,"startLine":155},"changed":true,"byteRange":{"endByte":5841,"startByte":4735}},{"kind":"function","name":"buildCiFailureRecords","range":{"endLine":221,"startLine":193},"changed":true,"byteRange":{"endByte":6879,"startByte":5843}},{"kind":"function","name":"toCiFailureRecord","range":{"endLine":245,"startLine":223},"changed":true,"byteRange":{"endByte":7445,"startByte":6881}},{"kind":"function","name":"toCiFailureListItem","range":{"endLine":263,"startLine":247},"changed":true,"byteRange":{"endByte":8374,"startByte":7447}},{"kind":"function","name":"toCiFailureDetail","range":{"endLine":291,"startLine":265},"changed":true,"byteRange":{"endByte":9553,"startByte":8376}},{"kind":"function","name":"sortRelatedArtifacts","range":{"endLine":304,"startLine":293},"changed":true,"byteRange":{"endByte":10065,"startByte":9555}},{"kind":"function","name":"toCiFailureId","range":{"endLine":309,"startLine":306},"changed":true,"byteRange":{"endByte":10278,"startByte":10067}},{"kind":"function","name":"toFailedJob","range":{"endLine":325,"startLine":311},"changed":true,"byteRange":{"endByte":11022,"startByte":10280}},{"kind":"function","name":"findCheckRun","range":{"endLine":341,"startLine":327},"changed":true,"byteRange":{"endByte":11567,"startByte":11024}},{"kind":"function","name":"toArtifact","range":{"endLine":354,"startLine":343},"changed":true,"byteRange":{"endByte":12139,"startByte":11569}},{"kind":"function","name":"sanitizeArtifactMetadata","range":{"endLine":370,"startLine":356},"changed":true,"byteRange":{"endByte":12667,"startByte":12141}},{"kind":"function","name":"deriveRedactedLogExcerpts","range":{"endLine":405,"startLine":372},"changed":true,"byteRange":{"endByte":13798,"startByte":12669}},{"kind":"function","name":"findCiLogArtifactId","range":{"endLine":427,"startLine":407},"changed":true,"byteRange":{"endByte":14403,"startByte":13800}},{"kind":"function","name":"matchesPostQueryFilters","range":{"endLine":431,"startLine":429},"changed":true,"byteRange":{"endByte":14585,"startByte":14405}},{"kind":"function","name":"unwrapArtifact","range":{"endLine":443,"startLine":433},"changed":true,"byteRange":{"endByte":14792,"startByte":14587}},{"kind":"function","name":"readGroups","range":{"endLine":447,"startLine":445},"changed":true,"byteRange":{"endByte":14951,"startByte":14794}},{"kind":"function","name":"readString","range":{"endLine":451,"startLine":449},"changed":true,"byteRange":{"endByte":15078,"startByte":14953}},{"kind":"function","name":"readNumber","range":{"endLine":455,"startLine":453},"changed":true,"byteRange":{"endByte":15211,"startByte":15080}},{"kind":"function","name":"readStringArray","range":{"endLine":459,"startLine":457},"changed":true,"byteRange":{"endByte":15389,"startByte":15213}},{"kind":"function","name":"uniqueStrings","range":{"endLine":463,"startLine":461},"changed":true,"byteRange":{"endByte":15476,"startByte":15391}},{"kind":"function","name":"isRecord","range":{"endLine":467,"startLine":465},"changed":true,"byteRange":{"endByte":15628,"startByte":15478}},{"kind":"function","name":"toRequiredIsoString","range":{"endLine":475,"startLine":469},"changed":true,"byteRange":{"endByte":15856,"startByte":15630}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/src/modules/ci-failures/ci-failures.store.ts","hunkNewEnd":475,"hunkNewStart":1,"enclosingSymbol":"toRequiredIsoString"}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/api/test/ci-failures-dashboard-api.spec.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"@nestjs/common","symbols":["BadRequestException","NotFoundException","UnauthorizedException"]},{"line":2,"source":"pg-mem","symbols":["newDb"]},{"line":3,"source":"../src/infrastructure/database/migrations","symbols":["runDatabaseMigrations"]},{"line":4,"source":"../src/modules/ci-failures/ci-failures.controller","symbols":["CiFailuresController"]},{"line":5,"source":"../src/modules/ci-failures/ci-failures.store","symbols":["PostgresCiFailuresStore"]},{"line":6,"source":"../src/modules/review-runs/dashboard-auth.store","symbols":["PostgresDashboardAuthStore"]},{"line":7,"source":"../src/modules/review-runs/review-runs.controller","symbols":["ReviewRunsController"]},{"line":8,"source":"../src/modules/review-runs/review-runs.store","symbols":["PostgresReviewRunsStore"]}],"symbols":[{"kind":"method","name":"query","range":{"endLine":11,"startLine":11},"changed":true,"byteRange":{"endByte":775,"startByte":687}},{"kind":"method","name":"end","range":{"endLine":12,"startLine":12},"changed":true,"byteRange":{"endByte":799,"startByte":779}},{"kind":"function","name":"createTestPool","range":{"endLine":33,"startLine":28},"changed":true,"byteRange":{"endByte":1790,"startByte":1590}},{"kind":"function","name":"seedCiFailureDashboardData","range":{"endLine":469,"startLine":254},"changed":true,"byteRange":{"endByte":19432,"startByte":10028}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/test/ci-failures-dashboard-api.spec.ts","hunkNewEnd":469,"hunkNewStart":1,"enclosingSymbol":"seedCiFailureDashboardData"}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/api/test/infrastructure/database/database-migrations.spec.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"pg-mem","symbols":["newDb"]},{"line":2,"source":"../../../src/infrastructure/database/migrations","symbols":["runDatabaseMigrations"]},{"line":3,"source":"../../../src/modules/webhooks/github/postgres-github-webhook.store","symbols":["PostgresGitHubWebhookStore"]}],"symbols":[{"kind":"method","name":"query","range":{"endLine":6,"startLine":6},"changed":false,"byteRange":{"endByte":348,"startByte":260}},{"kind":"method","name":"end","range":{"endLine":7,"startLine":7},"changed":false,"byteRange":{"endByte":372,"startByte":352}},{"kind":"function","name":"createTestPool","range":{"endLine":35,"startLine":30},"changed":false,"byteRange":{"endByte":994,"startByte":794}},{"kind":"function","name":"createDeterministicUuidFactory","range":{"endLine":44,"startLine":37},"changed":false,"byteRange":{"endByte":1187,"startByte":996}},{"kind":"function","name":"insertMinimalReviewRun","range":{"endLine":136,"startLine":46},"changed":false,"byteRange":{"endByte":2632,"startByte":1189}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/api/test/infrastructure/database/database-migrations.spec.ts","hunkNewEnd":172,"hunkNewStart":165,"enclosingSymbol":null},{"path":"apps/api/test/infrastructure/database/database-migrations.spec.ts","hunkNewEnd":183,"hunkNewStart":176,"enclosingSymbol":null}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/web/app/api/ci-failures/[id]/route.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"../../../../lib/dashboard-api-proxy","symbols":["forwardDashboardApiMutation"]}],"symbols":[{"kind":"function","name":"GET","range":{"endLine":8,"startLine":3},"changed":true,"byteRange":{"endByte":322,"startByte":91}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/web/app/api/ci-failures/[id]/route.ts","hunkNewEnd":8,"hunkNewStart":1,"enclosingSymbol":"GET"}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/web/app/api/ci-failures/route.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"../../../lib/dashboard-api-proxy","symbols":["forwardDashboardApiMutation"]}],"symbols":[{"kind":"function","name":"GET","range":{"endLine":11,"startLine":3},"changed":true,"byteRange":{"endByte":305,"startByte":88}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/web/app/api/ci-failures/route.ts","hunkNewEnd":11,"hunkNewStart":1,"enclosingSymbol":"GET"}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/web/packages/shared/test/github/firmcodeai-activity.spec.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"vitest","symbols":["describe","expect","it"]},{"line":2,"source":"../../src","symbols":["FIRMCODEAI_SUMMARY_COMMENT_MARKER","isFirmcodeAiActivityComment","renderFirmcodeAiSummaryActivity"]}],"symbols":[],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/web/packages/shared/test/github/firmcodeai-activity.spec.ts","hunkNewEnd":15,"hunkNewStart":9,"enclosingSymbol":null},{"path":"apps/web/packages/shared/test/github/firmcodeai-activity.spec.ts","hunkNewEnd":52,"hunkNewStart":46,"enclosingSymbol":null}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"apps/web/tests/github-sync-routes.spec.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"../app/auth/github/route","symbols":["GET","startGitHubOAuth"]},{"line":2,"source":"../app/api/ci-failures/route","symbols":["GET","listCiFailures"]},{"line":3,"source":"../app/api/ci-failures/[id]/route","symbols":["GET","readCiFailure"]},{"line":4,"source":"../app/api/github/installations/sync/route","symbols":["POST","syncInstallations"]},{"line":5,"source":"../app/api/rules/route","symbols":["GET","readRules","PATCH","saveRules"]},{"line":6,"source":"../app/api/repositories/[id]/sync/route","symbols":["POST","syncRepository"]}],"symbols":[{"kind":"function","name":"jsonResponse","range":{"endLine":167,"startLine":160},"changed":false,"byteRange":{"endByte":7907,"startByte":7717}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"apps/web/tests/github-sync-routes.spec.ts","hunkNewEnd":6,"hunkNewStart":1,"enclosingSymbol":null},{"path":"apps/web/tests/github-sync-routes.spec.ts","hunkNewEnd":160,"hunkNewStart":131,"enclosingSymbol":"jsonResponse"}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0},{"path":"packages/shared/src/contracts/review.ts","errors":[],"parser":"tree-sitter-typescript","imports":[{"line":1,"source":"../enums/review-run-status","symbols":["ReviewRunStatus"]},{"line":2,"source":"../risk/changed-file-risk","symbols":["ChangedFileRiskClassification"]},{"line":3,"source":"../review/large-pr-handling","symbols":["LargePullRequestReviewArtifact","ReviewSkippedFileReport"]}],"symbols":[{"kind":"function","name":"canManageSensitiveWorkspaceSettings","range":{"endLine":153,"startLine":151},"changed":false,"byteRange":{"endByte":3790,"startByte":3656}},{"kind":"function","name":"canRetryReviewRuns","range":{"endLine":157,"startLine":155},"changed":false,"byteRange":{"endByte":3940,"startByte":3799}},{"kind":"function","name":"canManageRepositoryConfiguration","range":{"endLine":161,"startLine":159},"changed":false,"byteRange":{"endByte":4080,"startByte":3949}},{"kind":"function","name":"canAccessRawReviewArtifacts","range":{"endLine":165,"startLine":163},"changed":false,"byteRange":{"endByte":4239,"startByte":4089}},{"kind":"function","name":"canManageBilling","range":{"endLine":169,"startLine":167},"changed":false,"byteRange":{"endByte":4427,"startByte":4248}}],"hasError":false,"language":"typescript","hunkScopes":[{"path":"packages/shared/src/contracts/review.ts","hunkNewEnd":590,"hunkNewStart":577,"enclosingSymbol":null},{"path":"packages/shared/src/contracts/review.ts","hunkNewEnd":728,"hunkNewStart":655,"enclosingSymbol":null}],"parseStatus":"parsed","errorNodeCount":0,"missingNodeCount":0}],"reviewRunId":"18efb318-a8ce-485c-8dec-05ca18898931","parserVersion":"0.25.2","schemaVersion":"tree-sitter-artifact/v1"}},"rawAccessAllowed":true,"createdAt":"2026-05-24T18:48:00.977Z"}