🏛️ 三省六部制 · OpenClaw Multi-Agent Orchestration System — 9 specialized AI agents with real-time dashboard, model config, and full audit trails
This report presents the forensic synthetic code analysis of cft0808/edict, a Python project with 16,206 GitHub stars. SynthScan v2.0 examined 38,937 lines of code across 168 source files, recording 388 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 13.5 places this repository in the Low 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).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
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 388 distinct pattern matches across 10 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 |
|---|---|---|---|---|
| MEDIUM | uninstall.sh | 2 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | uninstall.sh | 4 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | uninstall.sh | 25 | # ── Step 0: 确认 ──────────────────────────────────────────── | COMMENT |
| MEDIUM | uninstall.sh | 42 | # ── Step 1: 停止正在运行的服务 ──────────────────────────────── | COMMENT |
| MEDIUM | uninstall.sh | 57 | # ── Step 2: 清理 OpenClaw 注册配置 ────────────────────────────── | COMMENT |
| MEDIUM | uninstall.sh | 102 | # ── Step 3: 清除 Workspace 目录 ───────────────────────────────── | COMMENT |
| MEDIUM | uninstall.sh | 119 | # ── Step 4: 清除本地数据缓存 ──────────────────────────────────── | COMMENT |
| MEDIUM | uninstall.sh | 138 | # ── Step 5: 重启 Gateway ──────────────────────────────────────── | COMMENT |
| MEDIUM | uninstall.sh | 152 | # ── Main ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 2 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | install.sh | 4 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | install.sh | 27 | # ── Step 0: 依赖检查 ────────────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 50 | # ── Step 0.5: 备份已有 Agent 数据 ────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 91 | # ── Step 1: 创建 Workspace ────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 123 | # ── Step 2: 注册 Agents ───────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 189 | # ── Step 3: 初始化 Data ───────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 239 | # ── Step 3.3: 创建 data 软链接确保数据一致 (Fix #88) ───────── | COMMENT |
| MEDIUM | install.sh | 293 | # ── Step 3.5: 设置 Agent 间通信可见性 (Fix #83) ────────────── | COMMENT |
| MEDIUM | install.sh | 304 | # ── Step 3.5b: 同步 API Key 到所有 Agent ────────────────────────── | COMMENT |
| MEDIUM | install.sh | 364 | # ── Step 4: 构建前端 ────────────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 389 | # ── Step 5: 首次数据同步 ──────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 401 | # ── Step 6: 重启 Gateway ──────────────────────────────────── | COMMENT |
| MEDIUM | install.sh | 411 | # ── Main ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | start.sh | 2 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | start.sh | 5 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | edict.sh | 2 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | edict.sh | 5 | # ══════════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 50 | // ── 消息类型 ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 79 | // ── 官员身份 ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 105 | // ── Agent 运行时状态 ───────────────────────────────────────── | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 113 | // ── 会话 ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 126 | // ── 随机事件(命运骰子)────────────────────────────────────── | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 312 | // ── system prompt 生成器 ─────────────────────────────────────── | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 338 | // ── Agent 主类 ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | edict/朝堂议政_开发规格.md | 448 | // ── 私有方法 ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | edict/docker-compose.yml | 1 | # ══════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | edict/docker-compose.yml | 3 | # ══════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | edict/frontend/src/components/CourtDiscussion.tsx | 313 | // ═══════════════════ | COMMENT |
| MEDIUM | edict/frontend/src/components/CourtDiscussion.tsx | 315 | // ═══════════════════ | COMMENT |
| MEDIUM | edict/frontend/src/components/CourtDiscussion.tsx | 437 | // ═══════════════════ | COMMENT |
| MEDIUM | edict/frontend/src/components/CourtDiscussion.tsx | 439 | // ═══════════════════ | COMMENT |
| MEDIUM⚡ | tests/test_sync_symlinks.py | 14 | # ── Bootstrap: make scripts/ importable ────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_sync_symlinks.py | 21 | # ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_sync_symlinks.py | 23 | # ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_sync_symlinks.py | 51 | # ── Tests ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1387 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1389 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1401 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1403 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1414 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1416 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1450 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1452 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1487 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1489 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1509 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1511 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1531 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1533 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| MEDIUM | docs/task-dispatch-architecture.md | 1549 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | uninstall.sh | 79 | except Exception as e: | CODE |
| LOW | edict.sh | 187 | except Exception: | CODE |
| LOW | edict/backend/app/db.py | 39 | except Exception: | CODE |
| LOW | edict/backend/app/api/admin.py | 27 | except Exception as e: | CODE |
| LOW | edict/backend/app/api/admin.py | 35 | except Exception as e: | CODE |
| LOW | edict/backend/app/api/websocket.py | 49 | except Exception as e: | CODE |
| LOW | edict/backend/app/api/websocket.py | 75 | except Exception as e: | CODE |
| LOW | edict/backend/app/api/websocket.py | 99 | except Exception: | CODE |
| LOW | edict/backend/app/api/websocket.py | 132 | except Exception: | CODE |
| LOW | edict/backend/app/api/websocket.py | 148 | except Exception: | CODE |
| LOW | edict/backend/app/workers/outbox_relay.py | 45 | except Exception as e: | CODE |
| LOW | edict/backend/app/workers/outbox_relay.py | 85 | except Exception as exc: | CODE |
| LOW | edict/backend/app/workers/outbox_relay.py | 110 | except Exception as dlq_err: | CODE |
| LOW | edict/backend/app/workers/dispatch_worker.py | 349 | except Exception as e: | CODE |
| LOW | edict/backend/app/workers/dispatch_worker.py | 536 | except Exception as e: | CODE |
| LOW | edict/backend/app/workers/dispatch_worker.py | 597 | except Exception as e: | CODE |
| LOW | edict/backend/app/workers/orchestrator_worker.py | 98 | except Exception as e: | CODE |
| LOW | edict/backend/app/workers/orchestrator_worker.py | 139 | except Exception as e: | CODE |
| LOW | edict/backend/app/workers/orchestrator_worker.py | 341 | except Exception as e: | CODE |
| LOW | edict/backend/app/channels/qq.py | 44 | except Exception: | CODE |
| LOW | edict/backend/app/channels/base.py | 34 | except Exception: | CODE |
| LOW | edict/scripts/kanban_update_edict.py | 120 | except Exception: | CODE |
| LOW | edict/scripts/kanban_update_edict.py | 137 | except Exception as e: | CODE |
| LOW | edict/scripts/kanban_update_edict.py | 155 | except Exception as e: | CODE |
| LOW | edict/migration/migrate_json_to_pg.py | 158 | except Exception as e: | CODE |
| MEDIUM | tests/test_task_mutation_race.py | 200 | def update_field_a(): | CODE |
| MEDIUM | tests/test_task_mutation_race.py | 207 | def update_field_b(): | CODE |
| LOW | tests/test_task_mutation_race.py | 204 | except Exception as e: | CODE |
| LOW | tests/test_task_mutation_race.py | 211 | except Exception as e: | CODE |
| LOW | dashboard/auth.py | 46 | except Exception: | CODE |
| LOW | dashboard/auth.py | 80 | except Exception: | CODE |
| LOW | dashboard/auth.py | 125 | except Exception: | CODE |
| MEDIUM | dashboard/server.py | 155 | def _refresh(): | CODE |
| MEDIUM | dashboard/server.py | 986 | def do_wake(): | CODE |
| MEDIUM | dashboard/server.py | 2176 | def _do_dispatch(): | CODE |
| MEDIUM | dashboard/server.py | 2341 | def handle(self): | CODE |
| MEDIUM | dashboard/server.py | 2660 | def do_refresh(): | CODE |
| MEDIUM | dashboard/server.py | 2827 | def apply_async(): | CODE |
| LOW⚡ | dashboard/server.py | 578 | except Exception: | CODE |
| LOW⚡ | dashboard/server.py | 582 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 105 | except Exception: | CODE |
| LOW | dashboard/server.py | 112 | except Exception: | CODE |
| LOW | dashboard/server.py | 158 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 311 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 346 | except Exception: | CODE |
| LOW | dashboard/server.py | 388 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 415 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 433 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 460 | except Exception: | CODE |
| LOW | dashboard/server.py | 511 | except Exception: | CODE |
| LOW | dashboard/server.py | 550 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 610 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 827 | except Exception: | CODE |
| LOW | dashboard/server.py | 839 | except Exception: | CODE |
| LOW | dashboard/server.py | 865 | except Exception: | CODE |
| LOW | dashboard/server.py | 877 | except Exception: | CODE |
| LOW | dashboard/server.py | 944 | except Exception: | CODE |
| LOW | dashboard/server.py | 1004 | except Exception as e: | CODE |
| LOW | dashboard/server.py | 1038 | except Exception: | CODE |
| LOW | dashboard/server.py | 1571 | except Exception: | CODE |
| 67 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | edict/backend/app/config.py | 2 | CODE | |
| LOW | edict/backend/app/models/task.py | 2 | CODE | |
| LOW | edict/backend/app/models/event.py | 10 | CODE | |
| LOW | edict/backend/app/models/audit.py | 7 | CODE | |
| LOW | edict/backend/app/models/audit.py | 11 | CODE | |
| LOW | edict/backend/app/models/__init__.py | 3 | CODE | |
| LOW | edict/backend/app/models/__init__.py | 4 | CODE | |
| LOW | edict/backend/app/models/__init__.py | 5 | CODE | |
| LOW | edict/backend/app/models/__init__.py | 5 | CODE | |
| LOW | edict/backend/app/models/__init__.py | 6 | CODE | |
| LOW | edict/backend/app/models/__init__.py | 7 | CODE | |
| LOW | edict/backend/app/models/__init__.py | 8 | CODE | |
| LOW | edict/backend/app/api/tasks.py | 2 | CODE | |
| LOW | edict/backend/app/api/tasks.py | 6 | CODE | |
| LOW | edict/backend/app/api/tasks.py | 9 | CODE | |
| LOW | edict/backend/app/api/tasks.py | 14 | CODE | |
| LOW | edict/backend/app/api/events.py | 2 | CODE | |
| LOW | edict/backend/app/api/events.py | 5 | CODE | |
| LOW | edict/backend/app/api/__init__.py | 1 | CODE | |
| LOW | edict/backend/app/api/__init__.py | 2 | CODE | |
| LOW | edict/backend/app/api/__init__.py | 3 | CODE | |
| LOW | edict/backend/app/api/__init__.py | 4 | CODE | |
| LOW | edict/backend/app/api/__init__.py | 5 | CODE | |
| LOW | edict/backend/app/api/admin.py | 3 | CODE | |
| LOW | edict/backend/app/api/websocket.py | 17 | CODE | |
| LOW | edict/backend/app/workers/outbox_relay.py | 15 | CODE | |
| LOW | edict/backend/app/workers/__init__.py | 1 | CODE | |
| LOW | edict/backend/app/workers/__init__.py | 1 | CODE | |
| LOW | edict/backend/app/workers/__init__.py | 2 | CODE | |
| LOW | edict/backend/app/workers/__init__.py | 2 | CODE | |
| LOW | edict/backend/app/workers/dispatch_worker.py | 25 | CODE | |
| LOW | edict/backend/app/workers/dispatch_worker.py | 26 | CODE | |
| LOW | edict/backend/app/workers/dispatch_worker.py | 26 | CODE | |
| LOW | edict/backend/app/workers/dispatch_worker.py | 29 | CODE | |
| LOW | edict/backend/app/workers/orchestrator_worker.py | 21 | CODE | |
| LOW | edict/backend/app/workers/orchestrator_worker.py | 24 | CODE | |
| LOW | edict/backend/app/services/__init__.py | 1 | CODE | |
| LOW | edict/backend/app/services/__init__.py | 1 | CODE | |
| LOW | edict/backend/app/services/__init__.py | 2 | CODE | |
| LOW | edict/backend/app/channels/webhook.py | 1 | CODE | |
| LOW | edict/backend/app/channels/telegram.py | 1 | CODE | |
| LOW | edict/backend/app/channels/discord.py | 1 | CODE | |
| LOW | edict/backend/app/channels/__init__.py | 1 | CODE | |
| LOW | edict/backend/app/channels/qq.py | 1 | CODE | |
| LOW | edict/backend/app/channels/feishu.py | 1 | CODE | |
| LOW | edict/backend/app/channels/base.py | 1 | CODE | |
| LOW | edict/backend/app/channels/slack.py | 1 | CODE | |
| LOW | edict/backend/app/channels/wecom.py | 1 | CODE | |
| LOW | edict/migration/env.py | 24 | CODE | |
| LOW | edict/migration/env.py | 24 | CODE | |
| LOW | edict/migration/env.py | 24 | CODE | |
| LOW | edict/migration/env.py | 24 | CODE | |
| LOW | edict/migration/migrate_json_to_pg.py | 29 | CODE | |
| LOW | edict/migration/migrate_json_to_pg.py | 30 | CODE | |
| LOW | edict/migration/migrate_json_to_pg.py | 30 | CODE | |
| LOW | tests/test_e2e_kanban.py | 6 | CODE | |
| LOW | tests/test_e2e_kanban.py | 13 | CODE | |
| LOW | tests/test_e2e_kanban.py | 13 | CODE | |
| LOW | tests/test_e2e_kanban.py | 13 | CODE | |
| LOW | tests/test_cwe22_file_url.py | 7 | CODE | |
| 19 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | edict/backend/app/channels/qq.py | 48 | def _resolve_api_url_and_token(base_url: str) -> tuple[str, str]: | CODE |
| LOW | tests/test_e2e_kanban.py | 82 | def test_short_title_rejected(): | CODE |
| LOW | tests/test_e2e_kanban.py | 115 | def test_done_not_overwritable(): | CODE |
| LOW⚡ | tests/test_cwe22_file_url.py | 16 | def test_file_url_path_traversal_blocked(tmp_path): | CODE |
| LOW | tests/test_cwe22_file_url.py | 53 | def test_file_url_within_allowed_roots_works(tmp_path): | CODE |
| LOW | tests/test_cwe22_file_url.py | 82 | def test_file_url_etc_passwd_blocked(tmp_path): | CODE |
| LOW⚡ | tests/test_task_mutation_race.py | 52 | def test_modify_tasks_exists_and_callable(self, monkeypatch, tmp_path): | CODE |
| LOW⚡ | tests/test_task_mutation_race.py | 57 | def test_modify_task_exists_and_callable(self, monkeypatch, tmp_path): | CODE |
| LOW⚡ | tests/test_task_mutation_race.py | 62 | def test_modify_task_updates_single_task(self, monkeypatch, tmp_path): | CODE |
| LOW⚡ | tests/test_task_mutation_race.py | 272 | def test_modify_tasks_uses_atomic_json_update(self): | CODE |
| LOW⚡ | tests/test_task_mutation_race.py | 281 | def test_modify_task_delegates_to_modify_tasks(self): | CODE |
| LOW⚡ | tests/test_task_mutation_race.py | 290 | def test_handle_scheduler_retry_uses_modify_task(self): | CODE |
| LOW⚡ | tests/test_task_mutation_race.py | 299 | def test_handle_scheduler_rollback_uses_modify_task(self): | CODE |
| LOW | tests/test_task_mutation_race.py | 76 | def test_modify_task_returns_false_for_missing(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_task_mutation_race.py | 81 | def test_modify_tasks_bulk_update(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_task_mutation_race.py | 106 | def test_scheduler_update_persists_atomically(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_task_mutation_race.py | 123 | def test_scheduler_update_missing_task(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_task_mutation_race.py | 135 | def test_scan_stalled_task_triggers_retry(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_task_mutation_race.py | 179 | def test_concurrent_writes_both_persist(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_task_mutation_race.py | 241 | def test_update_task_scheduler_no_load_save(self): | CODE |
| LOW | tests/test_task_mutation_race.py | 252 | def test_handle_scheduler_scan_no_save_tasks(self): | CODE |
| LOW | tests/test_task_mutation_race.py | 316 | def test_load_tasks_still_works(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_task_mutation_race.py | 323 | def test_save_tasks_still_works(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_file_lock.py | 19 | def test_read_missing_returns_default(tmp_path): | CODE |
| LOW | tests/test_file_lock.py | 24 | def test_update_modifies_data(tmp_path): | CODE |
| LOW | tests/test_file_lock.py | 50 | def test_write_atomic_no_partial(tmp_path): | CODE |
| LOW | tests/test_sync_symlinks.py | 68 | def test_idempotent_when_up_to_date(self, tmp_path): | CODE |
| LOW | tests/test_sync_symlinks.py | 78 | def test_replaces_physical_copy(self, tmp_path): | CODE |
| LOW | tests/test_sync_symlinks.py | 91 | def test_replaces_broken_symlink(self, tmp_path): | CODE |
| LOW | tests/test_sync_symlinks.py | 103 | def test_skips_self_referential_via_directory_symlink(self, tmp_path): | CODE |
| LOW | tests/test_sync_symlinks.py | 137 | def test_creates_symlinks_in_workspace(self, project): | CODE |
| LOW | tests/test_sync_symlinks.py | 156 | def test_legacy_workspace_main(self, project): | CODE |
| LOW | tests/test_sync_symlinks.py | 174 | def test_replaces_old_physical_copies(self, project): | CODE |
| LOW | tests/test_sync_symlinks.py | 187 | def test_file_resolves_to_project_root(self, project): | CODE |
| LOW | tests/test_sync_symlinks.py | 203 | def test_no_self_referential_symlinks_when_workspace_scripts_is_dir_symlink( | CODE |
| LOW | tests/test_kanban.py | 87 | def test_done_routes_to_review(tmp_path): | CODE |
| LOW | tests/test_kanban.py | 116 | def test_done_rejects_incomplete_todos(tmp_path): | CODE |
| LOW | tests/test_dashboard_dispatch.py | 11 | def test_dispatch_records_missing_openclaw_cli(monkeypatch, tmp_path): | CODE |
| LOW | tests/test_sync_agent_config.py | 15 | def test_sync_agent_config_accepts_allow_agents_key(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_dashboard_review_action.py | 19 | def test_review_approve_rejects_incomplete_todos(monkeypatch): | CODE |
| LOW | tests/test_dashboard_review_action.py | 51 | def test_review_approve_allows_complete_todos(monkeypatch): | CODE |
| LOW | tests/test_state_machine_consistency.py | 59 | def test_state_transitions_consistent(): | CODE |
| LOW⚡ | tests/test_state_machine_consistency.py | 84 | def test_pending_confirm_exists(): | CODE |
| LOW⚡ | tests/test_state_machine_consistency.py | 93 | def test_pending_has_outgoing_edges(): | CODE |
| LOW⚡ | tests/test_state_machine_consistency.py | 99 | def test_terminal_states_have_no_outgoing(): | CODE |
| LOW | tests/test_skill_manager.py | 27 | def test_default_skills_do_not_use_removed_openclaw_hub(self): | CODE |
| LOW | tests/test_skill_manager.py | 39 | def test_custom_hub_base_restores_hub_skill_urls(self): | CODE |
| LOW | tests/test_skill_manager.py | 59 | def test_import_official_hub_uses_per_skill_recommended_agents(self): | CODE |
| LOW⚡ | dashboard/server.py | 591 | def migrate_notification_config(): | CODE |
| LOW | dashboard/server.py | 844 | def _get_agent_session_status(agent_id): | CODE |
| LOW | dashboard/server.py | 1180 | def handle_scheduler_escalate(task_id, reason=''): | CODE |
| LOW | dashboard/server.py | 1214 | def handle_scheduler_rollback(task_id, reason=''): | CODE |
| LOW | dashboard/server.py | 1393 | def _startup_recover_queued_dispatches(): | CODE |
| LOW | dashboard/server.py | 1620 | def get_agent_activity_by_keywords(agent_id, keywords, limit=20): | CODE |
| LOW | dashboard/court_discuss.py | 411 | def _try_repair_truncated_discuss(content: str) -> dict | None: | CODE |
| LOW | scripts/sync_agent_config.py | 258 | def sync_scripts_to_workspaces(): | CODE |
| LOW | scripts/kanban_update.py | 49 | def _load_canonical_transitions() -> dict: | CODE |
| LOW | scripts/kanban_update.py | 243 | def _infer_agent_id_from_runtime(task=None): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | edict/backend/app/api/websocket.py | 80 | CODE | |
| LOW | edict/backend/app/api/websocket.py | 104 | CODE | |
| LOW | edict/backend/app/workers/outbox_relay.py | 54 | CODE | |
| LOW | edict/backend/app/workers/dispatch_worker.py | 186 | CODE | |
| LOW | edict/backend/app/workers/dispatch_worker.py | 277 | CODE | |
| LOW | edict/backend/app/workers/dispatch_worker.py | 382 | CODE | |
| LOW | edict/backend/app/workers/orchestrator_worker.py | 149 | CODE | |
| LOW | edict/backend/app/services/event_bus.py | 116 | CODE | |
| LOW | edict/backend/app/services/event_bus.py | 194 | CODE | |
| LOW | edict/scripts/kanban_update_edict.py | 294 | CODE | |
| LOW | tests/test_task_mutation_race.py | 252 | CODE | |
| LOW | tests/test_state_machine_consistency.py | 17 | CODE | |
| LOW | dashboard/server.py | 351 | CODE | |
| LOW | dashboard/server.py | 887 | CODE | |
| LOW | dashboard/server.py | 1254 | CODE | |
| LOW | dashboard/server.py | 1459 | CODE | |
| LOW | dashboard/server.py | 1478 | CODE | |
| LOW | dashboard/server.py | 1620 | CODE | |
| LOW | dashboard/server.py | 1754 | CODE | |
| LOW | dashboard/server.py | 1842 | CODE | |
| LOW | dashboard/server.py | 1273 | CODE | |
| LOW | dashboard/server.py | 2403 | CODE | |
| LOW | dashboard/server.py | 2528 | CODE | |
| LOW | dashboard/court_discuss.py | 322 | CODE | |
| LOW | dashboard/court_discuss.py | 498 | CODE | |
| LOW | scripts/sync_agent_config.py | 60 | CODE | |
| LOW | scripts/sync_agent_config.py | 84 | CODE | |
| LOW | scripts/sync_agent_config.py | 258 | CODE | |
| LOW | scripts/refresh_live_data.py | 21 | CODE | |
| LOW | scripts/sync_from_openclaw_runtime.py | 62 | CODE | |
| LOW | scripts/sync_from_openclaw_runtime.py | 132 | CODE | |
| LOW | scripts/sync_from_openclaw_runtime.py | 208 | CODE | |
| LOW | scripts/skill_manager.py | 312 | CODE | |
| LOW | scripts/sync_officials_stats.py | 78 | CODE | |
| LOW | scripts/sync_officials_stats.py | 137 | CODE | |
| LOW | scripts/kanban_update.py | 49 | CODE | |
| LOW | scripts/kanban_update.py | 556 | CODE | |
| LOW | scripts/refresh_watcher.py | 46 | CODE | |
| LOW | scripts/apply_model_changes.py | 37 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_cwe22_file_url.py | 20 | # Create a fake data dir with agent_config | COMMENT |
| MEDIUM⚡ | tests/test_cwe22_file_url.py | 28 | # Create a temp OCLAW_HOME that doesn't contain the secret file | COMMENT |
| MEDIUM | tests/test_sync_symlinks.py | 38 | # Create a couple of dummy scripts | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | requirements.txt | 1 | # 三省六部 · Python 依赖 | COMMENT |
| LOW | docs/remote-skills-quickstart.md | 21 | --description "MiniMax 多模态 CLI 技能" | COMMENT |
| LOW | docs/remote-skills-quickstart.md | 41 | ``` | COMMENT |
| LOW | docs/task-dispatch-architecture.md | 1061 | # - 参数3:to_dept(流转到谁) | COMMENT |
| LOW | docs/task-dispatch-architecture.md | 1081 | # 效果: | COMMENT |
| LOW | docs/task-dispatch-architecture.md | 1101 | # - 即时渲染为活动条目 | COMMENT |
| LOW | docs/task-dispatch-architecture.md | 1121 | # - task.output = "https://..." | COMMENT |
| LOW | docs/task-dispatch-architecture.md | 1241 | # 尝试伪造门下省的准奏(直接改JSON) | COMMENT |
| LOW | docs/task-dispatch-architecture.md | 1401 | # ═══════════════════════════════════════════════════════════ | COMMENT |
| LOW | docs/task-dispatch-architecture.md | 1561 | # - 完整活动流:79条活动记录 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | edict/backend/app/models/__init__.py | 10 | __all__ = ["AuditLog", "OutboxEvent", "Task", "TaskState", "Event", "Thought", "Todo"] | CODE |
| LOW | edict/backend/app/api/__init__.py | 7 | __all__ = [ | CODE |
| LOW | edict/backend/app/workers/__init__.py | 4 | __all__ = [ | CODE |
| LOW | edict/backend/app/services/__init__.py | 4 | __all__ = ["EventBus", "get_event_bus", "TaskService"] | CODE |
| LOW | edict/backend/app/channels/__init__.py | 46 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README_EN.md | 342 | │ ├── court_discuss.py # Court discussion (multi-agent LLM debate engine) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | edict/backend/app/channels/__init__.py | 40 | "placeholder": ch.placeholder, | CODE |