Skip to main content

grading-backend

Grade a team's backend implementation against its spec on 9 weighted dimensions, producing a markdown report + JSON summary with evidence.

Quellinformationen

Repository
jackwener/day3-lab
Letzte Quellaktivität
15. April 2026 um 03:03
Erkannte Sprache von SKILL.md
Chinesisch
Sterne
1
Forks
18

Installationsoptionen

Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.

Quelldateien prüfen

Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.

Datei-Explorer
8 Dateien

SKILL.md wird angezeigt

SKILL.md
Quellanweisungen · Schreibgeschützte Vorschau
name
grading-backend
description
Grade a team's backend implementation against its spec on 9 weighted dimensions, producing a markdown report + JSON summary with evidence.
# grading-backend 给 AI 培训项目后端实现打分。50 学员分成 ~12 组,按 spec-driven 方式实现本地部署的后端服务。本 skill 让 Claude(或 Qoder / Cursor / Claude Code agent)按统一 rubric 给某一组的后端打分,产出可给学员的 markdown 报告 + 可汇总 leaderboard 的 JSON。 --- ## 前置依赖 - **本地可跑**:待评后端能在本机启动(`npm run dev` / `uvicorn ...` / `go run ./...` / `./gradlew bootRun` 等),默认 `http://localhost:8080`(按项目 README 调整),有 health check 端点(`/health` / `/healthz` / `/ping`)或其他就绪信号。 - **Spec 文档位置**:`<project>/docs/spec.md` 或 `<project>/README.md` 或 `<project>/spec/*`。找不到则先向用户确认 spec 路径再开工,不要凭空评分。 - **Node.js 环境**:Node ≥ 18,用来跑 `npx ajv-cli` 校验 JSON、`npx autocannon` 做压测。 - **curl**:所有接口探针和取证命令基于 curl,macOS / Linux 自带即可。 - **输出目录**:所有证据和报告写到待评项目根目录下的 `.grading/`(已由 spec 约定 gitignore)。 **约定的工作目录**:所有 probe 脚本和 `.grading/` 输出都默认在**待评项目根目录**下执行。即评分时: 1. cd 到被评项目(如 `cd group-workshop/group-2`) 2. 用绝对路径调用 probe:`bash $WORKSHOP_ROOT/skills/grading-backend/probes/probe-robustness.sh team-2 http://localhost:8080 /api/items` 3. `.grading/` 会落到被评项目根下,与该项目共生 --- ## 共享契约(必读) 评分开始前,**必须先读完本文件** `## 评分标尺` / `## 报告模板` / `## 证据硬约束` 三段,以及 `../score-schema.json`。这些是 frontend / backend 两个 skill 共用的硬约束,不读会导致输出格式不一致、无法汇总 leaderboard: 1. 见本文件 **## 评分标尺** — 0–10 标尺含义 + S/A/B/C/D 档位定义。**所有维度打分必须对照此标尺**。 2. 见本文件 **## 报告模板** — 统一 Markdown 报告模板。产出的 `report.md` 必须照此结构填充。 3. `../score-schema.json` — JSON 摘要的 schema。产出的 `summary.json` 必须通过此 schema 校验。 4. 见本文件 **## 证据硬约束** — 打分 ≥7 或 ≤4 必须 ≥2 条证据,5–6 分必须 ≥1 条。违反则打分视为无效。 --- ## 评分标尺(0–10) 本段是 `grading-frontend` 与 `grading-backend` 两个 skill 共享的**唯一**打分锚点。两侧所有维度得分都必须按本表落点,再用证据说明为什么不是相邻的锚点。 ### 1. 分数锚点 | 分数 | 名称 | 判定标准 | |---:|---|---| | **10** | 工业级范本 | 可直接作为下一届教学样例;评分人找不到该维度的改进空间;相对已见过的最好学员作业也明显领先 | | **9** | 优秀 | 核心完全到位,仅 1–2 处非关键瑕疵(例如边缘场景文案、极端断点、冷路径日志) | | **7** | 良好 | 主流程到位,但存在 ≥3 处可改进;不影响交付但明显看得出赶工痕迹 | | **5** | 及格 | Happy path 能跑,但明显粗糙;有 1 类系统性漏洞(如缺状态、缺校验)但未致命 | | **3** | 不及格 | 该项存在尝试痕迹但严重不完整;主要子项缺失或逻辑错误 | | **0** | 未实现 | 完全缺失,或实现了但跑不起来 | | **N/A** | 不适用 | spec 明确未要求,或该维度在本项目栈上无意义;**必须写原因**,不计入总分 | **允许的分数**:0、3、5、7、9、10 是锚点;1/2/4/6/8 仅在证据支持"介于两锚点之间"时使用。不允许出现小数。 ### 2. 打分操作规则 1. **先选锚点,再微调**:拿到证据后先对齐最接近的锚点(10/9/7/5/3/0),再用证据决定 ±1 微调。禁止"先拍个 8 再补证据"。 2. **高低分必须有证据**: - `score ≥ 7` → 至少 2 条证据 - `score ≤ 4` → 至少 2 条证据 - `5–6` → 至少 1 条证据 - 详细规则见本文件 `## 证据硬约束` 段 3. **N/A 必须写原因**:`na_reason` 字段必填,格式 `"spec §X.Y 未涉及此项"` 或 `"技术栈 Z 无此概念"`。N/A 不计入总分。 4. **不能同时低分 + 高评**:如果评语是"很好,只差一点",分数不能 ≤ 5。 5. **锚点冲突时就低不就高**:若一个维度既符合 9 的正面描述也命中 5 的负面描述,取 5(警戒作用)。 ### 3. 总分计算 **公式**(N/A 不计入分母): ``` total = Σ(score_i × weight_i) / Σ(weight_i for dim_i where score_i != null) × 100 / 10 ``` 等价形式:先对非 N/A 维度算加权平均(0–10),再把有效权重归一化到 100,最后乘 10 映射到 0–100。 **例子**:前端 10 维总权重 100,若 `微文案 (权重 6)` 被判 N/A: - 有效权重总和 = 94 - 其余 9 维加权和 = Σ(score_i × weight_i) - `total = (Σ / 94) × 10` ### 4. 总分档位 | 档位 | 分数区间 | 含义 | |:---:|:---:|---| | **S** | ≥ 90 | 可作为本届教学样例 | | **A** | 80–89 | 合格交付,小范围打磨即可上线 | | **B** | 70–79 | 主流程 OK,系统性问题需要返工 | | **C** | 60–69 | 能 demo,不能交付;多处结构性缺陷 | | **D** | < 60 | 未达培训目标,需重做关键模块 | 档位只用于班级 leaderboard 横向对比,学员反馈以**维度得分 + 证据 + 改进清单**为主。 --- ## 报告模板 两个 grading skill 产出的 `.grading/reports/<team>-<side>.md` **必须**严格按本模板。字段缺一不可;无信息时填 `—`,**不要省略行**。模板本体用四个反引号包裹的 Markdown 代码块呈现,复制时去掉最外层反引号。 ### 使用说明 - 占位符形如 `{队伍名}`,落地时替换为实际值 - 维度详评块按 `grading-frontend` 10 维 / `grading-backend` 9 维完整展开,不能合并或省略 - 任一维度证据不足时,score 填 `null`,`na_reason` 填 `EVIDENCE_MISSING: ...`,并在末尾"评分风险"段汇总 - 报告的同级必须存在对应 JSON:`<team>-<side>.json`,schema 见 `../score-schema.json` ### 模板 ````markdown # 项目评分报告 — {队伍名}({前端 | 后端}) - 评分人:{Claude@model-id / 助教姓名} - 日期:{YYYY-MM-DD} - Spec 版本:{git sha 或 docs/spec.md 路径} - 被评项目 commit:{sha} - 评分耗时:{xx 分钟} ## 总分:{score} / 100 — 等级 {S | A | B | C | D} ## 维度汇总 | # | 维度 | 得分 | 权重 | 加权 | 一句话 | |---:|---|---:|---:|---:|---| | 1 | {维度名} | {0–10 或 N/A} | {w} | {score×w/10} | {一句话概述} | | 2 | ... | ... | ... | ... | ... | > 有效权重总和:{Σw_non-NA};N/A 维度:{列表或 "无"} ## 逐维度详评 ### 1. {维度名} — {score}/10(权重 {w}) **证据** - `path/to/file.ext:L12-L40` — {这条证据说明了什么} - 截图:`.grading/shots/{team}-{view}.png` - 命令:`curl -s localhost:8080/api/x` → `.grading/probes/{team}-x.log` **要到 10 差什么** 1. {具体、可操作的改进建议} 2. {...} 3. {...} --- ### 2. {维度名} — {score}/10(权重 {w}) (同样模板,完整列出所有维度) --- ## 亮点 - {值得表扬的 2–4 条,要带证据} ## 最该优先修的 3 件事 1. **{问题}** — 影响:{哪个维度掉了多少分};改法:{一两句话说清} 2. ... 3. ... ## 评分风险(可选) 仅当出现以下情况时填写,否则删除整节: - 证据不足被判 `EVIDENCE_MISSING` 的维度列表 - 评分人对某维度存疑但无法进一步取证的原因 - 项目未跑起来 / spec 缺失等影响评分可信度的事实 ```` ### 校验清单(写完报告后自检) - [ ] 总分 = Σ(加权列) × 10 / Σ(有效权重),数值对得上 - [ ] 每个维度都有至少一条引用(证据 / 截图 / 日志 / spec 条目) - [ ] 所有 N/A 都有 `na_reason` - [ ] "最该优先修的 3 件事" 每条都回指了具体维度 - [ ] 对应 JSON 已写入 `.grading/reports/<team>-<side>.json` --- ## 证据硬约束 本段是**打分是否有效**的判定规则。`grading-frontend` 和 `grading-backend` 两个 skill 在写入每个维度分数前**必须**先检查本表;证据不达标的打分视为无效。 设计目的:防止 agent 在缺乏实际观察的情况下拍脑袋打分。**宁可多一个 `EVIDENCE_MISSING`,不要编一个好看的分数**。 ### 1. 证据条数规则 | 分数段 | 最少证据条数 | 说明 | |---:|:---:|---| | **9–10** | **3** | 高分必须可复现;至少覆盖:1 条代码引用 + 1 条运行期证据(截图/probe/log) + 1 条 spec 比对 | | **7–8** | **2** | 需同时体现"主流程到位"与"非关键瑕疵" | | **5–6** | **1** | 一条即可,但必须能指出具体缺陷 | | **3–4** | **2** | 低分不能靠印象;必须列出 ≥2 个具体失败点 | | **0** | **1** | 至少证明"真的没有":grep 结果、spec 条目 + 代码库缺失、启动失败日志 | | **N/A** | **1** | 必须引用 spec 条目或技术栈说明,证明该项"不适用" | ### 2. 证据合法形式 每条证据必须是以下 4 类之一,**不得**为自然语言转述: 1. **代码引用**:`path/to/file.ext:L{start}-L{end}` 或 `path/to/file.ext:L{line}` - 路径必须相对项目根 - 必须真实存在(评分前 open / grep 确认过) 2. **截图**:`.grading/shots/<team>-<view>.png` - 文件必须存在;后端维度一般不使用 - 可附简短说明:"登录页 desktop 1280×800,有 layout shift" 3. **命令日志**:`.grading/probes/<team>-<probe>.log` 或在证据行内直接给出命令与关键输出 - 形如:`curl -s -o /dev/null -w "%{http_code}" localhost:8080/api/x -d '{}' → 500` - 压测结果引用 autocannon 输出文件 4. **Spec 引用**:`spec §3.2` / `docs/spec.md:L120-L145` / issue 链接 - 判定 N/A 或 Spec 一致性时必用 ### 3. 违规处理 #### 3.1 证据不足 若按 §1 无法凑够所需证据条数: 1. `score` 置为 `null` 2. `na_reason` 写为 `"EVIDENCE_MISSING: 需要 N 条证据,仅能取得 M 条(已尝试:<动作清单>)"` 3. 在报告末尾 `## 评分风险` 段落列出该维度 4. 该维度**不计入总分分母**(与正常 N/A 一致),但在评分风险段标注"非 spec 排除项" #### 3.2 证据伪造 / 占位 评分人/agent 若写入以下任一形式的证据,该维度直接作废并降级为 `EVIDENCE_MISSING`: - 路径不存在的 file:line(lint:评分后用 `test -f` 批量校验) - 截图文件不存在或大小为 0 - 命令日志内容与结论自相矛盾 - 描述性语言("代码组织得不错")未附具体引用 #### 3.3 高低分无证据 - `score ≥ 7` 但证据 < 2 条 → 降为 6,或标 `EVIDENCE_MISSING` - `score ≤ 4` 但证据 < 2 条 → 升为 5,或标 `EVIDENCE_MISSING` 选择哪个处理取决于评分人对维度的把握;两种方式都必须在"评分风险"中注明。 ### 4. 证据收集建议顺序 先做便宜的、可批量的,再做昂贵的: 1. **静态** (cheap):`grep` / `rg` 扫关键词、看 package.json / schema / migration 2. **Spec 对齐**:逐条把 spec 检查项对到代码文件 3. **运行期**:启 dev server / 后端服务,跑截图脚本 / probe 脚本 4. **交互**:走完主流程,看 console / network / 日志 5. **测试**:跑 test suite,看覆盖率与失败清单 每跑完一步把产物落盘到 `.grading/`,在报告证据行里引用相对路径即可。 --- ## 配套资源 按需读取(不是每次都读全部): - **`./anti-patterns.md`** — 后端反模式清单。**打"健壮性"、"代码分层"、"性能"三个维度时必读**,用来识别 controller 里写 SQL、裸 `try/except: pass` 吞异常、循环里 query 造成 N+1、写操作非幂等、错误响应结构每接口不同等典型滑坡。 - **`./examples/good-report.md`** 和 **`./examples/mediocre-report.md`** — 两份标定样例报告。**打分前读一次做分布校准**,避免全班都打 8 分这种分不开档的问题。 - **`./probes/probe-robustness.sh`** — 健壮性探针组合,跑 8 个场景(空 body / 错类型 / 超长字段 / 缺必填 / 越权 / 幂等重放 / 并发冲突 / 未登录)。取证时直接 `bash ./probes/probe-robustness.sh <team> <base-url> <path>`,不要手搓 curl。每个 probe 写 `.grading/probes/<team>-<probe-name>.log`,总表写 `.grading/probes/<team>-robustness-summary.md`。 - **`./probes/probe-performance.sh`** — 基于 `npx autocannon` 的 p50/p95/p99 压测脚本,输出 `.grading/probes/<team>-autocannon.log`(原始 autocannon 输出)和 `.grading/probes/<team>-perf-summary.txt`(解析后的 p50/p95/rps + rubric 建议)。 --- ## 评分流程(5 步) ### 步骤 1:定位与启动 1. 确认 spec 路径,记录 `spec_sha`(若 spec 在 git 仓库内)。 2. 读完 spec,列出:接口清单(method + path + 入参 + 出参 + 状态码) / 数据模型 / 权限角色 / 关键写操作。 3. 读 `package.json` / `pyproject.toml` / `go.mod` / `pom.xml` 识别技术栈(Node/Python/Go/Java、ORM、测试框架、日志库),记录 `project_sha`。 4. 启动后端服务,确认 `http://localhost:<port>/<health>` 可访问(curl 拿到 200 或 spec 约定的就绪响应)。如启动失败直接记录在报告"启动阻塞"一节,本维度不硬给 0 分,但在"Spec 一致性"里扣分。 ### 步骤 2:收集证据(evidence-first) **静态证据**: - 用 Grep/Glob 扫接口清单、分层目录(controller/service/repo)、schema / 迁移、测试目录、日志代码。 - 为每个维度预留至少 1 处 `file:line` 引用。 **动态证据**: ```bash # 健壮性:对主要写接口跑一遍 8 个 probe bash ./probes/probe-robustness.sh <team> http://localhost:8080 /api/items # 性能:对 GET 主列表接口 & POST 主写接口各压一次 bash ./probes/probe-performance.sh <team> http://localhost:8080 /api/items # 测试套件(按栈择一) npm test -- --coverage # Node pytest --cov # Python go test -cover ./... # Go # 手工 curl:对 spec 列出的每个接口至少调一次,记录 method + path + 状态码 + 响应体 curl -i -X GET http://localhost:8080/api/items curl -i -X POST http://localhost:8080/api/items -H 'Content-Type: application/json' -d '{"name":"demo"}' ``` 所有 probe 日志落到 `.grading/probes/<team>-*.log`,手工 curl 的关键输出也要 `tee` 进 `.grading/probes/<team>-curl.log`。 **交互证据**:按 spec 的主业务流(注册 → 登录 → 创建 → 查询 → 更新 → 删除,或 spec 指定流程)串一遍,记录每步状态码、响应体片段、异常。 ### 步骤 3:按 9 维度逐条打分 > ⚠️ 取证不足时的强制行为 > > - 维度打分 ≥7 或 ≤4 时,证据条数低于 evidence-requirements.md 规定的最低条数 → score 必须置 null,na_reason 写 "EVIDENCE_MISSING: 已尝试 X、Y,未能取得 Z" > - 这与 "spec 未要求" 的 N/A 是两回事:N/A 写 "N/A — spec §X.Y 未规定" > - 所有 EVIDENCE_MISSING 维度必须在报告底部 "## 评分风险" 段汇总列出 对照本文件下方 rubric(以及本文件 `## 评分标尺` 段),逐维度 0–10 打分。每一条打分必须附证据(file:line / curl log 行号 / probe log 行号 / 测试输出行号)。spec 未要求的维度写 "N/A — 原因",不计入总分。 ### 步骤 4:产出 report.md + summary.json
Auf GitHub ansehen
Diese SKILL.md ist sehr gross, daher zeigt SkillsMP hier nur den ersten Abschnitt. Auf GitHub ansehen