Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
13f6626
ADFA-4128: qb 08/12 core-orchestration — Core slice 4: the session st…
fryanpan Aug 21, 2026
f875737
ADFA-4128: qb 08 review fixes — cancel sequencing, provision tail, de…
fryanpan Aug 22, 2026
b330384
ADFA-4128 (8/11): address CodeRabbit review
fryanpan Aug 27, 2026
361c4d4
ADFA-4128: qb-08 review fixes - foreground policy, slot-busy park, na…
fryanpan Sep 1, 2026
b67c389
ADFA-4128: 0902 review round on quickbuild:core orchestration
fryanpan Sep 3, 2026
77b0309
ADFA-4128: five session-lifecycle fixes from the 0903 review round
fryanpan Sep 3, 2026
2606d59
ADFA-4128: name the guard on the Provisioning to Ready edge in the st…
fryanpan Sep 3, 2026
12def4c
ADFA-4128: a daemon that will not start reports a named message, not …
fryanpan Sep 3, 2026
f199b38
ADFA-4128: take the layout's tree walks off the session dispatcher
fryanpan Sep 4, 2026
3df0848
ADFA-4128: forget the death reporter when a respawn fails or a rebuil…
fryanpan Sep 4, 2026
4dd89ba
ADFA-4128: seed the executor's live generation from the baseline stamp
fryanpan Sep 4, 2026
b0c57fe
ADFA-4128: take the asset packaging and the artifact check off the se…
fryanpan Sep 4, 2026
50264fa
ADFA-4128: adopt the suspend scratch/store contracts and surface comp…
fryanpan Sep 4, 2026
1c3e38d
ADFA-4128: remove the scratch tree when provisioning fails after prep…
fryanpan Sep 5, 2026
1a6f3ba
ADFA-4128: cite the follow-up tickets from the session manager and th…
fryanpan Sep 5, 2026
30ae189
ADFA-4128: move the watch set with the baseline on a proxy app rebuild
fryanpan Sep 7, 2026
495fe1c
ADFA-4128: park a stopped rebaseline for retry instead of tearing the…
fryanpan Sep 7, 2026
1b7c508
ADFA-4128: round 5 session-manager fixes: death-reporter ownership, s…
fryanpan Sep 8, 2026
20e279b
ADFA-4128: re-key the connection registry on the reinstalled proxy ap…
fryanpan Sep 8, 2026
4f56a0b
ADFA-4128: round 5 doc fixes on the session state diagram
fryanpan Sep 8, 2026
6040c8d
style: spotless reformat, no functional change
fryanpan Sep 8, 2026
6e2379c
ADFA-4128: camel-case the rebuilt-uid test constant for ktlint
fryanpan Sep 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,17 @@ data class ProxyAppInfo(
val supportsComponentInfo: Boolean
get() = schema >= COMPONENT_SCHEMA_VERSION

/**
* Proxy class of the activity that carries MAIN/LAUNCHER, or null when none does; a null
* makes the launcher fall back to the package's default launch intent, which also resolves
* an `<activity-alias>` launcher.
*
* The restart deploy, the rebuild relaunch and the foreground switch all launch this, so
* the three cannot drift apart.
*/
val launcherProxyClass: String?
get() = components.firstOrNull { it.kind == ComponentKind.ACTIVITY && it.launcher }?.proxyClass

companion object {
private val log = LoggerFactory.getLogger("QB-ProxyAppInfo")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,7 @@ class QuickBuildScratch(
* the space guard. Never throws - a failure comes back as [Preparation.Failed]
* with the message provisioning surfaces to the user.
*
* A provision that fails after this returned [Preparation.Ready] leaves the tree behind:
* [remove] is keyed off the live layout, which a failed provision never sets, so the tree
* waits for the next session manager start's [sweep]. Tracked as a followup under
* ADFA-5423 rather than fixed here, since the failure paths that leave it live in the
* provisioner.
* A provision that fails after [Preparation.Ready] [remove]s the tree itself.
*
* @param projectRoot the project's root directory.
* @return [Preparation.Ready] with the tree, or [Preparation.Failed] on a space shortfall or
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,15 @@ sealed interface BuildOutcome {
* total beside the timing line; falls back to the build's own start with no trigger stamp.
* @property restarted true when the deploy took the process-restart path (a service,
* provider or Application class changed) instead of a hot swap.
* @property diagnostics the warnings the compile still produced, in the compiler's order;
* empty when it reported none or the route compiled nothing. Never an ERROR - that is a
* [CompileError].
*/
data class Success(
val generation: Long,
val durationMillis: Long,
val restarted: Boolean = false,
val diagnostics: List<BuildDiagnostic> = emptyList(),
) : BuildOutcome

/**
Expand Down Expand Up @@ -147,6 +151,15 @@ sealed interface BuildOutcome {
val message: String,
val daemonDied: Boolean = false,
) : BuildOutcome

companion object {
/**
* Fallback copy for a messageless throwable escaping the pipeline. The class name is
* in the ERROR log line the catch already writes, where it helps; on the status
* surface it reads as gibberish.
*/
const val UNEXPECTED_FAILURE = "Quick Build stopped unexpectedly"
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ class LiveReloadOrchestrator(
* Two limits: the daemon has no cancel op, so the compile runs to completion unheard and may
* delay the next build; and a stop in the deploy's own scheduler turn can report a cancel for a
* payload the proxy app already took, leaving the status line one generation behind.
* Tracked as ADFA-5456.
*
* @return true when a build was abandoned; false when there was nothing to cancel or it was a
* warm compile the user never asked for, on which the caller must report no cancellation.
Expand Down Expand Up @@ -713,7 +714,7 @@ class LiveReloadOrchestrator(
throw e
} catch (e: Throwable) {
log.error("Quick build #{} threw instead of reporting an outcome", buildId, e)
BuildOutcome.InfrastructureFailure(e.message ?: e.javaClass.name)
BuildOutcome.InfrastructureFailure(e.message ?: BuildOutcome.UNEXPECTED_FAILURE)
}
onBuildFinished(buildId, outcome)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,15 @@ sealed interface QuickBuildMessage {
/** The proxy app rebuild failed with no more specific cause to report. */
data object RebuildFailed : QuickBuildMessage

/**
* Provisioning died on an unexpected error that carried no message of its own.
*
* The fallback for a throw whose `message` is null (a bare NPE or `check`): the exception
* class name is diagnostic, belongs in the error log, and would read as gibberish on a
* banner - so the user gets this named case and the log keeps the class and stack.
*/
data object ProvisioningFailedUnexpectedly : QuickBuildMessage

/**
* App storage is too tight to hold the build's intermediates. Checked up front so this
* fails in seconds rather than minutes into a build.
Expand All @@ -99,6 +108,16 @@ sealed interface QuickBuildMessage {
/** The compile daemon refused the configuration it was started with. */
data object DaemonRejectedConfiguration : QuickBuildMessage

/**
* The compile daemon could not be started, so provisioning failed before any build ran.
*
* @property detail the daemon client's own reason (a spawn error, a protocol version
* mismatch, a missing reply), diagnostic rather than translatable
*/
data class DaemonStartFailed(
val detail: String,
) : QuickBuildMessage

/**
* The compile daemon died and could not be restarted, so the session stays degraded until
* the next tap or a session restart retries.
Expand Down
Loading
Loading