{
  "ticket": "U46 #83",
  "status": "passed",
  "startedAt": "2026-10-31T02:14:21.964260+08:00",
  "finishedAt": "2026-10-31T02:14:55.996393+08:00",
  "input": "python3 labs/batch-quartz/run.py",
  "exitCode": 0,
  "environment": {
    "os": "macOS-27.2-arm64-arm-64bit",
    "arch": "arm64",
    "python": "3.9.6",
    "dependencies": {
      "org.springframework.boot:spring-boot-starter-batch-jdbc": "4.0.9",
      "org.springframework.boot:spring-boot-starter": "4.0.9",
      "org.springframework.boot:spring-boot-starter-logging": "4.0.9",
      "ch.qos.logback:logback-classic": "1.5.38",
      "ch.qos.logback:logback-core": "1.5.38",
      "org.apache.logging.log4j:log4j-to-slf4j": "2.25.5",
      "org.apache.logging.log4j:log4j-api": "2.25.5",
      "org.slf4j:jul-to-slf4j": "2.0.20",
      "org.springframework.boot:spring-boot-autoconfigure": "4.0.9",
      "jakarta.annotation:jakarta.annotation-api": "3.0.0",
      "org.yaml:snakeyaml": "2.5",
      "org.springframework.boot:spring-boot-starter-batch": "4.0.9",
      "org.springframework.boot:spring-boot-batch": "4.0.9",
      "org.springframework.batch:spring-batch-core": "6.0.6",
      "org.springframework.batch:spring-batch-infrastructure": "6.0.6",
      "org.springframework.retry:spring-retry": "2.0.13",
      "org.springframework:spring-aop": "7.0.10",
      "io.micrometer:micrometer-core": "1.16.8",
      "io.micrometer:micrometer-commons": "1.16.8",
      "org.hdrhistogram:HdrHistogram": "2.2.2",
      "org.latencyutils:LatencyUtils": "2.0.3",
      "io.micrometer:micrometer-observation": "1.16.8",
      "org.springframework.boot:spring-boot-starter-jdbc": "4.0.9",
      "org.springframework.boot:spring-boot-jdbc": "4.0.9",
      "org.springframework.boot:spring-boot-sql": "4.0.9",
      "org.springframework:spring-jdbc": "7.0.10",
      "com.zaxxer:HikariCP": "7.0.2",
      "org.springframework.boot:spring-boot-batch-jdbc": "4.0.9",
      "org.springframework.boot:spring-boot-transaction": "4.0.9",
      "org.springframework.boot:spring-boot-persistence": "4.0.9",
      "org.springframework:spring-tx": "7.0.10",
      "org.springframework.boot:spring-boot-starter-quartz": "4.0.9",
      "org.springframework.boot:spring-boot-quartz": "4.0.9",
      "org.quartz-scheduler:quartz": "2.5.2",
      "org.springframework:spring-context-support": "7.0.10",
      "org.springframework:spring-beans": "7.0.10",
      "org.springframework:spring-context": "7.0.10",
      "org.springframework:spring-expression": "7.0.10",
      "com.mysql:mysql-connector-j": "9.7.0",
      "org.springframework.boot:spring-boot-starter-test": "4.0.9",
      "org.springframework.boot:spring-boot-test": "4.0.9",
      "org.springframework.boot:spring-boot": "4.0.9",
      "org.springframework.boot:spring-boot-test-autoconfigure": "4.0.9",
      "com.jayway.jsonpath:json-path": "2.10.0",
      "org.slf4j:slf4j-api": "2.0.20",
      "jakarta.xml.bind:jakarta.xml.bind-api": "4.0.5",
      "jakarta.activation:jakarta.activation-api": "2.1.4",
      "net.minidev:json-smart": "2.6.0",
      "net.minidev:accessors-smart": "2.6.0",
      "org.ow2.asm:asm": "9.7.1",
      "org.assertj:assertj-core": "3.27.7",
      "net.bytebuddy:byte-buddy": "1.17.8",
      "org.awaitility:awaitility": "4.3.0",
      "org.hamcrest:hamcrest": "3.0",
      "org.junit.jupiter:junit-jupiter": "6.0.3",
      "org.junit.jupiter:junit-jupiter-api": "6.0.3",
      "org.opentest4j:opentest4j": "1.3.0",
      "org.junit.platform:junit-platform-commons": "6.0.3",
      "org.apiguardian:apiguardian-api": "1.1.2",
      "org.junit.jupiter:junit-jupiter-params": "6.0.3",
      "org.junit.jupiter:junit-jupiter-engine": "6.0.3",
      "org.junit.platform:junit-platform-engine": "6.0.3",
      "org.mockito:mockito-core": "5.20.0",
      "net.bytebuddy:byte-buddy-agent": "1.17.8",
      "org.objenesis:objenesis": "3.3",
      "org.mockito:mockito-junit-jupiter": "5.20.0",
      "org.skyscreamer:jsonassert": "1.5.3",
      "com.vaadin.external.google:android-json": "0.0.20131108.vaadin1",
      "org.springframework:spring-core": "7.0.10",
      "commons-logging:commons-logging": "1.3.6",
      "org.jspecify:jspecify": "1.0.1",
      "org.springframework:spring-test": "7.0.10",
      "org.xmlunit:xmlunit-core": "2.10.4"
    }
  },
  "expectedTestCount": 19,
  "expectedTestNames": {
    "study.batchquartz.BatchPersistenceTest": [
      "abandonMakesExecutionUnrestartableAndRecoverUnsticksStarted",
      "completedStepIsSkippedOnRestartUnlessAllowStartIfComplete",
      "concurrentLaunchOfSameInstanceOnlyOneWins",
      "failedChunkRestartResumesFromCheckpointAndReplaysUncommittedWork",
      "faultTolerantSkipsBadItemAndKeepsOthers",
      "jobIdentityIsNamePlusIdentifyingParameters",
      "skipLimitWithoutFaultTolerantDoesNotSkip"
    ],
    "study.batchquartz.BootAutoConfigurationTest": [
      "batchDefaultsToResourcelessRepositoryWithoutDataSource",
      "batchWithDataSourceUsesJdbcRepositoryAndCreatesSchema",
      "quartzDefaultsToMemoryStoreAndJdbcRequiresExplicitProperty"
    ],
    "study.batchquartz.QuartzPersistenceTest": [
      "clusterTakesOverAfterInstanceDies",
      "clusteredSchedulersFireOnceThroughRowLock",
      "disallowConcurrentBlocksRatherThanRunsParallel",
      "failingJobIsNotRetriedByQuartz",
      "jdbcStorePersistsAcrossSchedulerRestart",
      "misfireCronFireOnceNowVersusDoNothing",
      "misfireSimpleSmartPolicyReschedulesNotCatchUp",
      "nonClusteredModeLeavesOrphanedTriggersStuck",
      "shutdownWaitAllowsRunningJobToFinish"
    ]
  },
  "reports": [
    {
      "name": "study.batchquartz.BatchPersistenceTest",
      "tests": "7",
      "failures": "0",
      "errors": "0",
      "skipped": "0",
      "testNames": [
        "abandonMakesExecutionUnrestartableAndRecoverUnsticksStarted",
        "completedStepIsSkippedOnRestartUnlessAllowStartIfComplete",
        "concurrentLaunchOfSameInstanceOnlyOneWins",
        "failedChunkRestartResumesFromCheckpointAndReplaysUncommittedWork",
        "faultTolerantSkipsBadItemAndKeepsOthers",
        "jobIdentityIsNamePlusIdentifyingParameters",
        "skipLimitWithoutFaultTolerantDoesNotSkip"
      ],
      "sha256": "d4a09652b2ddb51d208477c6754ee9b4707345c7df1c4a8ccbe2e800b0b4142f"
    },
    {
      "name": "study.batchquartz.BootAutoConfigurationTest",
      "tests": "3",
      "failures": "0",
      "errors": "0",
      "skipped": "0",
      "testNames": [
        "batchDefaultsToResourcelessRepositoryWithoutDataSource",
        "batchWithDataSourceUsesJdbcRepositoryAndCreatesSchema",
        "quartzDefaultsToMemoryStoreAndJdbcRequiresExplicitProperty"
      ],
      "sha256": "324fc03b81ce33eca7107c0ac45a250f772f73475d65c40d23fbe854f64f372a"
    },
    {
      "name": "study.batchquartz.QuartzPersistenceTest",
      "tests": "9",
      "failures": "0",
      "errors": "0",
      "skipped": "0",
      "testNames": [
        "clusterTakesOverAfterInstanceDies",
        "clusteredSchedulersFireOnceThroughRowLock",
        "disallowConcurrentBlocksRatherThanRunsParallel",
        "failingJobIsNotRetriedByQuartz",
        "jdbcStorePersistsAcrossSchedulerRestart",
        "misfireCronFireOnceNowVersusDoNothing",
        "misfireSimpleSmartPolicyReschedulesNotCatchUp",
        "nonClusteredModeLeavesOrphanedTriggersStuck",
        "shutdownWaitAllowsRunningJobToFinish"
      ],
      "sha256": "971bcfdfe052fc5e82321d4e5dec96b11a19fbd5bcb2e9a43ff935ea753a3428"
    }
  ],
  "testCount": 19,
  "observed": [
    "U46 quartzPersisted jobRows=1 triggerState=WAITING",
    "U46 clusterTakeover deadRowRemoved=true orphanCleaned=true",
    "U46 quartzCluster fired=1 states=2 locks=2",
    "U46 misfireSimple fired=1 simpleRows=1 state=ACQUIRED",
    "U46 quartzNonCluster locks=0 deadRowKept=true orphanStillAcquired=true",
    "U46 quartzShutdownWait waited=true executed=1",
    "U46 quartzFailing noRetry once=1 repeat=3",
    "U46 quartzNonConcurrent fired=2 triggerState=BLOCKED",
    "U46 misfireCron once=1 nothing=0 nothingNextInFuture=true",
    "U46 batchIdentity instances=2 executions=2 jobKeyDiffers=true nonIdentifyingIgnored=true",
    "U46 batchFaultTolerant status=COMPLETED rows=3 writeSkips=1",
    "U46 batchRestart firstStatus=FAILED rowsAfterFailure=2 finalRows=6 reads=10 commits=2 rollbacks=0",
    "U46 batchSkipWithoutFt status=FAILED writeSkip=0",
    "U46 batchStepSkip step1Runs=1 step2Runs=2 step1Executions=1",
    "U46 batchConcurrentLaunch rejected=true executions=1",
    "U46 batchAbandonRecover abandoned=true recoverUnstuck=true restartNewExecution=true",
    "U46 bootQuartz jdbcStore=LocalDataSourceJobStore clustered=false qrtzTables=11",
    "U46 bootBatchJdbc resourceless=false batchTables=9"
  ],
  "results": [
    {
      "name": "java-version",
      "command": [
        "/Library/Java/JavaVirtualMachines/liberica-jdk-21.jdk/Contents/Home/bin/java",
        "-version"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/labs/batch-quartz",
      "startedAt": "2026-10-31T02:14:21.988315+08:00",
      "finishedAt": "2026-10-31T02:14:22.022461+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u46/run-anmrfigj/java-version.log",
      "logSha256": "392524ee4bfbd5e1de98c543683d7fcaed057f7d69ef44a0d0a182de17816feb",
      "observed": []
    },
    {
      "name": "maven-version",
      "command": [
        "mvn",
        "-version"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/labs/batch-quartz",
      "startedAt": "2026-10-31T02:14:22.022782+08:00",
      "finishedAt": "2026-10-31T02:14:23.219486+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u46/run-anmrfigj/maven-version.log",
      "logSha256": "bba0865da01a8b3b2c925c6b7fee10782f3e69aa5f382c2f52f06c87a4bc5624",
      "observed": []
    },
    {
      "name": "mvn-test",
      "command": [
        "mvn",
        "-B",
        "-ntp",
        "-o",
        "-f",
        "/Users/gaochao/Documents/面试/software-engineering-study/labs/batch-quartz/pom.xml",
        "test"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/labs/batch-quartz",
      "startedAt": "2026-10-31T02:14:23.219895+08:00",
      "finishedAt": "2026-10-31T02:14:54.451155+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u46/run-anmrfigj/mvn-test.log",
      "logSha256": "3d7866c97792f7f65fbd718b88a3354eadcce5c3a532634c16adb91be737a31c",
      "observed": [
        "U46 quartzPersisted jobRows=1 triggerState=WAITING",
        "U46 clusterTakeover deadRowRemoved=true orphanCleaned=true",
        "U46 quartzCluster fired=1 states=2 locks=2",
        "U46 misfireSimple fired=1 simpleRows=1 state=ACQUIRED",
        "U46 quartzNonCluster locks=0 deadRowKept=true orphanStillAcquired=true",
        "U46 quartzShutdownWait waited=true executed=1",
        "U46 quartzFailing noRetry once=1 repeat=3",
        "U46 quartzNonConcurrent fired=2 triggerState=BLOCKED",
        "U46 misfireCron once=1 nothing=0 nothingNextInFuture=true",
        "U46 batchIdentity instances=2 executions=2 jobKeyDiffers=true nonIdentifyingIgnored=true",
        "U46 batchFaultTolerant status=COMPLETED rows=3 writeSkips=1",
        "U46 batchRestart firstStatus=FAILED rowsAfterFailure=2 finalRows=6 reads=10 commits=2 rollbacks=0",
        "U46 batchSkipWithoutFt status=FAILED writeSkip=0",
        "U46 batchStepSkip step1Runs=1 step2Runs=2 step1Executions=1",
        "U46 batchConcurrentLaunch rejected=true executions=1",
        "U46 batchAbandonRecover abandoned=true recoverUnstuck=true restartNewExecution=true",
        "U46 bootQuartz jdbcStore=LocalDataSourceJobStore clustered=false qrtzTables=11",
        "U46 bootBatchJdbc resourceless=false batchTables=9"
      ]
    },
    {
      "name": "mvn-dependency",
      "command": [
        "mvn",
        "-B",
        "-ntp",
        "-o",
        "-f",
        "/Users/gaochao/Documents/面试/software-engineering-study/labs/batch-quartz/pom.xml",
        "dependency:list",
        "-DoutputFile=/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u46/run-anmrfigj/dependencies.txt"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/labs/batch-quartz",
      "startedAt": "2026-10-31T02:14:54.453252+08:00",
      "finishedAt": "2026-10-31T02:14:55.966527+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u46/run-anmrfigj/mvn-dependency.log",
      "logSha256": "1bef78904168b835e94eb79a25df0bbd2181c56cd6990723bc243bfec55d8ddc",
      "observed": []
    }
  ],
  "artifacts": {
    "pom.xml": "5fdf92a277e2caa27fa802181033194e4618609545dda5921665e37aec29366f",
    "run.py": "4a33b32cbeacf8f9a0feb17447d39dd4cd56a3ad7c558a09e614324ea4245223",
    "README.md": "eb15b74376bc41dd358eaf5c250c9e77f7f6a938d1bff0e6dc982498cc80df96",
    "src/test/java/study/batchquartz/BatchFixture.java": "3f853703c79820e095f5cd33a459a3014ed17117e28835a537aa9ea30a1d0728",
    "src/test/java/study/batchquartz/BatchPersistenceTest.java": "f6450ac43caf5ee0a7b1c1b614b55573327c4904de50f0a73e57e68661f0a46c",
    "src/test/java/study/batchquartz/BootAutoConfigurationTest.java": "0a15feecf94f846b3f34f77e362e5fb320dd58dd452dc91976249106295e36f8",
    "src/test/java/study/batchquartz/LabDatabase.java": "63e6a36a12a846f06c27a9c5c8863031b77c4f957215ffcf7786ac3854b443d4",
    "src/test/java/study/batchquartz/QuartzFixture.java": "19fead3a3e0a37e7aa1ead494298eae88d3ce7c695c599a96790452720ce52d1",
    "src/test/java/study/batchquartz/QuartzPersistenceTest.java": "dd56743cea60aa83063f1d2cc03d58ab41048c007cff2b7eab9c7bad489f1062"
  },
  "logs": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u46/run-anmrfigj",
  "cleanup": {
    "processGroups": "本入口创建的进程组已逐条回收（每条命令后 cleanup_group；清理失败会置非零退出并阻止 passed）",
    "resources": "测试 fixture 关闭 Hikari 数据源并 DROP 每个独有库；runner 再核对 study_u46% 无残留",
    "databasesBefore": [],
    "databasesAfter": [],
    "databaseDropped": true
  },
  "limits": [
    "Spring Batch 6.0.6 / Quartz 2.5.2 / Framework 7.0.10 / Boot 4.0.9 / MySQL 8.4.7 全部固定并实跑；中文注释与主题基线等价于仓库其余 lab，不是 mock 或内存替身",
    "Quartz 多实例是同一 JVM 内多个 Scheduler 对象共用同一 MySQL 库；证明行锁与集群接管语义，不等于多机进程隔离、网络分区或断电",
    "misfire 用回拨 NEXT_FIRE_TIME 与 2 秒阈值构造受控加速，不是生产时间窗；集群接管用回拨 LAST_CHECKIN_TIME 构造，不是真实进程死亡",
    "未运行：远程分区/远程 chunk（spring-batch-integration）、JSR-352、Quartz Terracotta/JTA、XA 跨库、数据库主从切换、Batch Mongo JobRepository、生产 TLS"
  ]
}
