Skip to main content
Version: 0.1.0-alpha.4 (alpha)

C# capsule qualification

This is developer execution evidence for #549, separate from the beginner C# authoring guide. It does not authorize a release or replace human newcomer review #345. The complete finite qualification and its clean-source repeat passed at the sources recorded below. PR #557 was squash/admin merged into development after all eight exact-head workflows and 24 PR check rows passed. Ticket #549 is closed with all thirteen criteria satisfied. Later shared-runtime regression failures remain separate retained evidence and do not authorize merging an unqualified follow-up.

Delivered source and evidence​

The final reviewed head 67763cdc122f270733d75639a6aa4eb9e4aaaa13 and actual development squash 8f08f7a95dbd68aebc525120645a27dc5ab85e14 have identical tree 9a63049d798845f70eeb1344b7a39ad0e131bb36. The complete .NET qualification 35981797862 and broad CI 35981798865 passed together with all language and security cross-checks before the PR #557 merge. Source/execution evidence and the final gate audit were posted before closing #549.

Execution artifact 10800703843 matches 2,367 Git inputs, including exactly 45 SDK sources and no generated SDK files; before/after source and all five host-binary identities match. All fifteen builds, both NativeAOT probes, seven owner tests, ten actual SDK cases (96.06 seconds), five secret assertions, 27 node outcomes, 24 resource samples and six printed Bash steps (29.01 seconds) passed. Seventeen node deployments and the guide deployment were each deleted once. Node, compiler, cleanup and HTTP-peer owners were cleanly reclaimed and joined. Qualification SHA-256 is 517332dd681f340e535018c7257625f24ab8de6a7028706c3bece267b9dc276f.

The separate source archive 10799987822 matches 4,129 selected Git files and modes (40,127,766 bytes), SHA-256 5a1057186817fa6b10a3c2bb062c74abae38e34d1f5ede528093d07a16fa424d. Broad CI's discovery/execution artifact 10801848873 lists 175 registered targets and 2,812 active cases; those are discovery counts, not a claim that discovery itself executes tests. Its actual execution log separately confirms all twenty added readiness/timer/ownership regressions, 17 local-service cases and seven closed-diagnostic integration cases.

The later development Go run and final Go candidate exposed two additional currentness-contention boundaries despite the earlier green shared head. Their retained failure analysis keeps the compiler-worker and active clock failures distinct. Neither is a reclassification of the older .NET shipping trap, whose private cause was not captured. Human newcomer review #345 and runtime release HOLD remain separate.

Supported experiment​

The compiler host is Linux x86-64 with .NET SDK 10.0.100, Componentize.NET SDK and WitBindgen 0.8.0-preview00011, NativeAOT LLVM 10.0.0-rc.1.26306.1, WASI SDK 29.0, wit-bindgen 0.62.0 and wasm-tools 1.254.0. The maintained project enables trimming, invariant globalization, single-threaded execution and no application dependencies or MSBuild overrides. The six NuGet packages are locked by exact version and verified content hash. Signed NuGet content is verified with the pinned SDK's package reader, not a raw signed-ZIP digest.

The independent source capture includes handwritten C#, authoritative WIT, vendored SDK, generator and runtime inputs. Compiler, runtime, reference-pack, NuGet and WASI input inventories are compared before and after each build. Generated bindings are regenerated independently and compared with the actual NativeAOT compiler's bindings. Build observations deliberately remain operator-asserted, non-hermetic, dependency-incomplete and not reproducibility claims. Production package validation compares the compiled contract with WIT.

The closed runtime retains only the explicitly declared monotonic-clock import needed by GC. It grants no ambient files, sockets, wall time or entropy. Each activation owns its managed heap and task objects; dormant deployments have no CLR process, OS thread, listener, event loop, execution cell or guest heap. The supported guest ceiling is 128 MiB, one billion fuel and 120 seconds for a cold invocation. Deliberately multi-operation SDK tests use ten billion fuel. These are finite experiment bounds, not throughput or production sizing claims.

Qualification history and current gate​

The readiness correction delivered with PR #557 uses an explicitly supplied activation-owned timer for sealed, read-only currentness observations. Only the exact closed admission-authority-busy result can wait, within one shared five-second window and the unchanged original activation deadline and cancellation. Original grants are rechecked before the single pool acquisition; no compilation, fetch, mutation or invocation is replayed. Legacy callers remain executor-neutral and immediately fail closed. That delivered correction left compiler-worker, materialization and execution-start checks unchanged. The later worker/clock correction is recorded separately in the Go qualification report and package-admission contract; its new source requires separate exact-head qualification.

An actual signed-catalog fence reproduces a deterministic failing warm-readiness case without the opt-in wait and passes with it. Twelve new Linux regressions and five existing admission tests passed; all eight executor and 76 node unit tests also passed, including eight new forwarding, cancellation, deadline, transport and timer-ownership cases. These are local regression results, not final-head SDK qualification, and do not recover the uncaptured causes of older failures.

Integrated diagnostic head 41a07273209d06a8ac96fd33291f30527cbdc30e passed the complete .NET run 35975059698. Artifact 10798651998 matches all 2,356 captured Git inputs, including exactly 45 SDK sources and no generated SDK files. Before/after source and host-binary identities match. Both NativeAOT probes, seven ownership cases, ten actual SDK cases (96.00 seconds), five project builds, 27 node invocations, 24 resource samples and all six printed guide blocks (28.58 seconds) passed. The node and HTTP peer shut down cleanly; the formerly failing shipping-warm case passed. Qualification SHA-256 is 1b2ec8b49550c47ed205f3b2677cd47c0477e98f522fcae6034855dcf50395e0. The runtime identity covers 2,195 files and 13,789,339 bytes, digest 206658948c2af4b70ada916e2ef9ae08dca48bc4ed8804b84a74a9b05393b8cc. Source artifact 10798195278 separately matches 4,118 selected Git files and modes (40,063,650 bytes), archive SHA-256 b884c8861d14ddd2e96250b5047d6211bbdc3694b8204602d3a26183fdf7de09. CI merge 93697116495399656c5208a77f61f912028c903d and the reviewed head share tree 881d28ef6866fd7f26b55b33c562782884c8d65d.

That head is not qualified for merge: its Go cross-check 35975059660 failed after nine passing SDK cases. Artifact 10797374406 matches 2,341 Git inputs and the same runtime identity. The first answer and declared-error child cases passed; the next answer failed during queued preparation, before materialization. The closed diagnostic identifies ChildFailure / Unavailable / AdmissionAuthorityBusy, with zero child fuel and guest memory. The parent subsequently entered its panic path on the unexpected child result. Neither the exact readiness checkpoint nor competing fence owner is captured; Queued alone does not exclude synchronous compiler-worker checks. No node or guide qualification was reached. This is distinct from the older generic parent trap below, whose private cause remains unknown. No invocation was retried to clear this gate.

The same head's TypeScript cross-check 35975059688 passed completely. Artifact 10798549332 matches 2,349 Git inputs and unchanged before/after source and tool identities: ten SDK cases (894.98 seconds), 27 node invocations, 24 resource samples and six guide blocks (81.35 seconds), with clean/reaped owners. The 17 deletions each succeeded once; first-to-final OS sampling spanned 936.55 seconds within the existing 1,200-second owner. Qualification SHA-256 is c0a47122bd01852460ebcd15769bd84f3e914395c1b54dea90382a992a45bff6. This cross-check does not substitute for the final TypeScript PR's exact-head CI or clear the separate Go failure.

The broad run 35975060016 also passed every selected job. Discovery artifact 10799870975 records 175 registered targets and 2,792 active cases; discovery is not an execution count. Its SHA-256 is 6e36d6dbaa472d48ddd45d570cb646a43593944083551d428c4f3a6f4c04b22d. The execution log separately confirms all 17 local-service and seven diagnostic integration cases, plus the ten new closed-currentness cases. Java, C, Rust and security cross-checks passed too. Seven successful workflows do not clear the failed Go workflow or authorize merging this head.

The diagnostic commits repair a gap: host-import traps now preserve only a validated reason from the existing admission.currentness vocabulary. The original constructor must have exactly one recognized detail and field, with the matching platform code and retryability. The node independently checks the runtime-trap/code/reason combination before forwarding that existing detail. Unknown shapes, raw messages, arbitrary metadata and backtraces are not copied. The outer GuestTrap, non-retryability, consumption, stop/memory precedence and public CLI vocabulary remain unchanged. This adds no logging, locks, retries, authority or budget allowance. Twenty-eight focused host/node/CLI Rust cases and 24 CI inventory/lane/coverage Python cases passed; exact-head Linux qualification is still required. This observation repair does not establish or fix the private causes of the retained failures below.

The preceding diagnostic head 65e7390d074f58e914ae7155375eed343c2838cd did not repeat the complete pass: .NET run 35968038565 failed in the enforced-node workflow. Artifact 10795870530 retains all ten passing SDK cases (94.44 seconds), then twelve node invocation receipts, ten resource samples and dormant populations 5/9/17. The final authoring-shipping-warm invocation returned known/dispatched guest-trap in 25.06 milliseconds, reporting 50,780,412 fuel and 53,018,624 peak guest-memory bytes. The public receipt does not retain its private trap reason. The peer was alive before failure cleanup and was closed/reaped; complete node cleanup and the printed guide are not qualified. No invocation was retried.

All 2,350 captured pre-execution Git inputs match that head, with no generated SDK files. Final after-execution identities were not captured. Failed marker SHA-256 is 1221f97efe9f84df778f06ad814d3c58c68dd5c8f826dffc197e055ce8862ff5; the node failure receipt is a462ba6da9737639c236755e88fe4ba64d5e3349e4b82962097b7571670bb6a9. Source artifact 10795176008 separately matches all 4,112 selected Git blobs and modes (40,022,327 bytes), archive SHA-256 be6fcd52b956c4f71e6d15fc118df8165c862a87b41016a67b9f1a64ac5c8363. CI merge e88dd260c9c52b711773f653da3295b0c827fba1 and the reviewed head share tree 6b383152e5d3b93fc0af177c38a11997e9fa1e2b.

The same head's Go cross-check 35968038588 also failed. Artifact 10795094294 retains nine passing SDK cases and one failed service case (135.65 seconds). Unlike the preceding a880 failure, the first permitted nested answer succeeded in 13.8306 seconds. The next declared-error case trapped in the parent with guest-runtime-error after 4.8635 milliseconds while one child remained outstanding. The closed child diagnostic has no records and is not incomplete; it does not identify a parent-side host/runtime failure. Aggregate consumption includes the outstanding half-budget child reservation: eight child calls, about five billion fuel and 35,061,760 memory bytes do not establish eight dispatches. Only one new child start was observed. The private parent cause remains unknown, and node/guide execution was not reached. These failed gates prevent delivery despite the earlier complete qualifications below.

The same head's TypeScript cross-check 35968038564 passed completely. Artifact 10796213887 matches all 2,343 captured Git inputs, with unchanged before/after source and tool identities: ten SDK cases, 27 node invocations, 24 resource samples and all six printed guide blocks passed, with clean node/peer shutdown. All 17 deletions succeeded once; the measured first-to-final OS sample span was 931.85 seconds within the bounded 1,200-second owner. Qualification SHA-256 is ec617f6e622b7ab3f8fcbebeeb83ec1035b88038425c7522efd6228d86d18d1b. Broad CI 35968038765 also passed. Discovery artifact 10796891041 retains 2,775 active cases; the actual Linux log confirms all 17 local-service and seven new closed-diagnostic regressions passed. Neither passing workflow clears the Go or .NET failures.

A bounded local Linux Go experiment retained one passing unchanged-source attempt and four passing diagnostic processes, with no closed error events. It did not reproduce the CI failure or establish its private cause. The observation-only experimental source is identified separately from this Git head; these local attempts do not qualify the PR or justify a production policy or budget change.

A separate, single local Linux .NET workflow using the same observation-only source completed all 27 node invocations, 24 samples and 123 control attempts in 96.3 seconds. It retained unchanged source, component and binary identities and clean/reaped node and peer owners. The diagnostic captured no host-import error; six uncorrelated runtime markers accompanied the workflow's deliberate fault and cancellation cases. This experiment does not identify the original shipping-warm trap, qualify the later Git head or replace its complete CI execution above.

The integrated head a880cfd731f82194c36265886a65a1374d0313fb passed the complete .NET run 35963178615. Artifact 10793826456 independently matches 2,346 captured Git inputs and zero generated SDK inputs. Five standalone builds, all ten SDK cases (97.38 seconds), 27 signed-node invocations, 24 resource observations and dormant populations 5/9/17 passed. The HTTP peer saw eight authorized requests, zero unexpected requests and all three held operations physically closed. Node/peer shutdown was clean. All six printed guide blocks passed in 27.85 seconds. A single 15 ms audit-idle observation had all required counters zero; the one deletion received durable acknowledgment 10, and the retained catalog contains zero deployments, object generations and publication pins.

Before/after source and execution-tool inventories match. Runtime identity is sha256:ce7ae39f77472a059e8a76139a070bafcfa20aa4edd452e04dc447300e64c005 (2,185 files, 13,727,494 bytes); qualification marker identity is sha256:f02064a0a69c3f27a007f1c094bcd530f276c65cd46009686b39aaed47d77f3e. Source artifact 10793237246 matches all 4,108 selected Git blobs and executable modes (39,985,713 bytes), archive SHA-256 ff92d1ceb52391c89a81735cf3900c802edbbaa93c1ab6392718819925b0f13a. CI merge 6f8a00cea1b00540c67f7aed53585308818518a6 and the reviewed head share tree a5c2f893805d286d9726d2a27d64172872ed9c7d; the merge parents are the development documentation squash 417ed363 and the reviewed a880cfd7.

The same head passed the complete TypeScript cross-check 35963178639. Artifact 10794941119 matches all 2,339 captured Git inputs, with unchanged before/after source and execution-tool inventories. All ten SDK cases passed in 883.43 seconds, followed by 27 node invocations, 24 resource observations, the 5/9/17 dormant populations and all six printed guide blocks (80.12 seconds). The HTTP peer recorded eight authorized requests, zero unexpected requests and all three held operations physically closed; node shutdown was clean. All 17 deployment deletions succeeded once in 150.48 seconds. The actual first-to-final OS resource-sample span was 921.20 seconds, independently establishing that the old 900-second owner was insufficient for this finite workload. This successful execution qualifies the bounded 1,200-second fixture correction at this source, not the final TypeScript-specific PR head or an earlier failed run.

Broad CI 35963178726 also passed. Artifact 10794656924 retains the discovered 2,768 active cases and actual execution of all 17 local-service cases, the three slow-preparation regressions, the real 32 KiB audit-writer drain and CLI counter projection tests. Rust, C, Java and security workflows passed as well. Website checks do not replace the separate human newcomer review #345 or lift the release hold.

That head is not merge-ready: its Go cross-check 35963178643 failed before signed-node or guide execution. Artifact 10793745523 retains nine passing SDK cases and one failed nested-service case (130.53 seconds total). The first permitted child stopped at Queued with DependencyFailed/Unavailable, zero fuel/memory/effects and 438 microseconds of wall time; its parent failed the expected-result assertion after 7.095 seconds. The private child rejection detail was not retained, so the cause remains unknown. This differs from the earlier Resolved stale-load failure. The fixture uses a fixed supply-chain clock; real elapsed time alone does not establish an expired lease.

The next candidate adds test-only diagnostics before child errors are lowered to guest values. It retains at most 32 fixed stage/code/reason records, never raw messages, paths, tokens or payloads. Unknown shapes remain unclassified; overflow, contention or poisoned observation storage explicitly marks the record incomplete. The original start, future, outcome and owners pass through once without copying payloads, changing authority or retrying work. Seven native fake-invoker regressions cover the closed shapes, malformed values, redaction, unchanged success/error forwarding, bounded storage and pending-owner drop. These diagnostics improve observation; they do not establish or fix the unrecovered private cause. Fresh exact-source runtime qualification is required.

The integrated head 9f51c60cdd686eb23aab5408f5dde75b4e7f7d09 passed run 35942901339. Artifact 10785948026 matches 2,346 captured Git inputs with no generated SDK outputs. All ten SDK cases passed in 95.82 seconds, followed by 27 signed-node invocations, 24 resource observations, dormant populations 5/9/17 and clean node/HTTP-peer shutdown. All eight peer requests were authorized, none was unexpected and all three held operations closed. The six printed guide blocks passed in 28.47 seconds. Audit readiness took one 15 ms observation with every required counter zero; the guide's single deletion received a durable audit acknowledgment and the retained catalog has zero deployments.

The before/after source and execution-tool inventories match. Runtime source identity is sha256:b12a96b6e49b9ad36ae3326c35df5a19bc3930a30ce48c51ec51f41de5933653 (2,185 files, 13,727,514 bytes); qualification marker identity is sha256:06140e5617cfc8f8117a519577bfb2ead26796f2291aaeb15932c4732c00c0c1. The separate source archive matches all 4,105 selected Git blobs and modes, SHA-256 e8f959828303f35dd1cefd3ed3de884e9552d78984718d413a5d74d6559fa7ee. The CI merge b8fbb53c0d72072c40b65286a2a3210885eb53b8 and reviewed head share tree e6c317a0a28305291411ebab7966ac1521f54ea3.

That head also passed broad repository CI and the Rust, C, Java, Go and security workflows, but its TypeScript cross-check run 35942901312 failed, so that head was not merge-ready. Artifact 10786577160 retains ten passing SDK cases (872.12 seconds), the 5/9/17 dormant populations, 20 invocation receipts and 18 resource samples. The first allowed HTTP invocation returned the declared connection-failed result with a known outcome after 47.92 seconds; HTTP cancellation, subsequent cleanup and the guide were not qualified. The test peer has a 300-second listener lifetime, but the preceding sequential control and invocation receipts total at least 726.85 seconds. This establishes a fixture lifetime mismatch with the existing 900-second authoring owner. The prior peer exit was not captured, so its exact private failure cause is not claimed recovered. No invocation or uncertain mutation was retried. A corrected fixture and every final-head CI gate remain required for delivery.

The correction ties the peer to an absolute, finite owner deadline, including startup, request and held-socket work; ordinary peer use keeps its 300-second default. Only TypeScript's end-to-end qualification allowance becomes 1,200 seconds. The retained first HTTP result already ends at least 774.77 seconds into the old 900-second allowance. Its 26 remaining package inspections are estimated to need about 153 seconds from the measured 5.9-second TypeScript inspection cost and independently observed Go deletion curve; this is not a measured TypeScript cleanup result. The 20-minute harness bound leaves finite room to execute the unchanged case set. Other language allowances, 120-second activations, the 30-second binding-compile deadline, control-call bounds, 1,800-second demo proofs, resource quotas and authorization remain unchanged. Failed runs now retain bounded peer exit/reaping diagnostics. New exact-source execution remains required; no earlier failed run is reclassified as a pass.

Run 35934374519 repeated the complete qualification successfully at f8fff6bb1f0e854e6caff3a577848bd87a12a883. Artifact 10782987086 contains all ten SDK cases, 27 signed-node invocations, 24 resource observations, the 5/9/17 dormant populations and all six printed Bash steps. The node and HTTP peer shut down cleanly, all three held HTTP operations closed and no unexpected requests occurred. Independent Git comparison verified 2,341 captured inputs, including exactly the tracked SDK sources: zero generated build or Python-cache outputs were included. The source and execution-tool inventories remained unchanged before and after qualification. The runtime digest is sha256:5e68470fa3a4985748fe90586981b8c2a88c126a59d8f799328327cdffa1bf15 (2,181 files, 13,680,816 bytes), and the qualification marker digest is sha256:ac9f38c9d50e03533639125b568352e12c495c5234278b21212f6ff486b46eb0. The separate immutable archive matched all 4,084 expected Git blobs and modes, SHA-256 1f9b9dd15268c62bd0a6536be4dc87c9c5178566252c717876401922b586b03f.

The same head's broader CI run 35934375368 separately failed the unchanged small-WAT concurrent local-service acceptance case in the Phase 3 security matrix. The existing wrapper retained only command-exit, not the assertion details; that gate is not claimed green and its cause is not inferred from the successful .NET qualification. Final integrated CI must pass it with bounded failure diagnostics available.

The later integrated head 0c08d3f175f8cb58546208abe7f797cd27d6b61b failed run 35938546333 at the printed guide's final deployment delete. Artifact 10783703577 retains the complete attempt. All ten SDK cases and the separate signed-node workload passed: 27 invocations, 24 samples, the 5/9/17 dormant populations and clean node/HTTP-peer teardown. The guide also built, published and deployed its component and returned both expected greeting answers. Its deletion returned public resource-exhausted, with requestDispatched: true and outcomeKnown: true; no deletion was retried. The retained catalog still contains the deployment at generation 2. The exit trap stopped the guide's node cleanly, but that is not successful deployment cleanup or guide qualification.

No delete attempt appears in the seven retained audit records. The last two records are the valid invocation's monotonic-clock grant/outcome observations, immediately before the rejected cleanup. The guide configures eight audit queue operations, which derive a 32 KiB byte allowance; each observation and a new control reservation occupy 16 KiB of that allowance until physically released. This supports audit-byte pressure as an explanation, but the private rejection reason was not retained and is not claimed proven. The source archive matches all 4,102 selected Git blobs and modes, SHA-256 37b335092e4d1aac855669e92c7594c98f07cd3ca7128d123b908ae6cb70fed8. The failed attempt remains a failed gate regardless of earlier successful runs.

The guide now makes bounded read-only observations of audit ownership before issuing its one deletion. Existing queued-byte, durable staging and recovery state are exposed through matching server/CLI counters; missing, malformed, closed or recovery-pending observations fail closed. The observation has a five-second deadline, at most 32 reads and finite process/output cleanup bounds. It neither reserves future capacity nor changes journal quotas, policy, leases or deletion checks. Local tests cover these boundaries; the deterministic two-observation/32 KiB journal regression and full guide still require Linux CI at the new source. This correction is not a retroactive pass for the failed run.

The same integrated head's TypeScript cross-check also failed run 35938546318. Artifact 10784514997 retains nine passing SDK cases and the failed nested-call case. Its child stopped at Resolved with Unavailable and zero consumption; the parent failed after 67.45 seconds. This test composition sampled its synthetic healthy load only before the parent request, while normal admission rejects samples older than 60 seconds. Stale child load is a supported inference, not a recovered private rejection reason. The fixture now samples the same healthy profile at every admission; production health sources, freshness limits, quotas and invocation deadlines are unchanged. Deterministic real-WAT regressions retain both the stale-child rejection and the fresh parent/child path, without sleeping or retrying either admission. Linux execution remains required.

The separate TypeScript candidate's run 35938383435 retained admission-clock-lease-uncovered in artifact 10784737181 after one bounded deployment preparation took 6.18 seconds. The existing authenticated control owner now renews its finite clock lease after successful package inspection, before compiling the binding plan. Initial eligibility and the existing final live-policy, proof-expiry, revocation and deadline checks remain; startup/recovery receives no renewal authority. Registered real-package tests advance a fake clock across that boundary and cover cancellation, revoked/expired proofs and startup failure. These shared changes need successful Linux CI at the new integrated source; they do not qualify the earlier failure.

The following first-success measurements remain tied to their original source, not to the later integration head.

Run 35932426366 passed at 57fbc36690d9ccad65b6a18d2c49a4188e1ff061. Artifact 10782416468 retains five standalone builds, nine actual SDK builds, seven ownership checks, all ten admitted SDK cases (78.33 seconds), 27 signed-node invocation receipts, 24 resource observations, 123 recorded control calls and all six printed Bash steps (22.29 seconds). Typed results, secret alias zeroization and closed owners, allowed/denied HTTP, trap, fuel/memory exhaustion, deadline, cancellation, disconnect, fresh subsequent state and final deployment deletion passed. The node and HTTP peer were reaped cleanly; all three held HTTP operations closed, with no unexpected requests or remaining activation/provider/compiler owners.

The runtime source identity is sha256:f6ae16771985517c7a3acecb542f2ad98b9b9683f8663c6d3b466a87b20c6c2a (2,180 files, 13,671,845 bytes). Independent Git-blob comparison verified 2,340 runtime/SDK/WIT/schema/helper/guide inputs. The immutable source archive separately matched all 4,083 expected files and executable modes (SHA-256 f30b75bf8eaaf18a6cb6d7516334e6b8b275861cb4712e0b00615734879a4406). The qualification marker digest is sha256:41b2b076737de5a88d3dab2e1102f8102504df8d0f35c3f71ba69b3be6be6c0b; the source and tool inventories remained unchanged through node and guide execution.

The first receipt's SDK inventory also records 74 generated probe bin/obj and Python-cache outputs (26,009,700 bytes). These are explicitly not Git source inputs. The workflow now builds that diagnostic probe in its own temporary directory and disables Python bytecode writes, so the final SDK source inventory must match the reviewed tree exactly without an output exception.

Node startup measured 55.17 ms. Word-count and shipping cold requests took 2,927.95 and 2,914.49 ms; their warm repeats took 23.78 and 23.87 ms. The first recorded greeting was already warm after the explicit runtime-grant denial check and is not a cold-compilation measurement. Ordinary activations peaked at 54,067,200 charged guest-memory bytes. The memory-exhaustion case reached 121,765,888 bytes within the 128 MiB ceiling and the following fresh invocation succeeded. The fuel-exhaustion receipt charged exactly one billion.

ObservationProcesses / threads / listenersNode RSS bytesActive cells / cache entries
Empty node1 / 8 / 156,139,7760 / 0
5 dormant deployments1 / 7 / 167,682,3040 / 0
9 dormant deployments1 / 7 / 167,686,4000 / 0
17 dormant deployments1 / 7 / 167,686,4000 / 0
Held HTTP activation1 / 8 / 1176,046,0801 / 2
After cancellation1 / 8 / 1125,153,2800 / 2
After all deployment deletion1 / 7 / 1125,169,6640 / 2

Each dormant population has three settled samples, zero application-owned resources and no active activation, quota or execution-cell ownership. Shared compiled images remain bounded at two entries and one preparation; they are not per-deployment heaps. RSS is a non-atomic process observation, not an allocator release guarantee, and deleting deployments does not promise that RSS becomes the initial baseline. Clean shutdown joined the fixed compiler/cleanup workers.

Standalone captured builds took 15.88–16.27 seconds including source inventories, binding checks and packaging. The larger 5,050,538-byte diagnostic component compiled in 13.79 seconds with maximum compiler RSS of 305,296 KiB; its separate cold-backend probe prepared in 35.99 seconds. That diagnostic is distinct from the managed node's cold/warm observations above. None is a throughput, 100k-scale or arbitrary-.NET-application qualification.

Retained earlier attempts​

Run 35919449058 at 7a69352177fee84c2edf1d976fcd0e3523797aab passed the initial actual-compiler and clock/fresh-heap diagnostics, but its standalone builder incorrectly compared raw signed archive bytes with NuGet's normalized content hash. The locked content was not changed; verification now uses the signature-aware reader supplied by the exact .NET SDK.

Run 35921141813 at 1e56de8cb573c81e057df839b42845bccc455dca passed both NativeAOT backend diagnostics and built the standalone greeting from its captured source. The probe compiler took 6.57 seconds with 188,212 KiB maximum compiler RSS. Its 2,288,059-byte component prepared cold in 13.36 seconds; observed echo/wide activations peaked at 54,067,200 guest linear-memory bytes. Those measurements describe this probe and runner, not whole-node RSS or arbitrary C# applications.

That run failed closed during package inspection at the conservative component reference-work limit. A bounded native diagnosis measured 1,304,239 conservative reference visits but only 11,921 actual binary/type visits, 2,488 functions and 293,022 operators in the 2,292,496-byte greeting. Whole-instance alias summaries account for the difference. Reference expansion now has an independent finite 2,097,152 ceiling; actual type/allocation work remains capped at 262,144 and depth remains capped at 64. All 71 packaging unit tests and inspection of the retained actual greeting pass locally. Linux qualification must still validate the final source; this local inspection is not node execution evidence.

Earlier SDK and node failures​

Run 35929987442 at c844116196341fdb373f3bcbca6a61499ed189a8 passed all ten admitted SDK cases in 97.14 seconds, including the actual compiled secret alias-zeroization, preserved-copy, repeated-disposal and use-after-close assertions. The nested service returned successfully cold in 7.538 seconds and warm in about 16 ms. Each caller/callee activation peaked at 54,067,200 charged guest-memory bytes; the parent receipt includes 108,134,400 aggregate bytes. These are this runner's observations, not throughput or whole-process RSS guarantees.

The enforced node reached dormant populations of 5 and 9 with one process, seven threads, one listener and no active activation/cell ownership. Applying dormant-09 then failed closed with signature-stale-proof: the isolated demo signer's 60-second proof age contradicted its 30-minute signed experiment. Artifact 10780739918 preserves that failed run; the 17-deployment, invocation, cleanup and printed-guide stages were not qualified by that attempt. The exact source archive independently matched all 4,082 expected Git blobs (archive SHA-256 da8aa0ff351fcb26809ecb699d7f7c3967f43f639f61674836b77d191c08dde4). The broad Rust gate also caught a shared test-module dependency, now corrected by passing the explicit admission-memory ceiling from its caller. Its failed CI is not treated as passing delivery evidence.

The isolated demo signer now aligns both proof-age ceilings with its existing 1,800-second signature lifetime. Real cryptographic regressions check positive proofs at 61, 900 and 1,799 seconds, exact rejection at 1,800, and independent enforcement of a shorter publisher or builder proof age. This does not change production policy defaults, revocation/currentness enforcement or the finite five-second durable clock lease. The successful full run above includes this correction through the node and printed-guide stages.

Rust regression run 35932426453 at 57fbc36690d9ccad65b6a18d2c49a4188e1ff061 reached dormant populations 5, 9 and 17 and passed all four greeting invocations. The first word-count invocation then failed closed with admission-authority-busy, a known outcome before execution with zero fuel, memory and effects. Artifact 10782136500 retains this attempt. The authority intentionally rejects currentness checks while its fence is held; the qualification does not retry that request or relax the fence. A new isolated final-head run must pass the complete regression.

Run 35928271057 at 79ef782ab9f3440baa10123a3581ed727c875c87 passed the expanded actual NativeAOT probe, all five standalone and nine SDK builds, seven ownership checks and eight of ten SDK runtime tests. The secret success/typed-error diagnostic and actual secret/streaming cases passed. Artifact 10780656604 retains two admission failures: the nested caller declared its required 256 MiB ceiling, but the signing fixture still advertised a 128 MiB runtime. The fixture now uses the same explicit nested-service ceiling as the node composition; ordinary package profiles remain at 128 MiB. No production delegation rule or authority is widened. The successful full run above includes the nested service and complete signed-node/printed-guide stages.

Run 35926712630 at 2a2e131d1a51971cfc24eb792fea5323240114f1 executed the actual full-width and aggregate value cases successfully. Its declared-error probe returned the correct typed error, but the test used a success-only assertion. Artifact 10779557766 retains that harness failure. The assertion now checks the error category and exact payload separately. A local diagnostic of that unchanged compiled component also traced member lookup through String.GetHashCode to the closed runtime's ambient-entropy denial. Reflection lookup is therefore an explicit negative test, separate from supported library/task/GC checks. The successful full run above also passes the following fresh invocations.

Run 35922933562 at 2dc9ed406cfb0975024b4454e749677d3d4b6f55 built all five standalone and nine SDK components, passed six owner checks and seven of ten admitted SDK cases. Artifact 10778646686 retains the failures. The streaming example did not handle its expected typed denial; the nested service caller's 128 MiB reservation could not fund the callee under the node's half-remaining-memory delegation rule. Each NativeAOT activation measured about 54 MiB. Only that nested caller now explicitly reserves 256 MiB; the callee and standalone templates stay at 128 MiB, and production delegation is unchanged.

An actual retained secret component reproduced the third failure under the native diagnostic. Its full backtrace identifies unsupported CryptographicOperations.ZeroMemory; the later ambient-randomness trap came from exception reporting, not the secret provider. Local owned bytes now use non-elidable volatile zero stores with an additional alias-observation test. The compiled SDK diagnostic checks success/disposal and all four typed errors. The closed runtime still denies ambient entropy. The successful full Linux run above covers these changes; the failed attempt remains a failure.

tools/qualify_dotnet_capsules.py must retain five standalone builds, nine actual SDK builds, seven explicit disposable-owner/zeroization checks and all ten admitted provider/ownership cases. The compiled probe also checks full-width signed/unsigned values, UTF-8/NUL strings, options, nested record lists, declared errors, rooted WIT exports after trimming, dynamic-code flags, activation-local tasks and GC collection. A separate negative member-lookup probe verifies that unsupported runtime reflection traps without ambient hash-seed entropy, followed by fresh successful invocations. Compilation alone does not pass those execution checks.

The signed real-node workflow must cover the three tutorials, allowed/denied HTTP, errors, cancellation/disconnect, deadlines, trap/fuel/memory exhaustion, fresh subsequent state and cleanup. Resource receipts must include startup, active ownership, bounded shared caches and dormant populations of 5, 9 and 17. The six printed Bash guide steps must execute unchanged. Each failed attempt retains QUALIFICATION-FAILED.json; only the final qualification.json with status: passed, source-bound receipts and exact-head PR CI approve delivery.

After installing the guide's pinned prerequisites, use a fresh directory:

python3 tools/qualify_dotnet_capsules.py --tools "$LSF_DOTNET_TOOLS" \
--output "$(mktemp -d)/dotnet-authoring"

Final PR/issue evidence must identify the reviewed source and successful run. This does not qualify 100k deployment scale, transactional state, clusters or runtime release publication. Those gates and #345 remain separate.