全部任务、背景、接口、评分和提交要求见 题面.pdf(English)。本 README 说明环境运行与 Agent 记录配置,正式规格以 PDF 为准。
C++ 程序使用 C++17 编译器(GCC、Clang 或 MSVC);平台运行不需要 Python,Agent 记录配置在本地 Git 仓库执行。每题都是完整单文件程序。CPP-Classroom 中打开对应练习,修改 IMPLEMENTATION 区域,运行后记得主动提交。
本地可直接编译一题(Windows 将输出名换为 a1_q1.exe 等):
c++ -std=c++17 src/main/A1_q1.cpp -o a1_q1
./a1_q1未实现时抛出 TODO,非零退出是预期状态;完成后输出 PUBLIC 2/2。它只表示该题的两组公开检查通过。
可选:使用 CMake 3.16+ 在 CLion 或终端构建全部程序和独立公开测试:
cmake -S . -B build
cmake --build build --parallel 4
ctest --test-dir build --output-on-failure可选:有 Python 3.9+ 时,运行与教师相同引擎的可见测试适配器,无第三方 Python 依赖:
python3 tools/check.py . --only q1
python3 tools/check.py . --output scores不需要浏览器运行 Python。未实现题会失败;公开全过也不代表隐藏全过。公开检查保留在 src/tests,可结合 PDF 阅读;每题 main 内也嵌有相同两组检查,方便平台单文件运行。
| 路径 | 用途 | 是否修改 |
|---|---|---|
| src/main/A1_*.cpp | 你的实现;每题完整单文件 | 仅 IMPLEMENTATION 区内 |
| src/tests/ | 独立公开调用 | 不修改 |
| include/ | 本地适配器所用固定数据类型 | 不修改 |
| 题面.pdf、题面_en.pdf | 正式规格 | 不修改 |
| tools/、.github/、CMakeLists.txt | 检查与构建基础设施 | 不修改 |
| .pre-commit-config.yaml | 固定 v0.1.5 的会话归档配置 | 不修改 |
| .agent-sessions/bundles/ | 自动生成的 Agent 会话归档 | 随提交保留 |
| .agent-sessions/source/ | 原始会话导出,已忽略 | 不提交 |
| local_tests/ | 你自己新增的实验测试 | 可以新增 |
| README.md 下方两节 | 个人说明 | 填写 |
GitHub Actions 自动运行公开评分;Q1–Q8 全部通过时评分步骤转绿,挑战题未完成不阻断 CI。正式收卷由教师 grader 复核。
在 main 分支开发并推送,或通过 PR 合并到 main。每次 main 推送、目标为 main 的 PR,以及手动运行都会触发 CI。CI 参照 Python 作业检查累计修改范围、运行公开用例自动评分,并将提交粒度软检查写入 Actions Summary。
学生仓库只允许改动 src/main 中原有题目的实现、README.md、local_tests/ 和 .agent-sessions/bundles/;工作流、工具、公开测试、固定类型和题面不能修改。模板维护仓库跳过学生修改范围检查。提交数以初始 commit 为基准统计,参考线为 15,只提供过程线索,不阻断 CI 或自动决定人工分。
Summary 显示每题通过组数、公开自测功能分 /60 与挑战分 /20,并附 JSON、Markdown 和 CSV 评分报告 Artifact。Q1–Q8 必须全部通过;B1/B2 为选做,未完成不阻止 CI 通过。评分失败时仍生成 Summary 和可用的诊断报告。
公开自测分不等于正式成绩,教师私有用例不进入学生仓库或 CI;人工 40 分和最终总分保持待评。确认最终 main commit 的 CI 全部通过后,每人填写一次 AIM 2627 CPP Coursework 1 回执。按问卷要求填写个人信息、仓库链接和最终 main commit,并保留对应 Actions 运行链接;以问卷实际字段为准。PR 的检查不替代最终 main 提交。
本地复现 CI 评分:python3 tools/check.py . --output scores --require-core。
以下步骤在个人学生仓库根目录执行。使用 Git 与 Python 3.10+,建议创建长期保留的独立环境:
python -m venv .venv-agent-session-commitmacOS / Linux 激活:
source .venv-agent-session-commit/bin/activateWindows PowerShell 激活:
.\.venv-agent-session-commit\Scripts\Activate.ps1激活后按下面要求安装并配置。后续提交时保留该环境可用;每个新 clone 分别安装 hooks。
允许并鼓励合理使用 AI 辅助开发。是否使用 AI 本身不影响功能分;你仍须核对代码并解释自己的接口、状态更新与失败路径。AI 使用透明度占人工部分 20 分,以声明、归档覆盖度、真实性和核对说明共同评阅。未使用 AI 的同学明确声明并保留开发记录,不需要伪造会话归档。
参照 Python Assessment,使用 Agent Session Commit(AgentLedger)固定版本 0.1.5 记录过程。归档步骤在本地执行,需要 Git 和 Python 3.10+;C++ 程序本身仍只依赖 C++17。在各自 Assessment 的个人学生 Git 仓库内配置,不要在教师完整目录或其他项目里安装。即使使用 CPP-Classroom 编码,也应将最终实际提交的源码同步到个人仓库,随仓库提交增量记录和归档。
在长期保留的 Python 环境中安装,进入学生仓库根目录后运行:
python -m pip install --index-url https://pypi.org/simple 'agent-session-commit[pre-commit]==0.1.5'
agent-session-commit install --pre-commit
agent-session-commit status安装器让你选择实际使用的 Agent 并确认会话来源,配置只对当前 clone 生效。每份 Assessment、每次新 clone 都单独配置;升级后重新运行安装器刷新 hooks。随模板提供的 .pre-commit-config.yaml 已将归档后端固定为 v0.1.5,不要改成旧版。保持安装时的 Python 环境可用,移动或删除环境后须重新安装 hooks。
每次正常 git commit 成功后,post-commit hook 将新增会话打包到 .agent-sessions/bundles/,再 amend 到刚完成的同一个提交;没有新增会话时不另建归档,也不产生额外的归档 commit。amend 会改变提交 SHA,最终提交号以 git rev-parse HEAD 为准。只有 status 正常不能证明记录完整:完成一次真实修改和提交后,再检查最终提交中是否包含对应归档。
git rev-parse HEAD
git show --stat HEAD -- .agent-sessions/选择的 Agent 或会话目录变化时重新运行安装器;浏览器聊天、未支持的 IDE 或远程环境不能假定会自动收集,应按工具支持的格式导出实际会话并选择 Custom 来源。原始导出可放 .agent-sessions/source/(已忽略),但 .agent-sessions/bundles/ 必须随 Git 提交,不能把整个 .agent-sessions/ 加入忽略列表。README 的“AI 使用与开发过程”要说明使用的工具、范围、归档位置、如何核对结果,以及未归档部分的原因和补充材料。
归档是普通 Git 内容,不加密、不会自动脱敏,推送到公开仓库后他人可读取。确认所选来源属于本作业,不要把口令、令牌或无关项目的私密会话放进去。没有使用 AI 时如实声明;记录不完整时如实说明,不编造、替换或回填成不存在的对话。
课程会结合会话归档、仓库内标记检索和 Git 历史分析核对 AI 使用情况。透明使用 AI 不扣分;单一标记不能替代对完整开发记录的复核,也不会单独决定功能分或最终总分。
不使用选择界面时,0.1.5 支持同时显式提供 Agent 和实际来源,例如:
agent-session-commit install --pre-commit --agent codex --source /absolute/path/to/sessions
agent-session-commit status将示例路径换成实际来源。手动配置时需设置仓库本地的 agent-session.agent、agent-session.source 和 agent-session.workdir,再安装 pre-commit hooks;直接运行 pre-commit install 不会自动弹出 Agent 选择界面。
旧环境升级:重新执行固定 0.1.5 的 pip 安装命令,再运行 agent-session-commit install --pre-commit。若此前使用原生 hooks(未带 --pre-commit),先按工具提示卸载原生安装,再启用本模板的框架 hooks,避免同时使用两套管理方式。更换 Agent 或目录后也需重新配置。
English: use Agent Session Commit 0.1.5 with the supplied v0.1.5 hook configuration, Git, and Python 3.10+. Setup is local to each student clone. Commit .agent-sessions/bundles/, keep raw exports out of Git, and verify the final amended commit. Disclose AI use and missing records honestly; declarations and archives support the existing 20-point transparency assessment.
按 Q1–Q8、B1/B2 记录:是否完成、核心思路、关键边界、时间/空间复杂度。给出至少三个新增边界测试的输入、预期和实际结果,再描述一处缺陷如何定位并修复。
- 思路:
ratio先检查最大血量,再将血量限制到合法区间,使用long long整数乘除得到截断的百分比;report复用该结果,限制电量范围,按 60 和 20 分档后拼接字符串。 - 边界:最大血量非正时不执行除法;电量 19/20/59/60;负血量、超上限血量;最大规模血量;极端 int 电量。血量乘以 100 最大为 10^14,可用 long long 保存。
- 复杂度:
ratio时间与额外空间均 O(1);在题目限定的数字范围内,report的时间和空间也为 O(1)。 - 验证:单文件输出
PUBLIC 2/2;python3 tools/check.py . --only q1得到 Q1 单题公开功能分 4.8/60;local_tests/q1_boundaries.cpp的 13 项断言通过,启用 AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误。
| 新增输入 | 预期 | 实际 |
|---|---|---|
ratio(-5,100) |
0 |
0 |
ratio(10,0) |
-1 |
-1 |
ratio(999999999999LL,1000000000000LL) |
99 |
99 |
report(0,4,0,-7) |
ID=0;HP=INVALID;BAT=0;STATE=LOW |
与预期一致 |
完成情况:Q1–Q8、B1/B2 均已实现。真实缺陷记录的现状见下方最终复核说明。
先由 Codex 提供三处填空骨架,再讲解答案,经本人要求由 Codex 写入。逐条编辑时按逗号遍历当前文本,比较完整标签,命中后只处理一次。首标签删除时移除后面的逗号,唯一标签直接清空;其他标签删除时移除前面的逗号。每次编辑重新查找,不沿用旧下标。
设编辑数为 m,过程中最大文本长度为 L,时间复杂度 O(mL)。除按值传入的文本及返回结果外,临时标签最多 32 字符,额外工作空间 O(1);文本存储 O(L)。
python3 tools/check.py . --only q2 的两组公开检查通过,单题功能分 6.0/60。随后运行 local_tests/q2_boundaries.cpp 三组边界调用:完整匹配与首次命中、连续删除后从空名单追加、变长改名后重新查找与大小写不匹配;预期依次为 cam2,camera,cam、imu、long_name,x,实际均一致。AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误。再回归 Q1,公开评分仍为 4.8/60,13 项边界断言通过。
先讨论首窗口右端下标 k-1、移出元素下标 right-k 和 long long 的必要性,再由 Codex 实现。无效 k 直接返回空序列;计算首窗口后,每次移出一个旧元素并加入一个新元素,仅当窗口和严格大于阈值时记录右端下标。时间 O(n),额外工作空间 O(1),返回结果空间除外。
公开两组检查通过,单题公开功能分 6.0/60。随后运行 local_tests/q3_boundaries.cpp 三组共 10 项断言,实际结果均符合预期:
| 边界组 | 代表输入 | 预期与实际 |
|---|---|---|
| 空输入与无效窗口 | alarms({1,2},3,0) |
空序列 |
| 负数、相等阈值与窗口端点 | alarms({-2,-1,0},1,-1);alarms({-2,-1,0},3,-3) |
{2};空序列 |
| 大整数窗口和 | 200000 个 10^9,k=200000,阈值为 199999999999999 / 200000000000000 | {199999} / 空序列 |
启用 AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;回归 Q1/Q2 公开检查及全部已有边界测试通过。
由 Codex 实现。每行创建独立字符串流,读取操作和参数;先检查数字提取是否成功、参数范围和是否有尾随内容,再检查候选结果范围。所有验证通过后才更新 value,否则仅增加 rejected。每行恰好增加一个计数,空输入独立初始化。不能只凭读出整数就接受 8x 或 1.5,也不能在发现尾缀前更新 value。
设输入总字符数为 S,时间 O(S+行数),单行流及临时字符串占 O(最大行长) 额外空间。公开两组检查通过,单题功能分 7.2/60。随后运行 local_tests/q4_boundaries.cpp 三组新增边界检查,预期与实际均一致:
| 边界组 | 输入要点 | 预期与实际 {value,accepted,rejected} |
|---|---|---|
| 结果越界、拒绝后保留状态 | 设置正负端点后尝试越界,最后执行非法 RESET | {-1,3,3} |
| 严格解析 | 设置 5 后尝试小数、字母尾缀、缺参、提取溢出、小写操作、非法 RESET 和空行 | {5,1,7} |
| 合法空白与独立调用 | 含空白、正号和前导零的四条命令,再单独调用空输入 | {1,4,0};{0,0,0} |
AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;回归 Q1–Q3 的公开检查与全部已有边界测试通过。
由 Codex 实现。空行数组直接返回空矩阵;非空地图先验证列数、各行长度和所有字符,非法时抛出 std::invalid_argument。完整验证通过后才计算结果。障碍输出 -1;空地遍历上下左右四个方向,先确认坐标在地图内,再判断是否为障碍。时间 O(行数×列数),除返回矩阵外额外工作空间 O(1),返回矩阵空间 O(行数×列数)。
公开两组检查通过,单题功能分 7.2/60。随后运行 local_tests/q5_boundaries.cpp 三组共 11 项检查,实际均符合预期:
| 边界组 | 输入要点 | 预期与实际 |
|---|---|---|
| 完整输入验证 | 空数组、零列、不等长、最后字符非法 | 空矩阵;其余抛 invalid_argument |
| 退化地图 | 单格 .、单行 #.#、单列 ./# |
{{0}};{{-1,2,-1}};{{1},{-1}} |
| 邻域及输入保护 | 对角障碍、中心四面包围、全障碍 | 对角不计,中心风险为 4,障碍全为 -1,输入保持不变 |
AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;回归 Q1–Q4 公开检查与已有边界测试全部通过。
先讲解欧氏距离与平方距离比较,再由 Codex 实现。负射程直接返回 -1;单次遍历排除不可见、hp<=0 和超射程目标,使用局部变量保存最佳编号、血量、平方距离,依次按血量、距离、编号比较。首个合格目标通过 best_id==-1 判断选入,返回编号而非下标。乘法从 1LL 开始,避免 int 中间计算溢出;不排序或修改输入。时间 O(n),额外空间 O(1)。
公开两组检查通过,单题功能分 8.4/60。随后运行 local_tests/q6_boundaries.cpp 三组共 11 项检查,预期与实际一致:
| 边界组 | 输入要点 | 预期与实际 |
|---|---|---|
| 筛选与空候选 | 空列表、负射程、不可见/零血量/负血量/超射程、零射程原点 | 无候选为 -1,原点合法目标返回编号 42 |
| 多级比较 | 血量优先、同血量距离优先、完全平局编号优先,并反转顺序 | 分别选择 7、9、2,反转后仍为 2,调用未改变原顺序 |
| 宽整数和射程端点 | 百万级负坐标、边界外一格、双百万级坐标平方和 | 边界上的编号 8 入选,超射程目标不入选 |
AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;回归 Q1–Q5 全部公开检查及已有边界测试通过。
由 Codex 实现。每帧先冷却并将热量最低限制为 0;请求为 0 则结束本帧。请求为 1 时检查弹量和冷却后的热量,成功才扣弹、加热并计 shots;拒绝仅计 rejected,仍保留本帧冷却效果。空请求不进入循环,保留初始弹量与热量。时间 O(帧数),额外空间 O(1)。
公开两组检查通过,单题功能分 9.6/60。随后运行 local_tests/q7_boundaries.cpp 三组共 9 项检查,预期与实际一致:
| 边界组 | 输入要点 | 预期与实际 {shots,rejected,ammo,heat} |
|---|---|---|
| 空序列与空闲帧 | (4,80,10,30,{});(4,5,10,30,{0}) |
{0,0,4,80};{0,0,4,0} |
| 资源边界 | 无弹但冷却;零冷却零射击热量;超热拒绝不扣弹 | {0,1,0,40};{1,0,0,100};{0,1,1,100} |
| 更新顺序与守恒 | (2,90,10,20,{1,1,1}) |
{2,1,0,100},shots+ammo=2,shots+rejected=请求为1的数量,输入未变 |
第三组逐帧:第一帧冷却到 80 后发射,剩 1 弹、热量 100;第二帧冷却到 90,射击会超限所以拒绝,仍剩 1 弹、热量 90;第三帧冷却到 80 后发射,剩 0 弹、热量 100。AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;回归 Q1–Q6 全部公开检查及已有边界测试通过。
由 Codex 实现。先验证 id 与 hp 的接收范围,非法记录仅计 invalid,不访问或占用编号;合法后再查 seen 标记,重复仅计 duplicate。首次合法记录计 valid,并把 hp 夹到 [0,100] 后累加到 long long。最后按编号扫描本次调用独立初始化的标记表,产生升序 ids。时间 O(n+U),标记表空间 O(U),U=10000 为固定编号范围,返回编号空间 O(valid)。不修改输入或依赖其他题。
公开两组检查通过,单题功能分 10.8/60。随后运行 local_tests/q8_boundaries.cpp 三组共 9 项检查,预期与实际一致:
| 边界组 | 输入要点 | 预期与实际 |
|---|---|---|
| 分类顺序与守恒 | 非法血量后补发、已见编号的非法记录、合法重复、int 极值编号 | valid=1、duplicate=1、invalid=4、total_hp=30、ids={1},两条计数恒等式成立 |
| 范围端点与排序 | 编号 0/9999,血量 -1000/1000、-5/200,乱序输入 | valid=4、total_hp=200、ids={0,1,2,9999},输入未变 |
| 调用独立与空批次 | 重新传入编号 1,再调用空批次 | 新批次 valid=1、total_hp=42;空批次所有计数及总血量为 0,ids 为空 |
AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;回归 Q1–Q7 全部公开检查与已有边界测试通过。
由 Codex 实现。先识别可选正负号,要求后面至少一位 ASCII 数字。用 long long 保存非负幅值,正数上限为 2147483647,负数幅值上限为 2147483648。每次累积前判断 magnitude > (limit-digit)/10,若成立则拒绝,避免先乘加后检查。成功处理全部字符后才应用符号并写入 output;任意失败均保持原输出。没有使用禁止的转换函数、字符串流或自定义 class。时间 O(字符串长度),额外空间 O(1)。
公开两组检查通过,挑战分 10/20。随后运行 local_tests/b1_boundaries.cpp 三组边界检查,实际均符合预期:
| 边界组 | 输入要点 | 预期与实际 |
|---|---|---|
| 正负范围端点 | 2147483647、-2147483648,以及各自向外超出 1 | 两端成功,越界失败并保留旧 output |
| 严格语法 | 空串、独立符号、空白、小数、指数、重复符号、尾缀、全角数字、嵌入空字符 | 全部失败,output 保持 73 |
| 长字符串与前导零 | +0、-0000、+00042、1000 个 9、1000 个 0、999 个 0 后接 1 | 依次为 0、0、42、失败保留 42、0、1 |
AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;Q1–Q8 全部已有边界测试通过,完整公开评分为功能 60/60、挑战 10/20,--require-core 检查通过。
由 Codex 实现。反向区间先返回 0,保证原数组不被修改。read 从左到右读取,元素位于闭区间时写入 data[write],再增加 write,最后返回保留数。write 始终不超过 read,所以不会覆盖尚未读取的元素;按读取顺序写入保证稳定。n=0 时循环不执行,允许空指针且不解引用。没有辅助容器、新数组、排序或释放操作。时间 O(n),额外空间 O(1),尾部不是结果的一部分。
公开两组检查通过,单题挑战分 10/20。随后运行 local_tests/b2_boundaries.cpp 三组共 10 项边界检查,预期与实际一致:
| 边界组 | 输入要点 | 预期与实际 |
|---|---|---|
| 空输入与反向区间 | nullptr 且 n=0;数组 {1,2},区间 [5,3] | 均返回 0,反向区间数组不变 |
| 稳定性、重复值和端点 | {3,1,3,2,3},区间 [2,3] | 返回 4,前缀 {3,3,2,3} |
| 特殊命中情况 | low=high 的全保留、全删除、覆盖 int 两端的区间 | 分别返回 3、0、3,全保留时顺序不变 |
AddressSanitizer 与 UndefinedBehaviorSanitizer 未报告错误;回归 Q1–Q8、B1 全部已有边界测试通过。完整公开评分为功能 60/60、挑战 20/20,--require-core 检查通过;这不代表隐藏测试或人工评分已完成。
在原先按题保留的 10 次提交之后,按以下真实变更分别保留增量记录:Q2 边界补充、Q4 严格解析补充、统一回归脚本、最大规模测试,以及最终 README 记录核对。本轮没有修改任何题目的 C++ 实现,也没有拆分或改写原有提交。
补充边界检查。 Q2 追加了空编辑、同名替换后继续编辑、空名单连续追加并保留重复标签、空名单删除未命中、调用方文本及编辑记录不变等检查。代表输入 edit_labels("a,a", {{"a","a"},{"a","x"}}) 预期 x,a,从空名单依次追加 imu、imu、lidar 预期 imu,imu,lidar,实际均一致。Q4 追加了参数本身超界、long long 正负极值、额外参数、全空白、十六进制/指数尾缀,以及逐条非法命令不改变已有值的检查;例如 {"SET 23","RESET 1"} 预期 {23,1,1},实际一致。原来的边界检查全部保留。
一条命令回归本地测试。 新增 local_tests/run_regression.py,需要 Python 3.9+ 和 C++17 编译器,无第三方 Python 依赖。脚本自动发现同目录下的 *_boundaries.cpp,在临时目录编译和运行,每组分别报告结果,编译失败、运行失败或超时均返回非零状态,临时二进制不会进入仓库。已核对未知测试名、找不到编译器时返回错误;不修改教师的检查器或工作流。此脚本是本地补充测试入口,不替代公开或隐藏评分。
python3 local_tests/run_regression.py
python3 local_tests/run_regression.py --sanitize
python3 local_tests/run_regression.py --only q2 q4--sanitize 启用 AddressSanitizer 和 UndefinedBehaviorSanitizer,要求编译器支持这两个选项;普通运行不要求 sanitizer。可用 --compiler 指定编译器可执行文件,或使用 CXX 环境变量。
最大规模验证。 local_tests/max_scale_boundaries.cpp 的结果如下;这是题目规模上限下的结果检查,复杂度仍依据各题算法分析,不能仅凭一次运行通过证明。
| 题目 | 输入规模与构造 | 预期与实际 |
|---|---|---|
| Q3 | n=200000,正负 10^9 交替;k=199999/200000/1,阈值 0 | 分别返回 {199998}、空序列、全部 100000 个偶数下标 |
| Q6 | 100000 个目标,编号倒序,坐标 (-600000,800000),位于百万射程边界 | 初始选择编号 0;将编号 99999 血量降至 1 后选它;隐藏它后仍选 0;反转顺序不变;射程缩小为 999999 后无候选 |
| Q8 | 20000 帧,全部 10000 个编号先倒序首次到达,再合法重复 | valid=10000、duplicate=10000、invalid=0、total_hp=1000000,编号完整升序;首帧血量改为非法后为 valid=10000、duplicate=9999、invalid=1、total_hp=999900 |
| B2 | n=200000,重复 {3,-2,0,2,-1},区间 [-1,2] | 返回 120000,全部有效前缀重复 {0,2,-1},顺序正确 |
干净模板复测。 从仓库初始提交 b4cb0d8 恢复一份独立临时模板,将当前源码放回 src/main/,使用模板原有 tools/check.py 及固定类型评分:功能 60/60、挑战 20/20,--require-core 检查通过。另复制本地测试并从这份模板运行带 sanitizer 的统一回归,11/11 组通过,未报告内存或未定义行为错误。这是对本仓库初始模板的复测,不声称重新获取了教师后来更新的模板。
修改范围与归档核验。 教师自带 tools/ci_support.py check-files 检查通过;另将全部题目与初始版本比较,固定接口、实现区外内容及 README 两节个人说明之前的内容保持一致。提交的会话压缩包均可读取;每次提交后检查最终提交是否含新增归档,最终 SHA 以 hook 完成后的 git rev-parse HEAD 为准。原始会话和虚拟环境未提交。最终 GitHub Actions 状态须以重新推送后 main 的对应运行结果为准。
真实缺陷记录的现状。 当前测试没有暴露已完成解题实现的功能缺陷,因此仍没有可如实记录的“实际缺陷定位与修复”案例,题面的这一记录要求尚有缺项。早期原模板 TODO 和 Q2 练习留空引起的预期失败不冒充缺陷修复。本轮纠正了 Q1 单题评分曾写成“累计分”的说明问题,这只是文档表述修正,不算 C++ 缺陷案例;若后续实际发现问题,再补充复现输入、预期/实际、定位和修复验证。
声明是否使用 AI;如使用,说明工具、帮助范围、哪些建议未采用、如何验证结果,并附可复核记录。未使用则明确声明并提供开发记录。
已使用 Codex 桌面应用辅助阅读题面、规划顺序、生成 Q1–Q8、B1/B2 实现、设计和扩展边界测试、编写本地回归脚本,并运行编译器和公开评分器核对结果。README 的设计、测试和 AI 使用说明也由 Codex 辅助整理。Q2 曾保留填空并讲解,最终答案由 Codex 按本人要求写入;本作业不能声明为本人独立编写。对话中按题讨论了接口、边界、更新顺序、失败路径和复杂度,但有讲解记录不等于本人已独立掌握;本人仍须阅读并能够解释源码。
核对方式:将实现与公开规范逐项对照,每题公开检查后增加边界测试并回归已有题目;最终增加规模上限检查,在干净初始模板中重新运行公开检查和本地回归。以上程序验证由 Codex 实际执行,不声称均由本人手工运行。公开满分不代表隐藏测试或人工评分已通过。没有可核实的被否决代码建议清单,不编造未采用建议或缺陷案例。
归档方式:已在本 clone 配置 Agent Session Commit 0.1.5,Agent 为 Codex,实际来源为 /Users/sa/.codex/sessions,工作目录为本作业仓库;自动归档提交到 .agent-sessions/bundles/。原始导出目录 .agent-sessions/source/ 和 .venv-agent-session-commit/ 已忽略,不提交。每次正常提交后检查 hook 完成后的最终 SHA 和归档文件,不能仅凭 status 正常断言覆盖完整。尚未提交之后继续产生的对话会留待下一次正常提交收集;对未识别、未导出或尚未归档的部分不声称已经归档完整,应按实际情况补充说明。
可复核记录:Q1 71392b5、Q2 2f290d2、Q3 112d704、Q4 e7f99df、Q5 4c8dcc9、Q6 b6da551、Q7 9bfc331、Q8 5785d53、B1 39abef2、B2 e9a26e2 的最终提交均已核验包含对应新增归档;本轮测试收尾提交 2e6f69e、a4ca646、1ca2882、856ed6d 也已核验包含归档。本节最终修改随下一次正常提交归档,提交完成后再次核验。