[{"name":"Checkout","what":"Pulls the commit that triggered the build from GitHub.","command":"checkout scm"},{"name":"Environment check","what":"Prints the JDK and Gradle versions so the log records exactly what built this release.","command":"./gradlew task03Info"},{"name":"Compile","what":"Turns the Java sources into class files. Fails fast on any syntax or type error.","command":"./gradlew clean compileJava"},{"name":"Dependency report","what":"Writes the resolved runtime dependency tree and archives it with the build.","command":"./gradlew :app:dependencies"},{"name":"Unit tests","what":"Runs the JUnit 5 suite. A single failing assertion stops the release here.","command":"./gradlew test"},{"name":"Coverage","what":"Generates the JaCoCo report so test depth is visible, not assumed.","command":"./gradlew jacocoTestReport"},{"name":"Package","what":"Builds the versioned distribution archive containing the app and every dependency.","command":"./gradlew distTar"},{"name":"Deploy","what":"Extracts the archive into a new timestamped release directory and restarts the service.","command":"sudo task-03-deploy.sh"},{"name":"Smoke test","what":"Polls the health endpoint until the new release answers, so a broken deploy is caught immediately.","command":"curl /health"}]