ワンクリックで
grading-frontend
// Grade a team's frontend implementation against its spec on 10 weighted dimensions, producing a markdown report + JSON summary with evidence.
// Grade a team's frontend implementation against its spec on 10 weighted dimensions, producing a markdown report + JSON summary with evidence.
| name | grading-frontend |
| description | Grade a team's frontend implementation against its spec on 10 weighted dimensions, producing a markdown report + JSON summary with evidence. |
给 AI 培训项目前端实现打分。50 学员分成 ~12 组,按 spec-driven 方式实现本地部署的网站。本 skill 让 Claude(或 Qoder / Cursor / Claude Code agent)按统一 rubric 给某一组的前端打分,产出可给学员的 markdown 报告 + 可汇总 leaderboard 的 JSON。
npm run dev / pnpm dev / yarn dev 启动,默认 http://localhost:3000(按项目 README 调整)。<project>/docs/spec.md 或 <project>/README.md 或 <project>/spec/*。找不到则先向用户确认 spec 路径再开工,不要凭空评分。npx playwright 截图、npx ajv-cli 校验 JSON。首次使用时 npx playwright install chromium。.grading/(已由 spec 约定 gitignore)。约定的工作目录:所有 probe 脚本和 .grading/ 输出都默认在待评项目根目录下执行。即评分时:
cd group-workshop/group-2)bash $WORKSHOP_ROOT/skills/grading-frontend/probes/probe-screenshots.sh team-2 http://localhost:3000.grading/ 会落到被评项目根下,与该项目共生评分开始前,必须先读完本文件 ## 评分标尺 / ## 报告模板 / ## 证据硬约束 三段,以及 ../score-schema.json。这些是 frontend / backend 两个 skill 共用的硬约束,不读会导致输出格式不一致、无法汇总 leaderboard:
report.md 必须照此结构填充。../score-schema.json — JSON 摘要的 schema。产出的 summary.json 必须通过此 schema 校验。本段是 grading-frontend 与 grading-backend 两个 skill 共享的唯一打分锚点。两侧所有维度得分都必须按本表落点,再用证据说明为什么不是相邻的锚点。
| 分数 | 名称 | 判定标准 |
|---|---|---|
| 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 仅在证据支持"介于两锚点之间"时使用。不允许出现小数。
score ≥ 7 → 至少 2 条证据score ≤ 4 → 至少 2 条证据5–6 → 至少 1 条证据## 证据硬约束 段na_reason 字段必填,格式 "spec §X.Y 未涉及此项" 或 "技术栈 Z 无此概念"。N/A 不计入总分。公式(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:
total = (Σ / 94) × 10| 档位 | 分数区间 | 含义 |
|---|---|---|
| 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 维完整展开,不能合并或省略null,na_reason 填 EVIDENCE_MISSING: ...,并在末尾"评分风险"段汇总<team>-<side>.json,schema 见 ../score-schema.json# 项目评分报告 — {队伍名}({前端 | 后端})
- 评分人:{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 缺失等影响评分可信度的事实
na_reason.grading/reports/<team>-<side>.json本段是打分是否有效的判定规则。grading-frontend 和 grading-backend 两个 skill 在写入每个维度分数前必须先检查本表;证据不达标的打分视为无效。
设计目的:防止 agent 在缺乏实际观察的情况下拍脑袋打分。宁可多一个 EVIDENCE_MISSING,不要编一个好看的分数。
| 分数段 | 最少证据条数 | 说明 |
|---|---|---|
| 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 条目或技术栈说明,证明该项"不适用" |
每条证据必须是以下 4 类之一,不得为自然语言转述:
path/to/file.ext:L{start}-L{end} 或 path/to/file.ext:L{line}
.grading/shots/<team>-<view>.png
.grading/probes/<team>-<probe>.log 或在证据行内直接给出命令与关键输出
curl -s -o /dev/null -w "%{http_code}" localhost:8080/api/x -d '{}' → 500spec §3.2 / docs/spec.md:L120-L145 / issue 链接
若按 §1 无法凑够所需证据条数:
score 置为 nullna_reason 写为 "EVIDENCE_MISSING: 需要 N 条证据,仅能取得 M 条(已尝试:<动作清单>)"## 评分风险 段落列出该维度评分人/agent 若写入以下任一形式的证据,该维度直接作废并降级为 EVIDENCE_MISSING:
test -f 批量校验)score ≥ 7 但证据 < 2 条 → 降为 6,或标 EVIDENCE_MISSINGscore ≤ 4 但证据 < 2 条 → 升为 5,或标 EVIDENCE_MISSING选择哪个处理取决于评分人对维度的把握;两种方式都必须在"评分风险"中注明。
先做便宜的、可批量的,再做昂贵的:
grep / rg 扫关键词、看 package.json / schema / migration每跑完一步把产物落盘到 .grading/,在报告证据行里引用相对路径即可。
按需读取(不是每次都读全部):
./anti-patterns.md — AI slop 前端反模式清单。打"主题与审美"和"代码质量"两个维度时必读,用来识别默认 shadcn 灰白调、无主题色、按钮都 bg-blue-500、空态只写 "No data" 等典型滑坡。./examples/good-report.md 和 ./examples/mediocre-report.md — 两份标定样例报告。打分前读一次做分布校准,避免全班都打 8 分这种分不开档的问题。./probes/probe-screenshots.sh — 批量跑 4 态 + 3 断点截图(login / dashboard / empty / error × desktop / tablet / mobile)。取证时直接 bash ./probes/probe-screenshots.sh <team> <base-url> 即可,不要手搓 playwright 命令。./probes/probe-performance.sh — 跑 Lighthouse 测关键页面性能,输出 .grading/probes/<team>-lighthouse.json(原始 Lighthouse JSON)和 .grading/probes/<team>-lighthouse-mapping.txt(rubric 映射建议)。./probes/probe-a11y.sh — 跑 axe-core CLI 扫关键页面的 a11y 违规项,输出 .grading/probes/<team>-axe.json 和 .grading/probes/<team>-axe-summary.txt。spec_sha(若 spec 在 git 仓库内)。package.json 识别技术栈(React/Vue、TS/JS、Tailwind/CSS-in-JS、状态管理等),记录 project_sha。http://localhost:<port> 可访问。静态证据:
file:line 引用。动态证据:
# 一次性把主要页面的 3 断点 × 4 态截图跑完
bash ./probes/probe-screenshots.sh <team> http://localhost:3000
# 性能 & a11y
bash ./probes/probe-performance.sh <team> http://localhost:3000
bash ./probes/probe-a11y.sh <team> http://localhost:3000
所有截图落到 .grading/shots/<team>-*.png,所有 probe 日志落到 .grading/probes/<team>-*.log。
如果 playwright 不可用,fallback 为:提示评分人手动放置截图到 .grading/shots/ 后再继续。
交互证据:手动或用 playwright 过一遍主流程(登录 → 核心 CRUD → 提交 → 错误路径),记录 console / network 异常。
⚠️ 取证不足时的强制行为
- 维度打分 ≥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 / 截图路径 / probe log 行号)。spec 未要求的维度写 "N/A — 原因",不计入总分。
按本文件 ## 报告模板 段填 .grading/reports/<team>-frontend.md;按 ../score-schema.json 填 .grading/reports/<team>-frontend.json。每维度附"要到 10 差什么"2–4 条。
# JSON schema 校验
npx ajv-cli validate -s skills/score-schema.json \
-d .grading/reports/<team>-frontend.json
# 证据数量自检(每维度统计 file:line + 截图 + log 引用总数)
grep -cE "\.(tsx?|jsx?|vue|css|png|log):" .grading/reports/<team>-frontend.md
自检不过则回到步骤 2 补证据,不得放过。
| # | 维度 | 权重 |
|---|---|---|
| 1 | Spec 一致性 | 20 |
| 2 | 主题与审美 | 12 |
| 3 | 动画与流畅度 | 10 |
| 4 | 状态完备性 | 10 |
| 5 | 代码质量 | 10 |
| 6 | 响应式适配 | 8 |
| 7 | 表单与输入反馈 | 8 |
| 8 | 性能 | 8 |
| 9 | 无障碍 (a11y) | 8 |
| 10 | 微文案 | 6 |
关注点
锚点
取证方法
src/routes / app/ 目录对应关系列表。证据要求
file:line 引用到组件 / 路由文件。关注点
rounded-lg shadow)。./anti-patterns.md)。锚点
bg-blue-500 按钮 + gray-100 背景,典型 AI slop。取证方法
./anti-patterns.md,对照本项目截图逐条判断命中了哪些反模式。tailwind.config.* / theme/* / 全局 CSS,确认是否真的定义了主题 token。证据要求
tailwind.config.*:line 或 theme.ts:line 的引用。anti-patterns.md 中前 5 条)。关注点
锚点
transition,弹窗 / 路由硬切,hover 仅变色。取证方法
--trace on)观察过渡。transition / motion / framer-motion / @keyframes 的使用。证据要求
file:line 证明动画实现(或证明没有)。关注点
锚点
alert(err)。取证方法
bash ./probes/probe-screenshots.sh 已内置 empty / error view 的路由截图。证据要求
file:line 引用组件的状态分支代码。关注点
any。锚点
any 出现在第三方类型缺口位置且有注释,组件行数和 hooks 依赖都干净。any 或轻微 prop drilling,但架构能看懂。any 满天飞,hooks 依赖数组乱填。取证方法
any、@ts-ignore、console.log 数量。./anti-patterns.md 中的前端代码反模式。证据要求
file:line 引用(好的和差的都要有)。关注点
锚点
取证方法
bash ./probes/probe-screenshots.sh 已生成 3 断点截图。tailwind.config 断点设置和组件里 sm: / md: / lg: 分布。证据要求
file:line 体现断点处理代码。关注点
锚点
aria-invalid 标注。aria-invalid 或 1 处错误样式与全站不完全统一。取证方法
useForm / zod / yup / disabled / isSubmitting 的使用。证据要求
file:line 引用校验逻辑。关注点
锚点
取证方法
bash ./probes/probe-performance.sh 生成 TTFB / FCP / LCP 数据。npm run build 看产物大小;npx source-map-explorer 看 bundle 组成(可选)。React.lazy / import() / loading="lazy" / 虚拟列表库使用。证据要求
<team>-lighthouse.json + <team>-lighthouse-mapping.txt。file:line 体现优化手段或缺失。关注点
focus-visible 样式存在。锚点
focus-visible 清晰,表单有 label 关联,对比度全过。focus-visible 覆盖主要交互元素,label 全关联。<div>,无 focus-visible。<div onClick>,Tab 键按下去什么都不响应。取证方法
bash ./probes/probe-a11y.sh 跑 axe-core,看违规清单。role= / aria- / focus-visible / <label 的使用密度。证据要求
<team>-axe.json + <team>-axe-summary.txt。file:line 引用(正或反面)。关注点
锚点
取证方法
证据要求
file:line 引用具体文案位置。评分结束前逐项勾选,任一不通过就回到相应步骤补齐:
.grading/reports/<team>-frontend.md 已按本文件 ## 报告模板 段结构填完,10 个维度全部评完(或明确标 N/A)。.grading/reports/<team>-frontend.json 已产出,并通过 npx ajv-cli validate -s skills/score-schema.json 校验。## 证据硬约束 段(≥7 / ≤4 分 ≥2 条;5–6 分 ≥1 条)。.grading/shots/ 含至少 3 断点 × 4 态的截图;.grading/probes/ 含 <team>-lighthouse.json + <team>-lighthouse-mapping.txt + <team>-axe.json + <team>-axe-summary.txt。