Merge nucleic/lucid-river-toad-6efj into dev

This commit is contained in:
2026-07-29 02:52:41 -07:00
parent c755e9dee3
commit 57fd65bfe1
9 changed files with 686 additions and 151 deletions
+32 -8
View File
@@ -28,7 +28,12 @@ internal static class FacadeAssumptions
"hello capabilities — hostd degrades across preview→GA churn on this"),
new("WslcService", "GetMissingComponents", Kind.Method,
"components.missing RPC; returns IReadOnlyList<Component>, NOT a flags enum"),
new("WslcService", "InstallWithDependencies", Kind.Method, "components.install RPC"),
new("WslcService", "InstallWithDependenciesAsync", Kind.Method,
"components.install RPC — the ASYNC form, because only it carries InstallProgress"),
new("InstallProgress", "Component", Kind.Property,
"which component is installing → components.installProgress status"),
new("InstallProgress", "Total", Kind.Property,
"denominator for the install percentage (Progress/Total)"),
new("Component", "WslPackage", Kind.EnumValue,
"one of the three components onboarding can report missing"),
new("ServiceVersion", "Major", Kind.Property, "the version triple reported in hello"),
@@ -40,9 +45,13 @@ internal static class FacadeAssumptions
"session.ensure memoryMB — NOT MemoryMB; a resize needs a sandbox restart (§3.2)"),
new("SessionSettings", "Timeout", Kind.Property, "idle timeout for the whole session VM"),
new("Session", ".ctor", Kind.Constructor,
"there is NO CreateOrOpen — construction is the only entry point, and whether a second "
+ "construction with an existing name attaches or throws Error.SessionReserved is the "
+ "open question broker reattach (§2.3) hangs on"),
"there is NO CreateOrOpen — construction is the only entry point, and it is LAZY: a "
+ "second construction with an existing name succeeds and means nothing. Start() is "
+ "where the service is consulted, and it refuses with ERROR_ALREADY_EXISTS, which is "
+ "why broker reattach (§2.3) cannot be served from this surface"),
new("Session", "ProcessCrashed", Kind.Event,
"ProcessCrashInformation — the only crash detail wslc offers, and what makes a "
+ "SIGKILLed agent explicable in the host log (the Swift diagnoseKill seam)"),
new("Session", "Start", Kind.Method, "brings the session VM up after construction"),
new("Session", "Terminate", Kind.Method, "session.terminate RPC"),
new("Session", "Terminated", Kind.Event,
@@ -51,18 +60,24 @@ internal static class FacadeAssumptions
"distinguishes a crash from an orderly shutdown in the session.down reason"),
// ---- Images ----
new("Session", "PullImage", Kind.Method, "image.pull RPC (naros-agent from GHCR), sync form"),
new("Session", "PullImageAsync", Kind.Method,
"the async form, which is where pull PROGRESS comes from (ImageProgress)"),
"image.pull RPC (naros-agent from GHCR). The async form specifically: the sync "
+ "PullImage reports no progress at all"),
new("PullImageOptions", ".ctor", Kind.Constructor, "PullImageOptions(uri)"),
new("PullImageOptions", "RegistryAuth", Kind.Property,
"GHCR auth — a STRING, not a credentials object"),
new("Session", "Authenticate", Kind.Method,
"where that string COMES FROM: Authenticate(registryUri, user, password) mints the "
+ "identity token PullImageOptions.RegistryAuth wants. Without this the auth field "
+ "has no documented producer and a private GHCR pull cannot work"),
new("ImageProgress", "CurrentBytes", Kind.Property,
"→ image.pullProgress → the existing controlDownloadProgress UI surface"),
new("ImageProgressStatus", "Downloading", Kind.EnumValue, "pull progress phase"),
new("Session", "GetImages", Kind.Method, "image.list / image.inspect"),
new("ImageInfo", "Name", Kind.Property, "image ref — NOT .Reference"),
new("ImageInfo", "Sha256", Kind.Property, "image digest — NOT .Digest"),
new("ImageInfo", "Sha256", Kind.Property,
"image digest — NOT .Digest, and an IBuffer of raw bytes rather than a string, so the "
+ "facade hex-encodes it into the sha256:<hex> the rest of Nucleic speaks"),
new("Session", "DeleteImage", Kind.Method, "image.delete"),
// ---- Containers ----
@@ -85,9 +100,17 @@ internal static class FacadeAssumptions
new("Container", "Inspect", Kind.Method,
"the ONLY per-container introspection there is — there is no GetStatistics(), so "
+ "container.stats has to exec cgroup reads instead (§13.1 finding 2)"),
// NOTE the absence: there is no Container.Name and no Session.GetContainers(), so a
// container is only ever reachable through the handle CreateContainer returned. That is
// why the facade keeps its own name→handle roster, and why container.list cannot see
// anything created before a broker restart (§13.1 finding 1).
new("Container", "Id", Kind.Property,
"the only identity the SDK gives back — there is NO Name property to match on"),
new("Container", "CreateProcess", Kind.Method,
"proc.exec — NOT RunProcess, and it does not start the process"),
new("ContainerState", "Running", Kind.EnumValue, "the one state the facade tests by name"),
new("ContainerState", "Deleted", Kind.EnumValue,
"folds to \"absent\" — a deleted handle is gone as far as the Swift policy layer cares"),
new("DeleteContainerOption", "Force", Kind.EnumValue, "container.delete force"),
new("Error", "ContainerNotFound", Kind.EnumValue,
"structured failure codes — a better source for the RPC's data.kind than string matching"),
@@ -107,7 +130,8 @@ internal static class FacadeAssumptions
"→ proc.stderr — a SEPARATE event, not a stderr flag on one handler"),
new("Process", "Exited", Kind.Event, "→ proc.exit; must never overtake output (OutboundWriter)"),
new("Process", "GetInputStream", Kind.Method,
"proc.stdin — a WinRT stream, not a WriteStdin call; closing it is proc.closeStdin"),
"proc.stdin — a WinRT IOutputStream written through a DataWriter, not a WriteStdin "
+ "call; disposing the STREAM is what the guest sees as EOF, i.e. proc.closeStdin"),
new("Process", "Signal", Kind.Method, "proc.signal — the agent's real POSIX Stop path"),
new("Signal", "SIGKILL", Kind.EnumValue,
"signals are a NAMED enum; the RPC carries POSIX ints, so the broker maps them, and "