🏛️ 三省六部制 · OpenClaw Multi-Agent Orchestration System — 9 specialized AI agents with real-time dashboard, model config, and full audit trails
This report summarizes scanner evidence for cft0808/edict, a Python project with 16,986 GitHub stars. SynthScan examined 38,937 lines of code across 168 source files, recording 424 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 17.9 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 111 finding(s).
Are imports declared and package/API names verified? 80 finding(s).
Are wrappers, guards, and repeated structures necessary? 291 finding(s).
Which changes need focused human review? 424 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 424 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| 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 |
|---|---|---|---|---|
| HIGH | edict/backend/app/api/websocket.py | 134 | except WebSocketDisconnect: | CODE |
| HIGH | edict/backend/app/workers/dispatch_worker.py | 200 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | edict/backend/app/workers/dispatch_worker.py | 226 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | edict/backend/app/workers/dispatch_worker.py | 245 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | edict/backend/app/workers/dispatch_worker.py | 301 | except OSError: | CODE |
| HIGH | edict/backend/app/workers/dispatch_worker.py | 626 | except OSError: | CODE |
| HIGH | dashboard/server.py | 346 | except Exception: | CODE |
| HIGH | dashboard/server.py | 431 | except ImportError: | CODE |
| HIGH | dashboard/server.py | 460 | except Exception: | CODE |
| HIGH | dashboard/server.py | 578 | except Exception: | CODE |
| HIGH | dashboard/server.py | 1776 | except Exception: | CODE |
| HIGH | dashboard/server.py | 2059 | except Exception: | CODE |
| HIGH | dashboard/server.py | 2344 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | dashboard/server.py | 2361 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | dashboard/server.py | 2376 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | dashboard/server.py | 511 | except Exception: | CODE |
| HIGH | dashboard/server.py | 944 | except Exception: | CODE |
| HIGH | dashboard/server.py | 2567 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | scripts/sync_agent_config.py | 190 | except Exception: | CODE |
| HIGH | scripts/sync_agent_config.py | 291 | except Exception: | CODE |
| HIGH | scripts/refresh_live_data.py | 54 | except Exception: | CODE |
| HIGH | scripts/fetch_morning_news.py | 99 | except Exception: | CODE |
| HIGH | scripts/fetch_morning_news.py | 164 | except Exception: | CODE |
| HIGH | scripts/file_lock.py | 53 | except OSError: | CODE |
| HIGH | scripts/sync_from_openclaw_runtime.py | 247 | except Exception: | CODE |
| HIGH | scripts/sync_from_openclaw_runtime.py | 257 | except Exception: | CODE |
| HIGH | scripts/skill_manager.py | 152 | except Exception: | CODE |
| HIGH | scripts/sync_officials_stats.py | 121 | except Exception: pass | CODE |
| HIGH | scripts/sync_officials_stats.py | 100 | except Exception: pass | CODE |
| HIGH | scripts/sync_officials_stats.py | 120 | except Exception: pass | CODE |
| HIGH | scripts/utils.py | 65 | except ValueError: | CODE |
| HIGH | scripts/kanban_update.py | 121 | except Exception: | CODE |
| HIGH | scripts/kanban_update.py | 129 | except Exception: | CODE |
| HIGH | scripts/refresh_watcher.py | 93 | except Exception: | CODE |
| HIGH | scripts/refresh_watcher.py | 70 | except FileNotFoundError: | CODE |
| HIGH | scripts/apply_model_changes.py | 33 | except OSError: | CODE |
| 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 |