AI Agent 驱动的开源视频生成工作台 — 小说→角色/场景/道具设计→剧本→分镜图→视频,跨镜头角色与场景一致 | Open-source AI video workspace powered by AI Agents, Nano Banana 2 & Veo 3.1 / Grok / Seedance / OpenAI
This report presents the forensic synthetic code analysis of ArcReel/ArcReel, a Python project with 3,815 GitHub stars. SynthScan v2.0 examined 479,236 lines of code across 1748 source files, recording 8264 pattern matches distributed across 22 syntactic categories. The overall adjusted score of 20.4 places this repository in the Moderate AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 8264 distinct pattern matches across 22 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/.claude/skills/compose-video/scripts/compose_video.py | 397 | def _build_xfade_filter_complex( | CODE |
| LOW | …/.claude/skills/compose-video/scripts/compose_video.py | 498 | def concatenate_with_transitions( | CODE |
| LOW | frontend/src/api.ts | 238 | function normalizeDiagnosticsBucket(value: unknown): { code: string; message: string; location?: string }[] { | CODE |
| LOW | frontend/src/api.ts | 257 | function normalizeImportFailureDiagnostics(value: unknown): ImportFailureDiagnostics { | CODE |
| LOW | frontend/src/api.ts | 266 | function normalizeExportDiagnostics(value: unknown): ExportDiagnostics { | CODE |
| LOW | frontend/src/stores/app-store.ts | 36 | function readPersistedAssistantPanelWidth(): number { | CODE |
| LOW | frontend/src/stores/app-store.ts | 136 | function buildWorkspaceNotification( | CODE |
| LOW | frontend/src/stores/tasks-store.ts | 187 | function pruneSupersededOptimistic(tasks: TaskItem[], marks: ReadonlySet<string>): Set<string> { | CODE |
| LOW | frontend/src/stores/tasks-store.ts | 483 | export function selectLatestTaskByResource( | CODE |
| LOW | frontend/src/stores/tasks-store.ts | 579 | export function selectHasActiveTaskForScriptFile( | CODE |
| LOW | frontend/src/stores/tasks-store.ts | 631 | export function useHasActiveTaskForScriptFile( | CODE |
| LOW | frontend/src/utils/provider-models.ts | 110 | export function lookupDurationConstraints( | CODE |
| LOW | frontend/src/utils/provider-models.ts | 176 | export function lookupProjectVideoResolution( | CODE |
| LOW | frontend/src/utils/entry-projection.ts | 546 | export function collectCommittedMessageIds(entries: TimelineEntry[]): Set<string> { | CODE |
| LOW | frontend/src/utils/project-changes.ts | 113 | function formatSingleNotificationText(change: ProjectChange): string { | CODE |
| LOW | frontend/src/utils/project-changes.ts | 161 | export function formatGroupedNotificationText( | CODE |
| LOW | frontend/src/utils/project-changes.ts | 184 | export function formatGroupedDeferredText( | CODE |
| LOW | …ntend/src/components/copilot/PendingQuestionWizard.tsx | 116 | function toggleMultiQuestionAnswer(questionKey: string, value: string, checked: boolean): void { | CODE |
| LOW | …src/components/layout/WorkspaceNotificationsDrawer.tsx | 49 | export function WorkspaceNotificationsDrawer({ | CODE |
| LOW | …c/components/layout/ScriptGenerationNoticeListener.tsx | 8 | export function ScriptGenerationNoticeListener() { | CODE |
| LOW | …/src/components/canvas/timeline/VersionTimeMachine.tsx | 37 | function getImagePreviewHeightClass( | CODE |
| LOW | frontend/src/components/canvas/timeline/ShotList.tsx | 54 | function getStoryboardVersionCount(seg: Segment): number { | CODE |
| LOW | …src/components/canvas/timeline/TimelineCanvas.test.tsx | 143 | function renderWithAllWriteHandlers() { | CODE |
| LOW | …ts/canvas/reference/ReferenceDurationConfirmDialog.tsx | 59 | export function ReferenceDurationConfirmDialog({ open, items, onConfirm, onCancel }: Props) { | CODE |
| LOW | frontend/src/components/pages/AssetLibraryPage.tsx | 26 | export function rememberAssetLibraryReturnTo(pathname: string) { | CODE |
| LOW | frontend/src/hooks/useTaskFailureNotifications.ts | 23 | export function useTaskFailureNotifications(projectName?: string | null): void { | CODE |
| LOW | frontend/src/hooks/useScriptGenerationNotice.ts | 29 | export function useScriptGenerationNotice(): void { | CODE |
| LOW | frontend/src/hooks/useAssistantSession.ts | 572 | function getPendingQuestionFromEvent(payload: Record<string, unknown>): PendingQuestion | null { | CODE |
| LOW | frontend/src/actions/generation.ts | 173 | export async function enqueueCharacterVoiceSample( | CODE |
| LOW | frontend/src/actions/generation.ts | 287 | export async function enqueueReferenceVideoUnit( | CODE |
| LOW⚡ | tests/test_model_discovery.py | 365 | async def test_unknown_discovery_format(self): | CODE |
| LOW⚡ | tests/test_model_discovery.py | 455 | async def test_unknown_format_raises(self): | CODE |
| LOW⚡ | tests/test_model_discovery.py | 468 | def test_discover_openai_returns_endpoints(monkeypatch): | CODE |
| LOW | tests/test_model_discovery.py | 113 | async def test_tts_model_derives_audio_media_type(self, mock_openai_cls): | CODE |
| LOW | tests/test_model_discovery.py | 163 | async def test_display_name_equals_model_id(self, mock_openai_cls): | CODE |
| LOW | tests/test_model_discovery.py | 277 | async def test_default_marking_google(self, mock_genai): | CODE |
| LOW | tests/test_model_discovery.py | 301 | async def test_strips_models_prefix(self, mock_genai): | CODE |
| LOW | tests/test_model_discovery.py | 418 | async def test_default_base_url_when_none(self, mock_get_client): | CODE |
| LOW | tests/test_model_discovery.py | 437 | async def test_skips_entries_without_id(self, mock_get_client): | CODE |
| LOW | tests/test_tasks_router_more.py | 64 | def test_list_tasks_renders_known_code_per_locale(self, monkeypatch): | CODE |
| LOW | tests/test_tasks_router_more.py | 81 | def test_list_tasks_defaults_to_zh_without_header(self, monkeypatch): | CODE |
| LOW | tests/test_tasks_router_more.py | 89 | def test_list_tasks_passthrough_raw_and_legacy(self, monkeypatch): | CODE |
| LOW | tests/test_tasks_router_more.py | 102 | def test_get_task_renders_error_message(self, monkeypatch): | CODE |
| LOW | tests/test_tasks_router_more.py | 116 | def test_project_tasks_renders_error_message(self, monkeypatch): | CODE |
| LOW | tests/test_project_events_router.py | 71 | async def test_project_events_service_raises_not_found_when_project_missing(): | CODE |
| LOW | tests/test_project_events_router.py | 87 | async def test_project_events_service_raises_bad_request_for_invalid_project_name(): | CODE |
| LOW | tests/test_project_events_router.py | 103 | async def test_stream_project_events_emits_snapshot_and_changes(): | CODE |
| LOW | tests/test_project_events_router.py | 126 | async def test_stream_project_events_breaks_on_disconnect_in_idle(): | CODE |
| LOW | tests/test_project_events_router.py | 144 | async def test_stream_project_events_breaks_on_disconnect_during_continuous_events(): | CODE |
| LOW | tests/test_project_events_router.py | 187 | async def test_stream_project_events_ends_naturally_after_project_deleted_event(): | CODE |
| LOW⚡ | tests/test_task_failure.py | 20 | def test_encode_with_params_is_sorted_json(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 24 | def test_encode_unknown_code_raises(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 28 | def test_every_known_code_round_trips_through_render(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 55 | def test_detail_param_is_interpolated_untranslated(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 65 | def test_renders_nested_structured_reason(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 73 | def test_renders_nested_raw_text_reason(self): | CODE |
| LOW | tests/test_task_failure.py | 90 | def test_renders_double_nested_cascade(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 102 | def test_returns_unchanged_when_within_limit(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 105 | def test_truncates_raw_text_when_over_limit(self): | CODE |
| LOW⚡ | tests/test_task_failure.py | 108 | def test_shrinks_longest_string_param_of_structured_reason(self): | CODE |
| 6302 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …tend/src/components/shared/ModelConfigSection.test.tsx | 476 | // ── 联动约束:分辨率 / 参考图路径收窄可选时长 ────────────────── | COMMENT |
| MEDIUM | frontend/src/components/pages/ProjectSettingsPage.tsx | 46 | // ─── Section card primitive ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/pages/ProjectSettingsPage.tsx | 88 | // ─── Component ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/pages/ProjectSettingsPage.tsx | 143 | // ── Style picker state (independent save flow) ───────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/pages/CreateProjectModal.tsx | 28 | // ─── Step indicator ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/components/pages/CreateProjectModal.tsx | 138 | // ─── Main component ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_model_discovery.py | 359 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_discovery.py | 361 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_discovery.py | 463 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_discovery.py | 465 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 10 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 12 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 41 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 43 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 216 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 218 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 376 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_discovery.py | 378 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_candidates_api.py | 45 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_candidates_api.py | 47 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_candidates_api.py | 186 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_candidates_api.py | 188 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_candidates_api.py | 261 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_model_candidates_api.py | 263 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_candidates_api.py | 124 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_model_candidates_api.py | 126 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 32 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 34 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 158 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/conftest.py | 160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 185 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/conftest.py | 187 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_projects_router.py | 1379 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_projects_router.py | 1381 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 223 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 225 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 654 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 656 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 678 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 680 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 739 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 741 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 821 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_script_review.py | 824 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_script_review.py | 165 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_script_review.py | 167 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_script_review.py | 252 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_script_review.py | 254 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_script_review.py | 777 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_script_review.py | 779 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 88 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 90 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 141 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 260 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 262 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 324 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 326 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 329 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_episode_reset.py | 331 | # --------------------------------------------------------------------------- | COMMENT |
| 394 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_model_discovery.py | 3 | CODE | |
| LOW | tests/test_frontend_mcp_tool_i18n.py | 11 | CODE | |
| LOW | tests/test_model_candidates_api.py | 11 | CODE | |
| LOW | tests/test_retry.py | 3 | CODE | |
| LOW | tests/test_custom_provider_capabilities.py | 3 | CODE | |
| LOW | tests/test_v2_video_generations_backend.py | 6 | CODE | |
| LOW | tests/test_task_failure_capability.py | 8 | CODE | |
| LOW | tests/test_db_models.py | 9 | CODE | |
| LOW | tests/test_kling_video_backend.py | 7 | CODE | |
| LOW | tests/test_dashscope_shared.py | 3 | CODE | |
| LOW | tests/conftest.py | 3 | CODE | |
| LOW | tests/test_locked_episode_script_toctou.py | 11 | CODE | |
| LOW | tests/test_alembic_resource_type_dedupe_downgrade.py | 7 | CODE | |
| LOW | tests/test_discover_anthropic_fallback.py | 3 | CODE | |
| LOW | tests/test_asset_repo.py | 3 | CODE | |
| LOW | tests/test_session_actor.py | 6 | CODE | |
| LOW | tests/test_custom_provider_endpoints.py | 3 | CODE | |
| LOW | tests/test_resource_paths.py | 7 | CODE | |
| LOW | tests/test_custom_provider_repo.py | 3 | CODE | |
| LOW | tests/test_script_review.py | 7 | CODE | |
| LOW | tests/test_app_data_dir.py | 3 | CODE | |
| LOW | tests/test_episode_reset.py | 6 | CODE | |
| LOW | tests/test_script_skeleton.py | 10 | CODE | |
| LOW | tests/test_minimax_image_backend.py | 3 | CODE | |
| LOW | tests/test_alembic_supported_durations_backfill.py | 3 | CODE | |
| LOW | tests/test_kling_shared.py | 6 | CODE | |
| LOW | tests/test_thumbnail_fallback.py | 3 | CODE | |
| LOW | tests/test_vidu_image_backend.py | 3 | CODE | |
| LOW | tests/test_credential_api.py | 3 | CODE | |
| LOW | tests/test_diagnostics_service.py | 3 | CODE | |
| LOW | tests/test_text_metrics.py | 3 | CODE | |
| LOW | tests/test_project_manager_ad_mode.py | 7 | CODE | |
| LOW | tests/test_episode_paths.py | 7 | CODE | |
| LOW | tests/test_project_manager_source_kind.py | 6 | CODE | |
| LOW | tests/test_request_logging_middleware.py | 3 | CODE | |
| LOW | tests/test_script_review_router.py | 3 | CODE | |
| LOW | tests/test_minimax_shared.py | 3 | CODE | |
| LOW | tests/test_custom_provider_factory.py | 3 | CODE | |
| LOW | tests/test_system_config_router.py | 8 | CODE | |
| LOW | tests/test_script_structure_validator.py | 7 | CODE | |
| LOW | tests/test_frontend_task_type_i18n.py | 22 | CODE | |
| LOW | tests/test_anthropic_probe.py | 3 | CODE | |
| LOW | tests/test_episode_planner.py | 7 | CODE | |
| LOW | tests/test_vidu_shared.py | 3 | CODE | |
| LOW | tests/test_assets_router.py | 3 | CODE | |
| LOW | tests/test_image_utils.py | 4 | CODE | |
| LOW | tests/test_alembic_split_default_image_backend.py | 3 | CODE | |
| LOW | tests/test_backend_assembly_specs.py | 7 | CODE | |
| LOW | tests/test_pricing_strategies.py | 3 | CODE | |
| LOW | tests/test_onboarding_router.py | 3 | CODE | |
| LOW | tests/test_frontend_mount.py | 3 | CODE | |
| LOW | tests/test_agent_config_router.py | 3 | CODE | |
| LOW | tests/test_skill_script_path_guards.py | 9 | CODE | |
| LOW | tests/test_drama_pipeline_split.py | 10 | CODE | |
| LOW | tests/test_openai_video_backend.py | 3 | CODE | |
| LOW | tests/test_imports.py | 9 | CODE | |
| LOW | tests/test_providers_api.py | 8 | CODE | |
| LOW | tests/test_alembic_collapse_image_backend_buckets.py | 7 | CODE | |
| LOW | tests/test_custom_provider_loader.py | 7 | CODE | |
| LOW | tests/test_profile_manifest.py | 8 | CODE | |
| 501 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/.claude/skills/compose-video/scripts/compose_video.py | 724 | except Exception as e: | CODE |
| LOW | tests/test_session_manager_user_input.py | 41 | except Exception: | CODE |
| LOW | tests/test_session_manager_user_input.py | 65 | except Exception: | CODE |
| MEDIUM | tests/test_session_manager_user_input.py | 38 | def _done_cb(_t): | CODE |
| LOW | tests/test_end_frames_router.py | 320 | except Exception as exc: # noqa: BLE001 - 捕获后由主线程断言失败 | CODE |
| LOW | tests/test_end_frames_router.py | 327 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | tests/test_generation_worker_module.py | 1258 | except Exception: | CODE |
| LOW | tests/test_media_generator_module.py | 116 | except Exception as exc: | CODE |
| LOW | tests/test_media_generator_resume.py | 123 | except Exception: | CODE |
| LOW | tests/test_tts_skeleton.py | 129 | except Exception as exc: | CODE |
| LOW | tests/test_project_manager_concurrent_save.py | 105 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/test_project_manager_concurrent_save.py | 112 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | tests/test_project_manager_migration.py | 148 | except Exception as e: | CODE |
| MEDIUM | tests/test_project_manager_migration.py | 145 | def worker(): | CODE |
| LOW | server/auth.py | 385 | except Exception: | CODE |
| MEDIUM | server/auth.py | 380 | def _touch(): | CODE |
| LOW | server/app.py | 297 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW | server/app.py | 306 | except Exception: # noqa: BLE001 | CODE |
| LOW⚡ | server/app.py | 381 | except Exception: | CODE |
| LOW⚡ | server/app.py | 391 | except Exception as exc: | CODE |
| LOW⚡ | server/app.py | 401 | except Exception as exc: | CODE |
| LOW | server/app.py | 533 | except Exception: | CODE |
| LOW | server/routers/files.py | 413 | except Exception: | CODE |
| LOW | server/routers/files.py | 454 | except Exception: | CODE |
| LOW | server/routers/files.py | 613 | except Exception: | CODE |
| LOW | server/routers/files.py | 646 | except Exception: | CODE |
| LOW | server/routers/files.py | 682 | except Exception: | CODE |
| LOW | server/routers/files.py | 720 | except Exception: | CODE |
| LOW | server/routers/files.py | 898 | except Exception: | CODE |
| LOW | server/routers/files.py | 1022 | except Exception: | CODE |
| LOW | server/routers/system.py | 52 | except Exception: | CODE |
| LOW | server/routers/generate.py | 582 | except Exception: | CODE |
| LOW | server/routers/reference_videos.py | 641 | except Exception as exc: | CODE |
| LOW | server/routers/assistant.py | 132 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 153 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 166 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 182 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 220 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 262 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 281 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 315 | except Exception: | CODE |
| LOW | server/routers/assistant.py | 337 | except Exception: | CODE |
| LOW | server/routers/agent_chat.py | 221 | except Exception: | CODE |
| LOW | server/routers/agent_chat.py | 257 | except Exception as exc: | CODE |
| LOW | server/routers/cost_estimation.py | 55 | except Exception: | CODE |
| LOW | server/routers/end_frames.py | 61 | except Exception as e: | CODE |
| LOW | server/routers/providers.py | 633 | except Exception: | CODE |
| LOW | server/routers/providers.py | 641 | except Exception: | CODE |
| LOW | server/routers/providers.py | 994 | except Exception as exc: | CODE |
| LOW | server/routers/assets.py | 148 | except Exception: | CODE |
| LOW | server/routers/assets.py | 232 | except Exception: | CODE |
| LOW | server/routers/assets.py | 266 | except Exception: | CODE |
| LOW | server/routers/assets.py | 359 | except Exception: | CODE |
| LOW | server/routers/assets.py | 417 | except Exception: | CODE |
| LOW | server/routers/system_config.py | 205 | except Exception: | CODE |
| LOW | server/routers/system_config.py | 392 | except Exception as exc: | CODE |
| LOW | server/routers/system_config.py | 406 | except Exception as exc: | CODE |
| LOW | server/routers/_asset_router_factory.py | 165 | except Exception: | CODE |
| LOW | server/routers/_asset_router_factory.py | 233 | except Exception: | CODE |
| LOW | server/routers/_asset_router_factory.py | 261 | except Exception: | CODE |
| 320 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_script_review.py | 100 | def _set_mode(p: dict) -> None: | CODE |
| LOW | tests/test_system_config_router.py | 78 | async def _set_setting(key: str, value: str) -> None: | CODE |
| LOW | tests/test_resume_executor.py | 34 | def update_scene_asset(self, **kwargs: Any) -> None: | CODE |
| LOW | server/auth.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/auth.py | 309 | def _set_api_key_cache(key_hash: str, payload: dict | None, expires_at_ts: float | None = None) -> None: | CODE |
| LOW | server/app.py | 253 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/error_handlers.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/auth.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/project_events.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/files.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/script_review.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/generate.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/reference_videos.py | 56 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/assistant.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/agent_config.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/agent_chat.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/cost_estimation.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/end_frames.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | server/routers/providers.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/assets.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/system_config.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/_asset_router_factory.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/versions.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/projects.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/shot_uploads.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/routers/custom_providers.py | 82 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/entry_pipeline.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/service.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/event_log.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/session_manager.py | 58 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/sdk_transcript_adapter.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/agent_access_policy.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/options_assembler.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/sdk_tools/enqueue_assets.py | 210 | __all__ = [ | CODE |
| LOW | …ver/agent_runtime/sdk_tools/enqueue_narration_audio.py | 154 | __all__ = ["generate_narration_audio_tool"] | CODE |
| LOW | server/agent_runtime/sdk_tools/enqueue_grid.py | 214 | __all__ = ["generate_grid_tool"] | CODE |
| LOW | server/agent_runtime/sdk_tools/patch_episode_meta.py | 66 | __all__ = ["patch_episode_meta_tool"] | CODE |
| LOW | server/agent_runtime/sdk_tools/enqueue_videos.py | 1088 | __all__ = [ | CODE |
| LOW | server/agent_runtime/sdk_tools/__init__.py | 56 | __all__ = ["build_arcreel_mcp_server", "ToolContext", "ARCREEL_MCP_TOOL_IDS"] | CODE |
| LOW | server/agent_runtime/sdk_tools/enqueue_storyboards.py | 234 | __all__ = ["generate_storyboards_tool"] | CODE |
| LOW | server/agent_runtime/sdk_tools/patch_project.py | 326 | __all__ = ["patch_project_tool"] | CODE |
| LOW | server/agent_runtime/sdk_tools/text_generation.py | 82 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/agent_runtime/sdk_tools/text_generation.py | 1317 | __all__ = [ | CODE |
| LOW | server/agent_runtime/sdk_tools/enqueue_image_edits.py | 218 | __all__ = ["edit_images_tool"] | CODE |
| LOW | server/agent_runtime/sdk_tools/episode_planning.py | 236 | __all__ = ["plan_episodes_tool", "reset_episode_planning_tool"] | CODE |
| LOW | server/agent_runtime/sdk_tools/patch_script.py | 220 | __all__ = [ | CODE |
| LOW | server/services/end_frame.py | 60 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/project_events.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/script_review.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/generation_tasks.py | 62 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/generation_tasks.py | 1159 | def _set_character_sheet(p: dict) -> None: | CODE |
| LOW | server/services/resume_executor.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/jianying_draft_service.py | 59 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | server/services/reference_video_tasks.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/cost_estimation.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/project_archive.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/video_caps.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/generation_context.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | server/services/project_cover.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | lib/openai_shared.py | 22 | logger = logging.getLogger(__name__) | CODE |
| 100 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/test_video_backend_gemini.py | 116 | backend._client.aio.models.generate_videos.assert_awaited_once() | CODE |
| CRITICAL | tests/test_video_backend_gemini.py | 254 | backend._client.aio.models.generate_videos.assert_awaited_once() | CODE |
| CRITICAL | tests/test_video_backend_gemini.py | 295 | backend._client.aio.models.generate_videos.assert_awaited_once() | CODE |
| CRITICAL | tests/test_gemini_video_resolution.py | 104 | backend._client.aio.models.generate_videos.assert_not_awaited() | CODE |
| CRITICAL | tests/test_gemini_video_resolution.py | 124 | backend._client.aio.models.generate_videos.assert_not_awaited() | CODE |
| CRITICAL | tests/test_gemini_video_resolution.py | 143 | backend._client.aio.models.generate_videos.assert_awaited_once() | CODE |
| CRITICAL | tests/test_gemini_video_resolution.py | 172 | backend._client.aio.models.generate_videos.assert_not_awaited() | CODE |
| CRITICAL | tests/test_gemini_video_resolution.py | 232 | backend._client.aio.models.generate_videos.assert_awaited_once() | CODE |
| CRITICAL | tests/test_text_backends/test_ark.py | 333 | backend_with_structured._test_client.chat.completions.create.assert_called_once() | CODE |
| CRITICAL | tests/test_text_backends/test_ark.py | 335 | backend_with_structured._openai_client.chat.completions.create.assert_called_once() | CODE |
| CRITICAL | tests/test_text_backends/test_ark.py | 378 | backend._test_client.chat.completions.create.assert_called_once() | CODE |
| CRITICAL | tests/test_text_backends/test_ark.py | 502 | backend._openai_client.chat.completions.create.assert_not_called() | CODE |
| CRITICAL | tests/test_text_backends/test_ark.py | 582 | backend._test_client.chat.completions.create.assert_called_once() | CODE |
| CRITICAL⚡ | tests/test_image_backends/test_gemini.py | 127 | backend_aistudio._client.aio.models.generate_content.assert_awaited_once() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …_profile/.claude/agents/split-reference-video-units.md | 33 | ### Step 0: 查视频模型能力与用户偏好 | COMMENT |
| LOW | …untime_profile/.claude/agents/create-episode-script.md | 26 | ### Step 1: 确认前置条件 | COMMENT |
| LOW | …untime_profile/.claude/agents/create-episode-script.md | 44 | ### Step 2: 调用工具生成 JSON 剧本 | COMMENT |
| LOW | …untime_profile/.claude/agents/create-episode-script.md | 56 | ### Step 3: 验证生成结果 | COMMENT |
| LOW | …untime_profile/.claude/agents/create-episode-script.md | 66 | ### Step 4: 返回摘要 | COMMENT |
| LOW⚡ | agent_runtime_profile/.claude/agents/generate-assets.md | 20 | ### Step 1: 读取项目状态 | COMMENT |
| LOW⚡ | agent_runtime_profile/.claude/agents/generate-assets.md | 26 | ### Step 2: 执行任务命令 | COMMENT |
| LOW⚡ | agent_runtime_profile/.claude/agents/generate-assets.md | 34 | ### Step 3: 验证结果 | COMMENT |
| LOW⚡ | agent_runtime_profile/.claude/agents/generate-assets.md | 38 | ### Step 4: 返回结构化状态 | COMMENT |
| LOW | …ime_profile/.claude/agents/split-narration-segments.md | 35 | ### Step 0: 查视频模型能力与用户偏好 | COMMENT |
| LOW | …ntime_profile/.claude/agents/normalize-drama-script.md | 35 | ### Step 0: 查视频模型能力与用户偏好 | COMMENT |
| LOW⚡ | agent_runtime_profile/.claude/agents/analyze-assets.md | 25 | ### Step 1: 读取项目信息 | COMMENT |
| LOW⚡ | agent_runtime_profile/.claude/agents/analyze-assets.md | 32 | ### Step 2: 读取源文本 | COMMENT |
| LOW⚡ | agent_runtime_profile/.claude/agents/analyze-assets.md | 39 | ### Step 3: 分析提取角色、场景和道具 | COMMENT |
| LOW | agent_runtime_profile/.claude/agents/analyze-assets.md | 82 | ### Step 4: 调用工具写入 project.json | COMMENT |
| LOW | agent_runtime_profile/.claude/agents/analyze-assets.md | 106 | ### Step 5: 返回结构化摘要 | COMMENT |
| LOW | …ntend/src/components/pages/CreateProjectModal.test.tsx | 117 | // Step 3: Create button appears | COMMENT |
| LOW | docs/claude-agent-sdk-docs/file-checkpointing.md | 63 | # Step 1: Enable checkpointing | COMMENT |
| LOW | docs/claude-agent-sdk-docs/file-checkpointing.md | 79 | # Step 2: Capture checkpoint UUID from the first user message | COMMENT |
| LOW | docs/claude-agent-sdk-docs/file-checkpointing.md | 86 | # Step 3: Later, rewind by resuming the session with an empty prompt | COMMENT |
| LOW | docs/claude-agent-sdk-docs/file-checkpointing.md | 105 | // Step 1: Enable checkpointing | COMMENT |
| LOW | docs/claude-agent-sdk-docs/file-checkpointing.md | 120 | // Step 2: Capture checkpoint UUID from the first user message | COMMENT |
| LOW | docs/claude-agent-sdk-docs/file-checkpointing.md | 130 | // Step 3: Later, rewind by resuming the session with an empty prompt | COMMENT |
| LOW | docs/google-genai-docs/veo.md | 146 | # Step 1: Generate an image with Nano Banana. | COMMENT |
| LOW | docs/google-genai-docs/veo.md | 153 | # Step 2: Generate video with Veo 3.1 using the image. | COMMENT |
| LOW | docs/google-genai-docs/nano-banana.md | 317 | "text": "Here is a step-by-step guide to baking macarons, presented in three separate images.\n\n### Step 1: Pip | CODE |
| LOW | docs/google-genai-docs/nano-banana.md | 328 | "text": "\n\n### Step 2: Baking and Developing Feet\n\nOnce piped, the macarons are baked in the oven. A key sig | CODE |
| LOW | docs/google-genai-docs/nano-banana.md | 339 | "text": "\n\n### Step 3: Assembling the Macaron\n\nThe final step is to pair the cooled macaron shells by size a | CODE |
| LOW | docs/grok-docs/video-generation.md | 368 | // Step 1: Start extension request | COMMENT |
| LOW | docs/grok-docs/video-generation.md | 386 | // Step 2: Poll for results | COMMENT |
| LOW | docs/grok-docs/video-generation.md | 667 | # Step 1: Start generation | COMMENT |
| LOW | docs/grok-docs/video-generation.md | 681 | # Step 2: Poll for results | COMMENT |
| LOW | docs/grok-docs/video-generation.md | 704 | // Step 1: Start generation | COMMENT |
| LOW | docs/grok-docs/video-generation.md | 721 | // Step 2: Poll for results | COMMENT |
| LOW | docs/grok-docs/video-generation.md | 746 | # Step 1: Start generation | COMMENT |
| LOW | docs/grok-docs/video-generation.md | 758 | # Step 2: Poll for results | COMMENT |
| LOW | …ns/2026-04-17-reference-to-video-pr6-agent-workflow.md | 700 | ### Step 1: 读取项目信息和小说原文 | COMMENT |
| LOW | …ns/2026-04-17-reference-to-video-pr6-agent-workflow.md | 706 | ### Step 2: 按 video_unit 粒度拆分 | COMMENT |
| LOW | …ns/2026-04-17-reference-to-video-pr6-agent-workflow.md | 728 | ### Step 3: 保存中间文件 | COMMENT |
| LOW | …ns/2026-04-17-reference-to-video-pr6-agent-workflow.md | 755 | ### Step 4: 返回摘要 | COMMENT |
| LOW⚡ | …erpowers/plans/2026-04-03-agent-skill-orchestration.md | 95 | ### Step 1: 读取项目状态 | COMMENT |
| LOW⚡ | …erpowers/plans/2026-04-03-agent-skill-orchestration.md | 101 | ### Step 2: 执行脚本命令 | COMMENT |
| LOW⚡ | …erpowers/plans/2026-04-03-agent-skill-orchestration.md | 109 | ### Step 3: 验证结果 | COMMENT |
| LOW⚡ | …erpowers/plans/2026-04-03-agent-skill-orchestration.md | 113 | ### Step 4: 返回结构化状态 | COMMENT |
| LOW | …erpowers/specs/2026-02-02-data-sync-refactor-design.md | 427 | ### Step 4: 同步剧集信息 | COMMENT |
| LOW⚡ | …erpowers/specs/2026-02-28-turn-normalization-design.md | 86 | ### Step 1: 新建 `turn_schema.py` | COMMENT |
| LOW⚡ | …erpowers/specs/2026-02-28-turn-normalization-design.md | 90 | ### Step 2: 重构 `turn_grouper.py` | COMMENT |
| LOW⚡ | …erpowers/specs/2026-02-28-turn-normalization-design.md | 95 | ### Step 3: 重构 `stream_projector.py` | COMMENT |
| LOW⚡ | …erpowers/specs/2026-02-28-turn-normalization-design.md | 100 | ### Step 4: 修复 `service.py` 重连消息丢失 | COMMENT |
| LOW⚡ | …erpowers/specs/2026-02-28-turn-normalization-design.md | 105 | ### Step 5: 精简前端冗余 normalization | COMMENT |
| LOW⚡ | …026-03-05-sdk-upgrade-agent-runtime-refactor-design.md | 150 | # Step 1: SDK 读取 transcript(正确链、全有 UUID) | COMMENT |
| LOW⚡ | …026-03-05-sdk-upgrade-agent-runtime-refactor-design.md | 153 | # Step 2: UUID 集合 | COMMENT |
| LOW⚡ | …026-03-05-sdk-upgrade-agent-runtime-refactor-design.md | 156 | # Step 3: 当前轮次内容指纹(最后一个 real_user 之后的消息) | COMMENT |
| LOW⚡ | …026-03-05-sdk-upgrade-agent-runtime-refactor-design.md | 159 | # Step 4: 初始化投影器 | COMMENT |
| LOW⚡ | …026-03-05-sdk-upgrade-agent-runtime-refactor-design.md | 162 | # Step 5: 应用 buffer 并去重 | COMMENT |
| LOW⚡ | lib/db/repositories/task_repo.py | 802 | # Step 1: collect task_ids to requeue | COMMENT |
| LOW⚡ | lib/db/repositories/task_repo.py | 810 | # Step 2: batch UPDATE — single round-trip for all tasks | COMMENT |
| LOW | lib/db/repositories/task_repo.py | 825 | # Step 3: reload updated tasks in one SELECT IN | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_task_failure_capability.py | 120 | CODE | |
| LOW | tests/test_task_failure_capability.py | 301 | CODE | |
| LOW | tests/test_config_resolver.py | 1249 | CODE | |
| LOW | tests/test_config_resolver.py | 1711 | CODE | |
| LOW | tests/test_project_archive_service.py | 526 | CODE | |
| LOW | tests/test_registry_resolutions.py | 11 | CODE | |
| LOW | tests/test_generation_worker_module.py | 254 | CODE | |
| LOW | server/auth.py | 204 | CODE | |
| LOW | server/routers/files.py | 133 | CODE | |
| LOW | server/routers/files.py | 563 | CODE | |
| LOW | server/routers/files.py | 688 | CODE | |
| LOW | server/routers/files.py | 199 | CODE | |
| LOW | server/routers/files.py | 567 | CODE | |
| LOW | server/routers/files.py | 692 | CODE | |
| LOW | server/routers/system.py | 26 | CODE | |
| LOW | server/routers/agent_chat.py | 60 | CODE | |
| LOW | server/routers/agent_chat.py | 133 | CODE | |
| LOW | server/routers/agent_chat.py | 152 | CODE | |
| LOW | server/routers/providers.py | 460 | CODE | |
| LOW | server/routers/assets.py | 252 | CODE | |
| LOW | server/routers/assets.py | 434 | CODE | |
| LOW | server/routers/_asset_router_factory.py | 79 | CODE | |
| LOW | server/routers/_asset_router_factory.py | 100 | CODE | |
| LOW | server/routers/_asset_router_factory.py | 170 | CODE | |
| LOW | server/routers/versions.py | 162 | CODE | |
| LOW | server/routers/projects.py | 180 | CODE | |
| LOW | server/routers/projects.py | 403 | CODE | |
| LOW | server/routers/projects.py | 614 | CODE | |
| LOW | server/routers/projects.py | 671 | CODE | |
| LOW | server/routers/projects.py | 877 | CODE | |
| LOW | server/routers/projects.py | 983 | CODE | |
| LOW | server/routers/projects.py | 1036 | CODE | |
| LOW | server/routers/projects.py | 1103 | CODE | |
| LOW | server/routers/projects.py | 1161 | CODE | |
| LOW | server/routers/projects.py | 1222 | CODE | |
| LOW | server/routers/projects.py | 406 | CODE | |
| LOW | server/routers/projects.py | 675 | CODE | |
| LOW | server/routers/projects.py | 886 | CODE | |
| LOW | server/routers/projects.py | 991 | CODE | |
| LOW | server/routers/projects.py | 1107 | CODE | |
| LOW | server/routers/projects.py | 693 | CODE | |
| LOW | server/routers/shot_uploads.py | 49 | CODE | |
| LOW | server/routers/custom_providers.py | 399 | CODE | |
| LOW | server/routers/custom_providers.py | 778 | CODE | |
| LOW | server/agent_runtime/service.py | 817 | CODE | |
| LOW | server/agent_runtime/session_actor.py | 118 | CODE | |
| LOW | server/agent_runtime/turn_schema.py | 71 | CODE | |
| LOW | server/agent_runtime/event_log.py | 338 | CODE | |
| LOW | server/agent_runtime/event_log.py | 569 | CODE | |
| LOW | server/agent_runtime/session_manager.py | 756 | CODE | |
| LOW | server/agent_runtime/session_manager.py | 1203 | CODE | |
| LOW | server/agent_runtime/session_manager.py | 1324 | CODE | |
| LOW | server/agent_runtime/agent_access_policy.py | 373 | CODE | |
| LOW | server/agent_runtime/sdk_tools/text_generation.py | 256 | CODE | |
| LOW | server/agent_runtime/sdk_tools/text_generation.py | 271 | CODE | |
| LOW | server/agent_runtime/sdk_tools/patch_script.py | 38 | CODE | |
| LOW | server/agent_runtime/sdk_tools/patch_script.py | 71 | CODE | |
| LOW | server/services/end_frame.py | 195 | CODE | |
| LOW | server/services/end_frame.py | 236 | CODE | |
| LOW | server/services/project_events.py | 493 | CODE | |
| 58 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_cost_estimation_service.py | 617 | """单集脏脚本(segments=null)不应让整个项目费用估算 5xx;脏集降级为 0 segments | STRING |
| HIGH | tests/test_turn_schema.py | 143 | """SDK may send {type: text, text: null} — must not TypeError on join.""" | STRING |
| HIGH⚡ | tests/test_project_manager_save_validation.py | 263 | '{"episode": 1, "title": "x", "content_mode": "narration", "segments": null, ' | CODE |
| HIGH⚡ | tests/test_project_manager_save_validation.py | 275 | '"generation_mode": "reference_video", "video_units": null, ' | CODE |
| HIGH | tests/agent_runtime/test_session_manager_sandbox.py | 237 | "ffmpeg -i in.mp4 out.mp4 && python -c \"open('project.json','w')\"", | CODE |
| HIGH⚡ | server/agent_runtime/sdk_tools/patch_project.py | 229 | value = _coerce_numeric_string(value, int, f"{key} 必须是正整数或 null,收到 {value!r}") | CODE |
| HIGH⚡ | server/agent_runtime/sdk_tools/patch_project.py | 231 | raise ValueError(f"{key} 必须是正整数或 null,收到 {value!r}") | CODE |
| HIGH⚡ | server/agent_runtime/sdk_tools/patch_project.py | 237 | raise ValueError(f"source_language 必须是 {list(_SOURCE_LANGUAGE_VALUES)} 之一或 null,收到 {value!r}") | CODE |
| HIGH⚡ | server/agent_runtime/sdk_tools/patch_project.py | 243 | raise ValueError(f"brief 必须是字符串或 null,收到 {value!r}") | CODE |
| HIGH⚡ | server/agent_runtime/sdk_tools/patch_project.py | 249 | raise ValueError(f"narration_voice 必须是非空字符串或 null,收到 {value!r}") | CODE |
| HIGH⚡ | server/agent_runtime/sdk_tools/patch_project.py | 255 | value = _coerce_numeric_string(value, float, f"narration_speed 必须是正的有限数值或 null,收到 {value!r}") | CODE |
| HIGH⚡ | server/agent_runtime/sdk_tools/patch_project.py | 263 | raise ValueError(f"narration_speed 必须是正的有限数值或 null,收到 {value!r}") | CODE |
| HIGH | server/services/cost_estimation.py | 533 | # Project-level actual costs (characters/scenes/props/products 资产图 —— segment_id is null) | COMMENT |
| HIGH | lib/generation_queue_client.py | 276 | # ``or ""`` 而非默认参数:``{"action": null}`` 时 get 返回 None, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/vidu-docs/图生视频.md | 37 | curl -X POST -H "Authorization: Token {your_api_key}" -H "Content-Type: application/json" -d ' | CODE |
| HIGH | docs/vidu-docs/图片生成.md | 26 | curl -X POST -H "Authorization: Token {your_api_key}" -H "Content-Type: application/json" -d ' | CODE |
| HIGH | docs/vidu-docs/首尾帧生视频.md | 35 | curl -X POST -H "Authorization: Token {your_api_key}" -H "Content-Type: application/json" -d ' | CODE |
| HIGH | docs/vidu-docs/参考生视频.md | 44 | curl -X POST -H "Authorization: Token {your_api_key}" -H "Content-Type: application/json" -d ' | CODE |
| HIGH | docs/vidu-docs/参考生视频.md | 133 | curl -X POST -H "Authorization: Token {your_api_key}" -H "Content-Type: application/json" -d ' | CODE |
| HIGH | docs/vidu-docs/文生视频.md | 35 | curl -X POST -H "Authorization: Token {your_api_key}" -H "Content-Type: application/json" -d ' | CODE |
| HIGH | docs/claude-agent-sdk-docs/overview.md | 87 | export ANTHROPIC_API_KEY=your-api-key | CODE |
| HIGH | docs/claude-agent-sdk-docs/quickstart.md | 72 | ANTHROPIC_API_KEY=your-api-key | CODE |
| HIGH | docs/grok-docs/images-generation.md | 39 | api_key="YOUR_API_KEY", | CODE |
| HIGH | docs/grok-docs/images-generation.md | 228 | api_key="YOUR_API_KEY", | CODE |
| HIGH | docs/grok-docs/images-generation.md | 323 | api_key="YOUR_API_KEY", | CODE |
| HIGH | docs/grok-docs/images-generation.md | 403 | api_key="YOUR_API_KEY", | CODE |
| HIGH | docs/grok-docs/images-generation.md | 470 | api_key="YOUR_API_KEY", | CODE |
| HIGH | …uperpowers/plans/2026-03-31-grok-ark-shared-backend.md | 380 | raise ValueError("ARK_API_KEY 环境变量未设置\n请在 .env 文件中添加:ARK_API_KEY=your-api-key") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | alembic.ini | 1 | # A generic, single database configuration. | COMMENT |
| LOW | alembic.ini | 21 | prepend_sys_path = . | COMMENT |
| LOW | alembic.ini | 41 | # versions/ directory | COMMENT |
| LOW | alembic.ini | 61 | # 1. Parsing of the version_locations option falls back to using the legacy | COMMENT |
| LOW | frontend/src/stores/capabilities-store.ts | 1 | import { create } from "zustand"; | COMMENT |
| LOW | frontend/src/stores/tasks-store.ts | 101 | // | COMMENT |
| LOW | frontend/src/stores/tasks-store.ts | 361 | const seq = ++optimisticSeq; | COMMENT |
| LOW | frontend/src/stores/projects-store.ts | 121 | again = false; | COMMENT |
| LOW | frontend/src/stores/projects-store.ts | 241 | // 而非共享首轮或末轮的单一结果。 | COMMENT |
| LOW | frontend/src/stores/assistant-store.ts | 101 | // 只比对 entries 首尾元素引用(O(1),不能整数组比对,否则每次追加都会 | COMMENT |
| LOW | frontend/src/hooks/useProjectEventsSSE.ts | 181 | executeFocus(target); | COMMENT |
| LOW | frontend/src/hooks/useModelCapabilities.ts | 21 | // voiceConsistency → 服务端派生值。二维派生(模型能力 × 项目 generation_mode)只在 | COMMENT |
| LOW | frontend/src/onboarding/OnboardingTour.tsx | 81 | !requiredQuery || | COMMENT |
| LOW | tests/test_tts_pricing.py | 81 | # 自定义供应商 audio 计费(按用户填写的每万字符单价)覆盖在 tests/test_custom_cost.py, | COMMENT |
| LOW | …ystematic-debugging/condition-based-waiting-example.ts | 141 | // --------------- | COMMENT |
| LOW | …s/skills/diagnosing-bugs/scripts/hitl-loop.template.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .agents/skills/afk-team-workflow/scripts/batch-poll.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .agents/skills/afk-team-workflow/scripts/batch-poll.sh | 21 | # "issues": [ | COMMENT |
| LOW | .agents/skills/afk-team-workflow/scripts/batch-poll.sh | 41 | # "merge_candidate": [<int>,...], # PR open, non-draft, mergeable==MERGEABLE, no failing AND no pending checks | COMMENT |
| LOW | .agents/skills/afk-team-workflow/scripts/batch-poll.sh | 61 | # "None - can start immediately (prereqs #41/#42 already merged)" — those trailing #refs | COMMENT |
| LOW | .agents/skills/afk-team-workflow/scripts/ledger.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .agents/skills/afk-team-workflow/scripts/ledger.sh | 21 | # batch-2026-06-20). Restricted to [A-Za-z0-9._-]; becomes the filename. | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 21 | # rebuilt by re-running poll.sh. query.sh is its only intended reader. | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 41 | # "created_at", "updated_at", | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 61 | # "comments_new": [{id, createdAt, reviewed_commit, reviewed_current_head, | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 81 | # # red CI can block reviewers, so fix it before waiting on them | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 101 | # refactor "_🛠️ Refactor suggestion" minor "_🟡 Minor" | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 121 | # | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/poll.sh | 141 | # swallow pushback comments that quote a command, silently suppressing real triggers). | COMMENT |
| LOW | …/skills/pr-ai-review-loop/scripts/test_quota_alerts.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …s/skills/pr-ai-review-loop/scripts/classify_commits.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …s/skills/pr-ai-review-loop/scripts/classify_commits.sh | 21 | # }, | COMMENT |
| LOW | .agents/skills/pr-ai-review-loop/scripts/query.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …s/skills/pr-ai-review-loop/scripts/test_pass_marker.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | server/agent_runtime/service.py | 301 | # 清掉后继续向下探测,避免返回指向已删除会话的幽灵 "accepted" | COMMENT |
| LOW | server/agent_runtime/agent_access_policy.py | 41 | 塞进来会破坏纯构造可测的根基。 | COMMENT |
| LOW | server/services/generation_tasks.py | 961 | if duration_seconds is None: | COMMENT |
| LOW | server/services/reference_video_tasks.py | 621 | if task_id is not None: | COMMENT |
| LOW | server/services/cost_estimation.py | 321 | # narration/drama 的 unit 自带 ``unit_id`` 且成员 shot 无独立 ID,unit 本身即展示 | COMMENT |
| LOW | docs/superpowers/specs/2026-04-09-task-cancel-design.md | 81 | ### 4. 后端实现层 | COMMENT |
| LOW | …superpowers/specs/2026-04-14-eslint-a11y-pr3-design.md | 261 | - **禁用**:`/* eslint-disable */` 文件级、`// eslint-disable-line` 无理由、`@ts-ignore` 联用 | COMMENT |
| LOW | …superpowers/specs/2026-05-18-log-persistence-design.md | 161 | COMMENT | |
| LOW | lib/script_models.py | 761 | COMMENT | |
| LOW | lib/path_safety.py | 61 | """ | COMMENT |
| LOW | lib/project_manager.py | 641 | # 判别(含 reference 模式的 video_units——否则它会落入 segments 兜底分支、total_scenes 错算为 0)。 | COMMENT |
| LOW | lib/config/anthropic_url.py | 21 | from lib.config.url_utils import ensure_anthropic_base_url | COMMENT |
| LOW | lib/config/registry.py | 81 | # 子集,在 __post_init__ 校验,misconfig fail-fast。 | COMMENT |
| LOW | lib/backend_assembly/specs.py | 181 | media_type=media_type, | COMMENT |
| LOW | lib/custom_provider/endpoints.py | 61 | [CustomProvider, str], | COMMENT |
| LOW | lib/video_backends/kling.py | 221 | # max_reference_images 以此处为准(编排层裁剪与生成时防御同读它;registry ModelInfo 另有一份 | COMMENT |
| LOW | lib/video_backends/ark.py | 201 | # cannot be mixed with reference media content,实测)——参考图是与首尾帧互斥的 | COMMENT |
| LOW | openspec/config.yaml | 1 | schema: spec-driven | COMMENT |
| LOW | openspec/config.yaml | 21 | # - Always include a "Non-goals" section | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | .agents/skills/triage/SKILL.md | 16 | > *This was generated by AI during triage.* | CODE |
| HIGH | docs/google-genai-docs/veo.md | 642 | - **Watermarking:** Videos created by Veo are watermarked using [SynthID](https://deepmind.google/technologies/synthid/) | CODE |
| HIGH | docs/google-genai-docs/nano-banana.md | 37 | AI-gener | CODE |
| HIGH | docs/google-genai-docs/nano-banana.md | 74 | AI | CODE |
| HIGH | docs/google-genai-docs/nano-banana.md | 105 | AI-genera | CODE |
| HIGH | docs/google-genai-docs/nano-banana.md | 219 | 时按缺失处理,不抛 attributeerror。 | STRING |
| HIGH | tests/server/agent_runtime/test_sdk_tools.py | 0 | generated_assets 为非 dict 脏数据(如字符串)时按缺失处理,不抛 attributeerror。 | STRING |
| HIGH | tests/lib/test_status_calculator_reference.py | 0 | generated_assets 为非 dict 脏数据(如字符串)时按缺失处理,不抛 attributeerror。 | STRING |
| HIGH | server/agent_runtime/message_serialization.py | 0 | convert sdk message to dict for json serialization. | STRING |
| HIGH | …s/superpowers/plans/2026-02-09-sdk-client-migration.md | 0 | convert sdk message to dict for json serialization. | STRING |
| HIGH | …/2026-03-05-sdk-upgrade-agent-runtime-refactor-plan.md | 0 | convert sdk message to dict for json serialization. | STRING |
| HIGH | …/superpowers/plans/2026-05-02-agent-custom-provider.md | 0 | 规范化 anthropic base_url。 @anthropic-ai/sdk 内部会拼接 /v1/messages、/v1/models 等,所以 base_url 必须是根级形态。如用户填了 https://example.com/ | STRING |
| HIGH | …owers/specs/2026-05-02-agent-custom-provider-design.md | 0 | 规范化 anthropic base_url。 @anthropic-ai/sdk 内部会拼接 /v1/messages、/v1/models 等,所以 base_url 必须是根级形态。如用户填了 https://example.com/ | STRING |
| HIGH | lib/config/url_utils.py | 0 | 规范化 anthropic base_url。 @anthropic-ai/sdk 内部会拼接 /v1/messages、/v1/models 等,所以 base_url 必须是根级形态。如用户填了 https://example.com/ | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_grid_executor.py | 215 | # Create a fake 400x400 grid image (2x2, each cell 200x200) | COMMENT |
| MEDIUM | tests/test_assistant_service_more.py | 110 | # Create an in-memory async store and seed data | COMMENT |
| MEDIUM | tests/test_assistant_service_more.py | 743 | # Create a fallback skill for metadata parsing test | COMMENT |
| MEDIUM | tests/test_discover_anthropic_fallback.py | 61 | # Create an active credential first | COMMENT |
| MEDIUM | tests/test_assistant_service_skills.py | 18 | # Create a dev-only skill in .claude/skills/ (should NOT appear) | COMMENT |
| MEDIUM⚡ | tests/test_image_backends/test_gemini.py | 139 | # Create a small test image | COMMENT |
| MEDIUM | scripts/migrate_sqlite_to_orm.py | 33 | # Create a minimal lib package stub so sub-imports resolve correctly | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/src/types/grid.ts | 17 | frame_type: "first" | "transition" | "placeholder"; | CODE |
| LOW | …src/components/canvas/timeline/EndFramePicker.test.tsx | 52 | frame_type: "placeholder", | CODE |
| LOW | tests/test_grid_layout.py | 125 | assert chain[5].frame_type == "placeholder" | CODE |
| LOW | tests/test_image_backends/test_gemini.py | 48 | api_key="fake-key", | CODE |
| LOW⚡ | server/routers/providers.py | 56 | "base_url": {"label": "Base URL", "type": "url", "placeholder": "Default"}, | CODE |
| LOW | server/routers/providers.py | 323 | if "placeholder" in meta: | CODE |
| LOW | server/routers/providers.py | 324 | field["placeholder"] = meta["placeholder"] | CODE |
| LOW | server/services/generation_tasks.py | 1518 | if frame.frame_type == "placeholder": | CODE |
| LOW | …cs/superpowers/plans/2026-04-09-grid-image-to-video.md | 333 | assert chain[5].frame_type == "placeholder" | CODE |
| LOW | …cs/superpowers/plans/2026-04-09-grid-image-to-video.md | 384 | frame_type: str # "first" | "transition" | "placeholder" | CODE |
| LOW | …cs/superpowers/plans/2026-04-09-grid-image-to-video.md | 521 | frame_type="placeholder", | CODE |
| LOW | …cs/superpowers/plans/2026-04-09-grid-image-to-video.md | 1431 | if fc.frame_type == "placeholder" or is_placeholder_cell(cell_img): | CODE |
| LOW | …cs/superpowers/plans/2026-04-09-grid-image-to-video.md | 1845 | frame_type: "first" | "transition" | "placeholder"; | CODE |
| LOW | …rpowers/specs/2026-03-18-provider-management-design.md | 230 | "placeholder": "默认官方地址" | CODE |
| LOW | …rpowers/specs/2026-04-09-grid-image-to-video-design.md | 69 | frame_type: str # "first" | "transition" | "placeholder" | CODE |
| LOW | scripts/probe_smoke.py | 70 | api_key="sk-ant-fake-key-for-smoke-test-not-real", | CODE |
| LOW | lib/grid/models.py | 38 | frame_type: Literal["first", "transition", "placeholder"] | CODE |
| LOW | lib/grid/models.py | 72 | - Remaining cells: frame_type="placeholder" | STRING |
| LOW | lib/grid/models.py | 109 | frame_type="placeholder", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | server/auth.py | 470 | # Type aliases for FastAPI dependency injection | COMMENT |
| MEDIUM | docs/claude-agent-sdk-docs/agent-loop.md | 11 | When you start an agent, the SDK runs the same [execution loop that powers Claude Code](/en/how-claude-code-works#the-ag | CODE |
| MEDIUM | docs/claude-agent-sdk-docs/agent-loop.md | 198 | ## The context window | COMMENT |
| MEDIUM | docs/google-genai-docs/pricing.md | 1013 | | [Gemini Deep Research Agent](https://ai.google.dev/gemini-api/docs/deep-research) | All model inference is charged at | CODE |
| MEDIUM | lib/script_models.py | 24 | # Structured Outputs 下不太会产出额外字段,产出即 hallucination,拒比静默丢更安全。 | COMMENT |
| MEDIUM | lib/script_models.py | 418 | # 与「未知字段(typo / hallucination)一律拒」并存——前者是已知 deprecated, | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docs/claude-agent-sdk-docs/python.md | 2973 | # Turn 1 - Claude: "I'll create a hello.py file for you..." | COMMENT |
| HIGH | docs/claude-agent-sdk-docs/python.md | 2977 | # Turn 3 - Claude: "I'll add a main function to hello.py..." (knows which file!) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/server/test_reference_video_tasks.py | 91 | CODE | |
| LOW | server/routers/tasks.py | 189 | CODE | |
| LOW | lib/generation_queue.py | 111 | CODE | |
| LOW | lib/media_generator.py | 91 | CODE | |
| LOW | lib/media_generator.py | 480 | CODE | |
| LOW | lib/media_generator.py | 534 | CODE | |
| LOW | lib/ledger.py | 95 | CODE | |
| LOW | lib/generation_queue_client.py | 109 | CODE | |
| LOW | lib/generation_queue_client.py | 160 | CODE | |
| LOW | lib/project_manager.py | 1537 | CODE | |
| LOW | lib/db/repositories/usage_repo.py | 127 | CODE | |
| LOW | lib/db/repositories/task_repo.py | 125 | CODE | |
| LOW | lib/image_backends/kling.py | 70 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | lib/project_manager.py | 830 | 从剧本文件同步集数信息到 project.json Agent 写入剧本后必须调用此方法以确保 WebUI 能正确显示剧集列表。 Args: project_na | STRING |
| HIGH | lib/source_loader/loader.py | 77 | 规范化上传文件为 UTF-8 .txt 并按"决策 7"备份原始字节。 Args: src: 临时文件路径(上传层已落盘)。 dst_dir: 目标项目的 source/ 目 | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ntend/src/components/pages/CreateProjectModal.test.tsx | 117 | // Step 3: Create button appears | COMMENT |
| LOW⚡ | lib/db/repositories/task_repo.py | 802 | # Step 1: collect task_ids to requeue | COMMENT |
| LOW⚡ | lib/db/repositories/task_repo.py | 810 | # Step 2: batch UPDATE — single round-trip for all tasks | COMMENT |
| LOW | lib/db/repositories/task_repo.py | 825 | # Step 3: reload updated tasks in one SELECT IN | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_session_manager_more.py | 633 | # Write file without extension (e.g. Makefile) — allowed (not in code blacklist) | COMMENT |
| LOW | .agents/skills/systematic-debugging/find-polluter.sh | 44 | # Check if pollution appeared | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/skills/diagnosing-bugs/scripts/hitl-loop.template.sh | 6 | # Usage: | COMMENT |