fix(spec): Phase 54-58 评审问题修复 + commit-push-pr 工具

- Phase 54-58: 修复 ChatGPT 5.3 评审报告中的 12 个问题
  - 严重问题 4 个:XSS 防护、租户隔离、审计语义、公开接口边界
  - 高优先级 5 个:数据源简化、返回模型、配置来源、Promise 处理、backend 标记
  - 中等优先级 3 个:枚举统一、输入边界、SQL 安全加固
- 新增工具:commit-push-pr.sh 和 /cpp slash command
- 文档:添加 commit-push-pr 使用指南

详见: artifacts/closed-loop/20260303T052013Z/phase-54-58-review-fixes-complete.md
This commit is contained in:
2026-03-03 14:23:25 +08:00
parent 79e7c4c274
commit 07c05c6823
45 changed files with 3808 additions and 50 deletions
+50
View File
@@ -0,0 +1,50 @@
---
name: cpp
description: Commit, push, and create PR in one command. Use when user wants to commit changes and create a pull request.
argument-hint: "[commit message] [--draft] [--no-pr]"
disable-model-invocation: false
---
# Commit-Push-PR 一键执行
执行以下操作:
1. **检查工作区状态**
- 使用 `git status --short` 查看未提交的更改
- 如果没有更改,提示用户并退出
2. **显示更改摘要**
- 列出修改的文件
- 列出新增的文件
- 询问用户确认
3. **解析参数**
- 从 $ARGUMENTS 中提取 commit 消息
- 检查是否有 `--draft` 标志(创建草稿 PR)
- 检查是否有 `--no-pr` 标志(不创建 PR)
- 检查是否有 `--dry-run` 标志(预览模式)
4. **执行 commit-push-pr 脚本**
```bash
bash scripts/commit-push-pr.sh -m "$COMMIT_MESSAGE" $FLAGS
```
5. **报告结果**
- 显示 commit SHA
- 显示 push 结果
- 如果创建了 PR,显示 PR 链接
## 使用示例
```
/cpp "fix: Phase 54-58 评审问题修复"
/cpp "feat: 新增功能" --draft
/cpp "chore: 更新文档" --no-pr
/cpp "test commit" --dry-run
```
## 注意事项
- 如果未安装 GitHub CLI,会跳过 PR 创建(除非使用 --no-pr)
- 如果当前分支已有 PR,会提示而不是创建新的
- 使用 --dry-run 可以预览操作而不实际执行
@@ -0,0 +1,31 @@
{
"check": "phase-29-execute",
"status": "fail",
"exitCode": 1,
"summary": " PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-execute.log",
"source": "local",
"phase": "29",
"attempt": 1,
"timestamp": "2026-03-03T04:13:31Z",
"errors": [
" PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-manifest.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-rules.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-compile.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-integration.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-contract.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-nfr.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/pre-edit-guard.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/post-edit-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/stop-gate.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/review/diff-review.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/preflight/preflight-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-execute.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-parallel.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/run-all.sh has strict mode (set -euo pipefail)",
"║ FAIL: 0 ║",
"error: Unable to create '/Users/brunogao/work/codes/ljwx/ljwx-platform/.git/index.lock': Operation not permitted",
"error: could not write index"
]
}
@@ -0,0 +1,43 @@
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"phase": "29",
"attempt": 1,
"timestamp": "2026-03-03T04:13:28Z",
"errors": [
"(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:11:21.806 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:11:21.827 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:11:21.850 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 9 | Failed: 1 | Skipped: 1",
" FAILED RULES: R09",
" GATE RESULT: FAILED"
]
}
@@ -0,0 +1,163 @@
{
"phase": "29",
"attempt": 1,
"generatedAt": "2026-03-03T04:13:31Z",
"checks": [
{
"check": "phase-29-execute",
"status": "fail",
"exitCode": 1,
"summary": " PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-execute.log",
"source": "local",
"errors": [
" PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-manifest.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-rules.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-compile.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-integration.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-contract.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-nfr.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/pre-edit-guard.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/post-edit-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/stop-gate.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/review/diff-review.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/preflight/preflight-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-execute.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-parallel.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/run-all.sh has strict mode (set -euo pipefail)",
"║ FAIL: 0 ║",
"error: Unable to create '/Users/brunogao/work/codes/ljwx/ljwx-platform/.git/index.lock': Operation not permitted",
"error: could not write index"
]
},
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"errors": [
"(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:11:21.806 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:11:21.827 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:11:21.850 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 9 | Failed: 1 | Skipped: 1",
" FAILED RULES: R09",
" GATE RESULT: FAILED"
]
}
],
"failed": [
{
"check": "phase-29-execute",
"status": "fail",
"exitCode": 1,
"summary": " PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-execute.log",
"source": "local",
"errors": [
" PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-manifest.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-rules.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-compile.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-integration.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-contract.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-nfr.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/pre-edit-guard.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/post-edit-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/stop-gate.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/review/diff-review.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/preflight/preflight-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-execute.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-parallel.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/run-all.sh has strict mode (set -euo pipefail)",
"║ FAIL: 0 ║",
"error: Unable to create '/Users/brunogao/work/codes/ljwx/ljwx-platform/.git/index.lock': Operation not permitted",
"error: could not write index"
]
},
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"errors": [
"(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:11:21.806 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:11:21.827 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:11:21.850 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 9 | Failed: 1 | Skipped: 1",
" FAILED RULES: R09",
" GATE RESULT: FAILED"
]
}
],
"summary": {
"totalChecks": 2,
"failedChecks": 2
},
"errorSummary": [
"[local:phase-29-execute] PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
"[local:phase-29-execute] PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
"[local:phase-29-execute] PASS H2 scripts/gates/gate-manifest.sh has strict mode (set -euo pipefail)",
"[local:phase-29-execute] PASS H2 scripts/gates/gate-rules.sh has strict mode (set -euo pipefail)",
"[local:phase-29-execute] PASS H2 scripts/gates/gate-compile.sh has strict mode (set -euo pipefail)",
"[local:phase-29-execute] PASS H2 scripts/gates/gate-integration.sh has strict mode (set -euo pipefail)",
"[local:phase-29-precheck-gate] (node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"[local:phase-29-precheck-gate] (node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"[local:phase-29-precheck-gate] gate-rules: ERRORS=0 WARNINGS=18",
"[local:phase-29-precheck-gate] WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
"[local:phase-29-precheck-gate] gate-flyway-governance: ERRORS=0 WARNINGS=21",
"[local:phase-29-precheck-gate] 2026-03-03 12:11:21.806 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。"
]
}
@@ -0,0 +1,103 @@
{
"phase": "29",
"attempt": 1,
"generatedAt": "2026-03-03T04:13:31Z",
"input": {
"collect": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/collect.json"
},
"summary": {
"failedChecks": 2,
"categoryCounts": {
"A": 0,
"B": 2,
"C": 0,
"D": 0
},
"repairabilityCounts": {
"auto": 2,
"suggest": 0,
"mitigate": 0,
"manual": 0
}
},
"diagnoses": [
{
"check": "phase-29-execute",
"source": "local",
"category": "B",
"repairability": "auto",
"confidence": 0.78,
"reason": "Semi-deterministic test/schema/migration class failure.",
"signals": [
"contract"
],
"recommendedRecipes": [
"contract"
],
"evidence": {
"summary": " PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
"errors": [
" PASS H2 scripts/gates/gate-all.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-manifest.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-rules.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-compile.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-integration.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-contract.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/gates/gate-nfr.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/pre-edit-guard.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/post-edit-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/hooks/stop-gate.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/review/diff-review.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/preflight/preflight-check.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-execute.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/phase-parallel.sh has strict mode (set -euo pipefail)",
" PASS H2 scripts/run-all.sh has strict mode (set -euo pipefail)",
"║ FAIL: 0 ║",
"error: Unable to create '/Users/brunogao/work/codes/ljwx/ljwx-platform/.git/index.lock': Operation not permitted",
"error: could not write index"
],
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-execute.log"
}
},
{
"check": "phase-29-precheck-gate",
"source": "local",
"category": "B",
"repairability": "auto",
"confidence": 0.78,
"reason": "Semi-deterministic test/schema/migration class failure.",
"signals": [
"flyway"
],
"recommendedRecipes": [
"flyway"
],
"evidence": {
"summary": "(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"errors": [
"(node:65573) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:11:21.806 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:11:21.827 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:11:21.850 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。"
],
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log"
}
}
]
}
@@ -0,0 +1,42 @@
{
"generatedAt": "2026-03-03T04:13:33Z",
"input": {
"diagnosis": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/diagnosis.json",
"recipes": "scripts/ci/repair-recipes.yaml"
},
"summary": {
"planned": 2,
"applied": 2,
"passed": 1,
"failed": 1
},
"actions": [
{
"id": "codegen-openapi",
"check": "codegen",
"category": "B",
"mode": "auto",
"cmd": "if [ -x scripts/tools/export-openapi.sh ]; then bash scripts/tools/export-openapi.sh; else echo 'codegen recipe skipped: scripts/tools/export-openapi.sh not found'; fi",
"status": "pass",
"attempts": 1,
"exitCode": 0,
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/repair-logs/codegen-openapi.log",
"patchPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/repair-logs/codegen-openapi.patch",
"touchedFiles": []
},
{
"id": "flyway-repair",
"check": "flyway",
"category": "B",
"mode": "auto",
"cmd": "if [ -x scripts/flyway-repair.sh ]; then bash scripts/flyway-repair.sh; elif [ -x scripts/tools/flyway-repair.sh ]; then bash scripts/tools/flyway-repair.sh; else echo 'flyway repair script not found'; exit 1; fi",
"status": "fail",
"attempts": 1,
"exitCode": 1,
"logPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/repair-logs/flyway-repair.log",
"patchPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/repair-logs/flyway-repair.patch",
"touchedFiles": []
}
],
"patchPath": "artifacts/closed-loop/20260303T041046Z/phase-29/local-attempt-1/repair.patch"
}
@@ -0,0 +1,318 @@
diff --git a/docs/reports/data/phases/phase-29.json b/docs/reports/data/phases/phase-29.json
index f5fe95c..c8de9af 100644
--- a/docs/reports/data/phases/phase-29.json
+++ b/docs/reports/data/phases/phase-29.json
@@ -1,15 +1,15 @@
{
"phase": "29",
- "status": "PASS",
- "timestamp": "2026-03-02T14:54:10Z",
+ "status": "FAIL",
+ "timestamp": "2026-03-03T04:13:27Z",
"repo": {
"owner": "unknown",
"name": "unknown",
"default_branch": "master"
},
"git": {
- "commit": "92b87f4",
- "branch": "feat-baseline-gate-workflow"
+ "commit": "2b50bfe",
+ "branch": "master"
},
"ci": {
"run_id": null,
@@ -90,10 +90,10 @@
{
"id": "R09",
"name": "Tests",
- "status": "PASS",
- "critical": 0,
+ "status": "FAIL",
+ "critical": 1,
"warnings": 0,
- "message": "passed"
+ "message": "failed"
},
{
"id": "R10",
@@ -114,12 +114,20 @@
],
"summary": {
"total": 11,
- "pass": 10,
- "fail": 0,
+ "pass": 9,
+ "fail": 1,
"skip": 1,
- "critical": 0,
+ "critical": 1,
"warnings": 0,
- "pass_rate": 90.91
+ "pass_rate": 81.82
},
- "violations": []
+ "violations": [
+ {
+ "rule": "R09",
+ "severity": "CRITICAL",
+ "file": null,
+ "line": null,
+ "message": "failed"
+ }
+ ]
}
diff --git a/docs/reports/data/rtm.json b/docs/reports/data/rtm.json
index 736a16d..a9a03d4 100644
--- a/docs/reports/data/rtm.json
+++ b/docs/reports/data/rtm.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-03-02T23:54:54Z",
+ "generated_at": "2026-03-03T04:13:20Z",
"matrix": [
{
"phase": "00",
diff --git a/docs/reports/data/summary.json b/docs/reports/data/summary.json
index 1c3e6f0..3dc54c4 100644
--- a/docs/reports/data/summary.json
+++ b/docs/reports/data/summary.json
@@ -1,14 +1,14 @@
{
- "generated_at": "2026-03-02T23:55:08Z",
+ "generated_at": "2026-03-03T04:13:28Z",
"repo": {
"owner": "unknown",
"name": "unknown",
"default_branch": "master"
},
"git": {
- "branch": "feat-baseline-gate-workflow",
- "commit": "638a3f1",
- "short": "638a3f1"
+ "branch": "master",
+ "commit": "2b50bfe",
+ "short": "2b50bfe"
},
"ci": {
"run_id": null,
@@ -17,10 +17,10 @@
"run_url": null
},
"totals": {
- "pass": 33,
- "fail": 0,
+ "pass": 32,
+ "fail": 1,
"pending": 0,
- "critical": 0,
+ "critical": 1,
"warnings": 0
},
"phases": [
@@ -612,13 +612,13 @@
},
{
"phase": "29",
- "status": "PASS",
- "pass_rate": 90.91,
- "critical": 0,
+ "status": "FAIL",
+ "pass_rate": 81.82,
+ "critical": 1,
"warnings": 0,
- "timestamp": "2026-03-02T14:54:10Z",
- "git_commit": "92b87f4",
- "r09_status": "PASS",
+ "timestamp": "2026-03-03T04:13:27Z",
+ "git_commit": "2b50bfe",
+ "r09_status": "FAIL",
"gate_status": {
"R01": "PASS",
"R02": "PASS",
@@ -628,7 +628,7 @@
"R06": "PASS",
"R07": "PASS",
"R08": "PASS",
- "R09": "PASS",
+ "R09": "FAIL",
"R10": "SKIP",
"R11": "PASS"
}
@@ -700,6 +700,17 @@
}
],
"history": [
+ {
+ "timestamp": "2026-03-03T04:13:27Z",
+ "phase": "29",
+ "status": "FAIL",
+ "pass_rate": 81.82,
+ "git_commit": "2b50bfe",
+ "critical": 1,
+ "warnings": 0,
+ "run_id": null,
+ "run_url": null
+ },
{
"timestamp": "2026-03-02T23:55:07Z",
"phase": "53",
@@ -1238,17 +1249,6 @@
"warnings": 0,
"run_id": null,
"run_url": null
- },
- {
- "timestamp": "2026-03-02T18:11:40Z",
- "phase": "32",
- "status": "FAIL",
- "pass_rate": 63.64,
- "git_commit": "b54e089",
- "critical": 3,
- "warnings": 0,
- "run_id": null,
- "run_url": null
}
]
}
diff --git a/docs/reports/data/tests.json b/docs/reports/data/tests.json
index cae62c9..75cdd30 100644
--- a/docs/reports/data/tests.json
+++ b/docs/reports/data/tests.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-03-02T23:54:56Z",
+ "generated_at": "2026-03-03T04:13:28Z",
"ci": {
"run_id": null,
"run_attempt": 1,
@@ -7,10 +7,19 @@
"run_url": null
},
"summary": {
- "total": 0,
+ "total": 1,
"pass": 0,
- "fail": 0,
+ "fail": 1,
"skip": 0
},
- "tests": []
+ "tests": [
+ {
+ "phase": null,
+ "suite": "com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
+ "testcase": "",
+ "status": "ERROR",
+ "time_seconds": 3.596,
+ "message": "Failed to load ApplicationContext for [WebMergedContextConfiguration@3891b430 testClass = com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest, locations = [], classes = [com.ljwx.platform.app.LjwxPlatformApplication], contextInitializerClasses = [], activeProfiles = [\"test\"], propertySourceDescriptors = [], propertySourceProperties = [\"org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true\", \"server.port=0\"], contextCustomizers = [[ImportsContextCustomizer@769f6023 key = [org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientWebSecurityAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@35beb15e, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@191ae03f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@62679465, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@5f59185e, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@51e4ccb3, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@4b3fa0b3, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@40dd3977, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@50fc4786, org.springframework.boot.test.context.SpringBootTestAnnotation@843e3845], resourceBasePath = \"src/main/webapp\", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]"
+ }
+ ]
}
diff --git a/scripts/run-all.sh b/scripts/run-all.sh
index 58b23bf..8174929 100755
--- a/scripts/run-all.sh
+++ b/scripts/run-all.sh
@@ -131,6 +131,61 @@ is_completed() {
' "$MANIFEST" | grep -qE "(Status|Gate): PASSED"
}
+phase_has_manifest_entry() {
+ local phase="$1"
+ [[ -f "$MANIFEST" ]] || return 1
+ grep -q "^## PHASE $phase$" "$MANIFEST"
+}
+
+mark_phase_passed() {
+ local phase="$1"
+ local padded phase_brief title marker
+ padded="$(printf '%02d' "$phase")"
+ phase_brief="spec/phase/phase-${padded}.md"
+ marker="## PHASE $phase"
+ title="$(grep -m1 '^title:' "$phase_brief" 2>/dev/null | sed 's/title:[[:space:]]*//' | tr -d '"' || true)"
+ [[ -z "$title" ]] && title="Phase $phase"
+
+ if phase_has_manifest_entry "$phase"; then
+ awk -v marker="$marker" '
+ BEGIN { in_phase=0; status_set=0 }
+ $0 == marker { in_phase=1; print; next }
+ in_phase && /^## PHASE / {
+ if (!status_set) {
+ print "Status: PASSED"
+ }
+ in_phase=0
+ }
+ in_phase && /^(Status|Gate): / {
+ print "Status: PASSED"
+ status_set=1
+ next
+ }
+ { print }
+ END {
+ if (in_phase && !status_set) {
+ print "Status: PASSED"
+ }
+ }
+ ' "$MANIFEST" > "${MANIFEST}.tmp" && mv "${MANIFEST}.tmp" "$MANIFEST"
+ echo "[ClosedLoop][Local] Manifest updated: ${marker} -> PASSED"
+ return 0
+ fi
+
+ {
+ echo ""
+ echo "$marker"
+ echo "Title: $title"
+ echo "Completed: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
+ echo "Files:"
+ awk '/^scope:/,/^---$/' "$phase_brief" \
+ | sed -n 's/^[[:space:]]*-[[:space:]]*//p' \
+ | sed 's/^/ - /'
+ echo "Status: PASSED"
+ } >> "$MANIFEST"
+ echo "[ClosedLoop][Local] Manifest appended: ${marker} -> PASSED"
+}
+
phase_exists() {
local phase="$1"
local padded
@@ -254,6 +309,20 @@ execute_phase_with_closed_loop() {
mkdir -p "$attempt_dir"
echo "[ClosedLoop][Local] Phase $phase attempt $attempt/$((MAX_REPAIR_ATTEMPTS + 1))"
+ if phase_has_manifest_entry "$phase" || [[ -f "logs/phase-${padded}/run.log" ]]; then
+ if run_structured_check \
+ "phase-${padded}-precheck-gate" \
+ "$padded" \
+ "$attempt" \
+ "local" \
+ "$attempt_dir" \
+ bash scripts/gates/gate-all.sh "$phase"; then
+ echo "[ClosedLoop][Local] Gate already PASS on existing code, skip regeneration."
+ mark_phase_passed "$phase"
+ return 0
+ fi
+ fi
+
if run_structured_check \
"phase-${padded}-execute" \
"$padded" \
@@ -292,13 +361,17 @@ execute_phase_with_closed_loop() {
fi
# 修复后先做一次相关 gate 复检,保留证据链。
- run_structured_check \
+ if run_structured_check \
"phase-${padded}-gate-verify" \
"$padded" \
"$attempt" \
"local" \
"$attempt_dir" \
- bash scripts/gates/gate-all.sh "$phase" || true
+ bash scripts/gates/gate-all.sh "$phase"; then
+ echo "[ClosedLoop][Local] Repair verified by gate, skip regeneration."
+ mark_phase_passed "$phase"
+ return 0
+ fi
attempt=$((attempt + 1))
done
@@ -0,0 +1,43 @@
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"phase": "29",
"attempt": 1,
"timestamp": "2026-03-03T04:17:22Z",
"errors": [
"(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:15:26.767 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:15:26.786 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:15:26.813 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 9 | Failed: 1 | Skipped: 1",
" FAILED RULES: R09",
" GATE RESULT: FAILED"
]
}
@@ -0,0 +1,101 @@
{
"phase": "29",
"attempt": 1,
"generatedAt": "2026-03-03T04:17:22Z",
"checks": [
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"errors": [
"(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:15:26.767 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:15:26.786 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:15:26.813 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 9 | Failed: 1 | Skipped: 1",
" FAILED RULES: R09",
" GATE RESULT: FAILED"
]
}
],
"failed": [
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"errors": [
"(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:15:26.767 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:15:26.786 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:15:26.813 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 9 | Failed: 1 | Skipped: 1",
" FAILED RULES: R09",
" GATE RESULT: FAILED"
]
}
],
"summary": {
"totalChecks": 1,
"failedChecks": 1
},
"errorSummary": [
"[local:phase-29-precheck-gate] (node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"[local:phase-29-precheck-gate] (node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"[local:phase-29-precheck-gate] gate-rules: ERRORS=0 WARNINGS=18",
"[local:phase-29-precheck-gate] WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
"[local:phase-29-precheck-gate] gate-flyway-governance: ERRORS=0 WARNINGS=21",
"[local:phase-29-precheck-gate] 2026-03-03 12:15:26.767 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。"
]
}
@@ -0,0 +1,65 @@
{
"phase": "29",
"attempt": 1,
"generatedAt": "2026-03-03T04:17:22Z",
"input": {
"collect": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/collect.json"
},
"summary": {
"failedChecks": 1,
"categoryCounts": {
"A": 0,
"B": 1,
"C": 0,
"D": 0
},
"repairabilityCounts": {
"auto": 1,
"suggest": 0,
"mitigate": 0,
"manual": 0
}
},
"diagnoses": [
{
"check": "phase-29-precheck-gate",
"source": "local",
"category": "B",
"repairability": "auto",
"confidence": 0.78,
"reason": "Semi-deterministic test/schema/migration class failure.",
"signals": [
"flyway"
],
"recommendedRecipes": [
"flyway"
],
"evidence": {
"summary": "(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"errors": [
"(node:7098) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=21",
"2026-03-03 12:15:26.767 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:15:26.786 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:15:26.813 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。"
],
"logPath": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log"
}
}
]
}
@@ -0,0 +1,29 @@
{
"generatedAt": "2026-03-03T04:17:23Z",
"input": {
"diagnosis": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/diagnosis.json",
"recipes": "scripts/ci/repair-recipes.yaml"
},
"summary": {
"planned": 1,
"applied": 1,
"passed": 0,
"failed": 1
},
"actions": [
{
"id": "flyway-repair",
"check": "flyway",
"category": "B",
"mode": "auto",
"cmd": "if [ -x scripts/flyway-repair.sh ]; then bash scripts/flyway-repair.sh; elif [ -x scripts/tools/flyway-repair.sh ]; then bash scripts/tools/flyway-repair.sh; else echo 'flyway repair script not found'; exit 1; fi",
"status": "fail",
"attempts": 1,
"exitCode": 1,
"logPath": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/repair-logs/flyway-repair.log",
"patchPath": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/repair-logs/flyway-repair.patch",
"touchedFiles": []
}
],
"patchPath": "artifacts/closed-loop/20260303T041451Z/phase-29/local-attempt-1/repair.patch"
}
@@ -0,0 +1,413 @@
diff --git a/docs/reports/data/phases/phase-29.json b/docs/reports/data/phases/phase-29.json
index f5fe95c..7042cfd 100644
--- a/docs/reports/data/phases/phase-29.json
+++ b/docs/reports/data/phases/phase-29.json
@@ -1,15 +1,15 @@
{
"phase": "29",
- "status": "PASS",
- "timestamp": "2026-03-02T14:54:10Z",
+ "status": "FAIL",
+ "timestamp": "2026-03-03T04:17:20Z",
"repo": {
"owner": "unknown",
"name": "unknown",
"default_branch": "master"
},
"git": {
- "commit": "92b87f4",
- "branch": "feat-baseline-gate-workflow"
+ "commit": "2b50bfe",
+ "branch": "master"
},
"ci": {
"run_id": null,
@@ -90,10 +90,10 @@
{
"id": "R09",
"name": "Tests",
- "status": "PASS",
- "critical": 0,
+ "status": "FAIL",
+ "critical": 1,
"warnings": 0,
- "message": "passed"
+ "message": "failed"
},
{
"id": "R10",
@@ -114,12 +114,20 @@
],
"summary": {
"total": 11,
- "pass": 10,
- "fail": 0,
+ "pass": 9,
+ "fail": 1,
"skip": 1,
- "critical": 0,
+ "critical": 1,
"warnings": 0,
- "pass_rate": 90.91
+ "pass_rate": 81.82
},
- "violations": []
+ "violations": [
+ {
+ "rule": "R09",
+ "severity": "CRITICAL",
+ "file": null,
+ "line": null,
+ "message": "failed"
+ }
+ ]
}
diff --git a/docs/reports/data/rtm.json b/docs/reports/data/rtm.json
index 736a16d..41f1dc7 100644
--- a/docs/reports/data/rtm.json
+++ b/docs/reports/data/rtm.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-03-02T23:54:54Z",
+ "generated_at": "2026-03-03T04:17:15Z",
"matrix": [
{
"phase": "00",
diff --git a/docs/reports/data/summary.json b/docs/reports/data/summary.json
index 1c3e6f0..e3e0a76 100644
--- a/docs/reports/data/summary.json
+++ b/docs/reports/data/summary.json
@@ -1,14 +1,14 @@
{
- "generated_at": "2026-03-02T23:55:08Z",
+ "generated_at": "2026-03-03T04:17:21Z",
"repo": {
"owner": "unknown",
"name": "unknown",
"default_branch": "master"
},
"git": {
- "branch": "feat-baseline-gate-workflow",
- "commit": "638a3f1",
- "short": "638a3f1"
+ "branch": "master",
+ "commit": "2b50bfe",
+ "short": "2b50bfe"
},
"ci": {
"run_id": null,
@@ -17,10 +17,10 @@
"run_url": null
},
"totals": {
- "pass": 33,
- "fail": 0,
+ "pass": 32,
+ "fail": 1,
"pending": 0,
- "critical": 0,
+ "critical": 1,
"warnings": 0
},
"phases": [
@@ -612,13 +612,13 @@
},
{
"phase": "29",
- "status": "PASS",
- "pass_rate": 90.91,
- "critical": 0,
+ "status": "FAIL",
+ "pass_rate": 81.82,
+ "critical": 1,
"warnings": 0,
- "timestamp": "2026-03-02T14:54:10Z",
- "git_commit": "92b87f4",
- "r09_status": "PASS",
+ "timestamp": "2026-03-03T04:17:20Z",
+ "git_commit": "2b50bfe",
+ "r09_status": "FAIL",
"gate_status": {
"R01": "PASS",
"R02": "PASS",
@@ -628,7 +628,7 @@
"R06": "PASS",
"R07": "PASS",
"R08": "PASS",
- "R09": "PASS",
+ "R09": "FAIL",
"R10": "SKIP",
"R11": "PASS"
}
@@ -700,6 +700,39 @@
}
],
"history": [
+ {
+ "timestamp": "2026-03-03T04:17:20Z",
+ "phase": "29",
+ "status": "FAIL",
+ "pass_rate": 81.82,
+ "git_commit": "2b50bfe",
+ "critical": 1,
+ "warnings": 0,
+ "run_id": null,
+ "run_url": null
+ },
+ {
+ "timestamp": "2026-03-03T04:16:10Z",
+ "phase": "29",
+ "status": "FAIL",
+ "pass_rate": 81.82,
+ "git_commit": "2b50bfe",
+ "critical": 1,
+ "warnings": 0,
+ "run_id": null,
+ "run_url": null
+ },
+ {
+ "timestamp": "2026-03-03T04:13:27Z",
+ "phase": "29",
+ "status": "FAIL",
+ "pass_rate": 81.82,
+ "git_commit": "2b50bfe",
+ "critical": 1,
+ "warnings": 0,
+ "run_id": null,
+ "run_url": null
+ },
{
"timestamp": "2026-03-02T23:55:07Z",
"phase": "53",
@@ -1216,39 +1249,6 @@
"warnings": 0,
"run_id": null,
"run_url": null
- },
- {
- "timestamp": "2026-03-02T18:17:29Z",
- "phase": "47",
- "status": "FAIL",
- "pass_rate": 54.55,
- "git_commit": "3f6316a",
- "critical": 4,
- "warnings": 0,
- "run_id": null,
- "run_url": null
- },
- {
- "timestamp": "2026-03-02T18:15:41Z",
- "phase": "32",
- "status": "FAIL",
- "pass_rate": 63.64,
- "git_commit": "3f6316a",
- "critical": 3,
- "warnings": 0,
- "run_id": null,
- "run_url": null
- },
- {
- "timestamp": "2026-03-02T18:11:40Z",
- "phase": "32",
- "status": "FAIL",
- "pass_rate": 63.64,
- "git_commit": "b54e089",
- "critical": 3,
- "warnings": 0,
- "run_id": null,
- "run_url": null
}
]
}
diff --git a/docs/reports/data/tests.json b/docs/reports/data/tests.json
index cae62c9..9833c27 100644
--- a/docs/reports/data/tests.json
+++ b/docs/reports/data/tests.json
@@ -1,5 +1,5 @@
{
- "generated_at": "2026-03-02T23:54:56Z",
+ "generated_at": "2026-03-03T04:17:22Z",
"ci": {
"run_id": null,
"run_attempt": 1,
@@ -7,10 +7,19 @@
"run_url": null
},
"summary": {
- "total": 0,
+ "total": 1,
"pass": 0,
- "fail": 0,
+ "fail": 1,
"skip": 0
},
- "tests": []
+ "tests": [
+ {
+ "phase": null,
+ "suite": "com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
+ "testcase": "",
+ "status": "ERROR",
+ "time_seconds": 3.208,
+ "message": "Failed to load ApplicationContext for [WebMergedContextConfiguration@3891b430 testClass = com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest, locations = [], classes = [com.ljwx.platform.app.LjwxPlatformApplication], contextInitializerClasses = [], activeProfiles = [\"test\"], propertySourceDescriptors = [], propertySourceProperties = [\"org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true\", \"server.port=0\"], contextCustomizers = [[ImportsContextCustomizer@769f6023 key = [org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientWebSecurityAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration, org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityConfiguration, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration, org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration, org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration]], org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@35beb15e, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@191ae03f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@62679465, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@5f59185e, org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@51e4ccb3, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@4b3fa0b3, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@40dd3977, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@50fc4786, org.springframework.boot.test.context.SpringBootTestAnnotation@843e3845], resourceBasePath = \"src/main/webapp\", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]"
+ }
+ ]
}
diff --git a/scripts/run-all.sh b/scripts/run-all.sh
index 58b23bf..d8f80ab 100755
--- a/scripts/run-all.sh
+++ b/scripts/run-all.sh
@@ -131,6 +131,61 @@ is_completed() {
' "$MANIFEST" | grep -qE "(Status|Gate): PASSED"
}
+phase_has_manifest_entry() {
+ local phase="$1"
+ [[ -f "$MANIFEST" ]] || return 1
+ grep -q "^## PHASE $phase$" "$MANIFEST"
+}
+
+mark_phase_passed() {
+ local phase="$1"
+ local padded phase_brief title marker
+ padded="$(printf '%02d' "$phase")"
+ phase_brief="spec/phase/phase-${padded}.md"
+ marker="## PHASE $phase"
+ title="$(grep -m1 '^title:' "$phase_brief" 2>/dev/null | sed 's/title:[[:space:]]*//' | tr -d '"' || true)"
+ [[ -z "$title" ]] && title="Phase $phase"
+
+ if phase_has_manifest_entry "$phase"; then
+ awk -v marker="$marker" '
+ BEGIN { in_phase=0; status_set=0 }
+ $0 == marker { in_phase=1; print; next }
+ in_phase && /^## PHASE / {
+ if (!status_set) {
+ print "Status: PASSED"
+ }
+ in_phase=0
+ }
+ in_phase && /^(Status|Gate): / {
+ print "Status: PASSED"
+ status_set=1
+ next
+ }
+ { print }
+ END {
+ if (in_phase && !status_set) {
+ print "Status: PASSED"
+ }
+ }
+ ' "$MANIFEST" > "${MANIFEST}.tmp" && mv "${MANIFEST}.tmp" "$MANIFEST"
+ echo "[ClosedLoop][Local] Manifest updated: ${marker} -> PASSED"
+ return 0
+ fi
+
+ {
+ echo ""
+ echo "$marker"
+ echo "Title: $title"
+ echo "Completed: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
+ echo "Files:"
+ awk '/^scope:/,/^---$/' "$phase_brief" \
+ | sed -n 's/^[[:space:]]*-[[:space:]]*//p' \
+ | sed 's/^/ - /'
+ echo "Status: PASSED"
+ } >> "$MANIFEST"
+ echo "[ClosedLoop][Local] Manifest appended: ${marker} -> PASSED"
+}
+
phase_exists() {
local phase="$1"
local padded
@@ -248,12 +303,71 @@ execute_phase_with_closed_loop() {
padded="$(printf '%02d' "$phase")"
local phase_artifact_dir="${RUN_ARTIFACT_DIR}/phase-${padded}"
local attempt=1
+ local resume_mode=false
+
+ if phase_has_manifest_entry "$phase" || [[ -f "logs/phase-${padded}/run.log" ]]; then
+ resume_mode=true
+ echo "[ClosedLoop][Local] Resume mode enabled for phase $phase (existing outputs detected)."
+ fi
while (( attempt <= MAX_REPAIR_ATTEMPTS + 1 )); do
local attempt_dir="${phase_artifact_dir}/local-attempt-${attempt}"
mkdir -p "$attempt_dir"
echo "[ClosedLoop][Local] Phase $phase attempt $attempt/$((MAX_REPAIR_ATTEMPTS + 1))"
+ if $resume_mode; then
+ if run_structured_check \
+ "phase-${padded}-precheck-gate" \
+ "$padded" \
+ "$attempt" \
+ "local" \
+ "$attempt_dir" \
+ bash scripts/gates/gate-all.sh "$phase"; then
+ echo "[ClosedLoop][Local] Gate already PASS on existing code, skip regeneration."
+ mark_phase_passed "$phase"
+ return 0
+ fi
+
+ if ! $ENABLE_AUTO_REPAIR || (( attempt > MAX_REPAIR_ATTEMPTS )); then
+ echo "[ClosedLoop][Local] Resume mode: 自动修复未启用或已达到最大尝试次数,跳过重新生成。"
+ return 1
+ fi
+
+ echo "[ClosedLoop][Local] Resume mode: Collect -> Diagnose -> Repair (no regeneration)"
+ local resume_repair_rc=0
+ if ! collect_diagnose_repair "$padded" "$attempt" "$attempt_dir"; then
+ resume_repair_rc=$?
+ fi
+
+ local resume_applied=0
+ if [[ -f "${attempt_dir}/repair.json" ]]; then
+ resume_applied="$(jq -r '.summary.applied // 0' "${attempt_dir}/repair.json" 2>/dev/null || echo 0)"
+ fi
+
+ if [[ "$resume_repair_rc" -eq 11 || "$resume_applied" -eq 0 ]]; then
+ echo "[ClosedLoop][Local] Resume mode: 没有匹配的 repair recipe,停止自动修复。"
+ return 1
+ fi
+ if [[ "$resume_repair_rc" -ne 0 && "$resume_repair_rc" -ne 11 ]]; then
+ echo "[ClosedLoop][Local] Resume mode: repair recipe 执行失败(rc=${resume_repair_rc})。"
+ fi
+
+ if run_structured_check \
+ "phase-${padded}-gate-verify" \
+ "$padded" \
+ "$attempt" \
+ "local" \
+ "$attempt_dir" \
+ bash scripts/gates/gate-all.sh "$phase"; then
+ echo "[ClosedLoop][Local] Resume mode: repair verified by gate, skip regeneration."
+ mark_phase_passed "$phase"
+ return 0
+ fi
+
+ attempt=$((attempt + 1))
+ continue
+ fi
+
if run_structured_check \
"phase-${padded}-execute" \
"$padded" \
@@ -292,13 +406,17 @@ execute_phase_with_closed_loop() {
fi
# 修复后先做一次相关 gate 复检,保留证据链。
- run_structured_check \
+ if run_structured_check \
"phase-${padded}-gate-verify" \
"$padded" \
"$attempt" \
"local" \
"$attempt_dir" \
- bash scripts/gates/gate-all.sh "$phase" || true
+ bash scripts/gates/gate-all.sh "$phase"; then
+ echo "[ClosedLoop][Local] Repair verified by gate, skip regeneration."
+ mark_phase_passed "$phase"
+ return 0
+ fi
attempt=$((attempt + 1))
done
@@ -0,0 +1,45 @@
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"phase": "29",
"attempt": 1,
"timestamp": "2026-03-03T04:37:59Z",
"errors": [
"(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=10 WARNINGS=18",
" gate-rules: FAILED",
" FAIL scripts/gates/gate-rules.sh",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"2026-03-03 12:36:07.271 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:36:07.295 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:36:07.322 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 8 | Failed: 2 | Skipped: 1",
" FAILED RULES: R03 R09",
" GATE RESULT: FAILED"
]
}
@@ -0,0 +1,105 @@
{
"phase": "29",
"attempt": 1,
"generatedAt": "2026-03-03T04:37:59Z",
"checks": [
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"errors": [
"(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=10 WARNINGS=18",
" gate-rules: FAILED",
" FAIL scripts/gates/gate-rules.sh",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"2026-03-03 12:36:07.271 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:36:07.295 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:36:07.322 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 8 | Failed: 2 | Skipped: 1",
" FAILED RULES: R03 R09",
" GATE RESULT: FAILED"
]
}
],
"failed": [
{
"check": "phase-29-precheck-gate",
"status": "fail",
"exitCode": 1,
"summary": "(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"errors": [
"(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=10 WARNINGS=18",
" gate-rules: FAILED",
" FAIL scripts/gates/gate-rules.sh",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"2026-03-03 12:36:07.271 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:36:07.295 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:36:07.322 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.postgresql.util.PSQLException: 尝试连线已失败。",
"\tat com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)",
"Caused by: java.net.SocketException: Operation not permitted",
" gate-nfr: ERRORS=0 WARNINGS=3",
" FAIL scripts/gates/gate-test.sh",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 8 | Failed: 2 | Skipped: 1",
" FAILED RULES: R03 R09",
" GATE RESULT: FAILED"
]
}
],
"summary": {
"totalChecks": 1,
"failedChecks": 1
},
"errorSummary": [
"[local:phase-29-precheck-gate] (node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"[local:phase-29-precheck-gate] (node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"[local:phase-29-precheck-gate] gate-rules: ERRORS=10 WARNINGS=18",
"[local:phase-29-precheck-gate] gate-rules: FAILED",
"[local:phase-29-precheck-gate] FAIL scripts/gates/gate-rules.sh",
"[local:phase-29-precheck-gate] WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql"
]
}
@@ -0,0 +1,65 @@
{
"phase": "29",
"attempt": 1,
"generatedAt": "2026-03-03T04:37:59Z",
"input": {
"collect": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/collect.json"
},
"summary": {
"failedChecks": 1,
"categoryCounts": {
"A": 0,
"B": 1,
"C": 0,
"D": 0
},
"repairabilityCounts": {
"auto": 1,
"suggest": 0,
"mitigate": 0,
"manual": 0
}
},
"diagnoses": [
{
"check": "phase-29-precheck-gate",
"source": "local",
"category": "B",
"repairability": "auto",
"confidence": 0.78,
"reason": "Semi-deterministic test/schema/migration class failure.",
"signals": [
"flyway"
],
"recommendedRecipes": [
"flyway"
],
"evidence": {
"summary": "(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"errors": [
"(node:55519) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=10 WARNINGS=18",
" gate-rules: FAILED",
" FAIL scripts/gates/gate-rules.sh",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"2026-03-03 12:36:07.271 [main] ERROR o.s.b.w.e.tomcat.TomcatStarter [traceId=] [tenantId=] [userId=] - Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"2026-03-03 12:36:07.295 [main] WARN o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext [traceId=] [tenantId=] [userId=] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server",
"Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.",
"2026-03-03 12:36:07.322 [main] ERROR o.s.boot.SpringApplication [traceId=] [tenantId=] [userId=] - Application run failed",
"org.springframework.context.ApplicationContextException: Unable to start web server",
"Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainFilter' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/filter/TenantDomainFilter.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainAppService' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/appservice/TenantDomainAppService.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tenantDomainMapper' defined in URL [jar:nested:/Users/brunogao/work/codes/ljwx/ljwx-platform/ljwx-platform-app/target/ljwx-platform-app-1.0.0-SNAPSHOT.jar/!BOOT-INF/classes/!/com/ljwx/platform/app/infra/mapper/TenantDomainMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。",
"Error Code : 0",
"Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Unable to obtain connection from database: 尝试连线已失败。"
],
"logPath": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log"
}
}
]
}
@@ -0,0 +1,29 @@
{
"generatedAt": "2026-03-03T04:38:00Z",
"input": {
"diagnosis": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/diagnosis.json",
"recipes": "scripts/ci/repair-recipes.yaml"
},
"summary": {
"planned": 1,
"applied": 1,
"passed": 0,
"failed": 1
},
"actions": [
{
"id": "flyway-repair",
"check": "flyway",
"category": "B",
"mode": "auto",
"cmd": "if [ -x scripts/flyway-repair.sh ]; then bash scripts/flyway-repair.sh; elif [ -x scripts/tools/flyway-repair.sh ]; then bash scripts/tools/flyway-repair.sh; else echo 'flyway repair script not found'; exit 1; fi",
"status": "fail",
"attempts": 1,
"exitCode": 1,
"logPath": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/repair-logs/flyway-repair.log",
"patchPath": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/repair-logs/flyway-repair.patch",
"touchedFiles": []
}
],
"patchPath": "artifacts/closed-loop/20260303T043538Z/phase-29/local-attempt-1/repair.patch"
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,56 @@
{
"check": "phase-29-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:76543) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T050111Z/phase-29/local-attempt-1/logs/phase-29-precheck-gate.log",
"source": "local",
"phase": "29",
"attempt": 1,
"timestamp": "2026-03-03T05:03:04Z",
"errors": [
"(node:76543) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.523 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.080 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.025 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.609 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.072 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.115 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.010 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.108 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.477 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.424 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.527 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.412 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.493 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:02:02.788 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:02:02.788 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772513661518\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-38-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:7809) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T050111Z/phase-38/local-attempt-1/logs/phase-38-precheck-gate.log",
"source": "local",
"phase": "38",
"attempt": 1,
"timestamp": "2026-03-03T05:04:54Z",
"errors": [
"(node:7809) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.234 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.049 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.086 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.061 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.632 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.116 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.041 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.010 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.030 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.206 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.483 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.420 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.526 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.411 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.515 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:03:51.655 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:03:51.655 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772514121851\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-40-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:38695) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T050111Z/phase-40/local-attempt-1/logs/phase-40-precheck-gate.log",
"source": "local",
"phase": "40",
"attempt": 1,
"timestamp": "2026-03-03T05:06:48Z",
"errors": [
"(node:38695) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.413 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.048 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.084 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.060 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.641 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.072 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.115 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.036 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.169 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.481 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.421 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.548 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.413 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.515 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:05:42.692 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:05:42.692 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772514230788\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-41-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:69753) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T050111Z/phase-41/local-attempt-1/logs/phase-41-precheck-gate.log",
"source": "local",
"phase": "41",
"attempt": 1,
"timestamp": "2026-03-03T05:08:41Z",
"errors": [
"(node:69753) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.846 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.048 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.085 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.061 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.636 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.117 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.046 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.042 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.478 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.421 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.521 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.409 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.492 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:07:35.990 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:07:35.990 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772514341774\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-44-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:650) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T050111Z/phase-44/local-attempt-1/logs/phase-44-precheck-gate.log",
"source": "local",
"phase": "44",
"attempt": 1,
"timestamp": "2026-03-03T05:10:34Z",
"errors": [
"(node:650) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8.969 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.046 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.080 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.066 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.633 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.066 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.116 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.013 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.034 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.089 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.471 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.417 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.518 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.419 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.505 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:09:31.835 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:09:31.835 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772514455112\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-45-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:31649) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T050111Z/phase-45/local-attempt-1/logs/phase-45-precheck-gate.log",
"source": "local",
"phase": "45",
"attempt": 1,
"timestamp": "2026-03-03T05:12:26Z",
"errors": [
"(node:31649) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.306 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.080 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.075 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.051 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.702 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.061 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.118 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.092 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.478 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.421 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.525 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.410 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.504 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:11:23.245 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:11:23.245 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772514570954\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-46-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:62213) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T050111Z/phase-46/local-attempt-1/logs/phase-46-precheck-gate.log",
"source": "local",
"phase": "46",
"attempt": 1,
"timestamp": "2026-03-03T05:14:21Z",
"errors": [
"(node:62213) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8.802 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.046 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.075 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.052 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.706 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.122 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.036 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.077 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.491 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.424 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.531 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.415 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.511 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:13:17.855 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:13:17.855 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772514682369\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-47-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:6790) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T051722Z/phase-47/local-attempt-1/logs/phase-47-precheck-gate.log",
"source": "local",
"phase": "47",
"attempt": 1,
"timestamp": "2026-03-03T05:19:17Z",
"errors": [
"(node:6790) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.613 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.047 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.085 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.025 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.617 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.066 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.115 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.010 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.245 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.474 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.421 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.526 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.414 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.522 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:18:13.818 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:18:13.818 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772514796927\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-48-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:43564) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T052013Z/phase-48/local-attempt-1/logs/phase-48-precheck-gate.log",
"source": "local",
"phase": "48",
"attempt": 1,
"timestamp": "2026-03-03T05:22:07Z",
"errors": [
"(node:43564) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.943 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.049 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.084 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.024 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.716 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.116 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.030 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.129 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.461 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.404 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.522 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.449 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.504 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:21:04.683 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:21:04.683 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772515092964\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-49-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:75541) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T052013Z/phase-49/local-attempt-1/logs/phase-49-precheck-gate.log",
"source": "local",
"phase": "49",
"attempt": 1,
"timestamp": "2026-03-03T05:23:59Z",
"errors": [
"(node:75541) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.487 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.049 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.081 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.025 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.622 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.059 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.112 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.010 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.030 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.093 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.482 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.423 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.523 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.405 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.503 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:22:55.742 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:22:55.742 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772515263774\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-50-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:8150) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T052013Z/phase-50/local-attempt-1/logs/phase-50-precheck-gate.log",
"source": "local",
"phase": "50",
"attempt": 1,
"timestamp": "2026-03-03T05:25:50Z",
"errors": [
"(node:8150) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.261 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.046 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.054 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.025 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.613 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.017 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.114 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.033 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.973 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.475 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.422 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.521 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.411 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.504 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:24:47.043 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:24:47.043 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772515374838\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-51-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:39781) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T052013Z/phase-51/local-attempt-1/logs/phase-51-precheck-gate.log",
"source": "local",
"phase": "51",
"attempt": 1,
"timestamp": "2026-03-03T05:27:42Z",
"errors": [
"(node:39781) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.031 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.080 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.023 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.592 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.024 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.128 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.030 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.025 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.479 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.423 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.515 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.409 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.511 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:26:38.786 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:26:38.786 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772515486150\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-52-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:71620) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T052013Z/phase-52/local-attempt-1/logs/phase-52-precheck-gate.log",
"source": "local",
"phase": "52",
"attempt": 1,
"timestamp": "2026-03-03T05:29:31Z",
"errors": [
"(node:71620) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.377 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.050 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.084 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.059 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.622 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.074 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.020 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.113 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.039 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.047 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.477 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.423 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.525 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.412 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.506 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:28:29.791 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:28:29.792 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772515597839\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,56 @@
{
"check": "phase-53-precheck-gate",
"status": "pass",
"exitCode": 0,
"summary": "(node:2770) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
"logPath": "artifacts/closed-loop/20260303T052013Z/phase-53/local-attempt-1/logs/phase-53-precheck-gate.log",
"source": "local",
"phase": "53",
"attempt": 1,
"timestamp": "2026-03-03T05:31:21Z",
"errors": [
"(node:2770) [DEP0169] DeprecationWarning: `url.parse()` behavior is not standardized and prone to errors that have security implications. Use the WHATWG URL API instead. CVEs are not issued for `url.parse()` vulnerabilities.",
" gate-rules: ERRORS=0 WARNINGS=18",
" WARNING new migration detected (append to lock after review): ljwx-platform-app/src/main/resources/db/migration/V031__create_sys_frontend_error.sql",
" gate-flyway-governance: ERRORS=0 WARNINGS=22",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-core ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-security ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-data ---",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-web ---",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-web ---",
"[INFO] Tests run: 116, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6.685 s -- in com.ljwx.platform.contract.protocol.ProtocolContractSecurityTest",
"[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 s -- in com.ljwx.platform.phase00.SmokeTest",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.136 s -- in com.ljwx.platform.phase09.NoticeApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 s -- in com.ljwx.platform.phase08.DictConfigApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 s -- in com.ljwx.platform.phase30.DataChangeLogApiTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.624 s -- in com.ljwx.platform.phase39.DataMaskTest",
"[WARNING] Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s -- in com.ljwx.platform.phase06.TenantApiTest",
"[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.068 s -- in com.ljwx.platform.phase20.MenuApiIntegrationTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s -- in com.ljwx.platform.phase28.SecurityHardeningApiTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.118 s -- in com.ljwx.platform.phase04.UserApiTest",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.043 s -- in com.ljwx.platform.phase03.SecurityIntegrationTest",
"[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 s -- in com.ljwx.platform.phase35.StructuredLoggingTest",
"[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.010 s -- in com.ljwx.platform.phase33.MultiLevelCacheManagerTest",
"[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.034 s -- in com.ljwx.platform.phase05.RoleApiTest",
"[WARNING] Tests run: 170, Failures: 0, Errors: 0, Skipped: 1",
"[INFO] --- failsafe:3.5.4:integration-test (default) @ ljwx-platform-app ---",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.238 s -- in com.ljwx.platform.app.ProfileControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.485 s -- in com.ljwx.platform.app.LoginLogControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.424 s -- in com.ljwx.platform.app.MonitorControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.524 s -- in com.ljwx.platform.app.MenuControllerIT",
"[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.415 s -- in com.ljwx.platform.app.OnlineUserControllerIT",
"[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.515 s -- in com.ljwx.platform.app.DeptControllerIT",
"[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0",
"[INFO] --- failsafe:3.5.4:verify (default) @ ljwx-platform-app ---",
"2026-03-03 13:30:19.034 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: detected 1 failed or restarted instances.",
"2026-03-03 13:30:19.034 [main] INFO o.s.s.quartz.LocalDataSourceJobStore [traceId=] [tenantId=] [userId=] - ClusterManager: Scanning for instance \"Mac-Studio-2.local1772515708898\"'s failed in-progress jobs.",
" gate-nfr: ERRORS=0 WARNINGS=3",
" gate-baseline: ERRORS=0 WARNINGS=1",
" Total: 11 | Passed: 10 | Failed: 0 | Skipped: 1"
]
}
@@ -0,0 +1,177 @@
# Phase 54-58 评审问题修复完成报告
## 修复时间
2026-03-03 13:20 UTC+8
## 修复范围
根据 ChatGPT 5.3 评审报告,完成所有 12 个问题的修复。
---
## 修复清单
### ✅ 严重问题(4个)
#### 1. Phase 58 XSS 注入防护
**问题**:帮助中心 v-html 直接渲染 marked() 输出,未 sanitize
**修复位置**:`spec/phase/phase-58.md:344-364`
**修复内容**:
- 添加 DOMPurify 依赖到 `ljwx-platform-admin/package.json`
- 更新 HelpButton.vue 代码示例,使用 `DOMPurify.sanitize(marked.parse(doc.content))`
- 添加业务规则 BL-58-06:Markdown 渲染必须经过 DOMPurify 清洗
#### 2. Phase 55 报表租户隔离
**问题**:SQL 模板执行可能绕过 TenantLineInterceptor
**修复位置**:`spec/phase/phase-55.md:198-207, 255`
**修复内容**:
- Service 契约添加显式租户隔离说明:在 SQL 模板中强制注入 `AND tenant_id = #{tenantId}`
- 更新 BL-55-02:执行前自动在 WHERE 子句追加 `tenant_id = #{tenantId}`
- 添加 BL-55-07:禁止模板中手动写 tenant_id 条件,由框架统一注入
#### 3. Phase 56 审计矛盾
**问题**:异步写入 vs 全量审计要求冲突
**修复位置**:`spec/phase/phase-56.md:300`
**修复内容**:
- 明确审计策略:AI 对话日志异步写入,失败时记录到应用日志但不阻断响应
- 添加说明:审计完整性通过重试机制保障,而非同步阻塞
#### 4. Phase 58 帮助文档公开接口租户边界
**问题**:permitAll 路由的租户边界不清
**修复位置**:`spec/phase/phase-58.md:146-156`
**修复内容**:
- 添加租户隔离说明:`/api/v1/help-docs/route` 接口虽然无需鉴权,但必须通过 `X-Tenant-Id` header 传递租户 ID
- 后端通过 TenantLineInterceptor 自动注入 `tenant_id` 条件,确保只返回当前租户的帮助文档
---
### ✅ 高优先级(5个)
#### 5. Phase 55 数据源模型契约不完整
**问题**:SQL/API 混淆
**修复位置**:`spec/phase/phase-55.md:51-56, 67, 111, 152, 259-265`
**修复内容**:
- 移除 API 数据源类型,MVP 仅支持 SQL
- 添加技术约束说明:MVP 仅支持 PostgreSQL 数据库,SQL 模板语法遵循 PostgreSQL 标准
- 更新表结构:`data_source_type` 默认值改为 'SQL',注释改为"数据源类型(MVP 仅支持 SQL,目标数据库为 PostgreSQL)"
- 更新 DTO 校验:`@Pattern(regexp="SQL")` 并注明"MVP 仅支持 SQL,目标数据库为 PostgreSQL"
- 添加 BL-55-07:SQL 模板语法必须符合 PostgreSQL 标准
#### 6. Phase 55 返回模型缺 warning 字段
**问题**:pageSize 截断时无警告信息
**修复位置**:`spec/phase/phase-55.md:159-168`
**修复内容**:
- ReportResultVO 添加 `warnings` 字段(List<String>)
- 添加说明:当 pageSize 被截断时返回警告信息
#### 7. Phase 56 配置来源冲突
**问题**:sys_ai_config vs sys_config 冲突
**修复位置**:`spec/phase/phase-56.md:308-323`
**修复内容**:
- 明确配置单一真源:`sys_ai_config` 表(专用表)
- 删除 sys_config 相关描述
- Spring YAML 配置仅作为默认值/开发环境配置,生产环境从数据库读取
#### 8. Phase 57 请求封装 401 分支 Promise 悬挂
**问题**:401 分支只跳转不 resolve/reject,调用方可能 pending
**修复位置**:`spec/phase/phase-57.md:144-146`
**修复内容**:
- 401 分支改为 `reject(new Error('UNAUTHORIZED'))`,确保 Promise 正确结束
#### 9. Phase 57 标注 backend=false 但包含后端依赖
**问题**:Phase 57 使用了 sys_tenant_brand、sys_dict_data、sys_menu 等后端表
**修复位置**:`spec/phase/phase-57.md:4`
**修复内容**:
- 将 `backend: false` 改为 `backend: true`
- 添加说明:前置 Phase 已实现相关表结构,本 Phase 仅新增配置项
---
### ✅ 中等优先级(3个)
#### 10. Phase 54 字段枚举语义不统一
**问题**:USER/DEPT vs user/dept 混用
**修复位置**:`spec/phase/phase-54.md`
**修复内容**:
- 表结构注释统一为"实体类型(USER/DEPT/...,大写枚举)"
- DTO 校验添加 `@Pattern(regexp="USER|DEPT")`,注释改为"大写枚举:USER/DEPT"
#### 11. 多处输入边界缺失
**修复位置**:
- `spec/phase/phase-54.md:190-202`(FormDataQueryDTO)
- `spec/phase/phase-55.md:119-126`(ReportExecuteDTO)
- `spec/phase/phase-56.md:145-148`(AiChatDTO)
- `spec/phase/phase-56.md:182-189`(AiConfigUpdateDTO)
- `spec/phase/phase-58.md:159-166`(BillingQueryDTO)
- `spec/phase/phase-58.md:192-199`(HelpDocCreateDTO)
**修复内容**:
- FormDataQueryDTO:日期区间需同时提供,最大跨度 90 天
- ReportExecuteDTO:params 最多 20 个,需验证 key 在 filter_def 中定义
- AiChatDTO:sessionId 仅允许字母数字下划线短横线,message 1-2000 字符
- AiConfigUpdateDTO:modelName 仅允许字母数字点下划线短横线,apiKey 20-500 字符,baseUrl 必须以 http:// 或 https:// 开头
- BillingQueryDTO:endDate >= startDate,最大跨度 365 天
- HelpDocCreateDTO:title 1-200 字符,content 1-50000 字符,category 仅允许字母数字下划线短横线,routeMatch 必须以 / 开头
#### 12. Phase 55 SQL 安全校验策略脆弱
**问题**:简单 contains() 检测易绕过
**修复位置**:`spec/phase/phase-55.md:266-282`
**修复内容**:
- 使用正则词边界匹配(`\b` + keyword + `\b`),防止误判(如 "INSERTED_AT" 不应触发 "INSERT")
- 添加 GRANT、REVOKE 到禁止关键字列表
- 禁止多语句(分号分隔)
- 禁止注释(`--` 和 `/*`),防止绕过检测
---
## 修复影响范围
### 涉及 Phase
- Phase 54:动态表单引擎
- Phase 55:报表引擎
- Phase 56:AI 助手
- Phase 57:移动端 H5 + 国际化
- Phase 58:计费 + 帮助中心
### 涉及文件
- `spec/phase/phase-54.md`
- `spec/phase/phase-55.md`
- `spec/phase/phase-56.md`
- `spec/phase/phase-57.md`
- `spec/phase/phase-58.md`
### 修改类型
- 安全加固:XSS 防护、SQL 注入防护、租户隔离
- 契约完善:输入边界、字段校验、返回模型
- 语义统一:枚举值、配置来源、Promise 处理
- 元数据修正:backend 标记
---
## 验证建议
### 安全测试
1. Phase 58:验证 DOMPurify 是否正确清洗 Markdown 中的 XSS payload
2. Phase 55:验证 SQL 模板是否正确注入 tenant_id 条件
3. Phase 55:验证 SQL 安全校验是否能拦截绕过尝试(如 `IN/**/SERT`)
4. Phase 58:验证 `/api/v1/help-docs/route` 是否正确隔离租户数据
### 功能测试
1. Phase 54:验证日期区间校验(90 天限制)
2. Phase 55:验证 params 数量限制(20 个)和 key 白名单校验
3. Phase 56:验证 AI 配置输入边界(apiKey 长度、baseUrl 格式)
4. Phase 57:验证 401 响应后 Promise 是否正确 reject
5. Phase 58:验证计费查询日期区间校验(365 天限制)
### 集成测试
1. 验证多租户场景下各 Phase 的租户隔离是否生效
2. 验证输入边界校验是否在 Controller 层正确拦截
3. 验证异常场景下的错误信息是否符合规范
---
## 备注
- 所有修复均在 spec 层面完成,未涉及代码实现
- 修复遵循项目现有规范和架构设计
- 修复内容已同步到对应 Phase 的规格文档
- 建议在实现 Phase 54-58 时严格遵循修复后的规格
+168
View File
@@ -0,0 +1,168 @@
# Commit-Push-PR 工具使用指南
## 快速开始
### 基本用法
```bash
# 完整命令
bash scripts/commit-push-pr.sh -m "fix: Phase 54-58 评审问题修复"
# 快捷命令
bash scripts/cpp.sh "fix: Phase 54-58 评审问题修复"
```
## 命令选项
### 必填参数
- `-m, --message <msg>` - Commit 消息
### 可选参数
- `-t, --title <title>` - PR 标题(默认使用 commit 消息)
- `-b, --body <body>` - PR 描述
- `-B, --base <branch>` - 目标分支(默认 master)
- `--draft` - 创建草稿 PR
- `--no-pr` - 只 commit 和 push,不创建 PR
- `--dry-run` - 预览操作,不实际执行
## 使用示例
### 1. 基本提交并创建 PR
```bash
bash scripts/cpp.sh "fix: Phase 54-58 评审问题修复"
```
### 2. 创建草稿 PR
```bash
bash scripts/commit-push-pr.sh \
-m "feat: 新增报表引擎" \
-t "Phase 55: 报表引擎实现" \
--draft
```
### 3. 自定义 PR 标题和描述
```bash
bash scripts/commit-push-pr.sh \
-m "fix: 修复 XSS 漏洞" \
-t "安全修复:Phase 58 XSS 防护" \
-b "修复了帮助中心 Markdown 渲染的 XSS 漏洞,添加 DOMPurify 清洗"
```
### 4. 只提交和推送,不创建 PR
```bash
bash scripts/cpp.sh "chore: 更新文档" --no-pr
```
### 5. 预览操作(不实际执行)
```bash
bash scripts/commit-push-pr.sh -m "test commit" --dry-run
```
### 6. 指定目标分支
```bash
bash scripts/commit-push-pr.sh \
-m "hotfix: 紧急修复" \
-B develop
```
## 工作流程
脚本会按以下顺序执行:
1. **检查工作区** - 确认有未提交的更改
2. **显示文件列表** - 列出将要提交的文件
3. **Commit** - 执行 `git add -A` 和 `git commit`
4. **Push** - 推送到远程分支
5. **Create PR** - 使用 GitHub CLI 创建 PR(可选)
## 前置要求
### 必需
- Git 已配置
- 有未提交的更改
### 创建 PR 需要
- 安装 [GitHub CLI](https://cli.github.com/)
- 已登录 GitHub CLI (`gh auth login`)
如果未安装 GitHub CLI,可以使用 `--no-pr` 跳过 PR 创建。
## 错误处理
### 没有更改
```bash
$ bash scripts/cpp.sh "test"
[WARN] No changes to commit
```
### 未安装 GitHub CLI
```bash
[ERROR] GitHub CLI (gh) is not installed
[INFO] Install it from: https://cli.github.com/
[INFO] Or skip PR creation with --no-pr flag
```
### PR 已存在
```bash
[WARN] PR already exists for branch feature-branch: #123
[INFO] View PR: gh pr view 123 --web
```
## 最佳实践
1. **使用语义化提交消息**
```bash
bash scripts/cpp.sh "feat: 新增功能"
bash scripts/cpp.sh "fix: 修复 bug"
bash scripts/cpp.sh "docs: 更新文档"
bash scripts/cpp.sh "chore: 日常维护"
```
2. **草稿 PR 用于 WIP**
```bash
bash scripts/cpp.sh "wip: 进行中的工作" --draft
```
3. **预览后再执行**
```bash
bash scripts/cpp.sh "重要更改" --dry-run
# 确认无误后
bash scripts/cpp.sh "重要更改"
```
4. **分步操作**
```bash
# 先提交推送
bash scripts/cpp.sh "完成功能开发" --no-pr
# 测试通过后再创建 PR
gh pr create --base master --title "新功能"
```
## 快捷别名
可以在 `~/.bashrc` 或 `~/.zshrc` 中添加别名:
```bash
alias cpp='bash scripts/cpp.sh'
alias cppr='bash scripts/commit-push-pr.sh'
```
然后就可以直接使用:
```bash
cpp "fix: 修复问题"
cppr -m "feat: 新功能" --draft
```
+210
View File
@@ -0,0 +1,210 @@
#!/usr/bin/env bash
# ═══════════════════════════════════════════════════════════
# commit-push-pr.sh — 自动化 commit、push 和创建 PR
# 用法: bash scripts/commit-push-pr.sh [options]
#
# 选项:
# -m, --message <msg> Commit 消息(必填)
# -t, --title <title> PR 标题(可选,默认使用 commit 消息)
# -b, --body <body> PR 描述(可选)
# -B, --base <branch> 目标分支(可选,默认 master)
# --draft 创建草稿 PR
# --no-pr 只 commit 和 push,不创建 PR
# --dry-run 预览操作,不实际执行
#
# 示例:
# bash scripts/commit-push-pr.sh -m "fix: Phase 54-58 评审问题修复"
# bash scripts/commit-push-pr.sh -m "feat: 新增功能" -t "新功能 PR" --draft
# bash scripts/commit-push-pr.sh -m "chore: 更新文档" --no-pr
# ═══════════════════════════════════════════════════════════
set -euo pipefail
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$PROJECT_ROOT"
# ── 默认值 ─────────────────────────────────────────────────
COMMIT_MESSAGE=""
PR_TITLE=""
PR_BODY=""
BASE_BRANCH="master"
CREATE_PR=true
DRAFT_PR=false
DRY_RUN=false
# ── 颜色输出 ───────────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${BLUE}[INFO]${NC} $*"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $*"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $*"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $*"
}
# ── 参数解析 ───────────────────────────────────────────────
while [[ $# -gt 0 ]]; do
case "$1" in
-m|--message)
COMMIT_MESSAGE="$2"
shift 2
;;
-t|--title)
PR_TITLE="$2"
shift 2
;;
-b|--body)
PR_BODY="$2"
shift 2
;;
-B|--base)
BASE_BRANCH="$2"
shift 2
;;
--draft)
DRAFT_PR=true
shift
;;
--no-pr)
CREATE_PR=false
shift
;;
--dry-run)
DRY_RUN=true
shift
;;
-h|--help)
grep '^#' "$0" | grep -v '#!/usr/bin/env' | sed 's/^# //' | sed 's/^#//'
exit 0
;;
*)
log_error "Unknown option: $1"
echo "Use --help for usage information"
exit 1
;;
esac
done
# ── 参数验证 ───────────────────────────────────────────────
if [[ -z "$COMMIT_MESSAGE" ]]; then
log_error "Commit message is required. Use -m or --message"
exit 1
fi
# 如果没有指定 PR 标题,使用 commit 消息
if [[ -z "$PR_TITLE" ]]; then
PR_TITLE="$COMMIT_MESSAGE"
fi
# ── 检查工作区状态 ─────────────────────────────────────────
if [[ -z "$(git status --porcelain)" ]]; then
log_warn "No changes to commit"
exit 0
fi
# ── 获取当前分支 ───────────────────────────────────────────
CURRENT_BRANCH=$(git branch --show-current)
if [[ -z "$CURRENT_BRANCH" ]]; then
log_error "Not on any branch (detached HEAD)"
exit 1
fi
log_info "Current branch: $CURRENT_BRANCH"
log_info "Base branch: $BASE_BRANCH"
# ── 显示将要提交的文件 ─────────────────────────────────────
echo ""
log_info "Files to be committed:"
git status --short
echo ""
# ── Dry run 模式 ───────────────────────────────────────────
if $DRY_RUN; then
log_warn "DRY RUN MODE - No actual changes will be made"
echo ""
log_info "Would execute:"
echo " 1. git add -A"
echo " 2. git commit -m \"$COMMIT_MESSAGE\""
echo " 3. git push origin $CURRENT_BRANCH"
if $CREATE_PR; then
echo " 4. gh pr create --base $BASE_BRANCH --head $CURRENT_BRANCH --title \"$PR_TITLE\""
[[ -n "$PR_BODY" ]] && echo " --body \"$PR_BODY\""
$DRAFT_PR && echo " --draft"
fi
exit 0
fi
# ── Step 1: Commit ─────────────────────────────────────────
log_info "Step 1: Committing changes..."
git add -A
git commit -m "$COMMIT_MESSAGE"
log_success "Committed successfully"
# ── Step 2: Push ───────────────────────────────────────────
log_info "Step 2: Pushing to origin/$CURRENT_BRANCH..."
git push origin "$CURRENT_BRANCH"
log_success "Pushed successfully"
# ── Step 3: Create PR (optional) ───────────────────────────
if ! $CREATE_PR; then
log_info "Skipping PR creation (--no-pr flag)"
exit 0
fi
# 检查 gh CLI 是否安装
if ! command -v gh >/dev/null 2>&1; then
log_error "GitHub CLI (gh) is not installed"
log_info "Install it from: https://cli.github.com/"
log_info "Or skip PR creation with --no-pr flag"
exit 1
fi
# 检查是否已经有 PR
EXISTING_PR=$(gh pr list --head "$CURRENT_BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
if [[ -n "$EXISTING_PR" ]]; then
log_warn "PR already exists for branch $CURRENT_BRANCH: #$EXISTING_PR"
log_info "View PR: gh pr view $EXISTING_PR --web"
exit 0
fi
log_info "Step 3: Creating pull request..."
# 构建 gh pr create 命令
PR_CMD=(gh pr create --base "$BASE_BRANCH" --head "$CURRENT_BRANCH" --title "$PR_TITLE")
if [[ -n "$PR_BODY" ]]; then
PR_CMD+=(--body "$PR_BODY")
fi
if $DRAFT_PR; then
PR_CMD+=(--draft)
fi
# 执行创建 PR
if "${PR_CMD[@]}"; then
log_success "Pull request created successfully"
# 获取 PR 编号
PR_NUMBER=$(gh pr list --head "$CURRENT_BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
if [[ -n "$PR_NUMBER" ]]; then
log_info "PR #$PR_NUMBER: https://github.com/$(gh repo view --json nameWithOwner -q .nameWithOwner)/pull/$PR_NUMBER"
fi
else
log_error "Failed to create pull request"
exit 1
fi
echo ""
log_success "All done!"
Executable
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Quick alias for commit-push-pr.sh
# Usage: bash scripts/cpp.sh "commit message" [--draft] [--no-pr]
exec "$(dirname "$0")/commit-push-pr.sh" -m "$@"
+71
View File
@@ -0,0 +1,71 @@
# Phase 54-58 评审问题修复记录
## 评审来源
ChatGPT 5.3 对 Phase 54-58 的评审意见
## 修复状态
### 严重问题(4个)
#### 1. ✅ 前端 XSS 注入 - v-html 未 sanitize
**位置**: phase-58.md:344、phase-58.md:364
**问题**: HelpButton.vue 直接 v-html 渲染 marked() 输出,未使用 DOMPurify
**修复**: 在 phase-58.md 中添加 DOMPurify 依赖和使用说明
#### 2. ✅ 报表租户隔离机制风险
**位置**: phase-55.md:51、phase-55.md:255
**问题**: 报表执行使用原生 SQL,TenantLineInterceptor 可能不生效
**修复**: 在 phase-55.md 中明确说明报表执行的租户隔离策略
#### 3. ✅ Phase 56 审计要求矛盾
**位置**: phase-56.md:300、phase-56.md:364
**问题**: 一处写"异步写入",另一处写"全量审计"
**修复**: 统一为"同步写入,失败时记录错误但不阻断响应"
#### 4. ✅ 帮助文档公开接口租户边界不清
**位置**: phase-58.md:100、phase-58.md:151、phase-58.md:404
**修复**: 明确 /help-docs/route 的租户上下文获取策略
### 高优先级问题(5个)
#### 5. ✅ Phase 55 数据源模型契约不完整
**位置**: phase-55.md:54、phase-55.md:111、phase-55.md:198
**问题**: 声明支持 API 类型但缺少执行契约
**修复**: 移除 API 类型支持,MVP 仅支持 SQL 类型
#### 6. ✅ Phase 55 返回模型与业务规则不一致
**位置**: phase-55.md:159、phase-55.md:253
**问题**: BL 要求返回 warning,但 VO 未定义该字段
**修复**: 在 ReportResultVO 中添加 warnings 字段
#### 7. ✅ Phase 56 配置来源定义冲突
**位置**: phase-56.md:69、phase-56.md:308、phase-56.md:323
**问题**: sys_ai_config 表 vs sys_config vs 环境变量
**修复**: 统一为 sys_ai_config 表作为唯一配置源
#### 8. ✅ Phase 57 请求封装 401 分支 Promise 悬挂
**位置**: phase-57.md:144
**问题**: 401 分支只跳转不 resolve/reject
**修复**: 添加 reject 调用
#### 9. ✅ Phase 57 标注 backend=false 但包含后端依赖
**位置**: phase-57.md:5、phase-57.md:213、phase-57.md:230
**问题**: 需要后端字段支持但标记为纯前端
**修复**: 添加说明,这些字段在前置 Phase 中已实现
### 中等优先级问题(3个)
#### 10. ✅ Phase 54 字段枚举语义不统一
**位置**: phase-54.md:127、phase-54.md:246
**问题**: entity_type 大小写不一致
**修复**: 统一为大写枚举值
#### 11. ✅ 多处输入边界缺失
**位置**: phase-54.md:192、phase-58.md:162
**问题**: 日期区间、JSONB 大小未限制
**修复**: 添加输入边界校验规则
#### 12. ✅ Phase 55 SQL 安全校验策略脆弱
**位置**: phase-55.md:261
**问题**: 仅靠关键字黑名单
**修复**: 增强 SQL 校验策略说明
+5 -5
View File
@@ -124,7 +124,7 @@ scope:
|------|------|------|------|
| id | BIGINT | PK, NOT NULL | 主键(雪花 ID) |
| tenant_id | BIGINT | NOT NULL, DEFAULT 0, INDEX | 租户 ID |
| entity_type | VARCHAR(50) | NOT NULL | 实体类型(USER/DEPT/...) |
| entity_type | VARCHAR(50) | NOT NULL | 实体类型(USER/DEPT/...,大写枚举) |
| field_key | VARCHAR(100) | NOT NULL | 字段 Key(英文) |
| field_label | VARCHAR(100) | NOT NULL | 字段显示名称 |
| field_type | VARCHAR(50) | NOT NULL | 字段类型(TEXT/NUMBER/DATE/SELECT/...) |
@@ -191,14 +191,14 @@ scope:
|------|------|------|------|
| formDefId | Long | @NotNull | 表单定义 ID(必填,防止全表扫描) |
| creatorId | Long | — | 填写人 ID(可选过滤) |
| startTime | LocalDateTime | — | 创建时间开始(可选) |
| endTime | LocalDateTime | — | 创建时间结束(可选) |
| startTime | LocalDateTime | — | 创建时间开始(可选,需与 endTime 同时提供) |
| endTime | LocalDateTime | — | 创建时间结束(可选,需与 startTime 同时提供,且 endTime >= startTime,最大跨度 90 天) |
| pageNum | Integer | @Min(1) | 分页页码 |
| pageSize | Integer | @Min(1), @Max(100) | 分页大小 |
**禁止字段**:`tenantId`(由 TenantLineInterceptor 自动注入)
> `formDefId` 为必填,保证查询走 `idx_formdata_tenant_formdef` 索引,符合 BL-54-06(禁止全表 JSONB 扫描)。
> `formDefId` 为必填,保证查询走 `idx_formdata_tenant_formdef` 索引,符合 BL-54-06(禁止全表 JSONB 扫描)。日期区间校验在 Service 层执行。
### FormDefCreateDTO
@@ -243,7 +243,7 @@ scope:
| 字段 | 类型 | 校验 | 说明 |
|------|------|------|------|
| entityType | String | @NotBlank, @Size(max=50) | 实体类型(如 user/dept) |
| entityType | String | @NotBlank, @Size(max=50), @Pattern(regexp="USER|DEPT") | 实体类型(大写枚举:USER/DEPT) |
| fieldKey | String | @NotBlank, @Size(max=100), @Pattern(regexp="^[a-z][a-z0-9_]*$") | 字段唯一标识(小写字母+数字+下划线) |
| fieldLabel | String | @NotBlank, @Size(max=100) | 显示名称 |
| fieldType | String | @NotBlank, @Pattern(regexp="TEXT\|NUMBER\|DATE\|SELECT\|CHECKBOX") | 字段类型 |
+30 -11
View File
@@ -51,8 +51,10 @@ scope:
**解决方案**:实现 SQL 模板驱动的报表引擎,支持:
1. **报表定义管理**:在线配置 SQL 查询模板、列定义、过滤器
2. **安全参数化执行**:所有 SQL 使用 `#{}` 占位符,后端安全替换,防止 SQL 注入
3. **数据源抽象**:支持 SQL 类型(直接查询 DB)和 API 类型(调用内部 API)
4. **权限隔离**:TenantLineInterceptor 自动注入 tenant_id 过滤,报表结果严格隔离
3. **租户隔离**:执行时自动追加 `AND tenant_id = #{tenantId}` 条件,确保数据隔离
4. **权限隔离**:报表定义和执行结果严格按租户隔离
> **技术约束**:MVP 仅支持 PostgreSQL 数据库,SQL 模板语法遵循 PostgreSQL 标准。
## 数据库契约
@@ -64,7 +66,7 @@ scope:
| tenant_id | BIGINT | NOT NULL, DEFAULT 0, INDEX | 租户 ID |
| report_name | VARCHAR(100) | NOT NULL | 报表名称 |
| report_key | VARCHAR(100) | NOT NULL | 报表唯一标识 |
| data_source_type | VARCHAR(20) | NOT NULL, DEFAULT 'SQL' | 数据源类型:SQL / API |
| data_source_type | VARCHAR(20) | NOT NULL, DEFAULT 'SQL' | 数据源类型(MVP 仅支持 SQL,目标数据库为 PostgreSQL) |
| query_template | TEXT | NOT NULL | SQL 查询模板(使用 #{paramName} 占位符) |
| column_def | JSONB | NOT NULL | 列定义(列名、标题、类型、宽度、格式化) |
| filter_def | JSONB | NULL | 过滤器定义(参数名、类型、标签、是否必填) |
@@ -108,7 +110,7 @@ scope:
|------|------|------|------|
| reportName | String | @NotBlank, @Size(max=100) | 报表名称 |
| reportKey | String | @NotBlank, @Size(max=100), @Pattern(regexp="^[a-z][a-z0-9_]*$") | 报表唯一标识 |
| dataSourceType | String | @NotBlank, @Pattern(regexp="SQL\|API") | 数据源类型 |
| dataSourceType | String | @NotBlank, @Pattern(regexp="SQL") | 数据源类型(MVP 仅支持 SQL,目标数据库为 PostgreSQL) |
| queryTemplate | String | @NotBlank | SQL 模板(仅含 #{} 参数化占位符) |
| columnDef | List | @NotNull, @Size(min=1) | 列定义列表 |
| filterDef | List | — | 过滤器定义列表 |
@@ -120,10 +122,12 @@ scope:
| 字段 | 类型 | 校验 | 说明 |
|------|------|------|------|
| params | Map\<String, Object\> | — | 运行时参数(对应 filter_def 中的参数) |
| params | Map\<String, Object\> | @Size(max=20) | 运行时参数(对应 filter_def 中的参数,最多 20 个参数) |
| pageNum | Integer | @Min(1) | 分页页码 |
| pageSize | Integer | @Min(1), @Max(1000) | 分页大小(最大 1000 行) |
> **参数校验**:Service 层需验证 params 中的 key 必须在 filter_def 中定义,防止 SQL 注入。
### ReportDefVO
| 字段 | 类型 | 说明 |
@@ -147,7 +151,7 @@ scope:
| 字段 | 类型 | 校验 | 说明 |
|------|------|------|------|
| reportName | String | @NotBlank, @Size(max=100) | 报表名称 |
| dataSourceType | String | @NotBlank, @Pattern(regexp="SQL\|API") | 数据源类型 |
| dataSourceType | String | @NotBlank, @Pattern(regexp="SQL") | 数据源类型(MVP 仅支持 SQL,目标数据库为 PostgreSQL) |
| queryTemplate | String | @NotBlank | SQL 模板(仅含 #{} 参数化占位符) |
| columnDef | List | @NotNull, @Size(min=1) | 列定义列表 |
| filterDef | List | — | 过滤器定义列表 |
@@ -165,6 +169,7 @@ scope:
| total | Long | 总行数 |
| pageNum | Integer | 当前页 |
| pageSize | Integer | 每页大小 |
| warnings | List\<String\> | 警告信息列表(如 pageSize 截断、查询耗时过长等) |
## 核心组件契约
@@ -203,6 +208,10 @@ public class RptReportExecuteService {
* 2. 禁止包含 INSERT/UPDATE/DELETE/DROP/TRUNCATE 关键字(正则校验)
* 3. 分页大小不超过 1000 行
* 4. 执行超时 30s
* 5. 租户隔离:执行前在 SQL 末尾自动追加 "AND tenant_id = #{tenantId}"(从 SecurityContext 获取)
* - 若 SQL 已含 WHERE,追加 "AND tenant_id = #{tenantId}"
* - 若 SQL 无 WHERE,追加 "WHERE tenant_id = #{tenantId}"
* - 禁止用户在 query_template 中手动写 tenant_id 条件(防止绕过)
*/
public ReportResultVO execute(Long reportId, ReportExecuteDTO dto);
}
@@ -250,20 +259,22 @@ public class RptReportController {
- **BL-55-01**:创建报表时,`report_key` 在同一租户内不可重复 → 查重后插入 → 重复时返回 409 Conflict
- **BL-55-02**:报表 SQL 模板不得包含写操作关键字(INSERT/UPDATE/DELETE/DROP/TRUNCATE/ALTER)→ 服务层正则校验 → 发现违规返回 400
- **BL-55-03**:报表 SQL 模板必须使用 `#{}` 参数化占位符,禁止 `${}` 直接拼接 → 服务层校验 → 发现 `${}` 返回 400
- **BL-55-04**:执行报表查询时,`pageSize` 最大为 1000,超出时截断 → 返回 warning 字段
- **BL-55-05**:报表执行时,TenantLineInterceptor 自动注入 tenant_id 条件,确保跨租户数据隔离
- **BL-55-04**:执行报表查询时,`pageSize` 最大为 1000,超出时截断 → 返回 warnings 字段(List<String>)包含 "pageSize 已截断为 1000"
- **BL-55-05**:报表执行时,RptReportExecuteService 在 SQL 末尾自动追加 `AND tenant_id = #{tenantId}`(从 SecurityContext 获取),确保跨租户数据隔离 → 禁止用户在 query_template 中手动写 tenant_id 条件(创建时校验拒绝)
- **BL-55-06**:报表查询超时(30s)→ 中断查询 → 返回 504 带 trace_id
- **BL-55-07**:SQL 模板语法必须符合 PostgreSQL 标准 → 服务层不做语法校验(由 PostgreSQL 执行时报错)→ 执行失败时返回 500 带错误信息
## 安全设计
```java
// SQL 安全校验(在 RptReportDefAppService.create/update 中调用)
private void validateQueryTemplate(String queryTemplate) {
// 禁止写操作关键字(大小写不敏感)
// 禁止写操作关键字(大小写不敏感,使用词边界匹配)
String upper = queryTemplate.toUpperCase();
List<String> forbidden = List.of("INSERT", "UPDATE", "DELETE", "DROP", "TRUNCATE", "ALTER", "CREATE");
List<String> forbidden = List.of("INSERT", "UPDATE", "DELETE", "DROP", "TRUNCATE", "ALTER", "CREATE", "GRANT", "REVOKE");
for (String keyword : forbidden) {
if (upper.contains(keyword)) {
// 使用正则词边界匹配,防止误判(如 "INSERTED_AT" 不应触发 "INSERT")
if (Pattern.compile("\\b" + keyword + "\\b").matcher(upper).find()) {
throw new BusinessException(400, "SQL 模板禁止包含写操作关键字: " + keyword);
}
}
@@ -271,6 +282,14 @@ private void validateQueryTemplate(String queryTemplate) {
if (queryTemplate.contains("${")) {
throw new BusinessException(400, "SQL 模板禁止使用 ${} 占位符,请使用 #{}");
}
// 禁止多语句(分号分隔)
if (queryTemplate.trim().contains(";") && !queryTemplate.trim().endsWith(";")) {
throw new BusinessException(400, "SQL 模板禁止包含多条语句");
}
// 禁止注释(防止绕过检测)
if (queryTemplate.contains("--") || queryTemplate.contains("/*")) {
throw new BusinessException(400, "SQL 模板禁止包含注释");
}
}
```
+34 -24
View File
@@ -144,8 +144,8 @@ scope:
| 字段 | 类型 | 校验 | 说明 |
|------|------|------|------|
| sessionId | String | @Size(max=64) | 会话 ID(空则生成新会话) |
| message | String | @NotBlank, @Size(max=2000) | 用户提问 |
| sessionId | String | @Size(max=64), @Pattern(regexp="[a-zA-Z0-9_-]+") | 会话 ID(空则生成新会话,仅允许字母数字下划线短横线) |
| message | String | @NotBlank, @Size(min=1, max=2000) | 用户提问(1-2000 字符) |
**禁止字段**:`id`、`tenantId`、`userId`、`createdBy`、`createdTime`、`updatedBy`、`updatedTime`、`deleted`、`version`
@@ -182,9 +182,9 @@ scope:
| 字段 | 类型 | 校验 | 说明 |
|------|------|------|------|
| provider | String | @NotBlank, @Pattern(regexp="OPENAI\|TONGYI\|DEEPSEEK") | 提供商 |
| modelName | String | @NotBlank, @Size(max=100) | 模型名称 |
| apiKey | String | @NotBlank | API Key(明文,后端加密存储) |
| baseUrl | String | @Size(max=500) | 自定义 Base URL |
| modelName | String | @NotBlank, @Size(max=100), @Pattern(regexp="[a-zA-Z0-9._-]+") | 模型名称(仅允许字母数字点下划线短横线) |
| apiKey | String | @NotBlank, @Size(min=20, max=500) | API Key(明文,后端加密存储,20-500 字符) |
| baseUrl | String | @Size(max=500), @Pattern(regexp="https?://.*") | 自定义 Base URL(必须以 http:// 或 https:// 开头) |
| temperature | BigDecimal | @DecimalMin("0.0"), @DecimalMax("1.0") | 温度 |
| maxTokens | Integer | @Min(256), @Max(8192) | 最大 Token 数 |
@@ -297,7 +297,7 @@ public class AiConfigController {
> 格式:BL-56-{序号}:[条件] → [动作] → [结果/异常]
- **BL-56-01**:AI 对话时,Agent 仅持有只读权限(通过 SecurityContext 模拟只读角色)→ 尝试调用写操作 Tool → 返回 403
- **BL-56-02**:每次 AI 对话必须写入 sys_ai_conversation_log(包含 tool_calls JSONB)→ 写日志失败不影响对话响应(异步写入)
- **BL-56-02**:每次 AI 对话必须写入 sys_ai_conversation_log(包含 tool_calls JSONB)→ 同步写入,写日志失败时记录错误日志但不阻断对话响应(降级策略)
- **BL-56-03**:API Key 必须加密存储(AES),查询时 `apiKeyMasked` 脱敏显示 → 原始 Key 不在任何 VO 中暴露
- **BL-56-04**:AI 配置未启用时调用 /chat → 返回 503 "AI 功能未启用"
- **BL-56-05**:sessionId 为空时自动生成 UUID → 返回 AiChatVO 中的 sessionId 供客户端续用
@@ -305,29 +305,39 @@ public class AiConfigController {
## 模型切换配置
通过 `sys_config` 表存储,`AiConfigAppService` 动态加载:
**配置源**:`sys_ai_config` 表(单一真源,SSOT)
| 配置项 | 说明 |
|--------|------|
| ai.provider | 模型提供商(OPENAI/TONGYI/DEEPSEEK) |
| ai.model.name | 模型名称(如 gpt-4o, qwen-max, deepseek-chat) |
| ai.api.key.encrypted | 加密 API Key |
| ai.base.url | 自定义 Base URL(可选) |
`AiConfigAppService` 从 `sys_ai_config` 表动态加载配置,支持租户级覆盖:
- `tenant_id = 0`:全局默认配置(平台级)
- `tenant_id != 0`:租户自定义配置(优先级高于全局)
Spring AI 配置示例:
Spring AI 通过 `AiConfigAppService` 动态构建 ChatModel 实例:
```yaml
spring:
ai:
openai:
api-key: ${AI_API_KEY}
base-url: ${AI_BASE_URL:https://api.openai.com}
chat:
options:
model: ${AI_MODEL:gpt-4o}
temperature: 0.7
```java
@Service
public class AiConfigAppService {
public ChatModel buildChatModel() {
AiConfig config = getActiveConfig(); // 从 sys_ai_config 表查询
return switch (config.getProvider()) {
case "OPENAI" -> new OpenAiChatModel(
OpenAiApi.builder()
.apiKey(decrypt(config.getApiKeyEncrypted()))
.baseUrl(config.getBaseUrl())
.build(),
OpenAiChatOptions.builder()
.model(config.getModelName())
.temperature(config.getTemperature().doubleValue())
.maxTokens(config.getMaxTokens())
.build()
);
// ... 其他提供商
};
}
}
```
**禁止**:不使用 `sys_config` 表或环境变量作为配置源(避免多源冲突)。
## 测试用例(摘要)
详细用例见 **`spec/tests/phase-56-ai-assistant.tests.yml`**。
+11 -2
View File
@@ -2,7 +2,7 @@
phase: 57
title: "移动端 H5 + 国际化 (Mobile H5 + i18n)"
targets:
backend: false
backend: true
frontend: true
depends_on: [56]
bundle_with: []
@@ -141,7 +141,10 @@ const request = <T>(options: UniApp.RequestOptions): Promise<T> => {
success: (res) => {
const data = res.data as ApiResult<T>
if (data.code === 200) resolve(data.data)
else if (data.code === 401) { uni.redirectTo({ url: '/pages/login/index' }) }
else if (data.code === 401) {
uni.redirectTo({ url: '/pages/login/index' })
reject(new Error('UNAUTHORIZED'))
}
else reject(new Error(data.message))
},
fail: reject,
@@ -210,6 +213,8 @@ export default {
### 字典多语言
> **说明**:`sys_dict_data.labels JSONB` 字段在前置 Phase(Phase 8)中已实现,本 Phase 仅使用该字段。
后端 `sys_dict_data.labels JSONB` 字段支持多语言:
```json
{ "zh": "启用", "en": "Enabled" }
@@ -227,6 +232,8 @@ const getDictLabel = (dictType: string, value: string) => {
### 菜单多语言
> **说明**:`sys_menu.names JSONB` 字段在前置 Phase(Phase 4)中已实现,本 Phase 仅使用该字段。
`sys_menu.names JSONB` 字段:
```json
{ "zh": "用户管理", "en": "User Management" }
@@ -236,6 +243,8 @@ const getDictLabel = (dictType: string, value: string) => {
### 品牌配置语言
> **说明**:`sys_tenant_brand` 表在前置 Phase(Phase 42)中已实现,本 Phase 仅新增 `platform.default_locale` 配置项。
`sys_tenant_brand` 新增条目:
- `brand_key = platform.default_locale`,`brand_value = zh-CN`,`category = basic`
- 允许租户覆盖(`allow_tenant_override = true`)
+16 -8
View File
@@ -68,6 +68,7 @@ scope:
1. **计量计费**:Quartz 每日定时任务聚合 sys_operation_log/sys_login_log/sys_file 按 tenant_id 统计,写入 bill_usage_record
2. **运营仪表盘**:基于 bill_usage_record + sys_tenant 构建全局运营看板(DAU/MAU、存储用量、API 调用、即将过期预警)
3. **帮助中心**:帮助文档管理 + 前端悬浮 "?" 按当前路由匹配帮助内容
4. **XSS 防护**:前端使用 DOMPurify (^3.0.0) 清理 Markdown 渲染输出,防止帮助文档注入脚本
## 数据库契约
@@ -148,11 +149,13 @@ scope:
|------|------|----------|--------|--------|------|
| GET | /api/v1/help-docs | system:help:list | — | Result\<List\<HelpDocVO\>\> | 列表(按 category 过滤) |
| GET | /api/v1/help-docs/{id} | system:help:query | — | Result\<HelpDocVO\> | 详情 |
| GET | /api/v1/help-docs/route | — | — | Result\<HelpDocVO\> | 按路由匹配文档(无需鉴权) |
| GET | /api/v1/help-docs/route | — | — | Result\<HelpDocVO\> | 按路由匹配文档(无需鉴权,需 X-Tenant-Id header) |
| POST | /api/v1/help-docs | system:help:add | HelpDocCreateDTO | Result\<Long\> | 创建 |
| PUT | /api/v1/help-docs/{id} | system:help:edit | HelpDocUpdateDTO | Result\<Void\> | 更新 |
| DELETE | /api/v1/help-docs/{id} | system:help:delete | — | Result\<Void\> | 删除 |
> **租户隔离说明**:`/api/v1/help-docs/route` 接口虽然无需鉴权(permitAll),但必须通过 `X-Tenant-Id` header 传递租户 ID,后端通过 TenantLineInterceptor 自动注入 `tenant_id` 条件,确保只返回当前租户的帮助文档。
## DTO / VO 契约
### BillingQueryDTO(用量查询请求)
@@ -160,7 +163,9 @@ scope:
| 字段 | 类型 | 校验 | 说明 |
|------|------|------|------|
| startDate | LocalDate | @NotNull | 查询开始日期 |
| endDate | LocalDate | @NotNull | 查询结束日期 |
| endDate | LocalDate | @NotNull | 查询结束日期(需 >= startDate,最大跨度 365 天) |
> **日期区间校验**:Service 层需验证 `endDate >= startDate` 且跨度不超过 365 天,防止大范围查询。
| metricType | String | — | 指标类型过滤(可选,不传则返回全部类型) |
**禁止字段**:`tenantId`(由 TenantLineInterceptor 自动注入)
@@ -190,10 +195,10 @@ scope:
| 字段 | 类型 | 校验 | 说明 |
|------|------|------|------|
| docKey | String | @NotBlank, @Size(max=100), @Pattern(regexp="^[a-z][a-z0-9_-]*$") | 文档标识 |
| title | String | @NotBlank, @Size(max=200) | 标题 |
| content | String | @NotBlank | Markdown 正文 |
| category | String | @NotBlank, @Size(max=50) | 分类 |
| routeMatch | String | @Size(max=500) | 关联路由 |
| title | String | @NotBlank, @Size(min=1, max=200) | 标题(1-200 字符) |
| content | String | @NotBlank, @Size(min=1, max=50000) | Markdown 正文(1-50000 字符) |
| category | String | @NotBlank, @Size(max=50), @Pattern(regexp="[a-zA-Z0-9_-]+") | 分类(仅允许字母数字下划线短横线) |
| routeMatch | String | @Size(max=500), @Pattern(regexp="^/.*") | 关联路由(必须以 / 开头) |
| sortOrder | Integer | @Min(0) | 排序 |
**禁止字段**:`id`、`tenantId`、`createdBy`、`createdTime`、`updatedBy`、`updatedTime`、`deleted`、`version`
@@ -350,6 +355,7 @@ public class OperationsDashboardService {
import { useRoute } from 'vue-router'
import { getHelpDocByRoute } from '@/api/help/help-doc'
import { marked } from 'marked'
import DOMPurify from 'dompurify'
const route = useRoute()
const visible = ref(false)
@@ -360,8 +366,9 @@ const openHelp = async () => {
visible.value = true
}
// 安全渲染:marked 输出后使用 DOMPurify 清理 XSS
const renderedContent = computed(() =>
doc.value ? marked(doc.value.content) : ''
doc.value ? DOMPurify.sanitize(marked(doc.value.content)) : ''
)
</script>
```
@@ -409,11 +416,12 @@ public class HelpDocController {
- **BL-58-01**:DailyUsageStatJob 使用 `ON CONFLICT DO UPDATE` 实现幂等写入 → 每日重复执行不产生重复数据
- **BL-58-02**:运营仪表盘数据来源必须是 `bill_usage_record`(PostgreSQL),**禁止**从 Prometheus 查询租户维度数据(高基数问题)
- **BL-58-03**:`GET /api/v1/help-docs/route?path=...` 无需鉴权 → 任何登录用户可访问帮助文档
- **BL-58-03**:`GET /api/v1/help-docs/route?path=...` 为公开接口(permitAll)→ 未登录用户可访问 tenant_id=0 的全局文档;已登录用户可访问全局文档 + 本租户私有文档(通过 JWT 中的 tenantId 过滤)→ Service 层从 SecurityContext 获取 tenantId(未登录时默认 0)
- **BL-58-04**:帮助文档 `route_match` 支持精确匹配和前缀匹配(`/system/user` 匹配 `/system/user/list`)→ 优先精确匹配
- **BL-58-05**:租户用量超过套餐配额时(USER_COUNT > max_user_count 等)→ 通过消息中台发送告警通知给租户管理员 → 不强制阻断操作(P2 阶段仅告警)
- **BL-58-06**:即将到期预警(30 天内到期)→ 在运营仪表盘醒目展示 + 每周通过消息中台通知超管
- **BL-58-07**:调用 `GET /api/v1/billing/summary` 和 `GET /api/v1/ops/dashboard` 时 → Service 层验证 SecurityContext 中当前用户 tenantId == 0(平台超管身份)→ 非超管用户抛出 AccessDeniedException(响应 403),不返回任何跨租户数据
- **BL-58-08**:前端渲染帮助文档 Markdown 时 → 使用 DOMPurify.sanitize() 清理 marked() 输出 → 防止 XSS 注入(即使管理员恶意编辑文档也无法执行脚本)
## 测试用例(摘要)