7 changed files with 319 additions and 4 deletions
@ -0,0 +1,83 @@ |
|||
# W3-T8 Re-review: OpenAPI 示例与默认值修复 |
|||
|
|||
- Wave: W3 |
|||
- Task: T8 |
|||
- Review round: repair round 1 |
|||
- Base SHA: `aad0ba6` |
|||
- Head SHA: `310d931` |
|||
- Prior failed report: `W3-T8.md` |
|||
- Repair brief: `T8-repair-1.md` |
|||
- Verdict: **PASS** |
|||
|
|||
## Original Findings |
|||
|
|||
### Resolved: knowledge Upsert response example omitted `version` |
|||
|
|||
`docs/openapi-rc.json:7439` now includes `data.version: 2` in the `PUT /onboarding/company/knowledge` 200 example. The request example uses `version: 1`, so the returned `version: 2` is consistent with update semantics. `CompanyKnowledgeView` still exposes `version`, and the schema remains unchanged. |
|||
|
|||
### Resolved: create-item schema omitted runtime defaults |
|||
|
|||
`docs/openapi-rc.json:11718` now declares `sortOrder.default = 1000`. |
|||
`docs/openapi-rc.json:11724` now declares `required.default = false`. |
|||
These match the initialized runtime fields in `CompanyChecklistItemCreateRequest`. |
|||
|
|||
### Resolved: verifier did not assert the repaired contract |
|||
|
|||
`docs/verify_openapi.py:300-309` now asserts: |
|||
|
|||
- `CompanyChecklistItemCreateRequest.sortOrder.default == 1000` |
|||
- `CompanyChecklistItemCreateRequest.required.default is False` |
|||
- knowledge Upsert 200 example `data.version == 2` |
|||
|
|||
The verifier diff adds 12 lines and removes none. Existing path, operation, schema, security, response-reference, field, and error-code checks remain intact, so the prior checks were not weakened. |
|||
|
|||
## Scope Verification |
|||
|
|||
The scoped semantic OpenAPI diff contains exactly the three intended changes: |
|||
|
|||
- `CompanyChecklistItemCreateRequest.required.default`: added `false` |
|||
- `CompanyChecklistItemCreateRequest.sortOrder.default`: added `1000` |
|||
- knowledge Upsert 200 example `data.version`: added `2` |
|||
|
|||
No runtime Java, test, migration, endpoint, schema, security, or unrelated documentation changes are present in `aad0ba6..310d931`. |
|||
|
|||
## Evidence |
|||
|
|||
```text |
|||
python .\docs\verify_openapi.py |
|||
paths: 135 |
|||
N04 onboarding endpoints and schemas present (9 operations / 6 paths) |
|||
No empty ref keys found |
|||
Valid JSON: True |
|||
All checks passed! |
|||
``` |
|||
|
|||
```text |
|||
mvn -Dtest=Onboarding*Test,CompanyKnowledge*Test test |
|||
Tests run: 96, Failures: 0, Errors: 0, Skipped: 0 |
|||
BUILD SUCCESS |
|||
``` |
|||
|
|||
`git diff --check aad0ba6..310d931` passed. |
|||
|
|||
## Remaining Findings |
|||
|
|||
No blocking findings. |
|||
|
|||
Non-blocking carried-forward findings from the prior review remain outside this focused repair: |
|||
|
|||
- Error-code verification remains partly text-based rather than asserting exact operation/status/example structure. |
|||
- Success responses continue to use the repository's existing `*/*` media type instead of explicit `application/json`. |
|||
- Full `mvn clean verify` and real MySQL 8.4 / Docker acceptance remain pending; the previously identified full-suite failures are unrelated to N04/T8. |
|||
|
|||
## Assessment |
|||
|
|||
**Ready for T8 receipt:** Yes |
|||
|
|||
The two original Important findings are resolved, and both are now protected by exact verifier assertions without weakening earlier checks. |
|||
|
|||
Receipt command: |
|||
|
|||
```bash |
|||
ssf execution review changes/n04-onboard --wave W3-T8 --base aad0ba6 --head 310d931 --report .superpowers/sdd/reviews/W3-T8-rereview.md --verdict pass |
|||
``` |
|||
@ -0,0 +1,78 @@ |
|||
# W3-T8 Review: OpenAPI、接口文档与前端联调 |
|||
|
|||
- Wave: W3 |
|||
- Task: T8 |
|||
- Base SHA: `73afd87` |
|||
- Head SHA: `aad0ba6` |
|||
- Review report: `.superpowers/sdd/reviews/W3-T8.md` |
|||
- Verdict: **FAIL** |
|||
|
|||
## Strengths |
|||
|
|||
- T8 的交付范围正确:diff 仅涉及 OpenAPI、文档、验证脚本和 SDD 状态文件,没有修改 Java 生产代码或测试代码。 |
|||
- 与 `73afd87` 相比,OpenAPI 精确新增 6 个 `/onboarding` 路径、9 个 operation、20 个 schema;原有 129 个路径和 139 个 schema 的结构化内容均未变化。 |
|||
- 9 个 operation 的 `operationId` 唯一,全部声明 `bearerAuth`;成功响应引用正确;9701-9706 均出现在对应错误响应中。 |
|||
- `docs/onboarding-api.md` 覆盖角色、企业所有权、通用/企业清单合并、完成状态与版本、幂等创建、软删除、知识回退、3 条评价阈值、错误码和请求/响应示例。 |
|||
- `docs/frontend-integration.md` 第 22 节覆盖 Base URL、鉴权、9 个接口、请求示例、状态回退及 400/401/403/404/409 处理。 |
|||
- README 和 roadmap 已更新为 N04“实现完成,待真实 MySQL/Docker 验收”,并准确记录当前全量测试失败情况。 |
|||
- `docs/verify_openapi.py` 是增强而非削弱:删除了旧的固定路径总数断言,改为更强的 135 paths / 172 operations 断言,并新增 N04 路径、operation、security、schema 和错误码检查。 |
|||
- N04 专项回归通过:`Tests run: 96, Failures: 0, Errors: 0, Skipped: 0`,`BUILD SUCCESS`。 |
|||
|
|||
## Blocking Findings |
|||
|
|||
### Important: OpenAPI 示例与运行时响应不一致 |
|||
|
|||
- File: `docs/openapi-rc.json:7430-7439` |
|||
- `PUT /onboarding/company/knowledge` 的 200 示例 `data` 缺少 `version`。 |
|||
- Runtime `CompanyKnowledgeView`、OpenAPI schema 以及 `docs/onboarding-api.md` 都明确包含 `version`;企业客户端必须使用该字段进行下一次乐观锁更新。 |
|||
- 因此该示例会误导前端在对更新响应建模或联调时遗漏版本,直接违反 T8“字段、默认值与运行时 DTO 完全一致”的要求。 |
|||
- Fix: 在 200 示例中补充一个与更新语义一致的 `version`,并在 `docs/verify_openapi.py` 中增加示例字段断言。 |
|||
|
|||
### Important: 创建请求的 OpenAPI schema 未表达运行时默认值 |
|||
|
|||
- File: `docs/openapi-rc.json:11714-11722` |
|||
- `CompanyChecklistItemCreateRequest.sortOrder` 缺少 `default: 1000`。 |
|||
- `CompanyChecklistItemCreateRequest.required` 缺少 `default: false`。 |
|||
- Runtime DTO 明确初始化了这两个默认值,文档正文也说明默认值,但静态 OpenAPI schema 没有表达,违反 T8 对默认值一致性的要求。 |
|||
- Fix: 在对应 schema 属性中加入 `default`,并在 `docs/verify_openapi.py` 中断言这些默认值。 |
|||
|
|||
## Minor Findings |
|||
|
|||
- `docs/verify_openapi.py` 对 9704 的检查只验证响应描述或示例的序列化文本中存在该错误码;当前 9704 只出现在描述中。建议按 operation/status 精确断言错误码和示例结构,同时覆盖 `version` 默认值和响应示例,避免回归。 |
|||
- OpenAPI 200 响应当前沿用仓库既有的 `*/*` content type,而不是更明确的 `application/json`。这不影响本次 T8 通过判定,但会给前端代码生成带来额外歧义。 |
|||
- `changes/n04-onboard/.superpowers/sdd/progress.md` 尚未记录 T8 独立 review 结果,符合当前“review pending”状态,等待 receipt 后再更新。 |
|||
|
|||
## Non-Blocking Verification |
|||
|
|||
- `python .\docs\verify_openapi.py`: |
|||
- `paths: 135` |
|||
- `N04 onboarding endpoints and schemas present (9 operations / 6 paths)` |
|||
- `All checks passed!` |
|||
- 结构化对比 `73afd87..aad0ba6`: |
|||
- added paths: 6 |
|||
- added operations: 9 |
|||
- added schemas: 20 |
|||
- existing paths changed: 0 |
|||
- existing schemas changed: 0 |
|||
- N04 regression: |
|||
- `mvn -Dtest=Onboarding*Test,CompanyKnowledge*Test test` |
|||
- `Tests run: 96, Failures: 0, Errors: 0, Skipped: 0` |
|||
- `BUILD SUCCESS` |
|||
- Reported full-suite failure set reproduced independently: |
|||
- `mvn -Dtest=CareerProgressServiceTest,JobReviewDimensionControllerTest,JobReviewDimensionServiceTest,LocalResumeStorageServiceTest test` |
|||
- `Tests run: 69, Failures: 2, Errors: 9` |
|||
- failures are the reported CareerProgress/JobReviewDimension assertions and LocalResumeStorage temp-directory cleanup errors. |
|||
- `git diff --check 73afd87..aad0ba6` passed. |
|||
- `git diff --name-status 73afd87..aad0ba6` contains no Java production or test changes, so the reported failures are unrelated to the T8 commit. The N04 branch's only changes touching those packages are additive `JobReview` repository query methods that are not used by the failing paths; CareerProgress and LocalResumeStorage code is unchanged. |
|||
|
|||
## Assessment |
|||
|
|||
**Ready to merge?** No |
|||
|
|||
**Reasoning:** The OpenAPI structure, documentation coverage, security declarations, error-code coverage, and N04 regression are strong, but the static contract is not yet fully runtime-consistent. The missing knowledge-response `version` example and missing create-request defaults are actionable contract defects that must be fixed and re-reviewed before T8 can pass. |
|||
|
|||
Receipt command: |
|||
|
|||
```bash |
|||
ssf execution review changes/n04-onboard --wave W3-T8 --base 73afd87 --head aad0ba6 --report .superpowers/sdd/reviews/W3-T8.md --verdict fail |
|||
``` |
|||
@ -0,0 +1,113 @@ |
|||
# W3 Wave Review: n04-onboard |
|||
|
|||
- Wave: `W3` |
|||
- Base SHA: `a5730a7` |
|||
- Head SHA: `310d931` |
|||
- Verdict: **PASS (conditional)** |
|||
- Blocking findings inside W3: **None** |
|||
- Release status: **blocked by external verification gates** |
|||
|
|||
## Scope Reviewed |
|||
|
|||
Read the execution contract, onboarding-checklist and company-knowledge specs, design, W3 task reports (`W3-T6.md`, `W3-T6-rereview.md`, `W3-T7.md`, `W3-T8.md`, `W3-T8-rereview.md`), task briefs where needed, the combined diff `a5730a7..310d931`, and the relevant production, integration-test, OpenAPI, and documentation artifacts. |
|||
|
|||
The combined diff contains 31 files, `+7123/-1903`. W3 production changes are limited to: |
|||
|
|||
- `SecurityConfig.java` |
|||
- `OnboardingChecklistItemRepository.java` |
|||
- `OnboardingChecklistService.java` |
|||
- `CompanyKnowledgeService.java` |
|||
|
|||
The remainder is onboarding integration/privacy/end-to-end testing, OpenAPI/docs, and SDD workflow artifacts. No V1-V38 migration is modified in W3. No existing API path, request/response shape, or error semantics are intentionally changed. |
|||
|
|||
## Cross-Task Integration |
|||
|
|||
### Permissions and ownership |
|||
|
|||
- `/onboarding/**` is explicitly authenticated; anonymous requests return 401 through the existing security entry point. |
|||
- STUDENT and COMPANY role checks are enforced in service code, not merely by the HTTP matcher. |
|||
- Company operations resolve the company from `owner_user_id` and reject cross-company checklist mutation with `9701`/404 without modifying the target row. |
|||
- Privacy assertions cover success and error responses and verify absence of internal IDs, hashes, moderation fields, tokens, IP/User-Agent, phone, and email fields. |
|||
|
|||
### Concurrency and isolation |
|||
|
|||
- Company checklist creation runs at `READ_COMMITTED`, acquires a `PESSIMISTIC_WRITE` company-row lock, and uses a locking read for company item lookup before idempotency and active-count decisions. |
|||
- The 49-to-50 boundary is deterministic under H2 `MODE=MySQL` with the connection default forced to `REPEATABLE_READ`; the test observes exactly one success and one `9703`, with 50 active rows. |
|||
- Progress updates serialize per student user through a pessimistic user lock; concurrent first creation produces one progress row. |
|||
- Knowledge upserts serialize on the owning company row and map optimistic/duplicate-key conflicts to `9706`. |
|||
- The focused concurrency suite passes. Real MySQL 8.4 lock/deadlock behavior remains an external acceptance gate. |
|||
|
|||
### End-to-end contract |
|||
|
|||
- T7 exercises all 9 onboarding operations through the real Spring context, JWT/security chain, MockMvc, H2 persistence, and DTO serialization. |
|||
- Coverage includes standard/company checklist merge and fallback, completion and cancellation, stale versions, idempotent replay and hash conflict, 50-item limit, soft delete/repeat delete, cross-company isolation, `BASIC_ONLY`/`CONFIGURED`, `EMPTY`/`INSUFFICIENT`/`SUFFICIENT`, public-review filtering, tag limits, permission failures, and privacy assertions. |
|||
- T8 OpenAPI contains exactly 6 onboarding paths and 9 operations, all with bearer security and the expected response/error references. The repaired examples/defaults match runtime behavior. |
|||
|
|||
## Verification Evidence |
|||
|
|||
### Required focused regression |
|||
|
|||
```powershell |
|||
cd D:\1\zhi\zhilai\mydreamjob-server |
|||
$env:JAVA_HOME='D:\java'; $env:Path='D:\java\bin;'+$env:Path |
|||
& 'D:\maven\apache-maven-3.9.7\bin\mvn.cmd' '-Dtest=Onboarding*Test,CompanyKnowledge*Test' test |
|||
``` |
|||
|
|||
Result: `Tests run: 96, Failures: 0, Errors: 0, Skipped: 0`, `BUILD SUCCESS`. |
|||
|
|||
### Production-isolation concurrency check |
|||
|
|||
```powershell |
|||
& 'D:\maven\apache-maven-3.9.7\bin\mvn.cmd' '-Dtest=OnboardingConcurrencyIntegrationTest$RepeatableReadLimitBoundary' '-Dspring.datasource.hikari.transaction-isolation=TRANSACTION_REPEATABLE_READ' test |
|||
``` |
|||
|
|||
Result: `Tests run: 1, Failures: 0, Errors: 0, Skipped: 0`, `BUILD SUCCESS`. |
|||
|
|||
### Randomized end-to-end ordering |
|||
|
|||
```powershell |
|||
& 'D:\maven\apache-maven-3.9.7\bin\mvn.cmd' '-Dtest=OnboardingEndToEndIntegrationTest' '-Djunit.jupiter.testmethod.order.default=org.junit.jupiter.api.MethodOrderer$Random' test |
|||
``` |
|||
|
|||
Result: `Tests run: 7, Failures: 0, Errors: 0, Skipped: 0`, `BUILD SUCCESS`. |
|||
|
|||
### OpenAPI verification |
|||
|
|||
```powershell |
|||
python docs\verify_openapi.py |
|||
``` |
|||
|
|||
Result: `paths: 135`; `N04 onboarding endpoints and schemas present (9 operations / 6 paths)`; `No empty ref keys found`; `Valid JSON: True`; `All checks passed!`. |
|||
|
|||
Structured checks found 0 removed paths, 6 added paths, 0 removed schemas, and 20 added schemas. |
|||
|
|||
## External Blockers |
|||
|
|||
The reported full-suite failures were independently reproduced in isolation: |
|||
|
|||
```powershell |
|||
& 'D:\maven\apache-maven-3.9.7\bin\mvn.cmd' '-Dtest=CareerProgressServiceTest,JobReviewDimensionControllerTest,JobReviewDimensionServiceTest,LocalResumeStorageServiceTest' test |
|||
``` |
|||
|
|||
Result: `Tests run: 69, Failures: 2, Errors: 9, Skipped: 0`, `BUILD FAILURE`. |
|||
|
|||
- `CareerProgressServiceTest.fullAggregation_returnsCorrectSummaries` fails with expected `1` but got `0`. |
|||
- `JobReviewDimensionControllerTest.listReviews_shouldReturnDimensionScores` fails with 500 due a null `Page`. |
|||
- `JobReviewDimensionServiceTest.listReviews_shouldReturnDimensionScoresWithoutN1` fails with null `Page.getContent()`. |
|||
- `LocalResumeStorageServiceTest` reports 8 JUnit extension cleanup errors caused by sandbox `AccessDeniedException` on temporary directories. |
|||
|
|||
These failures are outside the W3 review range. `git diff --name-only a5730a7..310d931` contains no files in the failing controllers/services/storage paths. Across the full N04 branch from `a2c66b3`, the only review-package changes are additive query methods in `JobReviewRepository` and `JobReviewDimensionScoreRepository`; the failing CareerProgress and LocalResumeStorage code is unchanged. Therefore W3 itself can pass conditionally, but final release cannot be declared while `mvn clean verify` is red. |
|||
|
|||
Real MySQL 8.4/Docker execution also remains outstanding. The contract requires it for the final completion proof, and it was not performed without separate authorization. |
|||
|
|||
## Minor Findings |
|||
|
|||
- `git diff --check a5730a7..310d931` reports two workflow-report files with blank lines at EOF (`W2-T4.md`, `W2-T5.md`). This is documentation-only and non-blocking. |
|||
- Some OpenAPI error-code assertions remain partly textual rather than exact response-shape assertions. The repaired defaults/examples are covered. |
|||
- H2 `MODE=MySQL` is strong regression coverage but is not a substitute for the pending real-database acceptance gate. |
|||
|
|||
## Assessment |
|||
|
|||
**W3 passes conditionally.** T6 concurrency repair, T7 end-to-end coverage, and T8 contract/docs repair are integrated and verified; no blocking W3 finding remains. The final release/DP-7 gate remains blocked by the independently reproduced non-N04 full-suite failures and the pending real MySQL 8.4/Docker acceptance run. |
|||
|
|||
Report path: `D:\1\zhi\zhilai\changes\n04-onboard\.superpowers\sdd\reviews\W3-wave.md` |
|||
@ -0,0 +1,35 @@ |
|||
# T8 聚焦修复 1:OpenAPI 示例与默认值 |
|||
|
|||
## Prior Failure |
|||
|
|||
`W3-T8.md` 发现: |
|||
|
|||
- `PUT /onboarding/company/knowledge` 的 200 示例缺少运行时响应必备的 `version`。 |
|||
- `CompanyChecklistItemCreateRequest` 缺少运行时默认值 `sortOrder=1000`、`required=false`。 |
|||
- `docs/verify_openapi.py` 未断言示例字段和 schema 默认值,因此未捕获上述偏差。 |
|||
|
|||
## Objective |
|||
|
|||
修正 OpenAPI 契约,并增强验证脚本,使示例、默认值与运行时 DTO 一致。 |
|||
|
|||
## Required Changes |
|||
|
|||
- 在 `docs/openapi-rc.json` 中修正 `PUT /onboarding/company/knowledge` 的 200 示例,包含 `version`。 |
|||
- 为 `CompanyChecklistItemCreateRequest.sortOrder` 增加默认值 `1000`。 |
|||
- 为 `CompanyChecklistItemCreateRequest.required` 增加默认值 `false`。 |
|||
- 在 `docs/verify_openapi.py` 中增加精确断言: |
|||
- 知识 Upsert 200 示例的 `data.version` 存在。 |
|||
- 创建请求 schema 的两个默认值正确。 |
|||
- 不修改 runtime API 行为。 |
|||
|
|||
## Evidence |
|||
|
|||
```powershell |
|||
cd D:\1\zhi\zhilai |
|||
python .\docs\verify_openapi.py |
|||
``` |
|||
|
|||
```powershell |
|||
cd D:\1\zhi\zhilai\mydreamjob-server |
|||
mvn -Dtest=Onboarding*Test,CompanyKnowledge*Test test |
|||
``` |
|||
Loading…
Reference in new issue