@@ -4,6 +4,7 @@ import { join } from "node:path";
44import type { Metadata } from "next" ;
55import Link from "next/link" ;
66
7+ import { ReviewSubmissionForm } from "@/components/challenges/ReviewSubmissionForm" ;
78import { AppShell } from "@/components/layout/AppShell" ;
89import { Badge } from "@/components/ui/Badge" ;
910
@@ -29,8 +30,9 @@ export default function FirstReviewChallengePage() {
2930 < a className = "active" href = "#review" >
3031 第一题
3132 </ a >
32- < a href = "#diff" > AI Diff</ a >
33- < a href = "#rubric" > Rubric</ a >
33+ < a href = "#diff" > AI 补丁</ a >
34+ < a href = "#submit" > 提交审核</ a >
35+ < a href = "#rubric" > 评分</ a >
3436 </ nav >
3537 < div className = "actions" >
3638 < Link className = "button button-outline" href = "/" >
@@ -53,6 +55,7 @@ export default function FirstReviewChallengePage() {
5355 < span className = "id" > 001</ span >
5456 < Badge tone = "review" > Review</ Badge >
5557 < Badge tone = "mid" > Mid</ Badge >
58+ < span className = "pill" > Python / SymPy</ span >
5659 </ div >
5760 < h1 > 这个 AI 修复能合并吗?</ h1 >
5861 < p >
@@ -61,13 +64,10 @@ export default function FirstReviewChallengePage() {
6164 </ p >
6265 < div className = "source-grid" >
6366 < a href = "https://github.com/sympy/sympy/issues/22684" rel = "noreferrer" target = "_blank" >
64- SymPy Issue
65- </ a >
66- < a href = "https://github.com/sympy/sympy/pull/22714" rel = "noreferrer" target = "_blank" >
67- Correct PR
67+ 原始 Issue
6868 </ a >
6969 < a href = "https://arxiv.org/abs/2503.15223" rel = "noreferrer" target = "_blank" >
70- PatchDiff Paper
70+ 论文来源
7171 </ a >
7272 </ div >
7373 </ section >
@@ -80,55 +80,131 @@ export default function FirstReviewChallengePage() {
8080 </ div >
8181 < div className = "section-body" >
8282 < p >
83- 阅读下面的 AI PR diff,判断它是否可以 merge。如果不能,需要指出具体问题、影响和修复建议。
83+ 阅读下面的 AI PR diff,判断它是否可以 merge。如果不能,需要指出具体问题、影响和修复建议。你不需要了解整个
84+ SymPy 项目,只需要围绕本页给出的行为规则和 diff 做判断。
8485 </ p >
8586 < div className = "review-template" >
86- < pre > { `Can merge? Yes / No
87+ < pre > { `是否可以合并:可以 / 不可以
8788
88- Finding 1:
89- - Severity:
90- - Problem:
91- - Why it matters:
92- - Suggested fix:
89+ 问题 1:
90+ - 严重程度:
91+ - 问题描述:
92+ - 影响说明:
93+ - 修复建议:
9394
94- Finding 2:
95+ 问题 2:
9596...` } </ pre >
9697 </ div >
9798 </ div >
9899 </ section >
99100
101+ < section className = "challenge-section card" >
102+ < div className = "card-head" >
103+ < h2 > 题目上下文</ h2 >
104+ < span className = "mono" > Python</ span >
105+ </ div >
106+ < div className = "section-body" >
107+ < p >
108+ `Point` / `Point2D` 是 SymPy 里的几何点对象。坐标必须是合法的 SymPy 表达式,并且不能是明确的虚数坐标。
109+ </ p >
110+ < p >
111+ `evaluate(False)` 表示临时关闭部分自动化简。真实 issue 的问题是:关闭自动化简后,普通坐标也可能被旧逻辑误判,
112+ 从而抛出 `Imaginary coordinates are not permitted`。
113+ </ p >
114+ < p >
115+ 所以这道题的关键不是“只要不报错就行”,而是判断 AI 补丁有没有同时保住两个行为:普通坐标不要误杀,明确的虚数坐标仍然要拒绝。
116+ </ p >
117+ </ div >
118+ </ section >
119+
120+ < section className = "challenge-section card" >
121+ < div className = "card-head" >
122+ < h2 > 预期行为表</ h2 >
123+ < span className = "mono" > review hints</ span >
124+ </ div >
125+ < div className = "behavior-table-wrap" >
126+ < table className = "behavior-table" >
127+ < thead >
128+ < tr >
129+ < th > 输入场景</ th >
130+ < th > 期望行为</ th >
131+ < th > 审核时要看什么</ th >
132+ </ tr >
133+ </ thead >
134+ < tbody >
135+ < tr >
136+ < td >
137+ < code > with evaluate(False): Point(1, 2)</ code >
138+ </ td >
139+ < td > 应该允许创建点</ td >
140+ < td > 不能再误报 imaginary coordinates</ td >
141+ </ tr >
142+ < tr >
143+ < td >
144+ < code > with evaluate(False): Point(I, 2)</ code >
145+ </ td >
146+ < td > 应该继续抛出错误</ td >
147+ < td > 检查这个约束在补丁后是否仍成立</ td >
148+ </ tr >
149+ < tr >
150+ < td >
151+ < code > Point(x, y)</ code >
152+ </ td >
153+ < td > 符号输入不应被粗暴拒绝</ td >
154+ < td > 不确定是否为虚数时,不能当成明确非法</ td >
155+ </ tr >
156+ </ tbody >
157+ </ table >
158+ </ div >
159+ </ section >
160+
100161 < section className = "challenge-section card" id = "diff" >
101162 < div className = "card-head" >
102- < h2 > AI PR Diff </ h2 >
163+ < h2 > AI PR 变更 </ h2 >
103164 < span className = "mono" > ai-pr.diff</ span >
104165 </ div >
105166 < pre className = "diff-block" > { diff } </ pre >
106167 </ section >
168+
169+ < ReviewSubmissionForm />
107170 </ article >
108171
109172 < aside className = "challenge-side" >
110173 < section className = "card" >
111174 < div className = "card-head" >
112- < h2 > 背景 </ h2 >
175+ < h2 > 快速判断 </ h2 >
113176 </ div >
114177 < div className = "section-body compact" >
115178 < p >
116- SymPy `Point` / `Point2D` 不允许创建带有虚数坐标的点。真实 bug 是:
117- 在 `evaluate(False)` 下,即使输入没有虚数,也可能错误抛出异常。
179+ 语言:Python。
180+ </ p >
181+ < p >
182+ 类型:Review Mode,不要求你改代码。
118183 </ p >
119184 < p >
120- 你要审核的是 AI 补丁,不是上游最终合并的正确修复 。
185+ 目标:判断 AI PR 能否合并,并写出 review findings 。
121186 </ p >
122187 </ div >
123188 </ section >
124189
190+ < section className = "card" >
191+ < div className = "card-head" >
192+ < h2 > 看 Diff 顺序</ h2 >
193+ </ div >
194+ < div className = "section-body compact" >
195+ < p > 1. 先看 AI 改了哪一行判断条件。</ p >
196+ < p > 2. 再看新增测试只覆盖了什么场景。</ p >
197+ < p > 3. 最后用行为表检查是否有回归。</ p >
198+ </ div >
199+ </ section >
200+
125201 < section className = "card" id = "rubric" >
126202 < div className = "card-head" >
127203 < h2 > 评分重点</ h2 >
128204 </ div >
129205 < div className = "rubric-list" >
130206 < div className = "rubric-item" >
131- < span > Merge 判断 </ span >
207+ < span > 合并判断 </ span >
132208 < strong > 30%</ strong >
133209 </ div >
134210 < div className = "rubric-item" >
0 commit comments