Handoff: Resolve delayed-commit speed rules before releasing TinySiteConventions 0.0.8
Written 2026-10-20 UTC.
RE-VERIFY: This is a write-time snapshot. Check the current branch with git ls-remote, the pull request with gh pr view https://github.com/CodexCoder21Organization/TinySiteConventions/pull/5 --json state,headRefOid, and the artifact POMs before acting. Do not watch CI in this lane.
Design decisions in force
The 2026-10-20 brief says: "Design decisions (orchestrator — implement these; if one is unworkable, stop and show why)" and "If the contract above cannot work as written, stop and report the evidence — that is a complete result."
The conflicting requirements, verbatim:
Window byte count = for each needed blob: if it has any valid arrivals in the window, the sum of those arrival bytes; otherwise, if it completed inside the window, its full size; otherwise 0. Files/minute keeps counting distinct blob completions in the window.
A commit that adds no new bytes (the blob's chunks had all arrived already) must not change MB/min or ETA beyond floating-point rounding; the R1-adv F2 scenario becomes a test of that. Choose the window-vs-average rule so this holds (e.g. use the window when it covers enough elapsed time or holds any byte evidence; fall back to the start-to-now average only early in a job), document the rule in README.
Other required behavior remains: defaulted recentChunkArrivals List<UploadChunkArrival(sha256,atMillis,bytes)> with storage-clock timestamps, valid positive needed-blob observations only; start/completion/arrival activity, no activity from bare cumulative byte counts; average end speeds frozen at storage end, deployed ETA zero and failed/cancelled ETA null; calculation one listing pass with O(job) extra memory, bounded selection memory; all seven R1 coverage gaps; retain source compatibility with the 0.0.7 cumulative byte map.
The user granted publication of 0.0.8 only after the full suite passes on its first attempt from the exact pushed head, with served POM confirmation. Work stays in the started checkout and on the same implementation branch/PR. No merge, enqueue, deploy, CI watching, timeout increases, heap increases, iteration reductions or skipped tests. PR body must quote the owner's request and end with the Claude Code attribution; commit messages carry the requested coauthor.
Mission summary
Resolve both R1 reviews for the shared upload-job progress library, push commits to the existing PR, and release 0.0.8. The owner wants an in-progress upload display with selected file counts/sizes, progress, ETA, files/minute and MB/min. The review conclusions, independent coverage mapping and exact observed failure traces are included in the evidence appendix below.
What was found and done
- Verified the two R1 reviews against head 967f20c48733dd912d4200fd0f066cc2b30a8834. Confirmed F1 missing activity timestamps, F2 completion-threshold rate switch, and F3 whole-history groupBy. Added eleven self-contained public-API regression/coverage scripts; baseline first-attempt result 5 passed, 6 failed. Pushed the failing-test milestone.
- Reproduced the unchanged 600,000-record history OOM at 128 MiB. HPROF counts show 600,000 input summaries plus about 419,000 newly allocated lists and linked-map entries, confirming groupBy materialization. Implemented one-pass bounded calculation and bounded selector candidate batches. Same scale input passed in 11,256 ms. Heap cap, timeout and input size were unchanged.
- Implemented timestamped arrivals, per-blob window accounting, early average rule and frozen ended speeds. Added exact assertions for all seven test gaps. Initial fixed-code targeted run was 10/11; the one failure was a new test's timestamp subtraction error, corrected to the exact 60-minute boundary. After that correction, activity, existing speed and contract probe passed 3/3 on first attempts. No final full-suite result is claimed.
- Independent review found an actual contradiction: start=0, now=120000; b=1 MB all arrived at59000, c=1 MB missing; commit b at120000 sends no bytes. Window[60000,120000] has no arrivals. Invariant2 changes b's window contribution 0→1 MB while invariant3 forbids changing rate/ETA. Public test testUploadDelayedCommitContractProbe confirmed unchanged bytesUploaded=1000000, MB/min0→1, ETA null→59.99999999999999. Changing an early-average rule cannot fix this mature-window conflict.
- Stopped release work as explicitly required. Published nothing, merged/enqueued/deployed nothing, watched no CI. Updated the PR body with the conflict and exact validation limits. Pushed partial implementation and test corrections to the same branch. The release remains blocked on a contract choice, rather than silently narrowing continuity.
Relevant PRs / refs
| Repo |
Branch |
Remote head SHA |
PR |
Contents |
State |
| CodexCoder21Organization/TinySiteConventions |
feature/upload-job-record |
6302175a63141e7e2546e411096c227b2a0ec70d |
https://github.com/CodexCoder21Organization/TinySiteConventions/pull/5 |
Failing-test milestone and partial calculation/selection fix with contract probe |
Compiles; targeted scenarios covered as described; no final full suite; release blocked |
The failing-test commit is https://github.com/CodexCoder21Organization/TinySiteConventions/commit/75de3bbc4786a92d89888e3be228a3dbbf6a6533 . Partial implementation checkpoint is https://github.com/CodexCoder21Organization/TinySiteConventions/commit/ceb5ad988ce93f8c1962a4fa2b1db71adb324df9 . The strengthened counterexample is https://github.com/CodexCoder21Organization/TinySiteConventions/commit/6302175a63141e7e2546e411096c227b2a0ec70d . Related CLI work: https://github.com/CodexCoder21Organization/TinySiteCli/pull/3 . No WUI upload-job PR was open at the time this round queried its sibling PR list.
Published but not merged: version0.0.7 was published before this round from967f20c48733dd912d4200fd0f066cc2b30a8834, still in this open PR. Its POM https://kotlin.directory/tinysite/conventions/tinysite-conventions/0.0.7/tinysite-conventions-0.0.7.pom answered200. Version0.0.8 POM https://kotlin.directory/tinysite/conventions/tinysite-conventions/0.0.8/tinysite-conventions-0.0.8.pom answered404. This round ran no publication command or deployment.
No artifact branch was added; all implementation/tests are on the required existing branch. The complete findings/review/diagnostic text needed for cold pickup is embedded below in the central service record. The large heap binary is intentionally omitted: retained class counts and the exact reproducer are preserved, and it can be regenerated with HeapDumpOnOutOfMemoryError without increasing heap. Build outputs/dependency caches are not committed.
Next steps
- Re-verify current branch/PR/artifact state first.
- Ask the owner which rule governs commits delayed beyond the window. Keeping the specified per-blob completion fallback requires narrowing the continuity promise to blobs with chunk evidence inside the current window. Preserving unconditional continuity instead requires changing the window rule and retaining sufficient earlier byte history; a trailing-window-only input cannot distinguish that history once discarded. Do not choose silently.
- Once the contract is amended, pin that choice with a failing-first public test and finish the implementation/README/API accordingly. Review the existing delayed-commit probe when choosing its permanent expectation.
- Revert the implementation locally once and reconfirm the regression tests go red, then restore it. That additional requested confirmation was not executed after the explicit contract-stop condition was reached.
- Fetch/rebase main, run the final full suite with scripts/test.bash --local-and-remote --test . --log <outside-repo path> from the exact intended head, record the runner's first-attempt counts, push and update the same PR. Publication is allowed only if the exact-head full-suite result meets the user's first-attempt bar. Do not watch CI, merge, enqueue or deploy.
- Publish0.0.8 through the Maven publisher skill, verify the served POM, and only then describe0.0.7 as superseded. Current README/PR correctly call0.0.8 an unpublished target.
Reusable knowledge
The repo's jars/coursier JVM launcher works; /usr/local/bin/coursier is the already-documented wrong-architecture binary. gh pr edit fails through the obsolete projectCards GraphQL field; use gh api PATCH repos/CodexCoder21Organization/TinySiteConventions/pulls/5 with a structured JSON input file. report-challenge was read but not executed because its automatic enqueue/merge conflicts with this lane's explicit prohibition. Race mode reports test results from the winner, including failures; use XML test entries for counts. No reflection/mocks/external services are used by the pure calculation tests. Selection uses additional candidate batches for old-ended records, so memory is bounded while worst-case scans may increase; that is documented rather than hidden.
Final evidence extension
The original simple0→1 MB/min example could be avoided by averaging that sparse case, so the proof was strengthened before the final stop. Storage start1000, now121000; needed blobs7MB completed2000,1MB completed62000,2MB fully received60000 but committed only now,9MB missing. A caller retaining the required trailing window[61000,121000] supplies an empty arrival list. Before commit, window bytes1MB produce1 MB/min and the average of10MB over2minutes is5 MB/min. After commit, the explicit R1 gap1 assertion requires3 MB/min and ETA180 seconds, with the same10MB uploaded. Neither pre-commit rate can equal the required post-commit rate. This is now permanently covered by testUploadDelayedCommitContractProbe, whose exact empty-arrival variant passed1/1 on its first run before the final push. Three commits total are pushed on the required branch; the table above carries the latest remote SHA. No implementation change followed the partial-fix commit; the third commit strengthens only the evidence test.
Evidence appendix: complete local findings
L1 fix round — 0.0.8
Implemented public signatures — 0.0.8 release blocked; contract not final
data class UploadChunkArrival(val sha256: String, val atMillis: Long, val bytes: Long)
fun calculateUploadProgress(job: UploadJob, listing: List<StoredFileSummary>, end: UploadJobEnd?, nowMillis: Long, inFlightBytes: Map<String, Long> = emptyMap(), recentChunkArrivals: List<UploadChunkArrival> = emptyList()): UploadProgress
fun selectUploadJobIds(listing: List<StoredFileSummary>, nowMillis: Long, limit: Int = 5): List<String>
Existing record models, serializers, names and UploadProgress fields stay available.
Plan
- [done] Read both R1 reviews completely; verify source and reviewed head.
- [done] Read required guidance; add public-API tests for F1/F2/F3, ended freeze and seven coverage gaps; push failing tests first.
- [done] Implement bounded calculation/selection, arrivals, window accounting and ended speed freeze; update README/version as unpublished target.
- [blocked by refuted contract] Independent review found contradictory invariants2/3. Reverted-implementation confirmation and final full suite were not run after the required stop.
- [done] Push partial work and update existing PR with blocker. Publication is stopped: POM0.0.7 HTTP200, POM0.0.8 HTTP404; no publishing, CI watching, merge or deploy.
Mechanisms
OBSERVED: reviewed head is 967f20c48733dd912d4200fd0f066cc2b30a8834, existing PR is OPEN. F1 has no timestamp input; F2 switches from all uploaded bytes to completion-only bytes when the second completion arrives; F3 groups every listing name despite needing only this job’s names. Reproducers are the R1 scenarios plus timestamped live-arrival public calls.
Invariants before implementation
| Resource/input |
Owner/lifetime |
Public behavior/test |
| Job/end/listing |
Caller-owned immutable inputs; calculation retains nothing after return |
No mutation; exact own-record association and storage-clock start/end |
| Cumulative in-flight bytes |
Caller owns job observations; ignored after completion |
Clamp to declared size; no activity without valid arrivals |
| Arrival list |
Caller retains at least trailing window; calculation stores per-needed-blob aggregates only |
Positive needed arrivals in start..effective now; ignore future/old/cached/unrelated/old-completed; window bytes replace completion bytes per digest |
| End state |
Storage end timestamp is terminal calculation time |
Average speed frozen at end; deployed ETA zero, failed/cancelled null |
| Listing scan |
Calculation owns bounded aggregates for this job |
One listing pass; 600,000-history test at original heap |
| Selection |
Temporary bounded candidates; no persisted/cache state |
Latest duplicate records/end times, distinct ids, bounded results independent of listing order |
Reading
OBSERVED: Both review files read in full; repository README and UploadJobs.kt read. Required TESTING.md fetched via authenticated GitHub API (browser cannot access private repo); racing-CI guide fetched directly. Follow explicit brief’s bld-build gate and no-CI-watch instruction where TESTING.md disagrees.
First baseline checkpoint
OBSERVED: Original 600,000-record scale test failed with OutOfMemoryError at unchanged 128 MiB default. Behavior baseline runner returned 0/2 first-attempt passes (commit transition and ended-job ETA). Full runner records /tmp/l1-red-scale.xml and /tmp/l1-red-behavior.xml. Public arrival API scaffold added with unused defaulted parameter solely to compile the failing public tests; calculation remains unchanged. No existing tests edited yet.
Full baseline failure output:
Connecting to url://buildtest/ ...
Connected to url://buildtest/ (health=OK)
'getter for id: Long' is deprecated. Deprecated in Java
java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.ArrayList.grow(ArrayList.java:239)
at java.base/java.util.ArrayList.grow(ArrayList.java:244)
at java.base/java.util.ArrayList.add(ArrayList.java:483)
at java.base/java.util.ArrayList.add(ArrayList.java:496)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress(UploadJobs.kt:305)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress$default(UploadJobs.kt:132)
at tinysite.conventions.test.TestUploadProgressWithLongHistoryKt.testUploadProgressWithLongHistory(testUploadProgressWithLongHistory.kt:16)
at java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
at java.base/java.lang.invoke.LambdaForm$MH/0x000070bd64014800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:153)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/java.lang.invoke.LambdaForm$DMH/0x000070bd6400a000.invokeStatic(LambdaForm$DMH)
at java.base/java.lang.invoke.LambdaForm$MH/0x000070bd6400c800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:154)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.test.testUploadProgressWithLongHistory -> java.lang.OutOfMemoryError: Java heap space (in 10.9 seconds)
--- Console output (tinysite.conventions.test.testUploadProgressWithLongHistory) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.ArrayList.grow(ArrayList.java:239)
at java.base/java.util.ArrayList.grow(ArrayList.java:244)
at java.base/java.util.ArrayList.add(ArrayList.java:483)
at java.base/java.util.ArrayList.add(ArrayList.java:496)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress(UploadJobs.kt:305)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress$default(UploadJobs.kt:132)
at tinysite.conventions.test.TestUploadProgressWithLongHistoryKt.testUploadProgressWithLongHistory(testUploadProgressWithLongHistory.kt:16)
at java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
at java.base/java.lang.invoke.LambdaForm$MH/0x000070bd64014800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:153)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/java.lang.invoke.LambdaForm$DMH/0x000070bd6400a000.invokeStatic(LambdaForm$DMH)
at java.base/java.lang.invoke.LambdaForm$MH/0x000070bd6400c800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:154)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.test.testUploadProgressWithLongHistory) ---
TESTS FAILED (0/1 tests completed successfully, 1 failed)
[ConnectionClosed] Connection connection@2c54f51e closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/38416; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
Connection connection@2c54f51e closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/38416; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none [unhandled ConnectionClosedEffect from ConnectionCloseReasons.kt:127]
Connecting to url://buildtest/ ...
Connected to url://buildtest/ (health=OK)
[BuildscriptRunner] Checking cache for key: 9d2a8bd4e08d2217950d4cc76cac4afa27e5a17ead7ee9b149939a7ca78da896
[BuildscriptRunner] Cache MISS for key: 9d2a8bd4e08d2217950d4cc76cac4afa27e5a17ead7ee9b149939a7ca78da896, executing calculator
[BuildscriptRunner] Checking cache for key: 5cad142ec8653ef9a794da6e40fa760eaa65b976f97a531c6f78e5594fbb42f0
[BuildscriptRunner] Cache MISS for key: 5cad142ec8653ef9a794da6e40fa760eaa65b976f97a531c6f78e5594fbb42f0, executing calculator
Parameter 'recentChunkArrivals' is never used
[BuildscriptRunner] Stored result in cache for key: 5cad142ec8653ef9a794da6e40fa760eaa65b976f97a531c6f78e5594fbb42f0
[BuildscriptRunner] Stored result in cache for key: 9d2a8bd4e08d2217950d4cc76cac4afa27e5a17ead7ee9b149939a7ca78da896
'getter for id: Long' is deprecated. Deprecated in Java
java.lang.AssertionError: Expected <26.0>, actual <2.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.test.TestUploadCommitPreservesRateKt.testUploadCommitPreservesRate(testUploadCommitPreservesRate.kt:18)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.test.testUploadCommitPreservesRate -> java.lang.AssertionError: Expected <26.0>, actual <2.0>. (in 1.3 seconds)
--- Console output (tinysite.conventions.test.testUploadCommitPreservesRate) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <26.0>, actual <2.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.test.TestUploadCommitPreservesRateKt.testUploadCommitPreservesRate(testUploadCommitPreservesRate.kt:18)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.test.testUploadCommitPreservesRate) ---
java.lang.AssertionError: Expected <0.0>, actual <540.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.test.TestUploadEndedSpeedsFreezeKt.testUploadEndedSpeedsFreeze(testUploadEndedSpeedsFreeze.kt:19)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.test.testUploadEndedSpeedsFreeze -> java.lang.AssertionError: Expected <0.0>, actual <540.0>. (in 1.4 seconds)
--- Console output (tinysite.conventions.test.testUploadEndedSpeedsFreeze) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <0.0>, actual <540.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.test.TestUploadEndedSpeedsFreezeKt.testUploadEndedSpeedsFreeze(testUploadEndedSpeedsFreeze.kt:19)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.test.testUploadEndedSpeedsFreeze) ---
TESTS FAILED (0/2 tests completed successfully, 2 failed)
[ConnectionClosed] Connection connection@7570ac98 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/42552; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
Connection connection@7570ac98 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/42552; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none [unhandled ConnectionClosedEffect from ConnectionCloseReasons.kt:127]
Failing-test milestone
OBSERVED: Runner first-attempt records for all 11 added scenarios: 5 passed, 6 failed. Failures are chunk activity (running vs stalled), commit speed (52 vs 26 MB/min), ended ETA (0 vs 540s), old byte exclusion (zero vs historical average), duplicate timestamp window rule (1 vs 0.5), and unchanged 600,000-record scale (OutOfMemoryError). The five passing coverage additions protect existing correct semantics; no implementation change is claimed for them.
Connecting to url://buildtest/ ...
Connected to url://buildtest/ (health=OK)
'getter for id: Long' is deprecated. Deprecated in Java
java.lang.AssertionError: Expected <1.0>, actual <0.5>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadDuplicateCompletionRatesKt.testUploadDuplicateCompletionRates(testUploadDuplicateCompletionRates.kt:20)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.fixround.testUploadDuplicateCompletionRates -> java.lang.AssertionError: Expected <1.0>, actual <0.5>. (in 1.4 seconds)
--- Console output (tinysite.conventions.fixround.testUploadDuplicateCompletionRates) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <1.0>, actual <0.5>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadDuplicateCompletionRatesKt.testUploadDuplicateCompletionRates(testUploadDuplicateCompletionRates.kt:20)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.fixround.testUploadDuplicateCompletionRates) ---
java.lang.AssertionError: Expected <running>, actual <stalled>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadChunkActivityAndWindowKt.testUploadChunkActivityAndWindow(testUploadChunkActivityAndWindow.kt:16)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.fixround.testUploadChunkActivityAndWindow -> java.lang.AssertionError: Expected <running>, actual <stalled>. (in 1.2 seconds)
--- Console output (tinysite.conventions.fixround.testUploadChunkActivityAndWindow) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <running>, actual <stalled>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadChunkActivityAndWindowKt.testUploadChunkActivityAndWindow(testUploadChunkActivityAndWindow.kt:16)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.fixround.testUploadChunkActivityAndWindow) ---
java.lang.AssertionError: Expected <52.0>, actual <26.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadCommitPreservesRateKt.testUploadCommitPreservesRate(testUploadCommitPreservesRate.kt:18)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.fixround.testUploadCommitPreservesRate -> java.lang.AssertionError: Expected <52.0>, actual <26.0>. (in 1.4 seconds)
--- Console output (tinysite.conventions.fixround.testUploadCommitPreservesRate) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <52.0>, actual <26.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadCommitPreservesRateKt.testUploadCommitPreservesRate(testUploadCommitPreservesRate.kt:18)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.fixround.testUploadCommitPreservesRate) ---
java.lang.AssertionError: Expected <0.0>, actual <0.9999944444753085>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadWindowExcludesOldBytesKt.testUploadWindowExcludesOldBytes(testUploadWindowExcludesOldBytes.kt:24)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.fixround.testUploadWindowExcludesOldBytes -> java.lang.AssertionError: Expected <0.0>, actual <0.9999944444753085>. (in 1.3 seconds)
--- Console output (tinysite.conventions.fixround.testUploadWindowExcludesOldBytes) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <0.0>, actual <0.9999944444753085>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadWindowExcludesOldBytesKt.testUploadWindowExcludesOldBytes(testUploadWindowExcludesOldBytes.kt:24)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.fixround.testUploadWindowExcludesOldBytes) ---
java.lang.AssertionError: Expected <0.0>, actual <540.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadEndedSpeedsFreezeKt.testUploadEndedSpeedsFreeze(testUploadEndedSpeedsFreeze.kt:19)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.fixround.testUploadEndedSpeedsFreeze -> java.lang.AssertionError: Expected <0.0>, actual <540.0>. (in 1.4 seconds)
--- Console output (tinysite.conventions.fixround.testUploadEndedSpeedsFreeze) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <0.0>, actual <540.0>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadEndedSpeedsFreezeKt.testUploadEndedSpeedsFreeze(testUploadEndedSpeedsFreeze.kt:19)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.fixround.testUploadEndedSpeedsFreeze) ---
java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.LinkedHashMap.newNode(LinkedHashMap.java:281)
at java.base/java.util.HashMap.putVal(HashMap.java:648)
at java.base/java.util.HashMap.put(HashMap.java:618)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress(UploadJobs.kt:301)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress$default(UploadJobs.kt:132)
at tinysite.conventions.fixround.TestUploadProgressWithLongHistoryKt.testUploadProgressWithLongHistory(testUploadProgressWithLongHistory.kt:16)
at java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
at java.base/java.lang.invoke.LambdaForm$MH/0x00007e4b94014800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:153)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/java.lang.invoke.LambdaForm$DMH/0x00007e4b9400a000.invokeStatic(LambdaForm$DMH)
at java.base/java.lang.invoke.LambdaForm$MH/0x00007e4b9400c800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:154)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.fixround.testUploadProgressWithLongHistory -> java.lang.OutOfMemoryError: Java heap space (in 14.2 seconds)
--- Console output (tinysite.conventions.fixround.testUploadProgressWithLongHistory) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.LinkedHashMap.newNode(LinkedHashMap.java:281)
at java.base/java.util.HashMap.putVal(HashMap.java:648)
at java.base/java.util.HashMap.put(HashMap.java:618)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress(UploadJobs.kt:301)
at tinysite.conventions.UploadJobsKt.calculateUploadProgress$default(UploadJobs.kt:132)
at tinysite.conventions.fixround.TestUploadProgressWithLongHistoryKt.testUploadProgressWithLongHistory(testUploadProgressWithLongHistory.kt:16)
at java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
at java.base/java.lang.invoke.LambdaForm$MH/0x00007e4b94014800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:153)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/java.lang.invoke.LambdaForm$DMH/0x00007e4b9400a000.invokeStatic(LambdaForm$DMH)
at java.base/java.lang.invoke.LambdaForm$MH/0x00007e4b9400c800.invoke(LambdaForm$MH)
at java.base/java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:154)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.fixround.testUploadProgressWithLongHistory) ---
TESTS FAILED (5/11 tests completed successfully, 6 failed)
[ConnectionClosed] Connection connection@7bdfe61c closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/56068; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
Connection connection@7bdfe61c closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/56068; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none [unhandled ConnectionClosedEffect from ConnectionCloseReasons.kt:127]
OBSERVED: A separate unchanged-heap baseline with HeapDumpOnOutOfMemoryError produced /tmp/java_pid32806.hprof (199,878,446 bytes); same scale test failed again. Capturing heap did not change its heap cap or input size.
OBSERVED heap evidence before implementation: parsed /tmp/java_pid32806.hprof with a standalone HPROF record reader. Instance counts: 600,000 StoredFileSummary (the input), 419,831 ArrayList, 419,501 LinkedHashMap.Entry, and 421,742 Object[] arrays. The failing groupBy was partway through making one list and map entry per unrelated name when allocation failed. This confirms the materialization mechanism rather than only the error symptom.
OBSERVED first checkpoint pushed: https://github.com/CodexCoder21Organization/TinySiteConventions/commit/75de3bb .
INFERRED selection design tradeoff: top-limit candidates and end timestamps can be held without a whole-history index. Selection scans bounded candidate batches and their ends, taking further batches only when old end records exclude the previous candidates. Calculation itself uses exactly one listing pass.
Course-changing finding — release stopped
OBSERVED source and independent review: invariant 2 and unconditional invariant 3 conflict for a commit delayed beyond the trailing window. Public counterexample is being executed: storage start=0, now=120,000, b=1 MB fully received at59,000 and c=1 MB missing. Commit b at120,000 sends no new bytes. Window [60,000,120,000] contains no chunk arrivals. Rule 2 requires b’s contribution to change from 0 to1 MB at commit; rule 3 prohibits that rate/ETA change. Changing the early average rule cannot resolve this mature-job case. User explicitly instructed stop and show why if the contract is unworkable; release/publish is therefore stopped pending the owner’s decision.
Independent review:
Independent review of the L1 fix
Review scope: current working tree in /code/workspace/lanes/L1-conventions, targeting https://github.com/CodexCoder21Organization/TinySiteConventions/pull/5. This was a source and test review only. No test/build, repository edit, commit, push, CI query, publication or deployment was performed by this reviewer.
Plan:
- DONE: Read both R1 findings in full, README, UploadJobs.kt, and the eleven fixround tests; inspect the existing speed test and relevant Testing Architecture guidance in
/tmp/l1-testing.md.
- DONE: Map the seven R1 test gaps and the orchestrator invariants to the implementation and assertions.
- DONE: Surface the contradictory continuity case below to the manager. Stop further review expansion at the manager's request and record the precise evidence.
Blocking contract conflict: a no-byte commit after its chunks leave the window
OBSERVED: Orchestrator invariant 2 requires, per blob, the full completed size when completion is inside the window and there are no valid arrivals inside that window. Orchestrator invariant 3 requires that a commit which adds no bytes must not change MB/min or ETA. The following legal input meets both conditions, which demand different results.
Public-API counterexample for the manager to execute:
val id = "u0000000000000-abcdef"
val b = "b".repeat(64)
val c = "c".repeat(64)
val job = UploadJob(id, 0, "browser", listOf(
UploadJobFile("b", b, 1_000_000, true),
UploadJobFile("c", c, 1_000_000, true),
))
val listing = listOf(StoredFileSummary(uploadJobFileName(id), 1, 0))
val arrivals = listOf(UploadChunkArrival(b, 59_000, 1_000_000))
val before = calculateUploadProgress(job, listing, null, 120_000,
mapOf(b to 1_000_000L), arrivals)
val after = calculateUploadProgress(job,
listing + StoredFileSummary(blobFileName(b), 1_000_000, 120_000),
null, 120_000, emptyMap(), arrivals)
The trailing window is [60_000, 120_000]. All b bytes arrived at 59,000, and its later commit transfers no bytes. The caller supplies all arrivals in the trailing window (there are none), and even retains the older observation, so this does not depend on prematurely dropping an observation.
INFERRED from the exact source branches, not claimed as a runtime result:
| Value |
Before commit |
After commit |
| bytesUploaded |
1,000,000 |
1,000,000 |
| remaining bytes |
1,000,000 |
1,000,000 |
| megabytesPerMinute |
0.0 |
1.0 |
| etaSeconds |
null |
60.0 |
Mechanism: UploadJobs.kt:192 does not add the 59,000 arrival to window bytes; :216–:217 therefore changes b's contribution from zero to its entire 1 MB size at commit; :222–:225 uses the mature-job window in both calls. This correctly follows invariant 2 while violating the unconditional continuity promise in invariant 3. Changing the early-job average fallback cannot fix this mature-job case.
testUploadCommitPreservesRate and the committed/live comparison in testUploadChunkActivityAndWindow only commit blobs with arrivals inside the window. They establish that narrower continuity case and do not cover this counterexample. A permanent test should pin whichever behavior the owner chooses once the contract conflict is resolved. No implementation workaround is recommended before that choice.
Dedicated coverage cross-check
OBSERVED from assertions, without rerunning tests:
| R1 test gap |
New coverage |
| 1: old-byte exclusion, early average, zero recent samples, full rate/ETA values |
testUploadWindowExcludesOldBytes; the current existing speed test also now asserts MB/min and ETA around the boundary. |
| 2: parser semantic refusals, versions, reserved paths |
testUploadParserSemanticMatrix hand-builds JSON and checks full messages, including both path-validation entry points. |
| 3: thresholds after actual completions and resume |
testUploadCompletionActivityThresholds asserts both sides of each threshold in both listing orders, ignores cached-blob activity and resumes on a later completion. |
| 4: repeated valid summaries and duplicate-digest paths |
testUploadDuplicateCompletionRates checks both listing orders, latest matching timestamp, distinct counts, path counts, both speeds and ETA. Its one-completion expectation is intentionally the new mature-window rule, replacing the R1 review's old fallback expectation. |
| 5: repeated job/end summaries, sparse/empty results |
testUploadSelectionDeduplicatesRecords asserts exact result lists in both orders, latest job/end timestamps, empty input and fewer-than-limit results. |
| 6: window arithmetic at Long.MAX_VALUE and empty/cached/zero-byte transfers |
testUploadNumericAndEmptyTransfers asserts exact large rates/totals, zero-duration rates, fractional byte progress/ETA, missing zero-byte transfer counts, mixed transfers and full empty/cached transfer outputs. |
| 7: end-record UTF-8 limits |
testUploadEndMultibyteBounds independently constructs reader JSON at limit minus one, limit and limit plus one, and checks full writer/parser refusal messages. |
OBSERVED: The live chunk test covers active arrivals beyond both inactivity thresholds, aging after stopped arrivals, bare cumulative-byte inactivity, unrelated/cached/zero/negative/pre-start/future observations, old completions, and window double counting. The ended-speed test checks all outcomes at three advancing caller times, with storage-clock average rates and required ETA outcomes. The 600,000-record scale test retains the R1 scale and normal selection-then-calculation path, without changing the heap or reducing input size.
OBSERVED: The calculation now scans the listing once and retains only needed-blob observations plus job/end aggregates. Selection retains at most limit candidates/results and a bounded end-time map; it may rescan batches when old-ended candidates are excluded. No history-sized retained name map remains in either path.
No further concrete implementation defect was established before the manager requested that review expansion stop. This report does not certify runtime success, first-attempt results, final-head state or release readiness. The contract conflict above prevents an unconditional clean review of the requested invariants.
OBSERVED: Fixed implementation targeted batch returned 10/11 first-attempt passes, including unchanged scale input. The remaining test was a new-fixture arithmetic error: now3,601,000 minus last completion2,000 is3,599,000, which is correctly stalled. Corrected only that new fixture now/arrival time to3,602,000 to test the exact 60-minute boundary while retaining its abandoned assertion.
OBSERVED: Public delayed-commit probe printed beforeBytes=1000000 afterBytes=1000000 beforeMB=0.0 afterMB=1.0 beforeEta=null afterEta=59.99999999999999. This confirms the contract conflict. Its initial exact-60 assertion failed solely on normal Double rounding; corrected to a1e-12 tolerance. No changed implementation followed this result.
Full first green-targeted/probe outputs (including failure stack traces):
Connecting to url://buildtest/ ...
Connected to url://buildtest/ (health=OK)
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
tinysite.conventions (/code/workspace/lanes/L1-conventions/build.kts) invoking buildscript compile [unhandled StartingKotlinCompile from BuildscriptCache.kt:958]
null Using Kotlin home directory <no_path> [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64 [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Exception on loading scripting plugin: java.lang.ClassNotFoundException: org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Scripting plugin will not be loaded: not all required jars are present in the classpath (missing files: [./kotlin-scripting-compiler.jar, ./kotlin-scripting-compiler-impl.jar, ./kotlin-scripting-common.jar, ./kotlin-scripting-jvm.jar]) [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Using JVM IR backend [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Configuring the compilation environment [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le] [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
tinysite.conventions (/code/workspace/lanes/L1-conventions/build.kts) done buildscript compile [unhandled FinishedKotlinCompile from BuildscriptCache.kt:958]
2e3f31a31e4fead16b442c4b47bee1d419c2cc6d6adf385bd8d53042459c487f invoking buildscript compile [unhandled StartingKotlinCompile from BuildscriptCache.kt:958]
null Using Kotlin home directory <no_path> [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Using JDK home inferred from java.home: /usr/lib/jvm/temurin-21-jdk-amd64 [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Exception on loading scripting plugin: java.lang.ClassNotFoundException: org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Scripting plugin will not be loaded: not all required jars are present in the classpath (missing files: [./kotlin-scripting-compiler.jar, ./kotlin-scripting-compiler-impl.jar, ./kotlin-scripting-common.jar, ./kotlin-scripting-jvm.jar]) [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Using JVM IR backend [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Configuring the compilation environment [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
null Loading modules: [java.se, jdk.accessibility, jdk.attach, jdk.compiler, jdk.dynalink, jdk.httpserver, jdk.incubator.vector, jdk.jartool, jdk.javadoc, jdk.jconsole, jdk.jdi, jdk.jfr, jdk.jshell, jdk.jsobject, jdk.management, jdk.management.jfr, jdk.net, jdk.nio.mapmode, jdk.sctp, jdk.security.auth, jdk.security.jgss, jdk.unsupported, jdk.unsupported.desktop, jdk.xml.dom, java.base, java.compiler, java.datatransfer, java.desktop, java.xml, java.instrument, java.logging, java.management, java.management.rmi, java.rmi, java.naming, java.net.http, java.prefs, java.scripting, java.security.jgss, java.security.sasl, java.sql, java.transaction.xa, java.sql.rowset, java.xml.crypto, jdk.internal.jvmstat, jdk.internal.opt, jdk.zipfs, jdk.management.agent, jdk.jdwp.agent, jdk.internal.ed, jdk.internal.le] [unhandled DiagnosticEffect from BuildscriptCache.kt:958]
2e3f31a31e4fead16b442c4b47bee1d419c2cc6d6adf385bd8d53042459c487f done buildscript compile [unhandled FinishedKotlinCompile from BuildscriptCache.kt:958]
[BuildscriptRunner] Checking cache for key: 939abe2ac5f78a8e8a4212448efb05747325d937479e4ee13173c5d086d5ead3
[BuildscriptRunner] Cache MISS for key: 939abe2ac5f78a8e8a4212448efb05747325d937479e4ee13173c5d086d5ead3, executing calculator
[BuildscriptRunner] Checking cache for key: 7b03c0b0c71ecdb5ad8ac7f1795ee503b1d894122f35313728c85a5348a1ac69
[BuildscriptRunner] Cache MISS for key: 7b03c0b0c71ecdb5ad8ac7f1795ee503b1d894122f35313728c85a5348a1ac69, executing calculator
[BuildscriptRunner] Stored result in cache for key: 7b03c0b0c71ecdb5ad8ac7f1795ee503b1d894122f35313728c85a5348a1ac69
[BuildscriptRunner] Stored result in cache for key: 939abe2ac5f78a8e8a4212448efb05747325d937479e4ee13173c5d086d5ead3
[BuildscriptRunner] Checking cache for key: 97a6419abfb73777784b8129f2837f09d3a19558e4d26064424fb34506e08fb8
[BuildscriptRunner] Cache MISS for key: 97a6419abfb73777784b8129f2837f09d3a19558e4d26064424fb34506e08fb8, executing calculator
[BuildscriptRunner] Checking cache for key: 7b03c0b0c71ecdb5ad8ac7f1795ee503b1d894122f35313728c85a5348a1ac69
[BuildscriptRunner] Cache HIT for key: 7b03c0b0c71ecdb5ad8ac7f1795ee503b1d894122f35313728c85a5348a1ac69
[BuildscriptRunner] Stored result in cache for key: 97a6419abfb73777784b8129f2837f09d3a19558e4d26064424fb34506e08fb8
'getter for id: Long' is deprecated. Deprecated in Java
'getter for id: Long' is deprecated. Deprecated in Java
java.lang.AssertionError: Expected <abandoned>, actual <stalled>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadChunkActivityAndWindowKt.testUploadChunkActivityAndWindow(testUploadChunkActivityAndWindow.kt:29)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.fixround.testUploadChunkActivityAndWindow -> java.lang.AssertionError: Expected <abandoned>, actual <stalled>. (in 2.8 seconds)
--- Console output (tinysite.conventions.fixround.testUploadChunkActivityAndWindow) ---
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <abandoned>, actual <stalled>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.fixround.TestUploadChunkActivityAndWindowKt.testUploadChunkActivityAndWindow(testUploadChunkActivityAndWindow.kt:29)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.fixround.testUploadChunkActivityAndWindow) ---
TESTS FAILED (10/11 tests completed successfully, 1 failed)
[ConnectionClosed] Connection connection@105c41ea closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/38192; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none
Connection connection@105c41ea closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/38192; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none [unhandled ConnectionClosedEffect from ConnectionCloseReasons.kt:127]
Connecting to url://buildtest/ ...
Connected to url://buildtest/ (health=OK)
'getter for id: Long' is deprecated. Deprecated in Java
java.lang.AssertionError: Expected <60.0>, actual <59.99999999999999>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.test.TestUploadDelayedCommitContractProbeKt.testUploadDelayedCommitContractProbe(testUploadDelayedCommitContractProbe.kt:20)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
FAILED tinysite.conventions.test.testUploadDelayedCommitContractProbe -> java.lang.AssertionError: Expected <60.0>, actual <59.99999999999999>. (in 2.4 seconds)
--- Console output (tinysite.conventions.test.testUploadDelayedCommitContractProbe) ---
DELAYED_COMMIT beforeBytes=1000000 afterBytes=1000000 beforeMB=0.0 afterMB=1.0 beforeEta=null afterEta=59.99999999999999
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:449)
Caused by: java.lang.AssertionError: Expected <60.0>, actual <59.99999999999999>.
at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
at tinysite.conventions.test.TestUploadDelayedCommitContractProbeKt.testUploadDelayedCommitContractProbe(testUploadDelayedCommitContractProbe.kt:20)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at kompile.TestRunner.executeTest(TestRunner.kt:49)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
... 2 more
--- End console output (tinysite.conventions.test.testUploadDelayedCommitContractProbe) ---
TESTS FAILED (0/1 tests completed successfully, 1 failed)
[ConnectionClosed] Connection connection@5f6b7410 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/53932; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
Connection connection@5f6b7410 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/53932; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none [unhandled ConnectionClosedEffect from ConnectionCloseReasons.kt:127]
Existing-test edit inventory
Only tests/testUploadSpeedWindowAndFallback.kts: fallback.filesPerMinute 0.5→1.0; recentOne.filesPerMinute 260000/122000→1.0; afterBoundary.filesPerMinute 260000/121001→1.0. These explicitly implement the owner’s mature-job window choice; no timeout/iteration/skip changes. Added exact MB/min and ETA assertions at recentOne (2MB/min,270s), boundary(3MB/min,180s), afterBoundary(2MB/min,270s). New activity fixture time correction above is not an existing-baseline test change.
Literal contract counterexample (public API)
@file:WithArtifact("tinysite.conventions.buildMaven()")
@file:WithArtifact("org.jetbrains.kotlin:kotlin-stdlib:1.9.22")
@file:WithArtifact("org.jetbrains.kotlin:kotlin-test:1.9.22")
package tinysite.conventions.test
import build.kotlin.withartifact.WithArtifact
import kotlin.test.*
import tinysite.conventions.*
fun testUploadDelayedCommitContractProbe() {
val id = "u0000000000000-abcdef"; val b="b".repeat(64); val c="c".repeat(64)
val job=UploadJob(id,0,"browser",listOf(UploadJobFile("b",b,1_000_000,true),UploadJobFile("c",c,1_000_000,true)))
val listing=listOf(StoredFileSummary(uploadJobFileName(id),1,0))
val chunks=listOf(UploadChunkArrival(b,59_000,1_000_000))
val before=calculateUploadProgress(job,listing,null,120_000,mapOf(b to 1_000_000L),chunks)
val after=calculateUploadProgress(job,listing+StoredFileSummary(blobFileName(b),1_000_000,120_000),null,120_000,emptyMap(),chunks)
println("DELAYED_COMMIT beforeBytes=${before.bytesUploaded} afterBytes=${after.bytesUploaded} beforeMB=${before.megabytesPerMinute} afterMB=${after.megabytesPerMinute} beforeEta=${before.etaSeconds} afterEta=${after.etaSeconds}")
// These exact values are required by invariant 2, and contradict invariant 3.
assertEquals(1_000_000L,before.bytesUploaded); assertEquals(before.bytesUploaded,after.bytesUploaded)
assertEquals(0.0,before.megabytesPerMinute); assertEquals(1.0,after.megabytesPerMinute)
assertNull(before.etaSeconds); assertEquals(60.0,after.etaSeconds!!,1e-12)
}
OBSERVED tooling note: /usr/local/bin/coursier is the known wrong-architecture executable described by report-challenge/SKILL.md; shell returned ELF bytes and syntax errors. Used the repository’s JVM jars/coursier launcher successfully (handoff health OK). No new challenge was auto-filed: the skill identifies this as already known, and this lane explicitly prohibits enqueue/merge mutations that report-challenge-cli performs. No production impact.
Final checkpoint and brief item states
OBSERVED remote/local head match: ceb5ad988ce93f8c1962a4fa2b1db71adb324df9 on feature/upload-job-record, still OPEN in https://github.com/CodexCoder21Organization/TinySiteConventions/pull/5. Partial fix commit: https://github.com/CodexCoder21Organization/TinySiteConventions/commit/ceb5ad988ce93f8c1962a4fa2b1db71adb324df9 .
OBSERVED: Targeted fixed implementation run first-attempt results:10/11 passed,1 fixture arithmetic error (described above); subsequent corrected activity + existing speed + contract probe run:3/3 first-attempt passes from runner records. Scale case passed unchanged in11256ms at128MiB. Parser semantic and multibyte end tests passed, along with all remaining new coverage cases in the first targeted fixed-code run. No full-suite or release-readiness claim is made.
OBSERVED: No publication command ran. Direct checks:0.0.7 POM HTTP200;0.0.8 POM HTTP404. No CI watching, merge, enqueue or deploy ran.
| Brief item |
State/evidence |
| Read both reviews and verify claims |
Done; full files read, original source and baseline tests verified. |
| Activity from live chunks |
Done in partial implementation; initially stalled public test became green, including no-arrival inactivity and invalid arrivals. |
| Window bytes without double count |
Done in partial implementation; exact window/old-byte and per-blob arrival tests green. |
| Unconditional continuity alongside invariant2 |
Refuted by deterministic delayed-commit public API counterexample; owner decision required. F2 inside-window scenario passes. |
| Ended jobs freeze |
Done in partial implementation; all outcomes tested at three caller times, exact average/ETA assertions green. |
| Bounded work/F3 |
Done; same600,000 listing fails before and passes after at unchanged heap, extra calculation memory O(job), selector memory O(limit). |
| All seven R1 test gaps |
Done; exact-value assertions mapped by independent review above and runtime tests. |
| New commits same branch/PR |
Done, two commits pushed and remote SHA verified. |
| Final full-suite and named-check acceptance |
Stopped under explicit unworkable-contract instruction; not claimed. No CI watching was authorized. |
| Publish0.0.8 and served POM |
Stopped under explicit unworkable-contract instruction;0.0.8 is not published. |
| Final API, README and PR description |
Partial API and README updated; API cannot be declared final until contradiction is resolved. PR explains current API and that0.0.8 is intended to supersede0.0.7, rather than falsely claiming a publication. |
| Revert implementation once and show red again |
Not executed after required stop; initial failing-first baselines are preserved above. |
OBSERVED: No timeout, heap cap, iteration count or test skip was changed. The only existing-test edits are inventoried above. A new-only test’s stale-completion fixture moved to the exact60-minute boundary; the new counterexample’s ETA assertion permits floating-point rounding. Neither correction changes an established baseline assertion.
Corrected confirmation runner output:
Connecting to url://buildtest/ ...
Connected to url://buildtest/ (health=OK)
'getter for id: Long' is deprecated. Deprecated in Java
ALL TESTS PASSED (3/3 tests completed successfully)
[ConnectionClosed] Connection connection@7df10784 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/54042; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
Connection connection@7df10784 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/54042; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none [unhandled ConnectionClosedEffect from ConnectionCloseReasons.kt:127]
OBSERVED tooling friction: gh pr edit failed with GraphQL: Projects (classic) is being deprecated in favor of the new Projects experience ... (repository.pullRequest.projectCards). Used the GitHub REST PATCH pull-request endpoint with a structured JSON file instead. Challenge auto-report is not run because it enqueues/merges and this lane forbids those mutations; exact evidence is retained here and in the handoff.
OBSERVED terminal verification: git status --short is empty after final checkpoint; PR body updated through REST. No full-suite run was started, and0.0.8 is deliberately unpublished because the contract conflict was reproduced. Both review subagents are done. The only branch touched is feature/upload-job-record. Full diagnostics and review are embedded into the service handoff so no local-only evidence is required to resume.
Durable handoff
Created through create-handoff skill and marked BLOCKED with the exact contract reason: url://handoff/handoffs/hf-2026-10-20-resolve-delayed-commit-speed-rules-before-releasing-tinysiteconventions-0-0-8
WUI: https://www.handoff.wasmserver.com/handoffs/hf-2026-10-20-resolve-delayed-commit-speed-rules-before-releasing-tinysiteconventions-0-0-8
The service body contains the full findings and independent review, branch/commit links, counterexample, exact test results and remaining steps. It is the durable copy; no CI watch or production publication was started.
Stronger counterexample: neither fallback choice can satisfy all required assertions
The simple0→1 case demonstrates the current mature-window rule, but by itself an always-average choice for that particular sparse case would avoid the change. The following strengthens the proof using the review’s explicitly required gap1 result, so it does not depend on the chosen mature-window predicate.
Storage start1000, now121000, trailing window[61000,121000]. Needed blobs are old=7MB completed2000, recent=1MB completed62000, delayed=2MB whose chunks fully arrived60000 but whose commit has not yet occurred, and missing=9MB. The caller retains at least the trailing window; it has no chunk arrivals in that window and may discard the older60000 observation. Before commit, bytesUploaded=10MB via completed8MB plus in-flight2MB. Rule2 gives1MB of window bytes (1MB/min); the start-to-now average is10MB/2min=5MB/min. Commit delayed at121000, sending no new bytes. The post-commit input is the exact gap1 completion scenario, whose required assertion is3MB/min and ETA180s. Neither allowed pre-commit rate(1 or5) equals the required post-commit3. Thus switching the fallback predicate cannot satisfy continuity and the required exact-value scenario together. All counts/durations/bytes remain the mandated public inputs; no hidden byte history is assumed.
OBSERVED: Strengthened public contract probe passed1/1 on its first execution (2049ms) with assertions for the required rates1,3 and alternative-average5 MB/min. The final variant explicitly discards the pre-window arrival, as the caller contract permits; a separate exact-source verification of that empty-arrival-list variant is running. This is evidence gathering for the required stop, not further implementation or publication work.
OBSERVED final evidence checkpoint: exact empty-window-arrival variant passed1/1 on its first run; runner records: [{'file': '/code/workspace/lanes/L1-conventions/scripts/../tests/testUploadDelayedCommitContractProbe.kts', 'name': 'tinysite.conventions.test.testUploadDelayedCommitContractProbe', 'success': 'true', 'time': '2034'}]. Third commit pushed and local/remote heads match 6302175a63141e7e2546e411096c227b2a0ec70d. Link: https://github.com/CodexCoder21Organization/TinySiteConventions/commit/6302175a63141e7e2546e411096c227b2a0ec70d . This extends the earlier snapshot; no production implementation changed after the partial-fix commit.
Connecting to url://buildtest/ ...
Connected to url://buildtest/ (health=OK)
'getter for id: Long' is deprecated. Deprecated in Java
ALL TESTS PASSED (1/1 tests completed successfully)
[ConnectionClosed] Connection connection@6b556720 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/49162; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
Connection connection@6b556720 closed: initiator=LOCAL_CLOSE; direction=outbound; localAddress=/ip4/172.17.0.34/tcp/49162; remoteAddress=/ip4/198.199.106.165/tcp/35000; remotePeerId=12D3KooWLMyXNfwhcX1YsiNx3hnjk3GGSfsU1fydRa8bzrE6scMT; closedBy=unknown; cause=none [unhandled ConnectionClosedEffect from ConnectionCloseReasons.kt:127]
Final outcome: joint unconditional continuity and the mandated exact window-rate assertions are REFUTED by the counterexample. Release is stopped under the explicit brief instruction. The required owner decision is which rate contract takes precedence. No full suite, reversion confirmation, CI acceptance or0.0.8 publication is claimed.