build: prototype symlinked dual SDK namespaces#1327
Conversation
Signed-off-by: jasonqinzhou <jasonqinzhou@users.noreply.github.com>
Signed-off-by: Jason Zhou (Engrg-Hardware 1) <jasonzho@nvidia.com>
Signed-off-by: Jason Zhou (Engrg-Hardware 1) <jasonzho@nvidia.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
📜 Recent review details⏰ Context from checks skipped due to timeout. (5)
🧰 Additional context used📓 Path-based instructions (3)**/*.py📄 CodeRabbit inference engine (.claude/rules/generator/guard_rails.md)
Files:
**/*⚙️ CodeRabbit configuration file
Files:
tests/**⚙️ CodeRabbit configuration file
Files:
🔇 Additional comments (1)
WalkthroughThis PR splits the package into upper and core distributions, updates path resolution and logging imports, adds verification tooling, and refreshes build, CI, docs, and tests for the new layout. ChangesPackage split into upper and core
Estimated code review effort: 4 (Complex) | ~75 minutes Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (4)
rust/aiconfigurator-core/src/py.rs (1)
82-98: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low valueConsider distinguishing "not installed" from "installed but errored" fallback semantics.
Only the
py.import(...)failure short-circuits toOk(None); a successful import followed by acall_method0/extracterror propagates via?out of the closure, whichcompile_engine_from_flatconverts toAicError::DataRoot— bypassing the final repo-relative fallback entirely even though it's the same style of "resolution failed" scenario the function otherwise tries to gracefully degrade through. This is a design choice, not necessarily wrong (a real error from an installedaiconfigurator-coremay deserve surfacing), but worth confirming it's intentional given the rest of the function's degrade-through-multiple-sources philosophy.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@rust/aiconfigurator-core/src/py.rs` around lines 82 - 98, The path resolution in py.rs treats only import failure as “not installed,” but lets get_systems_paths()/extract() errors escape and skip the repo-relative fallback. Update the resolve logic around Python::with_gil and the perf_database lookup so that “installed but lookup failed” is handled according to the intended fallback semantics: either map those errors to Ok(None) and continue to crate::repo_relative(...), or explicitly separate and document them if they should remain hard failures. Make the behavior consistent with compile_engine_from_flat and the existing installed_root fallback flow..github/workflows/create-charts.yml (1)
43-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winEditable core install now compiles a Rust extension — no toolchain/cache step present.
aiconfigurator-coreswitched to the maturin backend, sopip install -e ./src/aiconfigurator-coreperforms a Rust build.ubuntu-latestships a Rust toolchain, so this likely works, but there's nodtolnay/rust-toolchainpin orSwatinem/rust-cache, meaning builds are unpinned and recompiled every run. Confirm the build succeeds here and consider adding Rust caching to keep this chart-only workflow fast.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/create-charts.yml around lines 43 - 44, The editable install of aiconfigurator-core now triggers a Rust build, so the create-charts workflow should either add the missing Rust toolchain/cache setup or explicitly confirm the build path is intentional. Update the steps around the pip install commands to include a pinned dtolnay/rust-toolchain and Swatinem/rust-cache for the aiconfigurator-core build, or otherwise ensure the maturin-backed install is handled efficiently and consistently in this job.Source: Path instructions
docker/Dockerfile (1)
72-81: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winEnforce wheelhouse-only resolution with
--no-index.The comment states dependency resolution "must pull the exact matching core wheel from the wheelhouse," but without
--no-indexuv will also consult the default index foraiconfigurator-core==<version>. Currently harmless since that exact version isn't published anywhere else yet, but it doesn't actually prove wheelhouse-exclusivity and could silently mask a resolution issue ifaiconfigurator-coreis ever published externally.🔧 Proposed fix
uv pip install --python /tmp/aic-upper-install-test/bin/python \ - --find-links /workspace/dist "${AIC_WHL}" && \ + --no-index --find-links /workspace/dist "${AIC_WHL}" && \🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docker/Dockerfile` around lines 72 - 81, The wheel install check in the Dockerfile still allows uv to consult the default index, so it does not באמת enforce wheelhouse-only dependency resolution. Update the `RUN uv venv...` block that installs `aiconfigurator-*` to add `--no-index` to the `uv pip install` command alongside `--find-links /workspace/dist`, so the `verify_installed_package_layers.py` check proves `aiconfigurator-core` is resolved only from the wheelhouse..github/workflows/accuracy-regression-testing.yml (1)
38-42: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winConsider caching cargo build artifacts for the editable core install.
pip install -e ./src/aiconfigurator-corenow triggers a full maturin/Rust compile on every run of this job, with noCargo.lock-keyed cache (e.g.actions/cacheover~/.cargo/registryand the Rusttarget/dir). This adds recompilation time to every accuracy-regression run.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/accuracy-regression-testing.yml around lines 38 - 42, The dependency install step is repeatedly recompiling the Rust-backed editable core install because no Cargo artifact cache is used. Update the accuracy-regression workflow around the Install dependencies step to add caching for the maturin/Rust build used by `pip install -e ./src/aiconfigurator-core`, ideally keyed off `Cargo.lock`, and cache the relevant Cargo directories such as the registry and build target so the `aiconfigurator-core` editable install can reuse compiled artifacts across runs.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@pyproject.toml`:
- Line 43: The dependency pin for aiconfigurator-core is hardcoded to
aiconfigurator version 0.10.0, which can drift from the upper wheel version used
by tools/verify_release_wheels.py. Update the pyproject.toml dependency entry so
it is derived from the project version or otherwise generated at release time,
keeping it in sync with the aiconfigurator package version and the
expected_requirement check in _verify_main_wheel.
In `@src/aiconfigurator/sdk/logging_utils.py`:
- Around line 24-39: The `use_plain_cli_output()` check is too tied to a
specific `ColoredFormatter` class identity, so it can miss `--no-color` when
logging is configured through the other namespace. Update the handler scan in
`logging_utils.use_plain_cli_output` to use namespace-agnostic duck typing
against the formatter object from each handler, checking for the
`force_no_color` signal instead of `isinstance(fmt, ColoredFormatter)`. Keep the
rest of the `_stdout_env_suggests_plain()` fallback behavior unchanged.
---
Nitpick comments:
In @.github/workflows/accuracy-regression-testing.yml:
- Around line 38-42: The dependency install step is repeatedly recompiling the
Rust-backed editable core install because no Cargo artifact cache is used.
Update the accuracy-regression workflow around the Install dependencies step to
add caching for the maturin/Rust build used by `pip install -e
./src/aiconfigurator-core`, ideally keyed off `Cargo.lock`, and cache the
relevant Cargo directories such as the registry and build target so the
`aiconfigurator-core` editable install can reuse compiled artifacts across runs.
In @.github/workflows/create-charts.yml:
- Around line 43-44: The editable install of aiconfigurator-core now triggers a
Rust build, so the create-charts workflow should either add the missing Rust
toolchain/cache setup or explicitly confirm the build path is intentional.
Update the steps around the pip install commands to include a pinned
dtolnay/rust-toolchain and Swatinem/rust-cache for the aiconfigurator-core
build, or otherwise ensure the maturin-backed install is handled efficiently and
consistently in this job.
In `@docker/Dockerfile`:
- Around line 72-81: The wheel install check in the Dockerfile still allows uv
to consult the default index, so it does not באמת enforce wheelhouse-only
dependency resolution. Update the `RUN uv venv...` block that installs
`aiconfigurator-*` to add `--no-index` to the `uv pip install` command alongside
`--find-links /workspace/dist`, so the `verify_installed_package_layers.py`
check proves `aiconfigurator-core` is resolved only from the wheelhouse.
In `@rust/aiconfigurator-core/src/py.rs`:
- Around line 82-98: The path resolution in py.rs treats only import failure as
“not installed,” but lets get_systems_paths()/extract() errors escape and skip
the repo-relative fallback. Update the resolve logic around Python::with_gil and
the perf_database lookup so that “installed but lookup failed” is handled
according to the intended fallback semantics: either map those errors to
Ok(None) and continue to crate::repo_relative(...), or explicitly separate and
document them if they should remain hard failures. Make the behavior consistent
with compile_engine_from_flat and the existing installed_root fallback flow.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: daa4e45b-ec8b-4453-a707-712cf6be9e61
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lockand included by none
📒 Files selected for processing (25)
.github/workflows/accuracy-regression-testing.yml.github/workflows/build-test.yml.github/workflows/create-charts.ymlDEVELOPMENT.mdREADME.mddocker/Dockerfilepyproject.tomlrust/aiconfigurator-core/src/py.rsrust/aiconfigurator-core/tests/embedded_round_trip.rsrust/aiconfigurator-core/tests/memory_round_trip.rssrc/aiconfigurator-core/pyproject.tomlsrc/aiconfigurator/logging_utils.pysrc/aiconfigurator/sdk/engine.pysrc/aiconfigurator/sdk/logging_utils.pysrc/aiconfigurator/sdk/memory.pysrc/aiconfigurator/sdk/pareto_analysis.pysrc/aiconfigurator/sdk/utils.pysrc/aiconfigurator_core/sdktests/README.mdtests/unit/sdk/test_core_namespace.pytests/unit/sdk/test_memory_estimation.pytests/unit/sdk/test_package_layering.pytools/build_legacy_monolith_fixture.pytools/verify_installed_package_layers.pytools/verify_release_wheels.py
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: Cargo Deny
- GitHub Check: Build and Test (unit)
- GitHub Check: Rust/Python engine-step parity
- GitHub Check: Build and Test (e2e)
- GitHub Check: AIC Accuracy Regression Testing
🧰 Additional context used
📓 Path-based instructions (6)
.github/workflows/**
⚙️ CodeRabbit configuration file
.github/workflows/**: - Review workflow edits for least-privilege permissions, safe trigger scopes, secret exposure, fork behavior, and release/cherry-pick side effects.
- Verify matrix jobs, artifact uploads, and scheduled support-matrix workflows still produce debuggable evidence.
Files:
.github/workflows/accuracy-regression-testing.yml.github/workflows/create-charts.yml.github/workflows/build-test.yml
**/*
⚙️ CodeRabbit configuration file
**/*: - Prefer applicable inline comments. When the correct fix is clear, small, and limited to the commented diff hunk, include it as a GitHub Suggested Change so the author can apply it with one click.
- Do not use a suggested change when the fix requires broader design choices, multiple files, generated artifacts, unavailable context, or validation that cannot be inferred from the diff.
- If a comment is not directly applicable, state the smallest concrete next step and why a one-click suggestion is not safe.
Files:
src/aiconfigurator_core/sdktests/README.mdsrc/aiconfigurator/sdk/engine.pysrc/aiconfigurator/sdk/pareto_analysis.pysrc/aiconfigurator/sdk/memory.pyrust/aiconfigurator-core/tests/embedded_round_trip.rssrc/aiconfigurator/sdk/utils.pytests/unit/sdk/test_core_namespace.pytests/unit/sdk/test_memory_estimation.pyDEVELOPMENT.mdsrc/aiconfigurator/sdk/logging_utils.pysrc/aiconfigurator-core/pyproject.tomlsrc/aiconfigurator/logging_utils.pytools/build_legacy_monolith_fixture.pytests/unit/sdk/test_package_layering.pypyproject.tomlrust/aiconfigurator-core/tests/memory_round_trip.rstools/verify_installed_package_layers.pyREADME.mdtools/verify_release_wheels.pyrust/aiconfigurator-core/src/py.rsdocker/Dockerfile
**/*.md
📄 CodeRabbit inference engine (.claude/rules/generator/config_schema.md)
**/*.md: Add computation rules in the rules authoring system when a new parameter requires non-trivial value computation beyond simple defaults
Add template modifications in the template authoring system when a new parameter requires special handling in generated artifacts
Files:
tests/README.mdDEVELOPMENT.mdREADME.md
tests/**
⚙️ CodeRabbit configuration file
tests/**: - Check that tests cover the changed behavior rather than only the happy path.
- Watch for fixtures or golden outputs that mask backend drift, support-matrix ordering changes, or CLI output regressions.
Files:
tests/README.mdtests/unit/sdk/test_core_namespace.pytests/unit/sdk/test_memory_estimation.pytests/unit/sdk/test_package_layering.py
**/*.py
📄 CodeRabbit inference engine (.claude/rules/generator/guard_rails.md)
**/*.py: Catch unsupported system/backend/version combinations early with fast validation to prevent wasting user time on late failures after profiling.
MoE model detection must useconfig.json, not model name patterns, to correctly identify MoE models with non-standard naming.
Usemodel_familynotmodel_namefor model compatibility checks;model_nameincludes size/quantization info that changes across variants.
safe_model_namemust be generated BEFORE saving results to avoid race condition with rawmodel_pathcontaining slashes.
Quantization type must be inferred from model config, not name patterns, to handle inconsistent naming conventions.
Files:
src/aiconfigurator/sdk/engine.pysrc/aiconfigurator/sdk/pareto_analysis.pysrc/aiconfigurator/sdk/memory.pysrc/aiconfigurator/sdk/utils.pytests/unit/sdk/test_core_namespace.pytests/unit/sdk/test_memory_estimation.pysrc/aiconfigurator/sdk/logging_utils.pysrc/aiconfigurator/logging_utils.pytools/build_legacy_monolith_fixture.pytests/unit/sdk/test_package_layering.pytools/verify_installed_package_layers.pytools/verify_release_wheels.py
src/aiconfigurator/sdk/**
⚙️ CodeRabbit configuration file
src/aiconfigurator/sdk/**: - Verify SDK API changes remain compatible with generator inputs, profiler data flow, and documented examples.
- Flag silent schema or field-name drift between SDK models and generator/module bridge code.
Files:
src/aiconfigurator/sdk/engine.pysrc/aiconfigurator/sdk/pareto_analysis.pysrc/aiconfigurator/sdk/memory.pysrc/aiconfigurator/sdk/utils.pysrc/aiconfigurator/sdk/logging_utils.py
🧠 Learnings (1)
📚 Learning: 2026-05-01T00:39:37.334Z
Learnt from: simone-chen
Repo: ai-dynamo/aiconfigurator PR: 956
File: src/aiconfigurator/sdk/perf_database.py:4144-4151
Timestamp: 2026-05-01T00:39:37.334Z
Learning: In src/aiconfigurator/sdk/**/*.py, preserve upstream metadata for PerformanceResult.source: since PerformanceResult defaults source to "silicon", callers should not force-set result.source (e.g., PerfDatabase._query_silicon_or_hybrid should rely on the default and keep any existing source information rather than overwriting it). Only set source explicitly when you truly intend to change it.
Applied to files:
src/aiconfigurator/sdk/engine.pysrc/aiconfigurator/sdk/pareto_analysis.pysrc/aiconfigurator/sdk/memory.pysrc/aiconfigurator/sdk/utils.pysrc/aiconfigurator/sdk/logging_utils.py
🪛 ast-grep (0.44.1)
tests/unit/sdk/test_core_namespace.py
[error] 67-73: Command coming from incoming request
Context: subprocess.run(
[sys.executable, "-c", script],
cwd=REPO_ROOT,
capture_output=True,
text=True,
check=False,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').
(subprocess-from-request)
[info] 56-56: use jsonify instead of json.dumps for JSON output
Context: json.dumps(leaves)
Note: [CWE-116] Improper Encoding or Escaping of Output.
(use-jsonify)
tests/unit/sdk/test_memory_estimation.py
[info] 224-224: Do not hardcode temporary file or directory names
Context: "/tmp/aic-core-systems"
Note: [CWE-377] Insecure Temporary File.
(hardcoded-tmp-file)
🪛 LanguageTool
DEVELOPMENT.md
[style] ~81-~81: ‘with respect to’ might be wordy. Consider a shorter alternative.
Context: ...ded wheel. The wheel itself is portable with respect to the link because it contains regular co...
(EN_WORDINESS_PREMIUM_WITH_RESPECT_TO)
README.md
[grammar] ~42-~42: Ensure spelling is correct
Context: ...tor` wheel contains the CLI, generator, webapp, and Spica. It depends on the exact mat...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🔇 Additional comments (27)
src/aiconfigurator_core/sdk (1)
1-1: LGTM!src/aiconfigurator/sdk/logging_utils.py (1)
56-124: LGTM! Moved verbatim from the upper package; no functional changes.src/aiconfigurator/logging_utils.py (1)
4-22: LGTM! Clean re-export shim that preserves backward compatibility without duplicating logic.src/aiconfigurator/sdk/pareto_analysis.py (1)
18-18: LGTM! Fixes what would otherwise be an SDK→upper-layer import violation now enforced bytests/unit/sdk/test_package_layering.py.DEVELOPMENT.md (1)
43-44: LGTM! Documentation accurately reflects the symlink layout, matches the actual symlink target (../aiconfigurator/sdk), and clearly calls out the cross-namespace identity caveat and Windows symlink requirements.Also applies to: 60-89, 144-146
README.md (1)
32-96: LGTM! Clear, consistent documentation of the platform constraint, namespace caveats, and upgrade path; matches the symlink layout and packaging behavior described elsewhere in the PR.Also applies to: 113-121
tests/README.md (1)
20-20: LGTM!rust/aiconfigurator-core/src/py.rs (1)
73-99: 🩺 Stability & AvailabilityNo new interpreter requirement here.
build_aic_enginealready runs underembed-python/pyo3/auto-initialize, soPython::with_gilhere matches the existing contract.> Likely an incorrect or invalid review comment.src/aiconfigurator/sdk/engine.py (1)
813-819: LGTM!src/aiconfigurator/sdk/memory.py (1)
309-309: LGTM!src/aiconfigurator/sdk/utils.py (1)
829-835: LGTM!rust/aiconfigurator-core/tests/embedded_round_trip.rs (1)
57-57: LGTM!Also applies to: 96-116
rust/aiconfigurator-core/tests/memory_round_trip.rs (1)
60-73: LGTM!Also applies to: 77-116, 119-174
tests/unit/sdk/test_memory_estimation.py (1)
206-225: LGTM!tests/unit/sdk/test_core_namespace.py (1)
24-90: LGTM!tests/unit/sdk/test_package_layering.py (1)
14-21: LGTM!Also applies to: 50-78, 113-135
pyproject.toml (1)
108-122: LGTM!tools/verify_release_wheels.py (2)
42-64: 🎯 Functional Correctness | ⚡ Quick win
rglobsymlink traversal is Python-version dependent — verify coverage.
src/aiconfigurator_core/sdkis a symlink into../aiconfigurator/sdk.Path.rglobfollows symlinked directories on 3.10–3.12, but 3.13 addedrecurse_symlinksdefaulting toFalse, so_add_source_tree(core, ".../aiconfigurator_core", ...)will enumerate the mirrored SDK files on older interpreters and skip them on 3.13+. That silently weakens themissing_sourcecheck depending on which interpreter runs verification. Consider walking the symlink target explicitly (or asserting the mirrored set) so coverage is deterministic across versions.
129-136: 🎯 Functional CorrectnessNo change needed here. The release-wheel path is Linux-only, so wheels lacking Unix mode bits are out of scope for this check.
> Likely an incorrect or invalid review comment.tools/verify_installed_package_layers.py (1)
126-151: 🩺 Stability & AvailabilityNo issue here.
MiniMaxAI--MiniMax-M2.5_config.jsonis bundled, so the--exercise-enginepath already uses a packaged config.> Likely an incorrect or invalid review comment.src/aiconfigurator-core/pyproject.toml (2)
35-50: 🗄️ Data Integrity & IntegrationNo action needed:
tool.maturin.includeis resolved from thepyproject.tomldirectory, with a fallback topython-source, so these paths are not dropped.> Likely an incorrect or invalid review comment.
43-50: 🗄️ Data Integrity & IntegrationNo recursive YAML glob needed here
aiconfigurator/systems/*.yamlalready covers the current flat asset layout, so there’s no nestedsystems/<subdir>/YAML to add.> Likely an incorrect or invalid review comment.tools/build_legacy_monolith_fixture.py (1)
1-96: LGTM!docker/Dockerfile (2)
19-23: LGTM!Also applies to: 33-34, 45-71
83-108: 🩺 Stability & AvailabilityMigration test hard-asserts on undocumented pip ordering behavior.
The
if verify...; then echo ERROR...; exit 1; fistep encodes an expectation about pip's internal uninstall/install ordering when crossing a package split — behavior that isn't a documented pip contract. If a future pip release changes this ordering (e.g. to better handle overlapping RECORD entries), this Docker stage will start failing the build via the inverted assertion, even though nothing in this repo changed. The throwaway venvs here (python -m venv) also don't pin/upgrade pip, so behavior can drift silently across base-image updates.Consider pinning pip's version for this scenario (or asserting more loosely, e.g. warning instead of hard-failing on the "unexpectedly preserved" branch) to reduce blast radius if pip's behavior changes upstream.
.github/workflows/accuracy-regression-testing.yml (1)
65-67: LGTM!.github/workflows/build-test.yml (1)
85-85: LGTM!Also applies to: 98-102, 234-237
| requires-python = ">=3.10" | ||
|
|
||
| dependencies = [ | ||
| "aiconfigurator-core==0.10.0", |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Hardcoded ==0.10.0 pin will drift from the upper wheel version.
tools/verify_release_wheels.py enforces Requires-Dist: aiconfigurator-core=={upper wheel Version} (see _verify_main_wheel, expected_requirement). This literal pin only matches while aiconfigurator is exactly 0.10.0; any version bump that forgets to edit this line will fail release verification. Consider deriving the pin from the project version (e.g. a dynamic/templated dependency or a release-time check) so the two stay in lockstep.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@pyproject.toml` at line 43, The dependency pin for aiconfigurator-core is
hardcoded to aiconfigurator version 0.10.0, which can drift from the upper wheel
version used by tools/verify_release_wheels.py. Update the pyproject.toml
dependency entry so it is derived from the project version or otherwise
generated at release time, keeping it in sync with the aiconfigurator package
version and the expected_requirement check in _verify_main_wheel.
Signed-off-by: Jason Zhou (Engrg-Hardware 1) <jasonzho@nvidia.com>
AIC Accuracy Regression TestingWorkflow result: Old revision: Summary
Comparison summary table
|
Summary
This is an alternative packaging prototype to #1322. It keeps the SDK, system data, model data, collector, and Rust crate in the repository's existing layout instead of relocating the project into
packages/.The SDK has one real source tree:
The relative Git symlink exposes the full SDK through both public import paths:
Packaging behavior
aiconfigurator-coreis a standalone Maturin wheel containing the Rust extension, SDK, system/model data, and both SDK namespace trees.aiconfiguratorwheel contains CLI, generator, webapp, and Spica, and depends exactly onaiconfigurator-core==0.10.0.TaskandEngineHandle.Important tradeoffs
This is source deduplication, not Python module aliasing. Importing the same leaf through both names creates separate module objects, classes, registries, and caches. Applications must choose one namespace consistently and should not exchange objects imported from the two namespaces. This is the principal semantic difference from #1322's compatibility wrappers, which preserve exact module identity.
There are two additional packaging caveats:
aiconfigurator/sdkfiles while uninstalling the old package. The tested migration paths are uninstall-first or force-reinstalling core after the upgrade.These limitations are intentionally documented in the draft so the symlink design can be compared directly with #1322 before choosing the release structure.
Validation
1792 passed, 36 skipped.63 passed.175 + 847disjoint upper/core payload files.EngineHandlelatency predictions passed.uv lock --check, Ruff, formatting, andgit diff --checkpassed.Summary by CodeRabbit