Handoff: finish the kompile-cli 0.0.84 rollout by landing the consolidated UrlResolver change
Written: 2026-07-22 00:53 UTC. The effort began 2026-07-10.
RE-VERIFY BEFORE ACTING. Every PR state, branch head, CI result, and artifact
statement below is a write-time snapshot. Re-query each PR with
gh pr view <url> --json state,mergeStateStatus,statusCheckRollup,headRefName,headRefOid,mergedAt,
re-check artifacts with HTTP requests to https://kotlin.directory, and use
build-watchman for any new CI/merge-queue wait. A fresh query wins over this document.
Mission summary
The original request was to inspect five existing handoffs, close obsolete ones, and drive
valid work to completion. The surviving rollout workstream was then expanded in this order:
- Ensure the approved kompile-cli release change merges.
- Use
TransitiveTestDependencyPruner
to remove redundant transitive test dependencies from kompile-cli, open a PR, and merge it.
- Treat all
@Timeout annotation values as seconds.
- Explain why the UrlResolver rollout build was taking longer than its normal roughly
60-minute duration and was killed at 90 minutes.
- Upgrade the rollout to kompile-cli 0.0.84, make it green, and merge it.
The user explicitly approved merging
the consolidated UrlResolver rollout PR.
Publication to kotlin.directory also has standing approval. Those approvals do not extend to
unrelated code PRs.
What was found and done
1. The kompile-cli release and dependency-pruning work are complete
2. The UrlResolver rollout is consolidated into one approved PR
The UrlResolver rollout PR
now contains the launcher upgrade to kompile-cli 0.0.84, timeout-unit corrections, the
UrlProtocol dependency upgrades needed by its test/fix chain, gossip amplification fixes,
a semantic peer-ordering test repair, and an Observable dependency upgrade.
At write time its remote branch is bump-kompile-cli-0.0.79 at
4eb6c1e4e43a16b9f71ff49c3b8f1efefc7daaa3. It is OPEN and DIRTY because
main advanced after the last push. Its latest checks are terminal:
- GitHub
bld-build was cancelled at the fixed 90-minute workflow limit:
https://github.com/CodexCoder21Organization/UrlResolver/actions/runs/29820691501/job/88602379623
- The remote build continued to 184 minutes and failed:
https://buildtest.kotlin.build/run?id=2fd9f63b
The remote run executed all 1,128 tests and recorded 1,121 passes plus seven unique failures.
That is materially different from the earlier kompile-cli 0.0.83 behavior, which could spend the
job in dependency resolution without executing tests. Version 0.0.84 got through resolution and
test discovery; the remaining duration is the full UrlResolver suite plus retries and infrastructure
waits.
3. Six of the seven latest failures were NetLab capacity/provisioning failures
The following scenarios failed while acquiring or waiting for NetLab environments, including
15-minute queue waits and 40-45-minute scenario caps:
testNetlabResolutionUnderLatencyAndPacketLoss
testNetlabGossipUnderDegradedLinks
testNetlabDynamicFailureRecovery
testNetlabImpairedNatRelayScenarios
testNetlabPeersGoingOffline
testNetlabSevereImpairmentScenarios
Their common evidence is environment acquisition/ready-state timeout during a provisioning
storm, not a shared UrlResolver assertion or stack trace. Do not change test iteration counts or
timeouts to conceal this. Re-run through normal CI after the code defect below is fixed, and use
the NetLab workflow if the capacity failures recur.
4. The seventh failure is a deterministic host-stack defect at the documented boundary
testNestedListParameterAtDepthLimitMarshalsSuccessfully constructs the documented
1,000-level List boundary through the public sandbox API. It passed 10/10 on the default local
stack, but the exact compiled test and input failed 10/10 in isolated JVMs with -Xss256k,
always with java.lang.StackOverflowError. There were no timeouts.
Verified mechanism: TypeMarshaling.checkHostMarshalDepth recursively validates each
container, then hostValueToJvmValue and hostListToJvmList mutually recurse while converting
the same structure. The promised semantic depth therefore depends on native host stack headroom
and can overflow before the declared limit. The reproducer logs are:
/tmp/pr737-depth-isolated-before-1.log through
/tmp/pr737-depth-isolated-before-10.log
- compiled test group:
/tmp/qtcompile-group3014983003494404080
- harness sources/classes:
/tmp/RunDepthOnce.java and /tmp/RunDepthRepro.java
Before the pause, the branch was rebased on then-current UrlResolver main
f875a8e9d. Rebase conflicts were limited to newer main timeout values; the newer
60/322-second values were retained while the 0.0.84 launcher changes remained applied.
An explicit-work-stack implementation for host validation and conversion was started and
preserved, but it has not been compiled or tested yet. Treat it as a checkpoint, not a verified
fix:
- remote branch:
handoff/pr737-stack-safe-marshaling-wip-20260722
- checkpoint commit:
https://github.com/CodexCoder21Organization/UrlResolver/commit/e124d3e991d676964e2e22293ebb8aa5941e58b3
- changed file:
src/foundation/url/resolver/sandbox/TypeMarshaling.kt
The checkpoint makes depth validation iterative and introduces explicit operations for List,
Collection, Map, JSONObject, JSONArray, and typed-projection construction. The next engineer must
compile-review it before relying on it; syntax, result propagation, and behavior compatibility are
still unverified.
5. Two other root causes were fixed and verified on the consolidated branch
Semantic peer-ordering regression. The test used a live peer identifier and raced Identify /
public-address propagation against the intended semantic state. The repair uses a non-live peer ID
and polls receiver state. It passed 10/10 locally before push.
Observable resubscribe freshness. Rotating subscribers caused a redundant recomputation that
replayed a stale derived value. The defect was reproduced in the Observable owner repository and
in UrlResolver. The owner-layer implementation was fixed, the Observable suite passed 352/352
twice, and community.kotlin.observable:core-jvm:0.3.16 was published and returned HTTP 200
at handoff write time. UrlResolver's 973 direct test pins were moved to 0.3.16 and the amplified
projection-resubscribe scenario passed after the upgrade.
The Observable source PR is
still OPEN. Its GitHub-hosted checks are green; its remote check failed. It is not covered by the
UrlResolver merge approval, so do not merge it without separate approval.
Relevant PRs and refs
All states below were queried live at 2026-07-22 00:53 UTC.
| Reference | Write-time state |
| --- | --- |
| https://github.com/CodexCoder21Organization/UrlResolver/pull/737 | OPEN, DIRTY, approved to merge; remote head 4eb6c1e4e43a16b9f71ff49c3b8f1efefc7daaa3; latest checks cancelled/failed |
| https://github.com/CodexCoder21Organization/UrlResolver/commit/e124d3e991d676964e2e22293ebb8aa5941e58b3 | Pushed WIP checkpoint on handoff/pr737-stack-safe-marshaling-wip-20260722; uncompiled and untested |
| https://github.com/CodexCoder21Organization/UrlResolver/pull/804 | OPEN, BEHIND; semantic gossip work is incorporated into the consolidated rollout and this PR should be closed only after the consolidated PR merges |
| https://github.com/CodexCoder21Organization/UrlResolver/pull/813 | OPEN, BEHIND; separate bytecode-attachment work, not part of this handoff |
| https://github.com/CodexCoder21Organization/Observable/pull/93 | OPEN, BLOCKED; GitHub checks green, remote check failed; separate merge approval required |
| https://github.com/CodexCoder21Organization/UrlProtocol/pull/389 | OPEN, DIRTY; separate authoritative-withdrawal work, not approved here |
| https://github.com/CodexCoder21Organization/kompile-cli/pull/127 | MERGED 2026-07-18; green |
| https://github.com/CodexCoder21Organization/kompile-cli/pull/128 | MERGED 2026-07-18; green |
| https://github.com/CodexCoder21Organization/UrlProtocol/pull/351 | MERGED 2026-07-19; green |
Two completed investigation records remain useful:
- https://github.com/CodexCoder21Organization/PlanRepository/blob/main/challenges/2026-07-20-1743-buildtest-api-repeatedly-returns-http-503-during-an.md
- https://github.com/CodexCoder21Organization/PlanRepository/blob/main/challenges/2026-07-21-1035-during-build-watchman-monitoring-of-urlresolver-pr-https.md
The two previously assigned subagents are complete and inactive. No subagent is currently running.
Next steps
- Re-verify current state first. Query every PR in the table and fetch UrlResolver
main.
- Clone UrlResolver fresh under
workspace/, read its AGENTS.md and README.md, and
check out handoff/pr737-stack-safe-marshaling-wip-20260722. Compare it to both current
main and remote bump-kompile-cli-0.0.79.
- Review and compile the checkpoint. Pay particular attention to:
- exact Map key/null semantics;
- propagation of failed SJVM allocations/invocations;
- operation/result-stack balance for empty and nested containers;
- typed-projection primitive vs object constructor arguments;
- JSON and Collection cycle/depth handling;
- preservation of full error messages.
- Run the existing public-API boundary test against the unfixed parent if the baseline needs
reconfirmation. Do not replace it with a private helper test.
- After the implementation compiles, rerun the identical isolated
-Xss256k reproducer at
least 10 times. It must flip from the established 10/10 StackOverflow baseline to 10/10 pass.
Also run the default-stack boundary test and the adjacent depth/cycle/List/Map/JSON/projection
scenarios, including:
testNestedListParameterAtDepthLimitMarshalsSuccessfully.kts
testDeeplyNestedListParameterIsRejectedNotStackOverflow.kts
testTypeMarshalingToJvmValueList.kts
testTypeMarshalingToJvmValueMap.kts
testHostOriginatedInterfaceNestedInContainersIsProjected.kts
- the existing cyclic-container and JSON nesting tests found by test discovery
- Run the complete available UrlResolver suite unchanged after
git fetch origin && git rebase origin/main. If NetLab provisioning failures recur,
classify them with NetLab evidence rather than changing test timeouts or iterations.
- Perform the required test-comprehensiveness and adversarial reviews. Check the README for any
public depth-contract wording that now needs clarification.
- Before updating the existing PR, verify it is still OPEN. Immediately fetch/rebase current
main, rerun all required tests after that rebase, and push the verified head to
bump-kompile-cli-0.0.79 with --force-with-lease. Do not push the raw WIP checkpoint.
- Update the PR body with the 10/10 constrained-stack before/after evidence and the final
suite results.
- Use the watch-build workflow, not a custom polling loop:
coursier launch buildwatchman:build-watchman:0.0.12 -r https://kotlin.directory -- --repo CodexCoder21Organization/UrlResolver --pr 737 --to-merged.
The user already approved merging the consolidated PR. Let normal CI and the merge queue run;
do not bypass either.
- Once the consolidated PR is genuinely MERGED, comment on and close
https://github.com/CodexCoder21Organization/UrlResolver/pull/804 as superseded.
- Re-verify the original rollout targets, then delete this handoff and
handoffs/2026-07-09-stale-kompile-bldbinary-buildmaven-local-cache-reuse-rootcause.md
through the pre-approved handoff-deletion workflow.
Reusable / operational knowledge
@Timeout values in this repository are seconds. Preserve newer main values when rebasing;
do not convert them back to millisecond-looking magnitudes.
- A 90-minute GitHub cancellation is not enough to identify where time went. The decisive evidence
is whether tests started, the test-event totals, individual scenario durations, and whether
infrastructure acquisition consumed the tail.
- The final remote run data was saved locally as
/tmp/pr737-buildtest-events-final.jsonl; it contains the exact seven unique failures.
- The prior build-watchman process has exited. Start a fresh watcher only after a verified push.
- GitHub PR status queries must be spaced at least 60 seconds apart. build-watchman already handles
the monitoring cadence and queue/lost-dispatch cases.
- Keep the Observable owner-layer PR separate from the approved UrlResolver merge. The 0.3.16
artifact exists, but source-main alignment remains incomplete until that PR is separately reviewed
and approved.
- The handoff-documentation PR is pre-approved and should be enqueued through PlanRepository's
GraphQL merge queue. Never use
--delete-branch.