CodexCoder21Organization/TinySiteWui
Stored run summary updated . Data age: 1006m 13s.
c2b3b8764e5b13 test attempts: 13 passed.
4 lanes across 1 droplet, 13 test attempts, over 1m 40s of testing.
Lane numbers are derived, not recorded: the coordinator reports the droplet an attempt ran on but no lane, so attempts are packed onto the lowest-numbered lane of their droplet that was free when they started. The number of lanes per droplet is exactly the number the runner used; which lane a particular test is drawn on is this reconstruction's.
| Status | Build Rule | Duration | Output | Error |
|---|---|---|---|---|
| PASSED | tinysitewui.buildMaven() | 2375ms | 82 files, 39.8 MB |
| Status | Project | Test | Duration | Error |
|---|---|---|---|---|
| PASSED | tinysitewui.test | testBrowserPublishesAFolderAndOpensTheSite | 7371ms | |
| PASSED | tinysitewui.test | testBrowserRetryAfterAFailedPublishSendsOnlyTheRest | 61871ms | |
| PASSED | tinysitewui.test | testConcurrentPublishesAndVisitsStayIntact | 27943ms | |
| PASSED | tinysitewui.test | testEveryKnownExtensionIsServedWithItsContentType | 19618ms | |
| PASSED | tinysitewui.test | testFileThatShrinksWhileBeingServedIsCutOffNotPadded | 10532ms | |
| PASSED | tinysitewui.test | testHomeListsOnlyPublishedSites | 11794ms | |
| PASSED | tinysitewui.test | testMisusedUploadsAreRefusedAndStoreNothing | 10377ms | |
| PASSED | tinysitewui.test | testPublishedSiteServesIndexAndNestedAssets | 14136ms | |
| PASSED | tinysitewui.test | testRangeRequestsReturnExactlyTheBytesAsked | 9201ms | |
| PASSED | tinysitewui.test | testSiteStopsBeingServedWhenItExpires | 7824ms | |
| PASSED | tinysitewui.test | testTimesAndSizesAreWordedByMagnitude | 15897ms | |
| PASSED | tinysitewui.test | testUnreachableStorageIsNotReportedAsMissing | 7294ms | |
| PASSED | tinysitewui.test | testUploadRefusesPathsOutsideTheSite | 4198ms |
[buildtest-coordinator] [2026-10-06 22:22:20] Coordinator work: waiting for archive analysis, queue position 1 of 1
[2026-10-06 22:22:21] Admission accounting: reserved=348 unreserved=0 requested=1 limit=200 observedFleet=165 fleetObservationValid=true
[2026-10-06 22:22:21] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=165 unreservedObserved=0 reservationsSum=348 reservationHolders=39 reservationHoldersWithNoObservedDroplet=18 otherGrantedRemainder=34 dropletLimit=200 queueDepth=46 queuePos=45 fleetObservationValid=true fleetObservationAge=10s fleetObservationUsable=true reservedProjection=200/200 freshProjection=200/200]
[2026-10-06 22:22:21] Waiting for droplet capacity; retrying admission in 30s
[2026-10-06 22:22:51] Admission accounting: reserved=348 unreserved=0 requested=1 limit=200 observedFleet=178 fleetObservationValid=true
[2026-10-06 22:22:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=178 unreservedObserved=0 reservationsSum=348 reservationHolders=39 reservationHoldersWithNoObservedDroplet=16 otherGrantedRemainder=21 dropletLimit=200 queueDepth=45 queuePos=43 fleetObservationValid=true fleetObservationAge=0s fleetObservationUsable=true reservedProjection=200/200 freshProjection=200/200]
[2026-10-06 22:22:51] Waiting for droplet capacity; retrying admission in 60s
[2026-10-06 22:23:51] Admission accounting: reserved=348 unreserved=0 requested=1 limit=200 observedFleet=176 fleetObservationValid=true
[2026-10-06 22:23:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=176 unreservedObserved=0 reservationsSum=348 reservationHolders=39 reservationHoldersWithNoObservedDroplet=16 otherGrantedRemainder=23 dropletLimit=200 queueDepth=43 queuePos=41 fleetObservationValid=true fleetObservationAge=3s fleetObservationUsable=true reservedProjection=200/200 freshProjection=200/200]
[2026-10-06 22:23:51] Waiting for droplet capacity; retrying admission in 120s
[2026-10-06 22:25:51] Admission accounting: reserved=341 unreserved=0 requested=1 limit=200 observedFleet=172 fleetObservationValid=true
[2026-10-06 22:25:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=172 unreservedObserved=0 reservationsSum=341 reservationHolders=39 reservationHoldersWithNoObservedDroplet=16 otherGrantedRemainder=21 dropletLimit=200 queueDepth=45 queuePos=40 fleetObservationValid=true fleetObservationAge=61s fleetObservationUsable=true reservedProjection=194/200 freshProjection=194/200]
[2026-10-06 22:25:51] Waiting for droplet capacity; retrying admission in 240s
[2026-10-06 22:29:51] Admission accounting: reserved=340 unreserved=2 requested=1 limit=200 observedFleet=167 fleetObservationValid=true
[2026-10-06 22:29:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=167 unreservedObserved=2 reservationsSum=340 reservationHolders=38 reservationHoldersWithNoObservedDroplet=15 otherGrantedRemainder=29 dropletLimit=200 queueDepth=48 queuePos=39 fleetObservationValid=true fleetObservationAge=7s fleetObservationUsable=true reservedProjection=197/200 freshProjection=197/200]
[2026-10-06 22:29:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 22:34:51] Admission accounting: reserved=317 unreserved=6 requested=1 limit=200 observedFleet=155 fleetObservationValid=true
[2026-10-06 22:34:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=155 unreservedObserved=6 reservationsSum=317 reservationHolders=36 reservationHoldersWithNoObservedDroplet=13 otherGrantedRemainder=42 dropletLimit=200 queueDepth=44 queuePos=36 fleetObservationValid=true fleetObservationAge=1s fleetObservationUsable=true reservedProjection=198/200 freshProjection=198/200]
[2026-10-06 22:34:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 22:39:51] Admission accounting: reserved=301 unreserved=0 requested=1 limit=200 observedFleet=134 fleetObservationValid=true
[2026-10-06 22:39:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=134 unreservedObserved=0 reservationsSum=301 reservationHolders=36 reservationHoldersWithNoObservedDroplet=11 otherGrantedRemainder=61 dropletLimit=200 queueDepth=42 queuePos=34 fleetObservationValid=true fleetObservationAge=18s fleetObservationUsable=true reservedProjection=196/200 freshProjection=196/200]
[2026-10-06 22:39:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 22:44:51] Admission accounting: reserved=291 unreserved=6 requested=1 limit=200 observedFleet=102 fleetObservationValid=true
[2026-10-06 22:44:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=102 unreservedObserved=6 reservationsSum=291 reservationHolders=35 reservationHoldersWithNoObservedDroplet=11 otherGrantedRemainder=89 dropletLimit=200 queueDepth=43 queuePos=34 fleetObservationValid=true fleetObservationAge=0s fleetObservationUsable=true reservedProjection=192/200 freshProjection=192/200]
[2026-10-06 22:44:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 22:49:51] Admission accounting: reserved=271 unreserved=0 requested=1 limit=200 observedFleet=100 fleetObservationValid=true
[2026-10-06 22:49:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=100 unreservedObserved=0 reservationsSum=271 reservationHolders=34 reservationHoldersWithNoObservedDroplet=8 otherGrantedRemainder=95 dropletLimit=200 queueDepth=40 queuePos=31 fleetObservationValid=true fleetObservationAge=6s fleetObservationUsable=true reservedProjection=196/200 freshProjection=196/200]
[2026-10-06 22:49:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 22:54:51] Admission accounting: reserved=263 unreserved=0 requested=1 limit=200 observedFleet=97 fleetObservationValid=true
[2026-10-06 22:54:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=97 unreservedObserved=0 reservationsSum=263 reservationHolders=34 reservationHoldersWithNoObservedDroplet=7 otherGrantedRemainder=99 dropletLimit=200 queueDepth=40 queuePos=30 fleetObservationValid=true fleetObservationAge=36s fleetObservationUsable=true reservedProjection=197/200 freshProjection=197/200]
[2026-10-06 22:54:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 22:59:51] Admission accounting: reserved=252 unreserved=0 requested=1 limit=200 observedFleet=84 fleetObservationValid=true
[2026-10-06 22:59:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=84 unreservedObserved=0 reservationsSum=252 reservationHolders=33 reservationHoldersWithNoObservedDroplet=6 otherGrantedRemainder=111 dropletLimit=200 queueDepth=41 queuePos=29 fleetObservationValid=true fleetObservationAge=15s fleetObservationUsable=true reservedProjection=196/200 freshProjection=196/200]
[2026-10-06 22:59:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 23:04:51] Admission accounting: reserved=235 unreserved=0 requested=1 limit=200 observedFleet=87 fleetObservationValid=true
[2026-10-06 23:04:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=87 unreservedObserved=0 reservationsSum=235 reservationHolders=33 reservationHoldersWithNoObservedDroplet=7 otherGrantedRemainder=111 dropletLimit=200 queueDepth=41 queuePos=27 fleetObservationValid=true fleetObservationAge=95s fleetObservationUsable=true reservedProjection=199/200 freshProjection=199/200]
[2026-10-06 23:04:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 23:09:51] Admission accounting: reserved=226 unreserved=0 requested=1 limit=200 observedFleet=81 fleetObservationValid=true
[2026-10-06 23:09:51] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=81 unreservedObserved=0 reservationsSum=226 reservationHolders=32 reservationHoldersWithNoObservedDroplet=7 otherGrantedRemainder=117 dropletLimit=200 queueDepth=43 queuePos=26 fleetObservationValid=true fleetObservationAge=108s fleetObservationUsable=true reservedProjection=199/200 freshProjection=199/200]
[2026-10-06 23:09:51] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 23:15:01] Admission accounting: reserved=197 unreserved=0 requested=1 limit=200 observedFleet=106 fleetObservationValid=true
[2026-10-06 23:15:01] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=106 unreservedObserved=0 reservationsSum=197 reservationHolders=30 reservationHoldersWithNoObservedDroplet=2 otherGrantedRemainder=91 dropletLimit=200 queueDepth=42 queuePos=23 fleetObservationValid=true fleetObservationAge=11s fleetObservationUsable=true reservedProjection=198/200 freshProjection=198/200]
[2026-10-06 23:15:01] Waiting for droplet capacity; retrying admission in 300s
[2026-10-06 23:20:10] Admission accounting: reserved=191 unreserved=2 requested=1 limit=200 observedFleet=89 fleetObservationValid=true
[2026-10-06 23:20:10] admissionDecision[run=957a0b8a path=fresh requested=1 myReservation=0 observedFleet=89 unreservedObserved=2 reservationsSum=191 reservationHolders=26 reservationHoldersWithNoObservedDroplet=0 otherGrantedRemainder=104 dropletLimit=200 queueDepth=43 queuePos=19 fleetObservationValid=true fleetObservationAge=12s fleetObservationUsable=true reservedProjection=194/200 freshProjection=194/200]
[2026-10-06 23:20:10] Waiting for droplet capacity; retrying admission in 300s
[buildtest-coordinator] [2026-10-06 23:30:08] Resuming build after service restart (was PENDING)
[2026-10-06 23:30:08] No droplet allocated, provisioning from scratch...
[2026-10-06 23:31:22] Droplet created: id=606783128, name=buildtest-957a0b8a-a75d188
[2026-10-06 23:31:22] Droplet active at 164.90.144.108
[2026-10-06 23:31:25] SSH access granted to droplet 606783128
[2026-10-06 23:31:25] Waiting for guest readiness on droplet 606783128
[2026-10-06 23:31:46] Guest readiness complete on droplet 606783128
[2026-10-06 23:31:46] Droplet active at 164.90.144.108
[buildtest-coordinator] [2026-10-06 23:31:47] SSH connected to 164.90.144.108
[2026-10-06 23:31:51] Reconciled dynamic restart recovery against 13 durable test_discovered identity/identities: restored 0 omitted identity/identities and ignored 0 recovery-only identity/identities from fresh archive analysis
[2026-10-06 23:31:51] Rebuilding dynamic dispatch after service restart from 13 discovered test(s) and 0 durable terminal result(s)
[2026-10-06 23:31:52] Dynamic dispatch: seeded 13 work unit(s) (13 discovered test(s), 0 terminal before seeding) into the shared lease queue
[2026-10-06 23:31:52] No runner execution found for this dynamic run; launching a work-queue runner for its unfinished work on droplet 606783128
[2026-10-06 23:31:52] Dynamic memory admission: droplet 0 has 4096 MiB RAM, 3221225472 bytes available to resident tests, and runner parallelism 4
[2026-10-06 23:31:53] Connecting via SSH and installing dependencies...
[2026-10-06 23:31:53] SSH connected
Stopped, disabled, and masked unattended-upgrades.service, apt-daily.service, apt-daily-upgrade.service, apt-daily.timer, and apt-daily-upgrade.timer; waited 0 seconds for apt/dpkg locks to clear
Dependencies already present (snapshot image), skipping installation
Java: openjdk version "21.0.11" 2026-04-21
Node.js: v18.19.1
Chromium: /usr/bin/chromium-browser
Coursier: /root/tools/coursier
Docker already present: Docker version 29.1.3, build 29.1.3-0ubuntu3~24.04.2
haveged already present
securerandom.source=file:/dev/urandom already set in /usr/lib/jvm/java-21-openjdk-amd64/conf/security/java.security
Dependencies installed successfully
Install image id: 245388985; base dependency fast path taken: true
[BuildDriver] Memory before swap: MemoryInfo(totalMemoryKb=4009856, availableMemoryKb=3457088, totalSwapKb=0, freeSwapKb=0)
mkswap: /swapfile: warning: wiping old swap signature.
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=b53d3469-44e1-4dd0-acc6-02ff5ba7ceea
Swap file created and enabled
[BuildDriver] Memory after swap: MemoryInfo(totalMemoryKb=4009856, availableMemoryKb=3454564, totalSwapKb=4194300, freeSwapKb=4194300)
[BuildDriver] Swap verified: 4194300KB total swap (was 0KB)
[2026-10-06 23:32:02] Dependencies installed
[2026-10-06 23:32:02] Uploading project archive...
Extracted projects:
CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1
[2026-10-06 23:32:03] Projects on remote: CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1
[2026-10-06 23:32:03] Projects from archive: tinysitewui:tinysite-wui
[2026-10-06 23:32:03] Building and testing workspace...
[2026-10-06 23:32:03] [dispatch] droplet 0 ready
[2026-10-06 23:32:03] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testBrowserPublishesAFolderAndOpensTheSite.kts] on droplet 0: its reservation of 2232 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 2151 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:32:03] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testConcurrentPublishesAndVisitsStayIntact.kts] on droplet 0: its reservation of 2166 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 4383 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:32:03] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testEveryKnownExtensionIsServedWithItsContentType.kts] on droplet 0: its reservation of 2017 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 6549 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:32:03] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testHomeListsOnlyPublishedSites.kts] on droplet 0: its reservation of 2095 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8566 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:32:03] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testPublishedSiteServesIndexAndNestedAssets.kts] on droplet 0: its reservation of 2090 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8644 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:32:03] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testTimesAndSizesAreWordedByMagnitude.kts] on droplet 0: its reservation of 2115 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8644 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:32:03] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testRangeRequestsReturnExactlyTheBytesAsked.kts] on droplet 0: its reservation of 1917 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8664 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:32:03] [dispatch] lease_issued: Issued lease 24af6d84-adf9-4062-9ab5-2bec625fd34a-957a0b8a-1d212218-3dbe-4063-bbee-15b0e451089e-L0 with 8 test(s) [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testBrowserRetryAfterAFailedPublishSendsOnlyTheRest.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testBrowserPublishesAFolderAndOpensTheSite.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testConcurrentPublishesAndVisitsStayIntact.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testEveryKnownExtensionIsServedWithItsContentType.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testHomeListsOnlyPublishedSites.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testPublishedSiteServesIndexAndNestedAssets.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testTimesAndSizesAreWordedByMagnitude.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testRangeRequestsReturnExactlyTheBytesAsked.kts] to droplet 0 (pull-based handout from shared queue; 5 unit(s) remaining). Memory admission: predicted peak 2263797760 bytes; resident predicted peak 2263797760 of 3221225472 bytes; 957427712 bytes remaining budget
System memory: 3915MB, JVM heap: 1957MB
Downloading https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.pom
Downloaded https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.pom
Downloading https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.pom.sha1
Downloaded https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.pom.sha1
Downloading https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.pom
Downloading https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.pom
Downloading https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.pom
Downloading https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.pom
Downloading https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.pom
Downloading https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.pom
Downloaded https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.pom
Downloaded https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.pom
Downloading https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.pom
Downloading https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.pom.sha1
Downloaded https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.pom
Downloading https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.pom.sha1
Downloaded https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.pom
Downloading https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.pom.sha1
Failed to download https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.pom.sha1
Downloading https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.pom.sha1
Downloaded https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.pom
Downloading https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.pom.sha1
Downloaded https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.pom
Downloading https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.pom.sha1
Downloaded https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.pom
Downloading https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.pom.sha1
Downloaded https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.pom.sha1
Downloaded https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.pom.sha1
Downloaded https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.pom.sha1
Downloaded https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.pom.sha1
Downloaded https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.pom.sha1
Downloaded https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.pom.sha1
Downloading https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.jar
Downloading https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.jar
Downloading https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.jar
Downloading https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.jar
Downloading https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.jar
Downloading https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.jar
Downloaded https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.jar
Downloading https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.jar
Downloaded https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.jar
Downloading https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.jar
Downloaded https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.jar
Downloading https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.jar.sha1
Downloaded https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.jar
Downloading https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.jar.sha1
Downloaded https://kotlin.directory/tools/kotlin/build/compile/interfaces/executionenvironment/tools-kotlin-build-compile-interfaces-executionenvironment/0.0.2/tools-kotlin-build-compile-interfaces-executionenvironment-0.0.2.jar.sha1
Downloading https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.jar.sha1
Downloaded https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.jar
Downloading https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.jar.sha1
Downloaded https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.jar
Downloading https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.jar.sha1
Failed to download https://kotlin.directory/io/get-coursier/coursier-cache_2.13/2.1.31-buffer2/coursier-cache_2.13-2.1.31-buffer2.jar.sha1
Downloading https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.jar.sha1
Downloaded https://kotlin.directory/community/kotlin/kompile/testrunner/bootstrap/community-kotlin-kompile-testrunner-bootstrap/0.0.16/community-kotlin-kompile-testrunner-bootstrap-0.0.16.jar.sha1
Downloaded https://kotlin.directory/util/cache/hashtofile/hash-to-file-cache/0.0.11/hash-to-file-cache-0.0.11.jar.sha1
Downloaded https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.jar
Downloading https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.jar.sha1
Downloaded https://kotlin.directory/kompile/executionenvironment/kompile-executionenvironment/0.0.44/kompile-executionenvironment-0.0.44.jar.sha1
Downloaded https://kotlin.directory/buildtest/runner/buildtest-runner/0.0.123/buildtest-runner-0.0.123.jar.sha1
Downloaded https://kotlin.directory/kompile/buildscript/kompile-buildscript/0.0.43/kompile-buildscript-0.0.43.jar.sha1
Downloaded https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.jar
Downloading https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.jar.sha1
Downloaded https://kotlin.directory/kompile/manager/0.0.205/manager-0.0.205.jar.sha1
Build-script stderr: [BuildscriptRunner] Checking cache for key: 6251ae4d4e150b85b06c9be5fdf1c8362944829234a6720a9dc56c917464637a
[BuildScriptStderrEffect from Main.kt:1547]
Build-script stderr: [BuildscriptRunner] Cache MISS for key: 6251ae4d4e150b85b06c9be5fdf1c8362944829234a6720a9dc56c917464637a, executing calculator
[BuildScriptStderrEffect from Main.kt:1547]
Build-script stderr: [BuildscriptRunner] Checking cache for key: 39da546a50188962618a9acc398a93fa10627f55d2115532a183ffa927ced86a
[BuildScriptStderrEffect from Main.kt:1547]
Build-script stderr: [BuildscriptRunner] Cache MISS for key: 39da546a50188962618a9acc398a93fa10627f55d2115532a183ffa927ced86a, executing calculator
[BuildScriptStderrEffect from Main.kt:1547]
Diagnostic: Variable 'stateChanged' initializer is redundant [DiagnosticReportedEffect from Main.kt:1547]
Diagnostic: Variable 'proxyToClose' initializer is redundant [DiagnosticReportedEffect from Main.kt:1547]
Build-script stderr: [BuildscriptRunner] Stored result in cache for key: 39da546a50188962618a9acc398a93fa10627f55d2115532a183ffa927ced86a
[BuildScriptStderrEffect from Main.kt:1547]
Build-script stderr: [BuildscriptRunner] Stored result in cache for key: 6251ae4d4e150b85b06c9be5fdf1c8362944829234a6720a9dc56c917464637a
[BuildScriptStderrEffect from Main.kt:1547]
/tmp/qtcompile-group3065364770844735157/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile17214250167841697507/testRangeRequestsReturnExactlyTheBytesAsked.kt:72:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile6043399996636365293/testTimesAndSizesAreWordedByMagnitude.kt:69:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile-group4126458088614032109/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile11162244399506991369/testPublishedSiteServesIndexAndNestedAssets.kt:72:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile12830308357163598280/testHomeListsOnlyPublishedSites.kt:69:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile14144064249452396394/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile14144064249452396394/testEveryKnownExtensionIsServedWithItsContentType.kt:70:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile5658062751570983244/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile5658062751570983244/testConcurrentPublishesAndVisitsStayIntact.kt:83:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
[2026-10-06 23:34:23] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testSiteStopsBeingServedWhenItExpires.kts] on droplet 0: its reservation of 1800 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8566 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:34:23] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testMisusedUploadsAreRefusedAndStoreNothing.kts] on droplet 0: its reservation of 1742 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8566 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:34:23] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testUnreachableStorageIsNotReportedAsMissing.kts] on droplet 0: its reservation of 1791 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8566 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:34:23] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testFileThatShrinksWhileBeingServedIsCutOffNotPadded.kts] on droplet 0: its reservation of 1846 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 8566 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:34:23] [dispatch] lease_issued: Issued lease 24af6d84-adf9-4062-9ab5-2bec625fd34a-957a0b8a-1d212218-3dbe-4063-bbee-15b0e451089e-L1 with 4 test(s) [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testSiteStopsBeingServedWhenItExpires.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testMisusedUploadsAreRefusedAndStoreNothing.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testUnreachableStorageIsNotReportedAsMissing.kts, CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testFileThatShrinksWhileBeingServedIsCutOffNotPadded.kts] to droplet 0 (pull-based handout from shared queue; 1 unit(s) remaining). Memory admission: predicted peak 489693184 bytes; resident predicted peak 2230812672 of 3221225472 bytes; 990412800 bytes remaining budget
/tmp/qtcompile-group258417380023452953/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile16259105017921968261/testBrowserPublishesAFolderAndOpensTheSite.kt:84:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile16259105017921968261/testBrowserPublishesAFolderAndOpensTheSite.kt:303:43: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val storedLong = java.net.URL("$base/s/$siteId/data/long.txt").openStream().use { it.readBytes() }
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile16259105017921968261/testBrowserPublishesAFolderAndOpensTheSite.kt:306:42: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
assertEquals(0, java.net.URL("$base/s/$siteId/empty.txt").openStream().use { it.readBytes() }.size)
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile16259105017921968261/testBrowserPublishesAFolderAndOpensTheSite.kt:307:50: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
assertEquals(indexHtml, java.net.URL("$base/s/$siteId/index.html").openStream().use { it.readBytes() }.toString(Charsets.UTF_8))
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile17541118282450714958/testBrowserRetryAfterAFailedPublishSendsOnlyTheRest.kt:86:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile17541118282450714958/testBrowserRetryAfterAFailedPublishSendsOnlyTheRest.kt:232:9: warning: variable 'siteBytes' is never used
val siteBytes = (indexHtml + siteCss + logoSvg + appJs + longText).toByteArray(Charsets.UTF_8).size
^ Variable 'siteBytes' is never used [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile-group9258011412409277966/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile7065263302527819733/testSiteStopsBeingServedWhenItExpires.kt:69:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile8332535102941987078/testMisusedUploadsAreRefusedAndStoreNothing.kt:70:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile-group4700197938591907503/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile11454213776428249363/testFileThatShrinksWhileBeingServedIsCutOffNotPadded.kt:74:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile11454213776428249363/testFileThatShrinksWhileBeingServedIsCutOffNotPadded.kt:211:39: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL("$base/s/$siteId/large.bin").openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile8599904739451974745/testUnreachableStorageIsNotReportedAsMissing.kt:74:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
[2026-10-06 23:34:57] [dispatch] cpu_skip_advisory: CPU admission would have skipped test [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testUploadRefusesPathsOutsideTheSite.kts] on droplet 0: its reservation of 1581 millicores would raise the worst-case concurrent CPU of the droplet's 4 lanes above its 2000 millicores (already 7971 millicores reserved by resident and selected tests); it was admitted because CPU admission is in OBSERVE mode
[2026-10-06 23:34:57] [dispatch] lease_issued: Issued lease 24af6d84-adf9-4062-9ab5-2bec625fd34a-957a0b8a-1d212218-3dbe-4063-bbee-15b0e451089e-L2 with 1 test(s) [CodexCoder21Organization-TinySiteWui-c2b3b8764e5b34578d986fb450ee58b4ff327ab1/tests/testUploadRefusesPathsOutsideTheSite.kts] to droplet 0 (pull-based handout from shared queue; 0 unit(s) remaining). Memory admission: predicted peak 103391232 bytes; resident predicted peak 1817706496 of 3221225472 bytes; 1403518976 bytes remaining budget
/tmp/qtcompile5975962040012541116/TestRunner.kt:82:49: warning: 'getter for id: Long' is deprecated. Deprecated in Java
.append(" #").append(thread.id)
^ 'getter for id: Long' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
/tmp/qtcompile5975962040012541116/testUploadRefusesPathsOutsideTheSite.kt:69:35: warning: 'constructor URL(String!)' is deprecated. Deprecated in Java
val connection = java.net.URL(url).openConnection() as java.net.HttpURLConnection
^ 'constructor URL(String!)' is deprecated. Deprecated in Java [DiagnosticEffect from Main.kt:1547]
Control socket idle for 60000ms with no RPC from the child; child process is still alive, so continuing to wait (the independent monotonic per-test watchdog still bounds the run)
[2026-10-06 23:35:34] [dispatch] drain: Drain: shared queue has no unowned work, droplet 0 has no outstanding leases or targeted recovery/acceleration assignment
[2026-10-06 23:35:35] Merged 7 build rule results from XML
[HeapDump] No heap dump files found on droplet
[2026-10-06 23:35:35] Collecting results...
[2026-10-06 23:35:35] Build+test results: 13 passed, 0 failed, 13 total
[2026-10-06 23:35:35] Build finished with status: COMPLETED (resumed after restart)
[perftest-dispatch] No @PerformanceTest-annotated tests found in workspace.
[2026-10-06 23:35:40] Destroying droplet...
[2026-10-06 23:35:40] Droplet enqueued for deletion