Pinned public framework submodule ================================= This repository contains private AGILab apps, not the public framework itself. Those apps depend on the shared AGILab core packages: - ``agi-env`` - ``agi-node`` - ``agi-cluster`` - ``agi-core`` Decision -------- The default framework source is the pinned git submodule at:: .external/agilab and the default core root is:: .external/agilab/src/agilab/core Rationale --------- The previous local developer workflow often relied on a machine-specific symlink such as ``core -> ../agilab/src/agilab/core`` or on an implicit sibling checkout. That was convenient, but it weakened the audit story: - a fresh clone of ``thales_agilab`` was not enough to reproduce the setup - local developers, CI, and reviewers could silently use different framework revisions - the effective framework version was not pinned inside the private repo boundary The pinned submodule fixes that by making the framework revision explicit in Git history and by giving CI, developers, and auditors the same default source. Supported resolution order -------------------------- ``tools/run_app_tests.py`` resolves the shared core in this order: 1. ``--core-root`` explicit override 2. ``.external/agilab/src/agilab/core`` pinned submodule 3. ``AGILAB_CORE_ROOT`` environment override 4. ``../agilab/src/agilab/core`` legacy sibling checkout Local workflow -------------- Initialise the submodule after cloning:: git submodule update --init --recursive Then launch the framework from the pinned checkout:: cd .external/agilab uv run streamlit run src/agilab/agilab.py -- --apps-dir "/path/to/thales_agilab/apps" Consequences ------------ - default local and CI behavior is reproducible - framework upgrades become explicit submodule updates - ad-hoc local overrides remain possible, but they are no longer the default