Repository navigation
Let first hostnames replace a service-created unrouted hostname - #6061
Merged
Merged
Conversation
A first production compose created with a hostname but no runtime port keeps that hostname in its tracked domains with no provider route. The first hostname continuation accepted only empty tracked domains or exactly the requested names, so the reviewed request was refused before any effect. Accept the tracked hostnames only when a completed creation receipt on the setup route shows the service created this exact target and target-id record with them and no route, and neither record changed since. Record only the reviewed hostnames. A created hostname that was routed, bound, claimed by another lane or named by the lane's own profile URL still refuses.
The docs claimed the hostname never got a route and no record was rewritten; the check proves the creation receipt, current record equality and no current route or claim. The refusal tests assert status, code and no effects instead of the message text.
Native inspection reported duplicated recovery steps and shadowed names; the shared fixture helpers keep every assertion.
Contributor
Author
|
Review result: weighed Weighed independent review, OpenAI (Codex CLI default; the CLI did not report the model), two rounds, read-only against this branch.
Prompts and full results: task evidence |
Contributor
Author
|
Ready for the merge train Head: 9b9315a |
Contributor
Author
|
Launchplane completed the merge-train step for this pull request.
Launchplane finished the merge-train step for this pull request. Launchplane manages this comment and will update it as the train moves. |
shiny-code-app Bot
added a commit
that referenced
this pull request
Nov 12, 2026
…e811b516ebe76e7: merge PR #6061
This was referenced Nov 12, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A first production compose created with
domainsbut noruntime_portkeeps those hostnames in its tracked target record, with no provider route. The Director-agent first-hostname continuation (setup_empty_lane_domain) accepted tracked domains only when they were empty or exactly the requested names. So a reviewed request for different names was refused in its first record-only check, before any provider call or record write: HTTP 400invalid_dokploy_target_setup, "First hostname setup requires an unchanged service-created empty compose."What changed
The service already holds positive provenance for those hostnames: the completed receipt of its own create-compose apply on
/v1/dokploy-targets/setup. Both the durable new-placement path and the existing-environment path store it, and it carries the created target record, target-id record androute_domain_ids.list_completed_target_creation_receipts(store read) finds completed create-compose receipts for one lane's exact target id.mode=apply,applied, no routes created, an empty env, and target and target-id records equal to the current ones. Anything else keeps the original refusal: no receipt, a receipt for another target, operation, instance or context, a routed creation, or any later change to either record.Effects on success are unchanged: per requested hostname, at most one HTTPS
webroute with the default certificate, or adoption of an exact one, then one compare-and-write of the target'sdomains. The record'ssource_labelbecomes the reconcile label, so the created-hostname allowance cannot apply again. Same-key replay and success-only receipt semantics are unchanged.Verification
invalid_dokploy_target_setup, same message), including two end-to-end tests. Those tests drive the real first-production create-compose producer, both new placement (durable) and existing environment, with a created hostname and then the reviewed two-name continuation.tests.test_director_testing_domain_setup tests.test_director_testing_target_creation tests.test_dokploy_compose_domain_outcomes tests.test_dokploy_target_setup_http tests.test_dokploy_empty_automation tests.test_director_testing_source_completion tests.test_dokploy_compose_source_setup tests.test_first_testing_public_ingress tests.test_dokploy_domain_authority_planning tests.test_public_host_authority_fences tests.test_action_effects tests.test_http_app_driver_dokploy tests.test_operation_authorization tests.test_durable_operation_authorization tests.test_disposable_lane_authority tests.test_authz_candidate_preparation tests.test_config_authority_audit tests.test_service: 593 tests OK (7 skipped) at e394768. Later commits changed only tests, docs and a local rename; both touched test modules pass at the head.Independent review
OpenAI (Codex CLI default; the CLI did not report the model), two rounds.
Removed: no maintained source; the duplicated recovery steps in the first-hostname tests are now shared fixture helpers.
Net lines: source +126 (+127/−1), docs +9, tests +286 (+316/−30).
Refs #6059