{
  "ticket": "U85 #122",
  "generatedAt": "2026-10-28T01:06:40.042376+08:00",
  "startedAt": "2026-10-28T00:59:23.439494+08:00",
  "runId": "0059236a81",
  "input": "python3 labs/data-scheduler/run.py",
  "environment": {
    "os": "macOS-27.2-arm64-arm-64bit",
    "arch": "arm64",
    "jdk": "openjdk version \"21.0.11\" 2026-04-21 LTS",
    "maven": "Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)",
    "mysql": "8.4.7",
    "mysqlBin": "/Users/Shared/DBngin/mysql/8.4.7_arm64/bin/mysql",
    "xxlJobVersion": "3.5.0",
    "upstreamCommit": "3bebfc1609b95413581b11e270e5670dce679813",
    "adminJarSha256": "1ff5456dc1e2ccaca7cfae54772a57feb73eb4a43edfb1055d4c41f8d2ae1124",
    "executorJarSha256": "34b71bafd4dc967b2f4b4a5e3d35b23b135855e9c72f9b31d6983db31fab5354",
    "schemaSqlSha256": "0ab12dbda74de586dd71a044f52136ae17ebfcde82ee8e5693a689a34f56b600",
    "tableCount": 8,
    "externalServices": "MySQL 127.0.0.1:3306 独有库 study_u85_xxl_0059236a81；admin/executor 均在 127.0.0.1 随机端口"
  },
  "scenarios": [
    {
      "name": "dag-child-chain",
      "startedAt": "2026-10-28T01:00:30.181767+08:00",
      "finishedAt": "2026-10-28T01:00:31.354394+08:00",
      "observed": [
        "U85 dagChain logs A=1 B=1 C=1",
        "U85 dagChain triggerType A=任务触发类型：手动触发",
        "U85 dagChain parentMsgHasChild=True",
        "U85 dagChain order=01:00:30 -> 01:00:30 -> 01:00:30",
        "U85 dagMissingChild parentHandle=200 childLogs=0 parentClaimsChild=True"
      ]
    },
    {
      "name": "blocking-strategies",
      "startedAt": "2026-10-28T01:00:31.354457+08:00",
      "finishedAt": "2026-10-28T01:00:46.488109+08:00",
      "observed": [
        "U85 blockDiscard firstHandle=200 secondTriggerCode=500 secondHandle=0",
        "U85 blockDiscard executorRejected=True policyField=True",
        "U85 blockSerial codes=[200, 200] addressReused=True",
        "U85 blockSerial serializedByMarker=True secondStart=2026-10-28T01:00:42.147959+08:00 firstFinish=2026-10-28T01:00:42.144503+08:00"
      ]
    },
    {
      "name": "fail-retry",
      "startedAt": "2026-10-28T01:00:46.488216+08:00",
      "finishedAt": "2026-10-28T01:01:00.074570+08:00",
      "observed": [
        "U85 retryCodes=[500, 500, 200]",
        "U85 retryLeft=[2, 1, 0]",
        "U85 retryTypes=[True, True, True]",
        "U85 retryHandleMsgs=['planned-failure attempt=1 key=0059236a81', 'planned-failure attempt=2 key=0059236a81', 'recovered-after-2-failures']"
      ]
    },
    {
      "name": "misfire-strategies",
      "startedAt": "2026-10-28T01:01:00.074764+08:00",
      "finishedAt": "2026-10-28T01:01:07.222293+08:00",
      "observed": [
        "U85 misfireSkip logs=0 (错过约3个20s周期，无补偿)",
        "U85 misfireOnce logs=1 compensation=True"
      ]
    },
    {
      "name": "graceful-shutdown",
      "startedAt": "2026-10-28T01:01:07.222343+08:00",
      "finishedAt": "2026-10-28T01:01:14.405564+08:00",
      "observed": [
        "U85 gracefulKill codes=[500, 500]",
        "U85 gracefulKill runningKilled=True queuedSkipped=True",
        "U85 gracefulKill registryRemoved=True"
      ]
    },
    {
      "name": "crash-and-lost-job",
      "startedAt": "2026-10-28T01:01:14.405633+08:00",
      "finishedAt": "2026-10-28T01:04:36.803247+08:00",
      "observed": [
        "U85 crashHandler halted pidGone=True registryRowsStill=1",
        "U85 crashStaleAddress triggerCode=500 msg=t com.xxl.tool.http.http.HttpRequest.execute(HttpRequest.java:514) \t... 10 more ",
        "U85 crash11minButRegistryAliveAfter70s handleCode=0 (跨过完整监控周期仍不判失败，须注册不在线)",
        "U85 crashRegistryExpired addressCleared=true",
        "U85 crashAddressEmpty triggerCode=500 msg=度失败：执行器地址为空<br>JobHandler：u85Crash<br>任务参数：millis=1000<br>调度备注：error, Address Router Fail.",
        "U85 crashLostJob handleCode=500 msg=任务结果丢失，标记失败",
        "U85 ssoSingleToken afterOtherLoginCode=500 msg=com.xxl.sso.core.exception.XxlSsoExcepti",
        "U85 crashRecovery recovered=true"
      ]
    },
    {
      "name": "duplicate-and-failover",
      "startedAt": "2026-10-28T01:04:38.452913+08:00",
      "finishedAt": "2026-10-28T01:06:37.904159+08:00",
      "observed": [
        "U85 duplicateFirst14sTwoAdmins=5 next22sAdded=11 total=16",
        "U85 duplicateSameSecond=0 executorRepeatTriggers=0",
        "U85 duplicateExecutions=16 distinctLogIds=16",
        "U85 schedulerFailover killedA at=22 plus7s=25",
        "U85 restartResume downAt=28 restartMark=28 after15s=33 newRows=5"
      ]
    }
  ],
  "observed": [
    "U85 preflight mysql=/Users/Shared/DBngin/mysql/8.4.7_arm64/bin/mysql db=study_u85_xxl_0059236a81 appname=study-u85-0059236a81 runtime=/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u85/runtime/run-0059236a81",
    "U85 versions mysql=8.4.7 upstreamCommit=3bebfc1609b95413581b11e270e5670dce679813 adminJarSha=1ff5456dc1e2ccac executorJarSha=34b71bafd4dc967b schemaSha=0ab12dbda74de586 tables=8",
    "U85 registry groupId=3 address=http://127.0.0.1:49785",
    "U85 scenarios completed"
  ],
  "exitCode": 0,
  "failure": null,
  "errors": [],
  "rawLogs": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u85/runtime/run-0059236a81",
  "cleanup": {
    "processesSurviving": [],
    "databaseDropped": true,
    "dropError": null,
    "labDatabasesRemaining": [],
    "runtimeDir": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u85/runtime/run-0059236a81"
  },
  "runnerSha256": "a3b784473bacd2dfcdf0fe70fcc2da7debe47ec6c85bebc8459170703d4baf26",
  "limits": [
    "MySQL 为本机 DBngin 8.4.x 的独有库，结束即 DROP；不使用 Docker、不写用户既有库。",
    "admin 与执行器都是固定 tag 3.5.0 的公开源码构建产物；admin 由本机 JDK21/Maven 从上游提交 3bebfc1609b9 构建，jar/建表 SQL 的 SHA-256 见 environment。",
    "双 admin 只验证数据库行锁（schedule_lock FOR UPDATE）与 trigger_next_time 的互斥；不覆盖网络分区、主备切换与租约代际，这些归 U87。",
    "丢失任务依赖两个真值条件：注册行已过期（执行器不在线）且日志运行中超过 10 分钟。实验把该行 trigger_time 回拨 11 分钟以获得时间窗，回拨是实验操作而非生产事实；注册过期通过回拨 registry.update_time 加速同一判据；为验证\"注册在线时不判丢失\"，实验中每 20 秒 UPDATE 一次 registry.update_time 模拟心跳并持续 70 秒，跨过完整监控周期。",
    "misfire 通过直接改库构造停机错过场景；补偿只发生一次，不等于按周期逐段回填。",
    "所有任务与参数为合成标签，不含用户业务数据与凭据；失败告警邮件地址留空，不访问真实 SMTP。"
  ]
}
