[BUG] Standalone kernel builds require unused components and lose manifest feature dependencies #49

Open
opened 2026-09-14 11:01:22 +02:00 by erikinkinen · 0 comments
Owner

Summary

The standalone dynamic kernel build path diverges from its declared component and Cargo feature graph. A kernel-only diagnostic first requires unrelated userspace service checkouts, then requires registry entries for unused image targets. Once those gates are corrected, a feature that works in ordinary Cargo builds loses its transitive runtime feature during dynamic compilation.

Reproduction

Use a manifest-coherent catalog containing Kernel, Bootloader, Boot Tool, native C memory support and their transitive dependencies, together with a registry containing only the kernel's dynamic dependency closure. Select KERNEL_ROOTD_TEST=none and ROOTD_TEST_MODE=none through scripts/build-kernel-fixture.sh.

With the native lifetime diagnostic selected, the isolated wrapper under development invokes this same builder. The three failures below were observed in sequence as each earlier defect was corrected. The ordinary feature-selection test also reproduces the first defect with no lifetime feature enabled.

Expected and actual behavior

Expected: a standalone kernel requires its actual source and shared-library closure, with the feature implications declared by its selected original Cargo manifest. Full service images must continue to validate their full target set.

Observed failures, each with actual exit status 1:

  • Non-runtime mode selection incorrectly enables userspace bootstrap, core and hardware modes: error: memd component missing in config/workspace.
  • Cache preparation requests all image targets against the smaller registry: erix-ipc-syscall-x86_64.so: shared-object registry entry is missing.
  • Dynamic compilation uses a duplicated, incomplete feature map: error E0425 for rootd_smoke_marker when the lifetime fixture's transitive runtime feature is missing.

Environment and identity

Integration base 47c27a1614c02323db7bbebfdbd0ca6b09bc9d45, with the isolated diagnostic adapter under development; Kernel 213c4606b2bf94d7ed87f339bf4c7462cad90987, IPC de6892790de69f40f749c393d24078b287b36175 and capability ABI 984c9f7b0ca910488f8c5b035d2f0cb88f18d304. Linux x86_64 host, Rust 1.97.1, freestanding x86_64 release target. These failures occur before VM execution. The source/catalog selectors are full original Git commits; no branch replacement or additional guest authority is involved. A last known working minimal graph is not established.

Evidence and prior checks

Current Integration 4b65755f1f2774798d4a909212db4e64c0349b86 finishes with failed push CI 1603 and PR CI 1604. Each complete catalog reports 54 passes and 432 failures out of 486 scenarios. Six full terminal logs total 14,427,322 bytes, with no warning candidates. Both Rust and Markdown jobs pass. The later isolated native diagnostic, canonical images and terminal modes are not reached by these runs.

Issue 50 tracks the observed shared-compiler regression: valid dependency-qualified Rootd selections are rejected as unknown local features. A minimal original-manifest check confirms the failure. The correction separates compiler cfg ownership and adds direct, transitive, malformed and real-compiler coverage; its full local checks are underway. Original failures remain retained, and these terminal runs are not being replayed unchanged. Earlier isolated native VM acceptance retains its separate exact source and artifact scope.

Signed Integration 4b65755f1f2774798d4a909212db4e64c0349b86 adds the isolated native lifetime scenario and corrects standalone kernel service selection, target-scoped cache identity and original-manifest feature closure. The redundant feature implication table is removed and the shared resolver joins the builder fingerprint. The normal component catalog remains independently selected.

The strict development/release default/all-feature Rust matrix passes 320/321 units, doctests, private rustdoc and freestanding builds; missing documentation remains denied. All 159 helper suites are accepted across the complete run and justified follow-ups: installed filesystem-tool routes and actual stage tracing, serialization after the real VM releases the global scenario lock, and declaration of the compiler fixture's selected feature. Original failures and actual statuses remain retained; assertions and production deadlines are unchanged.

The actual native VM passes both ordered unique markers, expected exit and forbidden-marker checks using signed Kernel 03e13a784bde08914864267a4e2a6324a22d05c7 and Bootloader e7fa39357a38c21529cccfd16cf3446eb07e8aa5. The 2,142,208-byte image has SHA256 4f021a40264739fef4979da2b0cd4647bde3f76b9dada6816aba6faa3594a797; QEMU stderr is empty. Complete preparation and execution takes 19.20 seconds under the unchanged 60/45-second VM limits, not a guest performance measurement. Kernel CI 528/529 and Bootloader CI 135/136 are green. Integration CI 1603/1604 is running; older suite and complete current-head acceptance remain pending. Realm adoption and both full guest build generations are unproved.

The original kernel-only mode regression fails deterministically after the existing positive and refusal cases. The local correction keeps service modes zero for a standalone kernel. Cache tests preserve the selected target's identity while rejecting missing libraries whenever that target or the full image requires them. Dynamic compiler tests now resolve previously unknown feature names from the selected manifest and reject undeclared features. The duplicated feature map is removed, and the shared resolver is included in builder cache identity.

All three corrected checks pass, and the isolated dynamic kernel and its six shared objects build with warning-denied compilation and validated artifact metadata. Integration's development/release default and all-feature Rust checks pass. Full helper validation and native VM acceptance are still in progress; no guest-build or full-image success is claimed.

Validation checkpoint — 14 September 2026: Signed Integration 7cc0593e101b2e0ca42f24d4fa189dd96cb1455c passes all 159 helper suites, the strict four-selection Rust matrix (320/321 units) and all 87 original Rootd feature selections from failed CI 1603/1604. Both final native VMs pass unchanged exit/marker rules with empty stderr. The lifetime image is 2,150,400 bytes, SHA256 7d8b99684110d38dd77d2be297f1d896d7bb94a2f60dc5a3ee3dcab06cea2c76; the ordinary Rootd image is 27,934,720 bytes, SHA256 3868790fac953843c62e3674ef149dc55e4502e5118212fcc95d1aef875cf1a0. Original compiler, runtime-import and entry-argument failures remain retained. Full CI 1605 and 1606 is running; no full-catalog pass is claimed.

Tracking

Related: Integration audit, Integration PR 12, and native lifetime contract. Keep this issue open until the signed correction and relevant current-head CI are verified. Preserve all failed preparations and distinguish build-tool/environment mistakes from these implementation defects.

## Summary The standalone dynamic kernel build path diverges from its declared component and Cargo feature graph. A kernel-only diagnostic first requires unrelated userspace service checkouts, then requires registry entries for unused image targets. Once those gates are corrected, a feature that works in ordinary Cargo builds loses its transitive runtime feature during dynamic compilation. ## Reproduction Use a manifest-coherent catalog containing Kernel, Bootloader, Boot Tool, native C memory support and their transitive dependencies, together with a registry containing only the kernel's dynamic dependency closure. Select `KERNEL_ROOTD_TEST=none` and `ROOTD_TEST_MODE=none` through `scripts/build-kernel-fixture.sh`. With the native lifetime diagnostic selected, the isolated wrapper under development invokes this same builder. The three failures below were observed in sequence as each earlier defect was corrected. The ordinary feature-selection test also reproduces the first defect with no lifetime feature enabled. ## Expected and actual behavior Expected: a standalone kernel requires its actual source and shared-library closure, with the feature implications declared by its selected original Cargo manifest. Full service images must continue to validate their full target set. Observed failures, each with actual exit status 1: - Non-runtime mode selection incorrectly enables userspace bootstrap, core and hardware modes: `error: memd component missing in config/workspace`. - Cache preparation requests all image targets against the smaller registry: `erix-ipc-syscall-x86_64.so: shared-object registry entry is missing`. - Dynamic compilation uses a duplicated, incomplete feature map: error E0425 for `rootd_smoke_marker` when the lifetime fixture's transitive runtime feature is missing. ## Environment and identity Integration base `47c27a1614c02323db7bbebfdbd0ca6b09bc9d45`, with the isolated diagnostic adapter under development; Kernel `213c4606b2bf94d7ed87f339bf4c7462cad90987`, IPC `de6892790de69f40f749c393d24078b287b36175` and capability ABI `984c9f7b0ca910488f8c5b035d2f0cb88f18d304`. Linux x86_64 host, Rust 1.97.1, freestanding x86_64 release target. These failures occur before VM execution. The source/catalog selectors are full original Git commits; no branch replacement or additional guest authority is involved. A last known working minimal graph is not established. ## Evidence and prior checks Current Integration `4b65755f1f2774798d4a909212db4e64c0349b86` finishes with failed [push CI 1603](https://git.erikinkinen.fi/erix/integration/actions/runs/1603) and [PR CI 1604](https://git.erikinkinen.fi/erix/integration/actions/runs/1604). Each complete catalog reports 54 passes and 432 failures out of 486 scenarios. Six full terminal logs total 14,427,322 bytes, with no warning candidates. Both Rust and Markdown jobs pass. The later isolated native diagnostic, canonical images and terminal modes are not reached by these runs. [Issue 50](https://git.erikinkinen.fi/erix/integration/issues/50) tracks the observed shared-compiler regression: valid dependency-qualified Rootd selections are rejected as unknown local features. A minimal original-manifest check confirms the failure. The correction separates compiler cfg ownership and adds direct, transitive, malformed and real-compiler coverage; its full local checks are underway. Original failures remain retained, and these terminal runs are not being replayed unchanged. Earlier isolated native VM acceptance retains its separate exact source and artifact scope. Signed Integration `4b65755f1f2774798d4a909212db4e64c0349b86` adds the isolated native lifetime scenario and corrects standalone kernel service selection, target-scoped cache identity and original-manifest feature closure. The redundant feature implication table is removed and the shared resolver joins the builder fingerprint. The normal component catalog remains independently selected. The strict development/release default/all-feature Rust matrix passes 320/321 units, doctests, private rustdoc and freestanding builds; missing documentation remains denied. All 159 helper suites are accepted across the complete run and justified follow-ups: installed filesystem-tool routes and actual stage tracing, serialization after the real VM releases the global scenario lock, and declaration of the compiler fixture's selected feature. Original failures and actual statuses remain retained; assertions and production deadlines are unchanged. The actual native VM passes both ordered unique markers, expected exit and forbidden-marker checks using signed Kernel `03e13a784bde08914864267a4e2a6324a22d05c7` and Bootloader `e7fa39357a38c21529cccfd16cf3446eb07e8aa5`. The 2,142,208-byte image has SHA256 `4f021a40264739fef4979da2b0cd4647bde3f76b9dada6816aba6faa3594a797`; QEMU stderr is empty. Complete preparation and execution takes 19.20 seconds under the unchanged 60/45-second VM limits, not a guest performance measurement. Kernel CI 528/529 and Bootloader CI 135/136 are green. Integration CI 1603/1604 is running; older suite and complete current-head acceptance remain pending. Realm adoption and both full guest build generations are unproved. The original kernel-only mode regression fails deterministically after the existing positive and refusal cases. The local correction keeps service modes zero for a standalone kernel. Cache tests preserve the selected target's identity while rejecting missing libraries whenever that target or the full image requires them. Dynamic compiler tests now resolve previously unknown feature names from the selected manifest and reject undeclared features. The duplicated feature map is removed, and the shared resolver is included in builder cache identity. All three corrected checks pass, and the isolated dynamic kernel and its six shared objects build with warning-denied compilation and validated artifact metadata. Integration's development/release default and all-feature Rust checks pass. Full helper validation and native VM acceptance are still in progress; no guest-build or full-image success is claimed. Validation checkpoint — 14 September 2026: Signed Integration `7cc0593e101b2e0ca42f24d4fa189dd96cb1455c` passes all 159 helper suites, the strict four-selection Rust matrix (320/321 units) and all 87 original Rootd feature selections from failed CI 1603/1604. Both final native VMs pass unchanged exit/marker rules with empty stderr. The lifetime image is 2,150,400 bytes, SHA256 `7d8b99684110d38dd77d2be297f1d896d7bb94a2f60dc5a3ee3dcab06cea2c76`; the ordinary Rootd image is 27,934,720 bytes, SHA256 `3868790fac953843c62e3674ef149dc55e4502e5118212fcc95d1aef875cf1a0`. Original compiler, runtime-import and entry-argument failures remain retained. Full CI [1605](https://git.erikinkinen.fi/erix/integration/actions/runs/1605) and [1606](https://git.erikinkinen.fi/erix/integration/actions/runs/1606) is running; no full-catalog pass is claimed. ## Tracking Related: [Integration audit](https://git.erikinkinen.fi/erix/integration/issues/11), [Integration PR 12](https://git.erikinkinen.fi/erix/integration/pulls/12), and [native lifetime contract](https://git.erikinkinen.fi/erix/kernel/issues/7). Keep this issue open until the signed correction and relevant current-head CI are verified. Preserve all failed preparations and distinguish build-tool/environment mistakes from these implementation defects.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
erix/integration#49
No description provided.