Harness Engineering实战三: 读者问:Harness的“层”到底写在哪?附完整Demo

0 阅读6分钟

理论再漂亮,落不到项目结构里,都是纸上谈兵。

上周发完《Harness Engineering 实战》,有读者留言: “文中提到的各种层,到底写在哪里?”

非常好的问题,这个是理论到工程落地的问题,这些“层”,需要落地到具体项目的对应结构中。

AI 编程的可靠性,从来不是靠“在对话框里多嘱咐两句”。 是靠工程结构硬约束。

这篇文章直接给一个最小可运行 Demo,供大家参考和一起交流提高。


01

先看目录结构

一个标准的 AI Harness 工程,长这样:

harness-demo/
├── AGENTS.md              # 约束层:AI 的行为准则与边界
├── .pre-commit-config.yaml # 校验层:提交前自动拦截
├── config/
│   └── harness.yaml       # 执行层:工具权限/超时/沙盒配置
├── .github/
│   └── workflows/
│       └── ai-check.yml   # 监控层:CI 流水线强制校验
├── scripts/
│   └── check_ai_code.py   # 自定义校验脚本
├── src/                   # 你的业务代码
└── tests/                 # 单元测试 & 边界用例

别嫌多。 每一层,都在替你挡一个线上故障。


02

让我们来逐层拆解

层一:约束层(AGENTS.md

放哪: 项目根目录。 

作用: AI 启动时自动读取,定义“能做什么/不能做什么”。

# AGENTS.md

## Context
你正在开发一个用户注册服务 (`src/user_service.py`)。

## Security Constraints (红线)
1. **密码安全**:绝对禁止明文存储!必须使用 `bcrypt` 或 `argon2` 哈希。
2. **输入校验**:邮箱必须符合 RFC 5322,禁止使用简单的 `if '@' in email`3. **防注入**:禁止字符串拼接 SQL。必须使用 ORM 或参数化查询。
4. **错误处理**:注册失败时,禁止在异常信息中泄露用户是否存在(防枚举攻击)。

## Tools
优先使用 `pydantic` 校验,`SQLAlchemy 2.0+` 异步语法。

层二:校验层(.pre-commit-config.yaml

放哪: 项目根目录。 

作用: 开发者 git commit 时,自动跑 Lint 与自定义脚本,拦截 AI 幻觉代码。

repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.4.5
    hooks:
      - id: ruff
        args: [--fix, --exit-non-zero-on-fix]
      - id: ruff-format
  - repo: local
    hooks:
      - id: ai-harness-check
        name: AI 代码安全校验
        entry: python scripts/check_ai_code.py
        language: system
        types: [python]

💡 原理与运行机制:这是 Git 的“安检门”。pre-commit 会在你敲下 git commit 的瞬间拦截操作,依次运行列表里的脚本。 

💡怎么跑:只要执行过 pre-commit install,它就会自动挂载到 .git/hooks/。 

💡为什么这么配:ruff 负责秒级格式化;local 钩子调用自定义脚本。若脚本检测到违规(返回 exit code 1),提交直接中止,烂代码进不了仓库。

层三:执行层(config/harness.yaml

放哪: config/ 目录。 

作用: 限制 AI Agent 能调用的 CLI、文件读写白名单、超时阈值。

agent:
  sandbox:
    enabled: true
    allowed_paths:
      - ./src
      - ./tests
      - ./logs
    blocked_commands:
      - rm -rf
      - sudo
      - curl -O
  limits:
    max_tokens_per_request: 8192
    timeout_seconds: 30
    max_file_edits_per_session: 15

💡 原理与运行机制:这是 AI Agent 的“紧箍咒”。不同于给人看的文档,这个文件是给 AI 框架(如 OpenClaw, LangChain, 或 IDE 的 Agent 模式)读取的配置。 

💡 怎么跑:Agent 启动时会自动加载 config/ 下的 YAML,将其转化为运行时的沙盒策略。 

💡 为什么这么配:allowed_paths 限制 AI 只能在项目目录读写,防止误删系统文件;blocked_commands 禁止高危指令;limits 防止 AI 陷入死循环刷爆 Token 账单。

层四:监控层(.github/workflows/ai-check.yml

放哪: .github/workflows/。 

作用: PR 合并前,CI 强制跑完整测试与覆盖率。不达标,不准合入。

name: AI Harness Check
on: [pull_request]

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up Python
        uses: actions/setup-python@v5
        with: { python-version: '3.11' }
      - name: Install deps
        run: pip install -r requirements.txt
      - name: Run Lint
        run: ruff check src/
      - name: Run Tests
        run: pytest tests/ --cov=src --cov-fail-under=80

💡 原理与运行机制:这是云端“终审法庭”。本地检查可能被 git commit --no-verify 绕过,但 GitHub Actions 是服务器端的强制拦截。 

💡 怎么跑:当你发起 Pull Request 时,GitHub 会自动启动虚拟服务器(Runner),按脚本拉代码、装环境、跑测试。 

💡 为什么这么配:on: [pull_request] 确保只在合并前触发;--cov-fail-under=80 强制要求测试覆盖率。只要有一项标红,PR 的 Merge 按钮就是灰色的,谁的面子也不给。


03

Q&A:AI 为什么会乖乖读 AGENTS.md?CLI 怎么用?

Q1:需要装插件或写代码加载吗? 

A:不需要。 这是 2026 年 AI IDE(Cursor/Trae/Qoder/Claude Code)的原生标准。 打开项目时,IDE 会自动扫描根目录的 AGENTS.md,并将其静默注入到 System Prompt 中。 你不需要任何配置。只要文件在,AI 写代码前就已经“背熟”了你的红线。

Q2:如果不用 IDE,直接用 CLI(如终端交互/通用 API)呢? 

A:主流 AI CLI(如 Anthropic 官方 claude)已支持自动读取;但通用终端或旧版 CLI 默认不会读。 

你需要手动注入。提供两种解法:

解法 1:一键注入脚本(推荐) 

在项目根目录建 run.sh,自动把 AGENTS.md 拼成 System Prompt: 

#!/bin/bash
# 读取约束文件
SYSTEM_PROMPT=$(cat AGENTS.md)
# 调用你的 CLI 工具(以 claude 为例)
claude --system "$SYSTEM_PROMPT" "$@"

运行:./run.sh "帮我写用户注册接口"

解法 2:手动拼接 Prompt

System: 你是一个严格遵守项目规范的工程师。请严格遵循以下约束:
[粘贴 AGENTS.md 全文]

User: 帮我写用户注册接口。

结论: IDE 是“自动挡”,CLI 是“手动挡”。Harness 的核心逻辑不变,只是注入方式不同。


04

怎么跑起来?(3 步)

1.初始化环境

pip install -r requirements.txt
pre-commit install

2.让 AI 生成代码

正常用Cursor/Trae/Qoder 或 CLI 写业务。AI 会自动读取 AGENTS.md 约束,输出符合规范的 src/user_service.py。

3.提交拦截

git add .
git commit -m "feat: add user registration"
# 若违反约束(如明文存密码),pre-commit 直接阻断,AI 代码进不了仓库。

05

实测踩过的 2 个坑

坑 1:AI 绕过 pre-commit 

有些开发者用 git commit --no-verify 强行提交。 

解法: 在 GitHub Actions 里加 required: true 分支保护。CI 不绿,PR 按钮是灰的。

坑 2:AGENTS.md 写太长 

AI 对超过 50 行的 System Prompt 注意力会衰减。 

解法: 只写“红线”与“输出格式”。具体实现逻辑,交给代码审查。


06

AI 不是魔法。 

你给它的边界越清晰,它给你的惊喜就越大。

别指望一句“帮我写个系统”就能搞定一切。 

把约束写进文件,把校验交给流水线,把合并权握在自己手里。

这才是 2026 年开发者的生存底线。


🍵 延伸交流 

本文完整 Demo 工程(含 `AGENTS.md` 模板、`pre-commit` 配置、CI 脚本与 `check_ai_code.py` 校验器)已上传。

关注公众号,后台回复 `harness-demo` 自动获取 Gitee 仓库链接。

想交流 AI 相关想法和内容,可扫码进技术交流群。 

群里不卷 KPI,只聊 AI 新玩法、提效工具和偶尔的“合法发呆”。

Image

注:微信群有有效期,假如失效或者满200人,请关注公众号添加微信拉入群。


关于作者

作者:近 20 年技术生涯,待过大厂也创过业。 懂大厂的规范与困境,也懂创业公司的敏捷与无奈。 懂技术也懂商业,实践用技术重构传统业务。公众号「AI 提效随笔」主理人。

欢迎转发,转载请注明出处。


📌 觉得有用?欢迎:

点赞 - 让更多人看到

转发 - 分享给需要的同事/朋友

关注 - 不错过后续更多精彩内容分享