mcpField
L
ln-642-layer-boundary-auditor

ln-642-layer-boundary-auditor

github.com/levnikolaevich测试与质量584293 次安装2 天前更新
代码仓库

关于 ln-642-layer-boundary-auditor

用于审计架构分层的技能,根据项目架构检测层边界违规,并检查事务、会话所有权和 HTTP 客户端抽象等跨层一致性。它向协调器返回带位置和建议的违规项。

主要功能

  1. 01从架构文档识别分层结构
  2. 02检测层外的 I/O 操作
  3. 03检查事务边界与会话所有权
  4. 04检查 HTTP 调用抽象覆盖率
  5. 05输出违规位置及修复建议

适用场景

  1. 01查找基础设施层之外的 I/O 代码
  2. 02定位跨层事务控制不一致
  3. 03检查 HTTP 调用是否经过客户端抽象

MCP 相关

可优先使用 hex-graph 分析引用、调用路径和架构耦合,使用 hex-line 读取代码及配置;若 MCP 不可用或未索引,则改用内置工具。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/levnikolaevich/claude-code-skills --skill ln-642-layer-boundary-auditor

安装后在 Claude Code 中输入/ln-642-layer-boundary-auditor确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
ai_ready_architecture.md
audit_scoring.md
audit_summary_contract.md
audit_worker_core_contract.md
cleanup_evidence_contract.md
evaluation_coordinator_runtime_contract.md
evaluation_parallelism_policy.md
evaluation_research_contract.md
evaluation_summary_contract.md
evaluation_worker_runtime_contract.md
layer_rules.md
loop_health_contract.md
mcp_integration_patterns.md
mcp_tool_preferences.md
refinement_trace_contract.md
scoring_rules.md
references/scripts/coordinator-runtime/lib/
artifacts.mjs
cli-helpers.mjs
core.mjs
loop-health.mjs
runtime-constants.mjs
schemas.mjs
validate.mjs
worker-guards.mjs
worker-runtime.mjs
references/scripts/evaluation-runtime/
cli.mjs
references/scripts/evaluation-runtime/lib/
guards.mjs
store.mjs
references/scripts/evaluation-worker-runtime/
cli.mjs
references/scripts/evaluation-worker-runtime/lib/
guards.mjs

详细介绍

**路径:**文件路径(references/、../ln-*)均相对于此技能目录。

层边界审计器

**类型:**L3 Worker

用于审计架构层边界并检测违规的 L3 Worker。

目的与范围

  • 读取 architecture.md,了解项目的分层结构
  • 检测层违规(基础设施层之外的 I/O 代码)
  • 检测跨层一致性问题:
    • 事务边界(提交/回滚的归属)
    • 会话归属(DI 或本地)
  • 检查模式覆盖率(所有 HTTP 调用均使用客户端抽象)
  • 检测错误处理重复
  • 向协调器返回违规列表

范围之外(由 ln-628-concurrency-auditor 负责):

  • 异步函数中的阻塞 I/O(在 async def 中使用同步 open/read)
  • 即发即弃任务(create_task 未设置错误处理器)

输入(来自 ln-640)

- architecture_path: string    # Path to docs/architecture.md
- codebase_root: string        # Root directory to scan
- skip_violations: string[]    # Files to skip (legacy)
- output_dir: string           # e.g., ".hex-skills/runtime-artifacts/runs/{run_id}/audit-report"

# Domain-aware (optional, from coordinator)
- domain_mode: "global" | "domain-aware"   # Default: "global"
- current_domain: string                   # e.g., "users", "billing" (only if domain-aware)
- scan_path: string                        # e.g., "src/users/" (only if domain-aware)

**当 domain_mode="domain-aware" 时:**所有 Grep/Glob 操作均使用 scan_path,而不是 codebase_root。为所有发现添加 domain 字段标签。

工作流

**必须阅读:**加载 references/two_layer_detection.md,了解检测方法。 **必须阅读:**加载 references/mcp_tool_preferences.md 和 references/mcp_integration_patterns.md

当引用、调用路径或架构耦合能显著提升审计效果时,优先使用 hex-graph。如可用,读取本地代码和配置时优先使用 hex-line。如果 MCP 不可用、不受支持或未建立索引,则使用内置的 Read/Grep/Glob/Bash 继续,并在报告中说明回退方案。

阶段 1:发现架构

**必须阅读:**加载 ../ln-640-pattern-evolution-auditor/references/layer_rules.md —— 使用 Architecture Presets(回退方案)、I/O Pattern Boundary Rules(阶段 2)、Coverage Checks(阶段 4)和 Cross-Layer Consistency rules(阶段 3)。

Read docs/architecture.md

Extract from Section 4.2 (Top-Level Decomposition):
  - architecture_type: "Layered" | "Hexagonal" | "Clean" | "MVC" | etc.
  - layers: [{name, directories[], purpose}]

Extract from Section 5.3 (Infrastructure Layer Components):
  - infrastructure_components: [{name, responsibility}]

IF architecture.md not found:
  Use fallback presets from layer_rules.md

Build ruleset:
  FOR EACH layer:
    allowed_deps = layers that can be imported
    forbidden_deps = layers that cannot be imported

**图分析加速(如果可用):**如果 contextStore.graph_indexed 为真,或 .hex-skills/codegraph/index.db 存在:

  • 模块耦合:analyze_architecture(path=scan_root, verbosity="full") —— 使用返回的耦合度指标识别紧密耦合的层。
  • **跨层调用:**对事务/会话函数使用 find_references(symbol) —— 跟踪各层的提交/回滚归属。
  • 编排深度:trace_paths(name="ServiceFn", file="...", path_kind="calls", direction="forward", depth=3, path=scan_root) —— 从具体的服务符号测量调用链深度,以检查编排是否扁平。
  • 对粗略或模块级选择器执行 trace_paths 后结果为空,并不足以判定某层无问题;如果选择器范围较广,请改用 inspect_symbol 或 grep/人工审查。
  • 如果图索引不可用,则回退到下文基于 grep 的检测。
阶段 2:检测层违规
scan_root = scan_path IF domain_mode == "domain-aware" ELSE codebase_root

FOR EACH violation_type IN layer_rules.md I/O Pattern Boundary Rules:
  grep_pattern = violation_type.detection_grep
  forbidden_dirs = violation_type.forbidden_in

  matches = Grep(grep_pattern, scan_root, include="*.py,*.ts,*.js")

  FOR EACH match IN matches:
    IF match.path NOT IN skip_violations:
      IF any(forbidden IN match.path FOR forbidden IN forbidden_dirs):
        violations.append({
          type: "layer_violation",
          severity: "HIGH",
          pattern: violation_type.name,
          file: match.path,
          line: match.line,
          code: match.context,
          allowed_in: violation_type.allowed_in,
          suggestion: f"Move to {violation_type.allowed_in}"
        })
阶段 3:跨层一致性检查
3.1 事务边界违规

**检查内容:**commit()/rollback() 在不一致的层中调用(repo + service + API)

检测:

repo_commits = Grep("\.commit\(\)|\.rollback\(\)", "**/repositories/**/*.py")
service_commits = Grep("\.commit\(\)|\.rollback\(\)", "**/services/**/*.py")
api_commits = Grep("\.commit\(\)|\.rollback\(\)", "**/api/**/*.py")

layers_with_commits = count([repo_commits, service_commits, api_commits].filter(len > 0))

安全模式(忽略):

  • 同一上下文中有注释 "# best-effort telemetry"
  • 文件以 _callbacks.py 结尾(进度通知器)
  • 有明确的 # UoW boundary 注释

违规规则:

条件严重性问题
layers_with_commits >= 3严重所有层的 UoW 归属混杂
repo + api commits高事务控制绕过了服务层
repo + service commits高UoW 归属不明确(repo 还是 service)
service + api commits中事务控制跨越服务层和 API 层

**例外:**如果是 Saga 模式/分布式事务,并且有明确的补偿操作,则将严重性从严重降为中。使用 // architecture decision 或 ADR 记录 UoW 边界时,跳过检查。

**建议:**选择单一的 UoW 归属方(推荐服务层),并从其他层移除 commit()

**工作量:**L(需要架构决策和重构)

3.2 会话所有权违规

内容: 同一调用链中混用 DI 注入的会话和本地创建的会话

检测:

di_session = Grep("Depends\(get_session\)|Depends\(get_db\)", "**/api/**/*.py")
local_session = Grep("AsyncSessionLocal\(\)|async_sessionmaker", "**/services/**/*.py")
local_in_repo = Grep("AsyncSessionLocal\(\)", "**/repositories/**/*.py")

违规规则:

条件严重性问题
同一模块中有 di_session AND local_in_repoHIGHAPI 注入了不同的会话,而仓库自行创建会话
调用基于 DI 的仓库的服务中有 local_sessionMEDIUM调用链中的会话不匹配

建议: 始终使用 DI,或始终使用本地会话。记录例外情况(例如遥测)

工作量: M

3.3 扁平编排违规

内容: 服务层函数调用其他服务,而这些服务又调用更多服务,形成深层编排链。

检测: 必须阅读: 加载 references/ai_ready_architecture.md — 映射服务导入,查找调用链深度。

违规规则:

条件严重性问题
服务链 >= 3 (A->B->C->D)HIGH深层编排
服务链 = 2 (A->B->C)MEDIUM考虑扁平化

建议: 提取一个在同一层级调用所有服务的编排器。每个服务都成为终点。

工作量: L


阶段 4:检查模式覆盖率
# HTTP Client Coverage
all_http_calls = Grep("httpx\\.|aiohttp\\.|requests\\.", codebase_root)
abstracted_calls = Grep("client\\.(get|post|put|delete)", infrastructure_dirs)

IF len(all_http_calls) > 0:
  coverage = len(abstracted_calls) / len(all_http_calls) * 100
  IF coverage < 90%:
    violations.append({
      type: "low_coverage",
      severity: "MEDIUM",
      pattern: "HTTP Client Abstraction",
      coverage: coverage,
      uncovered_files: files with direct calls outside infrastructure
    })

# Error Handling Duplication
http_error_handlers = Grep("except\\s+(httpx\\.|aiohttp\\.|requests\\.)", codebase_root)
unique_files = set(f.path for f in http_error_handlers)

IF len(unique_files) > 2:
  violations.append({
    type: "duplication",
    severity: "MEDIUM",
    pattern: "HTTP Error Handling",
    files: list(unique_files),
    suggestion: "Centralize in infrastructure layer"
  })
阶段 5:计算评分

必须阅读: 加载 references/audit_worker_core_contract.md 和 references/audit_scoring.md。

阶段 6:编写报告

必须阅读: 加载 references/audit_worker_core_contract.md 和 references/templates/audit_worker_report_template.md。

按照 references/audit_summary_contract.md 编写 JSON 摘要。在托管模式下,调用方会同时传入 runId 和 summaryArtifactPath;在独立模式下,工作器会按照共享契约生成自己的、限定于本次运行的工件路径。

# Build markdown report in memory with:
# - AUDIT-META (standard penalty-based: score, counts)
# - Checks table (io_isolation, http_abstraction, error_centralization, transaction_boundary, session_ownership)
# - Findings table (violations sorted by severity)
# - DATA-EXTENDED: {architecture, coverage}

IF domain_mode == "domain-aware":
  Write to {output_dir}/642-layer-boundary-{current_domain}.md
ELSE:
  Write to {output_dir}/642-layer-boundary.md
阶段 7:返回摘要
Report written: .hex-skills/runtime-artifacts/runs/{run_id}/audit-report/642-layer-boundary-users.md
Score: 4.5/10 | Issues: 8 (C:1 H:3 M:4 L:0)

关键规则

必须阅读: 加载 references/audit_worker_core_contract.md。

  • 首先阅读 architecture.md - 切勿假设架构类型
  • 跳过违规列表 - 遵守标记为逐步修复的遗留文件
  • 文件 + 行号 + 代码 - 始终提供带上下文的准确位置
  • 提供可执行的建议 - 始终指出应将代码移到哪里
  • 避免误报 - 验证路径包含被禁止的目录,而不仅仅是子字符串

完成定义

必须阅读: 加载 references/audit_worker_core_contract.md。

  • 从 docs/architecture.md 中确定架构(或使用备用方案)
  • 检查 layer_rules.md 中的所有违规类型
  • 检查跨层一致性:
    • 分析事务边界(commit/rollback 分布)
    • 分析会话所有权(DI 与本地会话)
  • 计算 HTTP 抽象和 2 项一致性指标的覆盖率
  • 违规列表包含严重性、位置和建议
  • 若具备领域感知:所有 Grep 均限定在 scan_path,发现项标记所属领域
  • 将报告写入 {output_dir}/642-layer-boundary[-{domain}].md(通过单次 Write 调用以原子方式写入)
  • 按契约编写摘要

参考文件

  • 分层规则:../ln-640-pattern-evolution-auditor/references/layer_rules.md
  • 评分影响:../ln-640-pattern-evolution-auditor/references/scoring_rules.md

版本: 2.1.0 最后更新: 2026-02-08

评论

支持 Markdown