{
  "ticket": "U61 #98",
  "status": "passed",
  "startedAt": "2026-10-28T13:07:59.344990+08:00",
  "finishedAt": "2026-10-28T13:08:05.632703+08:00",
  "input": "python3 labs/transaction-recovery/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-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-jdbc": "4.0.9",
      "org.springframework.boot:spring-boot": "4.0.9",
      "org.springframework:spring-context": "7.0.10",
      "org.springframework:spring-aop": "7.0.10",
      "org.springframework:spring-expression": "7.0.10",
      "io.micrometer:micrometer-observation": "1.16.8",
      "io.micrometer:micrometer-commons": "1.16.8",
      "org.springframework.boot:spring-boot-sql": "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:spring-jdbc": "7.0.10",
      "org.springframework:spring-beans": "7.0.10",
      "com.zaxxer:HikariCP": "7.0.2",
      "org.slf4j:slf4j-api": "2.0.20",
      "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-test-autoconfigure": "4.0.9",
      "com.jayway.jsonpath:json-path": "2.10.0",
      "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": 8,
  "expectedTestNames": [
    "cacheWatermarkRejectsStaleFillOnRealRedis",
    "consumerInboxDedupSurvivesRollbackAndReplay",
    "duplicateRequestReturnsSameResultAndConcurrentSameKeyYieldsOneEffect",
    "failureAfterOrderInsertRollsBackEveryWrite",
    "layeredRetryAmplificationAndDeadlineAdmission",
    "lostCommitResponseLeavesCommittedStateAndOriginalKeyRecovers",
    "outboxClaimLeaseTakeoverAndStaleTokenCas",
    "sendBeforeMarkCrashesThenReplayStillOneBusinessEffect"
  ],
  "reports": [
    {
      "name": "study.recovery.TransactionRecoveryTest",
      "tests": "8",
      "failures": "0",
      "errors": "0",
      "skipped": "0",
      "testNames": [
        "cacheWatermarkRejectsStaleFillOnRealRedis",
        "outboxClaimLeaseTakeoverAndStaleTokenCas",
        "duplicateRequestReturnsSameResultAndConcurrentSameKeyYieldsOneEffect",
        "lostCommitResponseLeavesCommittedStateAndOriginalKeyRecovers",
        "sendBeforeMarkCrashesThenReplayStillOneBusinessEffect",
        "consumerInboxDedupSurvivesRollbackAndReplay",
        "layeredRetryAmplificationAndDeadlineAdmission",
        "failureAfterOrderInsertRollsBackEveryWrite"
      ],
      "sha256": "bbd365172fe16b24217a192ba89f0c4fac0ba706f7d0e13cf2434b62ccb4de32"
    }
  ],
  "testCount": 8,
  "observed": [
    "U61 cacheWatermark=PASS staleFill=0 legitFill=2 sameVersionConflict=-1 partialScript=floor3/cache2 atomicGuard=MISS",
    "U61 outboxFencing=PASS version1=A version2=B oldCas=0 newCas=1 state=SENT",
    "U61 duplicateIdempotency=PASS serialDuplicate=true conflict=true concurrent=8 winner=1 uniqueLosers=7 effects=1",
    "U61 commitResponseLost=PASS clientException=SQLNonTransientConnectionException serverCommitted=true replay=DUPLICATE effect=1",
    "U61 atLeastOnceRecovery=PASS deliveries=2 businessEffects=1 finalState=SENT",
    "U61 consumerInbox=PASS rollbackThenReplay=SUCCEEDED duplicate=true conflict=true newEffects=1",
    "U61 retryBudget=PASS amplification=2x3x2=12 deadlineAdmission=false clientTimeoutBeforeServerFinished=true serverHits=13",
    "U61 midFailureRollback=PASS orderInsertedThenFailed stockUnchanged=true outboxUnchanged=true",
    "U61 cleanup=PASS ownDbRemaining=0"
  ],
  "results": [
    {
      "name": "java-version",
      "command": [
        "/Library/Java/JavaVirtualMachines/liberica-jdk-21.jdk/Contents/Home/bin/java",
        "-version"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/.claude/worktrees/trusting-lamarr-4a0807/labs/transaction-recovery",
      "startedAt": "2026-10-28T13:07:59.582339+08:00",
      "finishedAt": "2026-10-28T13:07:59.620930+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u61/run-28fdkk41/java-version.log",
      "logSha256": "392524ee4bfbd5e1de98c543683d7fcaed057f7d69ef44a0d0a182de17816feb",
      "observed": []
    },
    {
      "name": "maven-version",
      "command": [
        "mvn",
        "-version"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/.claude/worktrees/trusting-lamarr-4a0807/labs/transaction-recovery",
      "startedAt": "2026-10-28T13:07:59.621334+08:00",
      "finishedAt": "2026-10-28T13:07:59.957366+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u61/run-28fdkk41/maven-version.log",
      "logSha256": "bba0865da01a8b3b2c925c6b7fee10782f3e69aa5f382c2f52f06c87a4bc5624",
      "observed": []
    },
    {
      "name": "mvn-test",
      "command": [
        "mvn",
        "-B",
        "-ntp",
        "-o",
        "-f",
        "/Users/gaochao/Documents/面试/software-engineering-study/.claude/worktrees/trusting-lamarr-4a0807/labs/transaction-recovery/pom.xml",
        "test",
        "-Dtest=study.recovery.TransactionRecoveryTest"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/.claude/worktrees/trusting-lamarr-4a0807/labs/transaction-recovery",
      "startedAt": "2026-10-28T13:07:59.957912+08:00",
      "finishedAt": "2026-10-28T13:08:04.163699+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u61/run-28fdkk41/mvn-test.log",
      "logSha256": "43a730c1216322a393eca5dd6ac9fc8c885ff58b969c64ff9f5b7134a1e71544",
      "observed": [
        "U61 cacheWatermark=PASS staleFill=0 legitFill=2 sameVersionConflict=-1 partialScript=floor3/cache2 atomicGuard=MISS",
        "U61 outboxFencing=PASS version1=A version2=B oldCas=0 newCas=1 state=SENT",
        "U61 duplicateIdempotency=PASS serialDuplicate=true conflict=true concurrent=8 winner=1 uniqueLosers=7 effects=1",
        "U61 commitResponseLost=PASS clientException=SQLNonTransientConnectionException serverCommitted=true replay=DUPLICATE effect=1",
        "U61 atLeastOnceRecovery=PASS deliveries=2 businessEffects=1 finalState=SENT",
        "U61 consumerInbox=PASS rollbackThenReplay=SUCCEEDED duplicate=true conflict=true newEffects=1",
        "U61 retryBudget=PASS amplification=2x3x2=12 deadlineAdmission=false clientTimeoutBeforeServerFinished=true serverHits=13",
        "U61 midFailureRollback=PASS orderInsertedThenFailed stockUnchanged=true outboxUnchanged=true",
        "U61 cleanup=PASS ownDbRemaining=0"
      ]
    },
    {
      "name": "mvn-dependency",
      "command": [
        "mvn",
        "-B",
        "-ntp",
        "-o",
        "-f",
        "/Users/gaochao/Documents/面试/software-engineering-study/.claude/worktrees/trusting-lamarr-4a0807/labs/transaction-recovery/pom.xml",
        "dependency:list",
        "-DoutputFile=/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u61/run-28fdkk41/dependencies.txt"
      ],
      "cwd": "/Users/gaochao/Documents/面试/software-engineering-study/.claude/worktrees/trusting-lamarr-4a0807/labs/transaction-recovery",
      "startedAt": "2026-10-28T13:08:04.165024+08:00",
      "finishedAt": "2026-10-28T13:08:05.631524+08:00",
      "exitCode": 0,
      "runnerExitCode": 0,
      "timedOut": false,
      "failure": null,
      "cleanupError": null,
      "log": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u61/run-28fdkk41/mvn-dependency.log",
      "logSha256": "cc50c8e94b8c713c30606f9a368f050602f12983e484423cf2d1afeaac22a02e",
      "observed": []
    }
  ],
  "artifacts": {
    "pom.xml": "37c50e6f0dc1899274686577aa7a7c30fbfc372a9afa9db43e60c0be25b57575",
    "run.py": "2afe8d7a8900854c9517d102c1c96cfc9795b67b8cf90052558ff42f59d7935f",
    "README.md": "153f7a258d19f92a225201ae9438622ca96221c05ac73e5ec38740c5e1470ece",
    "src/test/java/study/recovery/FaultGates.java": "74c2357753609d77aebeb0ff4b25bf5b0b2c000f9539d349e5a8c7cec020d178",
    "src/test/java/study/recovery/RecoveryFixture.java": "a2442920a6c335bb8900efe534ac19547d139c02d35b4b0a6da36dc816ca9c6a",
    "src/test/java/study/recovery/TransactionRecoveryTest.java": "cc8b351b0a7a1f1ab13a172fa24605682011a1f9223b5d573abe3d79942b4831"
  },
  "logs": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u61/run-28fdkk41",
  "cleanup": {
    "processGroups": "本入口创建的进程组已逐条回收（每条命令后 cleanup_group；清理失败会置非零退出并阻止 passed）",
    "resources": "测试 fixture 只创建并 DROP 自己的 study_u61_* 专用库；Redis 只使用并删除 UUID 前缀键"
  },
  "limits": [
    "MySQL 是本机 DBngin 8.4.7（REPEATABLE-READ、innodb_flush_log_at_trx_commit=1），Redis 是本机 8.6.4 standalone；不是生产集群或复制集",
    "提交响应丢失用受控 TCP 代理丢弃 COMMIT 响应模拟，服务器真实提交；不是 OS 断电或网络分区",
    "retryBudget 的分层放大是确定性计数（2×3×2），deadline 准入是算例；HTTP 超时使用真实 loopback 上游",
    "缓存实验在真实 Redis 上执行 Lua 脚本；不是 Redis Cluster、主从切换或持久化恢复",
    "U61 不重写通用幂等/Outbox 教材；deadline/熔断/限流的通用权威讲解仍在 RPC 超时重试页与 U33 报告"
  ]
}
