Follow-up to #884 and 5f700aa68. The now-tested real packages/modules/src/module_system.zig loader still implements resolveImport(from_module, import_name) by discarding from_module and calling loadModule(import_name). loadModule searches the process cwd and global search paths, so two modules in different directories cannot reliably import their own ./sibling.home; a same-basename module elsewhere can resolve incorrectly. This is a source-observed gap, not a passing/failing runtime test claim.
Acceptance:
- Resolve relative imports against the importing module's owned file path, independent of process cwd, while preserving bare-name search-path behavior.
- Canonicalize path/cache identity so aliases and repeated imports share one owned AST, but same basenames in different directories remain distinct; deinit each module exactly once.
- Preserve the 10 MiB source limit, explicit
std.Io, public/private export semantics, parse-error rejection and error propagation from #884. - Add real temporary-directory tests with two independent roots, nested
./and../imports, aliases, missing targets, and allocation/lifetime checks. No simulation tests or assertion weakening. - Qualify under pinned Zig 0.17 and Zig 0.18 in Debug and ReleaseFast within the 3,840 MB guard; separately record cross-platform runtime limits.
Parent: #66.