{
  "ticket": "U31 #68",
  "startedAt": "2026-10-26T19:00:07.259642+08:00",
  "finishedAt": "2026-10-26T19:00:24.285742+08:00",
  "input": "JAVA_HOME=$(/usr/libexec/java_home -v21) python3 labs/reactive-security/run.py",
  "exitCode": 0,
  "environment": {
    "jdk": "openjdk version \"21.0.11\" 2026-04-21 LTS\nOpenJDK Runtime Environment (build 21.0.11+11-LTS)\nOpenJDK 64-Bit Server VM (build 21.0.11+11-LTS, mixed mode, sharing)",
    "maven": "Apache Maven 3.9.9 (8e8579a9e76f7d015ee5ec7bfcdc97d260186937)\nMaven home: /Users/gaochao/develop/maven-3.9.9\nJava version: 21.0.11, vendor: BellSoft, runtime: /Library/Java/JavaVirtualMachines/liberica-jdk-21.jdk/Contents/Home\nDefault locale: zh_CN_#Hans, platform encoding: UTF-8\nOS name: \"mac os x\", version: \"27.0.1\", arch: \"aarch64\", family: \"mac\"",
    "os": "macOS-27.0.1-arm64-arm-64bit",
    "arch": "arm64",
    "python": "3.9.6",
    "dependencies": {
      "spring-webflux": "7.0.10",
      "spring-security-web": "7.0.8",
      "spring-security-config": "7.0.8",
      "spring-security-rsocket": "7.0.8",
      "spring-security-oauth2-resource-server": "7.0.8",
      "spring-security-oauth2-jose": "7.0.8",
      "reactor-core": "3.8.8",
      "reactor-netty-http": "1.3.8",
      "rsocket-core": "1.1.5",
      "nimbus-jose-jwt": "10.4"
    }
  },
  "reports": [
    {
      "name": "study.reactivesecurity.JwtHttpTest",
      "tests": "1",
      "failures": "0",
      "errors": "0",
      "skipped": "0"
    },
    {
      "name": "study.reactivesecurity.RSocketAuthenticationTest",
      "tests": "1",
      "failures": "0",
      "errors": "0",
      "skipped": "0"
    },
    {
      "name": "study.reactivesecurity.ReactiveHttpTest",
      "tests": "6",
      "failures": "0",
      "errors": "0",
      "skipped": "0"
    },
    {
      "name": "study.reactivesecurity.WebSessionTest",
      "tests": "1",
      "failures": "0",
      "errors": "0",
      "skipped": "0"
    }
  ],
  "testCount": 9,
  "results": [
    {
      "name": "jdk",
      "command": [
        "/Library/Java/JavaVirtualMachines/liberica-jdk-21.jdk/Contents/Home/bin/java",
        "-version"
      ],
      "exitCode": 0,
      "observed": []
    },
    {
      "name": "maven",
      "command": [
        "mvn",
        "-version"
      ],
      "exitCode": 0,
      "observed": []
    },
    {
      "name": "tests",
      "command": [
        "mvn",
        "-q",
        "clean",
        "test"
      ],
      "exitCode": 0,
      "observed": [
        "U31OBSERVE http path=/api/who user=alice status=401",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/who user=null status=401",
        "U31OBSERVE http path=/api/who user=absent status=401",
        "U31OBSERVE http path=/api/who user=bob status=200",
        "U31OBSERVE http path=/api/orders/alice?owner=alice user=alice status=200",
        "U31OBSERVE http path=/api/orders/bob?owner=bob user=alice status=403",
        "U31OBSERVE http path=/api/orders/bob?owner=alice user=bob status=200",
        "U31OBSERVE http path=/api/orders/alice user=alice status=200",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE missingCredentials status=401",
        "U31OBSERVE http path=/api/who user=bob status=200",
        "U31OBSERVE http path=/api/who user=bob status=200",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/who user=bob status=200",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/who user=bob status=200",
        "U31OBSERVE http path=/api/who user=bob status=200",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/who user=bob status=200",
        "U31OBSERVE http path=/api/who user=null status=401",
        "U31OBSERVE http path=/api/who user=alice status=200",
        "U31OBSERVE http path=/api/admin user=alice status=403",
        "U31OBSERVE http path=/api/admin user=admin status=200",
        "U31OBSERVE http path=/api/method user=alice status=403",
        "U31OBSERVE http path=/api/method user=admin status=200",
        "U31OBSERVE jwks fixtureStopped=true",
        "U31OBSERVE jwt variant=valid status=200",
        "U31OBSERVE jwt variant=signature status=401",
        "U31OBSERVE jwt variant=valid status=200",
        "U31OBSERVE jwt variant=issuer status=401",
        "U31OBSERVE jwt variant=valid status=200",
        "U31OBSERVE jwt variant=audience status=401",
        "U31OBSERVE jwt variant=valid status=200",
        "U31OBSERVE jwt variant=expired status=401",
        "U31OBSERVE jwt variant=valid status=200",
        "U31OBSERVE jwt variant=future status=401",
        "U31OBSERVE jwt variant=valid status=200",
        "U31OBSERVE jwt variant=scope status=403",
        "U31OBSERVE jwt variant=valid status=200",
        "U31OBSERVE jwks fixtureStopped=true",
        "U31OBSERVE rsocket validUser=alice value=rsocket:alice",
        "U31OBSERVE rsocket missingAndWrongDenied=true roleDenied=true adminAllowed=true perRequestIdentity=true recovered=true",
        "U31OBSERVE rsocket listenerDisposed=true",
        "U31OBSERVE jwks fixtureStopped=true",
        "U31OBSERVE websession method=GET path=/browser/csrf login=false csrf=false status=200",
        "U31OBSERVE websession method=GET path=/browser/who login=false csrf=false status=401",
        "U31OBSERVE websession method=GET path=/browser/who login=true csrf=false status=200",
        "U31OBSERVE websession oldSessionCookieStatus=401",
        "U31OBSERVE websession method=GET path=/browser/who login=false csrf=false status=200",
        "U31OBSERVE websession method=GET path=/browser/csrf login=false csrf=false status=200",
        "U31OBSERVE websession method=POST path=/browser/write login=false csrf=false status=403",
        "U31OBSERVE websession method=POST path=/browser/write login=false csrf=true status=403",
        "U31OBSERVE websession method=POST path=/browser/write login=false csrf=true status=200",
        "U31OBSERVE websession method=POST path=/browser/logout login=false csrf=true status=200",
        "U31OBSERVE websession method=GET path=/browser/who login=false csrf=false status=401",
        "U31OBSERVE websession method=GET path=/browser/who login=true csrf=false status=200",
        "U31OBSERVE websession idRotated=true cookiePersisted=true missingAndWrongCsrfDenied=true validWrite=true logoutAuthenticationCleared=true recovered=true",
        "U31OBSERVE jwks fixtureStopped=true"
      ]
    },
    {
      "name": "dependencies",
      "command": [
        "mvn",
        "dependency:tree",
        "-Dincludes=org.springframework,org.springframework.security,io.projectreactor,io.projectreactor.netty,io.rsocket,com.nimbusds"
      ],
      "exitCode": 0,
      "observed": []
    }
  ],
  "sourceSha256": {
    "README.md": "d16a908bf2fb3a1fcebf4315f4fdfa4c0253ff299a3921e5cf68a270c2bf4c00",
    "pom.xml": "b294d9904adfdbfb902d3d561f0c9bf4469bf81079c78b1cc02cb39e7e988e79",
    "run.py": "295cf32154108ca44fef339711bcb792f7186e3c7f0201174cd1effa3c968e23",
    "src/test/java/study/reactivesecurity/JwtHttpTest.java": "c77834087ef896b51ddde33e871174c5a341718742fb3d149b769747043b9ccc",
    "src/test/java/study/reactivesecurity/JwtKeys.java": "39615c3da8199eb1ab09cedf562a268c999c42091a2a95dbf74362bae108392c",
    "src/test/java/study/reactivesecurity/RSocketAuthenticationTest.java": "05fd1210f5cf1e70529b8345535735b1c68ea245fd2e8c6b673162e664c9a9d0",
    "src/test/java/study/reactivesecurity/ReactiveHttpTest.java": "3e8f88875dbe134bbdce23e4ef77322dcdba4dd560b480becdb2afa33729da09",
    "src/test/java/study/reactivesecurity/SecurityLab.java": "e38532147fb95691473fa22cf6d6ea904a7473a6e970b56ebd5409e2070de075",
    "src/test/java/study/reactivesecurity/WebSessionTest.java": "87792cd17a3b7a52d4a4d62852de5359c37314426b472a88e6458fc273ed149b"
  },
  "rawLogs": "/Users/gaochao/.cache/software-engineering-study/java-depth-impl/u31/run-kr9v0vkz",
  "cleanup": {
    "springContextsClosed": 4,
    "jwksFixturesStopped": 4,
    "rsocketListenerDisposed": true,
    "testJvmExited": true
  },
  "limits": [
    "Actual Netty HTTP, BCrypt, reactive method proxies and RSocket TCP; not mocked authenticated contexts.",
    "Actual RSA signature and HTTP JWKS fixture, not an authorization server; actual OAuth2/OIDC issuance/revocation belongs to U30.",
    "Synthetic accounts, no enterprise IdP/LDAP/KDC/certificate/WebAuthn/MFA runtime.",
    "No TLS or browser attack, production capacity, distributed session/revocation or external authority refresh validation.",
    "Reactive OAuth Login/Client/opaque and concurrent sessions are fixed-source/configuration teaching, not claimed as runtime."
  ]
}
