depfix 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- depfix-0.1.0/CHANGELOG.md +22 -0
- depfix-0.1.0/CONTRIBUTING.md +28 -0
- depfix-0.1.0/MANIFEST.in +15 -0
- depfix-0.1.0/PKG-INFO +223 -0
- depfix-0.1.0/README.md +187 -0
- depfix-0.1.0/RELEASING.md +40 -0
- depfix-0.1.0/SECURITY.md +24 -0
- depfix-0.1.0/docs/AGENTS.md +35 -0
- depfix-0.1.0/docs/README.md +19 -0
- depfix-0.1.0/docs/concepts/AGENTS.md +30 -0
- depfix-0.1.0/docs/concepts/artifacts-and-cache/AGENTS.md +24 -0
- depfix-0.1.0/docs/concepts/artifacts-and-cache/README.md +25 -0
- depfix-0.1.0/docs/concepts/deployment/AGENTS.md +24 -0
- depfix-0.1.0/docs/concepts/deployment/README.md +30 -0
- depfix-0.1.0/docs/concepts/import-realms/AGENTS.md +25 -0
- depfix-0.1.0/docs/concepts/import-realms/README.md +31 -0
- depfix-0.1.0/docs/concepts/import-realms/compatibility.md +16 -0
- depfix-0.1.0/docs/concepts/manifests/AGENTS.md +24 -0
- depfix-0.1.0/docs/concepts/manifests/README.md +26 -0
- depfix-0.1.0/docs/concepts/resolution/AGENTS.md +26 -0
- depfix-0.1.0/docs/concepts/resolution/README.md +21 -0
- depfix-0.1.0/docs/concepts/resolution/module-discovery.md +13 -0
- depfix-0.1.0/docs/concepts/resolution/source-grammar.md +40 -0
- depfix-0.1.0/docs/concepts/resolution/uv-backend.md +16 -0
- depfix-0.1.0/docs/guides/AGENTS.md +24 -0
- depfix-0.1.0/docs/guides/getting-started.md +38 -0
- depfix-0.1.0/docs/guides/migration.md +12 -0
- depfix-0.1.0/docs/guides/troubleshooting.md +19 -0
- depfix-0.1.0/docs/operations/AGENTS.md +25 -0
- depfix-0.1.0/docs/operations/threat-model.md +27 -0
- depfix-0.1.0/docs/operations/verification.md +23 -0
- depfix-0.1.0/docs/project/AGENTS.md +23 -0
- depfix-0.1.0/docs/project/final-implementation-report.md +201 -0
- depfix-0.1.0/docs/project/phase-one-baseline.md +47 -0
- depfix-0.1.0/docs/reference/AGENTS.md +24 -0
- depfix-0.1.0/docs/reference/api.md +60 -0
- depfix-0.1.0/docs/reference/cli.md +31 -0
- depfix-0.1.0/docs/research/AGENTS.md +23 -0
- depfix-0.1.0/docs/research/cpython-import-realms.md +113 -0
- depfix-0.1.0/examples/AGENTS.md +27 -0
- depfix-0.1.0/examples/container/AGENTS.md +23 -0
- depfix-0.1.0/examples/container/Dockerfile +10 -0
- depfix-0.1.0/examples/container/README.md +5 -0
- depfix-0.1.0/examples/container/application.py +4 -0
- depfix-0.1.0/examples/two_idna_versions/AGENTS.md +23 -0
- depfix-0.1.0/examples/two_idna_versions/application.py +12 -0
- depfix-0.1.0/pyproject.toml +70 -0
- depfix-0.1.0/schemas/depfix-manifest-v1.schema.json +165 -0
- depfix-0.1.0/scripts/name_preflight.py +69 -0
- depfix-0.1.0/scripts/release_check.py +345 -0
- depfix-0.1.0/setup.cfg +4 -0
- depfix-0.1.0/src/depfix/__init__.py +196 -0
- depfix-0.1.0/src/depfix/__main__.py +3 -0
- depfix-0.1.0/src/depfix/_version.py +1 -0
- depfix-0.1.0/src/depfix/aliases.py +189 -0
- depfix-0.1.0/src/depfix/cache.py +385 -0
- depfix-0.1.0/src/depfix/cli.py +595 -0
- depfix-0.1.0/src/depfix/config.py +57 -0
- depfix-0.1.0/src/depfix/errors.py +214 -0
- depfix-0.1.0/src/depfix/handles.py +143 -0
- depfix-0.1.0/src/depfix/manager.py +258 -0
- depfix-0.1.0/src/depfix/manifest.py +456 -0
- depfix-0.1.0/src/depfix/models.py +113 -0
- depfix-0.1.0/src/depfix/project.py +585 -0
- depfix-0.1.0/src/depfix/py.typed +1 -0
- depfix-0.1.0/src/depfix/resolver.py +1000 -0
- depfix-0.1.0/src/depfix/runtime.py +708 -0
- depfix-0.1.0/src/depfix/scanner.py +271 -0
- depfix-0.1.0/src/depfix/schemas/depfix-manifest-v1.schema.json +165 -0
- depfix-0.1.0/src/depfix/settings.py +266 -0
- depfix-0.1.0/src/depfix/sources.py +306 -0
- depfix-0.1.0/src/depfix/specifiers.py +6 -0
- depfix-0.1.0/src/depfix/sync.py +123 -0
- depfix-0.1.0/src/depfix/uv_backend.py +334 -0
- depfix-0.1.0/src/depfix/wheel.py +406 -0
- depfix-0.1.0/src/depfix.egg-info/PKG-INFO +223 -0
- depfix-0.1.0/src/depfix.egg-info/SOURCES.txt +79 -0
- depfix-0.1.0/src/depfix.egg-info/dependency_links.txt +1 -0
- depfix-0.1.0/src/depfix.egg-info/entry_points.txt +2 -0
- depfix-0.1.0/src/depfix.egg-info/requires.txt +15 -0
- depfix-0.1.0/src/depfix.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes use this file. The project follows semantic versioning after its first public release.
|
|
4
|
+
|
|
5
|
+
## 0.1.0 - Unreleased
|
|
6
|
+
|
|
7
|
+
- Established the permanent `depfix` distribution, import, CLI, environment, cache, bundle, generated-package, and
|
|
8
|
+
synthetic-namespace identities.
|
|
9
|
+
- Added zero-configuration ranged imports and lazy `PackageHandle` loading.
|
|
10
|
+
- Added unified PyPI, Git, URL, file, Python-module, and PEP 508 direct-reference sources.
|
|
11
|
+
- Added Core Metadata/artifact module discovery and four-state native classification with mixed-wheel Python fallback.
|
|
12
|
+
- Added mandatory uv resolution/build backend, executable discovery, and private repair bootstrap.
|
|
13
|
+
- Added deterministic manifests, AST export, frozen/offline install, air-gap bundles, IDE stubs/source maps, and uv pip
|
|
14
|
+
passthrough.
|
|
15
|
+
- Preserved parent-specific multiversion realms, namespace provider sets, canonical identity, resource/metadata facades,
|
|
16
|
+
concurrency, and spawn-worker behavior.
|
|
17
|
+
- Added release validation, cross-platform CI, and manual trusted-publishing workflow templates.
|
|
18
|
+
- Added a project-wide DOX hierarchy, concept-owned documentation folders, a GitHub/PyPI README, and canonical
|
|
19
|
+
`agent0ai` project metadata.
|
|
20
|
+
|
|
21
|
+
Release blockers: the owner must choose a license, add a private security contact, confirm PyPI name acceptance, and
|
|
22
|
+
configure protected trusted-publisher environments.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Use CPython 3.11+ and install development dependencies:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
python -m venv .venv
|
|
7
|
+
.venv/bin/python -m pip install -e '.[test,release]'
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
On Windows, use `.venv\Scripts\python.exe`. Run before submitting changes:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
ruff format --check .
|
|
14
|
+
ruff check .
|
|
15
|
+
mypy src/depfix
|
|
16
|
+
pytest
|
|
17
|
+
python scripts/release_check.py --quick
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Changes to source parsing, manifests, import identity, cache layout, native policy, or uv commands require focused tests and
|
|
21
|
+
documentation. Tests must not depend on ambient third-party imports. Never commit credentials, private package artifacts,
|
|
22
|
+
global cache content, `.depfix/runtime`, or generated build output.
|
|
23
|
+
|
|
24
|
+
Preserve the stable `import_module -> ModuleType` and `load_package -> PackageHandle` contracts. New native support must be
|
|
25
|
+
opt-in and evidence-based; do not weaken the unknown-native gate to make one package pass.
|
|
26
|
+
|
|
27
|
+
No contributor identity or certificate-of-origin policy has been selected. The owner should establish those governance
|
|
28
|
+
terms together with the license before accepting external contributions.
|
depfix-0.1.0/MANIFEST.in
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include CHANGELOG.md
|
|
3
|
+
include SECURITY.md
|
|
4
|
+
include CONTRIBUTING.md
|
|
5
|
+
include RELEASING.md
|
|
6
|
+
recursive-include docs *.md
|
|
7
|
+
recursive-include schemas *.json
|
|
8
|
+
recursive-include examples *.py *.md Dockerfile
|
|
9
|
+
recursive-include scripts *.py
|
|
10
|
+
prune .depfix
|
|
11
|
+
prune .github
|
|
12
|
+
prune build
|
|
13
|
+
prune dist
|
|
14
|
+
prune tests
|
|
15
|
+
global-exclude .env .env.* *.py[cod] __pycache__/*
|
depfix-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: depfix
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Import multiple Python package versions side by side with isolated dependency realms
|
|
5
|
+
Author: agent0ai
|
|
6
|
+
Project-URL: Homepage, https://github.com/agent0ai/depfix
|
|
7
|
+
Project-URL: Documentation, https://github.com/agent0ai/depfix/tree/main/docs
|
|
8
|
+
Project-URL: Repository, https://github.com/agent0ai/depfix
|
|
9
|
+
Project-URL: Issues, https://github.com/agent0ai/depfix/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/agent0ai/depfix/blob/main/CHANGELOG.md
|
|
11
|
+
Keywords: dependencies,dependency-isolation,imports,multiversion,packaging,uv
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
Requires-Dist: packaging>=24
|
|
24
|
+
Requires-Dist: pathspec>=0.12
|
|
25
|
+
Requires-Dist: platformdirs>=4
|
|
26
|
+
Requires-Dist: uv>=0.11.0
|
|
27
|
+
Provides-Extra: test
|
|
28
|
+
Requires-Dist: pytest>=8; extra == "test"
|
|
29
|
+
Requires-Dist: mypy>=1.10; extra == "test"
|
|
30
|
+
Requires-Dist: pyright>=1.1.400; extra == "test"
|
|
31
|
+
Requires-Dist: jsonschema>=4.23; extra == "test"
|
|
32
|
+
Provides-Extra: release
|
|
33
|
+
Requires-Dist: build>=1.2; extra == "release"
|
|
34
|
+
Requires-Dist: ruff>=0.12; extra == "release"
|
|
35
|
+
Requires-Dist: twine>=6; extra == "release"
|
|
36
|
+
|
|
37
|
+
<p align="center">
|
|
38
|
+
<img src="https://raw.githubusercontent.com/agent0ai/depfix/main/.github/readme-banner.svg" alt="Depfix — isolated Python dependency realms" width="100%" />
|
|
39
|
+
</p>
|
|
40
|
+
|
|
41
|
+
<h3 align="center">Import the version you need. Keep its dependencies in their own realm.</h3>
|
|
42
|
+
|
|
43
|
+
<p align="center">
|
|
44
|
+
Depfix lets one Python process load multiple pure-Python package versions side by side—even when their transitive dependencies conflict.
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
<p align="center">
|
|
48
|
+
<a href="https://pypi.org/project/depfix/"><img alt="PyPI" src="https://img.shields.io/pypi/v/depfix?style=for-the-badge&logo=pypi&logoColor=white" /></a>
|
|
49
|
+
<a href="https://pypi.org/project/depfix/"><img alt="Python 3.11+" src="https://img.shields.io/pypi/pyversions/depfix?style=for-the-badge&logo=python&logoColor=white" /></a>
|
|
50
|
+
<a href="https://github.com/agent0ai/depfix/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/agent0ai/depfix/ci.yml?branch=main&style=for-the-badge&label=CI" /></a>
|
|
51
|
+
<a href="https://github.com/sponsors/agent0ai"><img alt="Sponsor agent0ai" src="https://img.shields.io/badge/Sponsor-agent0ai-FF69B4?style=for-the-badge&logo=githubsponsors&logoColor=white" /></a>
|
|
52
|
+
</p>
|
|
53
|
+
|
|
54
|
+
<p align="center">
|
|
55
|
+
<a href="#quick-start">Quick start</a> ·
|
|
56
|
+
<a href="#why-depfix">Why Depfix</a> ·
|
|
57
|
+
<a href="#from-live-imports-to-locked-deployments">Deployment</a> ·
|
|
58
|
+
<a href="#documentation">Documentation</a> ·
|
|
59
|
+
<a href="https://github.com/agent0ai/depfix/issues">Issues</a>
|
|
60
|
+
</p>
|
|
61
|
+
|
|
62
|
+
```python
|
|
63
|
+
from depfix import import_module
|
|
64
|
+
|
|
65
|
+
idna_2 = import_module("idna==2.10")
|
|
66
|
+
idna_3 = import_module("idna==3.10")
|
|
67
|
+
|
|
68
|
+
assert idna_2.__depfix_version__ == "2.10"
|
|
69
|
+
assert idna_3.__depfix_version__ == "3.10"
|
|
70
|
+
assert idna_2 is not idna_3
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
No virtual-environment switching. No `sys.path` swapping. No installation into the active `site-packages`.
|
|
74
|
+
|
|
75
|
+
## Why Depfix
|
|
76
|
+
|
|
77
|
+
| Capability | Why it matters |
|
|
78
|
+
| --- | --- |
|
|
79
|
+
| **Side-by-side versions** | Load different versions of the same pure-Python distribution in one process. |
|
|
80
|
+
| **Dependency realms** | Each root keeps parent-specific dependency edges, so one graph does not flatten into another. |
|
|
81
|
+
| **Zero-configuration start** | Call `import_module()` directly; the first request prepares an exact graph in the user cache. |
|
|
82
|
+
| **Reproducible deployments** | Export deterministic manifests, install frozen state, and build complete air-gap bundles. |
|
|
83
|
+
| **Real package sources** | Resolve PyPI requirements, Git refs, URLs, local projects, wheels, and standalone Python files. |
|
|
84
|
+
| **Honest isolation** | Pure-Python realm loading is supported; unsafe native-extension loading fails explicitly. |
|
|
85
|
+
|
|
86
|
+
## Quick start
|
|
87
|
+
|
|
88
|
+
Install Depfix from PyPI:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
python -m pip install depfix
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Then ask for the package version your code needs:
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
from depfix import import_module, load_package
|
|
98
|
+
|
|
99
|
+
requests = import_module("requests>=2.31,<3")
|
|
100
|
+
tools = load_package("setuptools==75.0.0")
|
|
101
|
+
|
|
102
|
+
print(requests.__depfix_version__)
|
|
103
|
+
print(tools.name, tools.version, tools.module_names)
|
|
104
|
+
setuptools = tools.modules.setuptools
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`import_module()` returns exactly one canonical module. If a distribution exposes zero or several public roots, Depfix
|
|
108
|
+
raises a typed discovery error instead of guessing. Use `module=` to select a known root or `load_package()` to inspect a
|
|
109
|
+
lazy package handle.
|
|
110
|
+
|
|
111
|
+
Importing `depfix` itself performs no resolution, network, cache, or subprocess work. Those begin only when a load or
|
|
112
|
+
preparation API is called.
|
|
113
|
+
|
|
114
|
+
## How it works
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
requirement or source
|
|
118
|
+
→ exact uv-backed resolution
|
|
119
|
+
→ hash-pinned artifact graph
|
|
120
|
+
→ verified, content-addressed cache
|
|
121
|
+
→ parent-specific dependency realm
|
|
122
|
+
→ canonical synthetic module identity
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Realm modules live under graph- and node-qualified internal names. Their logical imports are resolved through declared
|
|
126
|
+
dependency edges, not the process's ambient third-party packages. Repeated calls for the same graph and logical module
|
|
127
|
+
return the same module object.
|
|
128
|
+
|
|
129
|
+
Depfix invokes uv through its documented executable interface. It does not import uv internals, vendor a uv binary, alter
|
|
130
|
+
the active environment, or add prepared package trees to global `sys.path`.
|
|
131
|
+
|
|
132
|
+
## Sources
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
import_module("requests>=2.31,<3")
|
|
136
|
+
import_module("pypi:requests[socks]~=2.32")
|
|
137
|
+
import_module("git:https://github.com/acme/sdk.git@v2.4.0")
|
|
138
|
+
import_module("url:https://packages.example/acme_sdk-2.4.0-py3-none-any.whl#sha256=<digest>")
|
|
139
|
+
import_module("file:../acme-sdk")
|
|
140
|
+
import_module("file:./helpers.py")
|
|
141
|
+
import_module("py:https://modules.example/utilities.py#sha256=<digest>")
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Standard PEP 508 direct references work too. Mutable Git refs are pinned to commits during export. Credentials remain in
|
|
145
|
+
external uv, index, keyring, or Git configuration and are never serialized into manifests.
|
|
146
|
+
|
|
147
|
+
## From live imports to locked deployments
|
|
148
|
+
|
|
149
|
+
Live mode is ideal for exploration: it resolves into the platform cache and creates no project files. When the graph must
|
|
150
|
+
be reproducible, prepare it explicitly:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
depfix export . --output .depfix/imports.lock
|
|
154
|
+
depfix install .depfix/imports.lock --frozen
|
|
155
|
+
DEPFIX_FROZEN=1 python application.py
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
`export` scans static `import_module()` and `load_package()` calls without executing application code. The manifest records
|
|
159
|
+
exact artifacts, hashes, target identity, import ownership, source provenance, policy, and parent-specific edges.
|
|
160
|
+
|
|
161
|
+
For disconnected targets:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
depfix bundle .depfix/imports.lock --output dist/application.depfixbundle --include-depfix-runtime
|
|
165
|
+
depfix install dist/application.depfixbundle --offline --frozen
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
| Mode | Resolution | Network | Project state |
|
|
169
|
+
| --- | --- | --- | --- |
|
|
170
|
+
| **Live** | On the first request | Allowed by policy | None |
|
|
171
|
+
| **Prepared** | During export | Optional during install | Deterministic manifest |
|
|
172
|
+
| **Air-gapped** | On the connected build host | Forbidden on target | Manifest + exact bundle |
|
|
173
|
+
|
|
174
|
+
## IDE support
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
depfix ide sync .depfix/imports.lock
|
|
178
|
+
depfix ide configure .depfix/imports.lock
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Depfix generates a physical `depfix_imports` package with graph-specific stubs, editor snippets, and source maps. Distinct
|
|
182
|
+
aliases keep distinct version-specific APIs while runtime loading continues to use canonical realm identities.
|
|
183
|
+
|
|
184
|
+
## Boundaries worth knowing
|
|
185
|
+
|
|
186
|
+
Depfix is an alpha release focused on CPython 3.11–3.13. Its isolation boundary prevents dependency-graph collisions; it
|
|
187
|
+
is not a sandbox for untrusted Python code.
|
|
188
|
+
|
|
189
|
+
Pure-Python wheels, namespace packages, resources, relative and circular imports, selected metadata access, threads, and
|
|
190
|
+
spawn workers are covered. Native extensions can carry process-global ABI and library state that cannot be made safe by
|
|
191
|
+
renaming a module. Depfix rejects unknown native loading with `NativeIsolationRequired`; use an application-owned worker
|
|
192
|
+
process when native code is required.
|
|
193
|
+
|
|
194
|
+
## Documentation
|
|
195
|
+
|
|
196
|
+
| I want to… | Start here |
|
|
197
|
+
| --- | --- |
|
|
198
|
+
| Get a project running | [Getting started](https://github.com/agent0ai/depfix/blob/main/docs/guides/getting-started.md) |
|
|
199
|
+
| Understand dependency isolation | [Import realms](https://github.com/agent0ai/depfix/tree/main/docs/concepts/import-realms) |
|
|
200
|
+
| Follow resolution and package discovery | [Resolution](https://github.com/agent0ai/depfix/tree/main/docs/concepts/resolution) |
|
|
201
|
+
| Prepare containers or offline systems | [Deployment](https://github.com/agent0ai/depfix/tree/main/docs/concepts/deployment) |
|
|
202
|
+
| Inspect the Python surface | [Python API](https://github.com/agent0ai/depfix/blob/main/docs/reference/api.md) |
|
|
203
|
+
| Inspect every command | [CLI reference](https://github.com/agent0ai/depfix/blob/main/docs/reference/cli.md) |
|
|
204
|
+
| Review security assumptions | [Threat model](https://github.com/agent0ai/depfix/blob/main/docs/operations/threat-model.md) |
|
|
205
|
+
| Diagnose a failure | [Troubleshooting](https://github.com/agent0ai/depfix/blob/main/docs/guides/troubleshooting.md) |
|
|
206
|
+
|
|
207
|
+
Browse the complete [documentation map](https://github.com/agent0ai/depfix/tree/main/docs).
|
|
208
|
+
|
|
209
|
+
## Created by agent0ai
|
|
210
|
+
|
|
211
|
+
Depfix is an open-source project by [agent0ai](https://github.com/agent0ai), creator of
|
|
212
|
+
[Agent Zero](https://github.com/agent0ai/agent-zero), [Space Agent](https://github.com/agent0ai/space-agent), and
|
|
213
|
+
[DOX](https://github.com/agent0ai/dox).
|
|
214
|
+
|
|
215
|
+
- Found a bug or compatibility gap? [Open an issue](https://github.com/agent0ai/depfix/issues).
|
|
216
|
+
- Want to contribute? Read [CONTRIBUTING.md](https://github.com/agent0ai/depfix/blob/main/CONTRIBUTING.md).
|
|
217
|
+
- Preparing a release? Follow [RELEASING.md](https://github.com/agent0ai/depfix/blob/main/RELEASING.md).
|
|
218
|
+
- Want to support agent0ai's work? [Sponsor on GitHub](https://github.com/sponsors/agent0ai).
|
|
219
|
+
|
|
220
|
+
## License status
|
|
221
|
+
|
|
222
|
+
No license has been selected yet. Until the owner adds an explicit `LICENSE`, the source is publicly visible but no open-
|
|
223
|
+
source license grant should be assumed. License selection remains a blocker for the first public release.
|
depfix-0.1.0/README.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/agent0ai/depfix/main/.github/readme-banner.svg" alt="Depfix — isolated Python dependency realms" width="100%" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h3 align="center">Import the version you need. Keep its dependencies in their own realm.</h3>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
Depfix lets one Python process load multiple pure-Python package versions side by side—even when their transitive dependencies conflict.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="https://pypi.org/project/depfix/"><img alt="PyPI" src="https://img.shields.io/pypi/v/depfix?style=for-the-badge&logo=pypi&logoColor=white" /></a>
|
|
13
|
+
<a href="https://pypi.org/project/depfix/"><img alt="Python 3.11+" src="https://img.shields.io/pypi/pyversions/depfix?style=for-the-badge&logo=python&logoColor=white" /></a>
|
|
14
|
+
<a href="https://github.com/agent0ai/depfix/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/agent0ai/depfix/ci.yml?branch=main&style=for-the-badge&label=CI" /></a>
|
|
15
|
+
<a href="https://github.com/sponsors/agent0ai"><img alt="Sponsor agent0ai" src="https://img.shields.io/badge/Sponsor-agent0ai-FF69B4?style=for-the-badge&logo=githubsponsors&logoColor=white" /></a>
|
|
16
|
+
</p>
|
|
17
|
+
|
|
18
|
+
<p align="center">
|
|
19
|
+
<a href="#quick-start">Quick start</a> ·
|
|
20
|
+
<a href="#why-depfix">Why Depfix</a> ·
|
|
21
|
+
<a href="#from-live-imports-to-locked-deployments">Deployment</a> ·
|
|
22
|
+
<a href="#documentation">Documentation</a> ·
|
|
23
|
+
<a href="https://github.com/agent0ai/depfix/issues">Issues</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
from depfix import import_module
|
|
28
|
+
|
|
29
|
+
idna_2 = import_module("idna==2.10")
|
|
30
|
+
idna_3 = import_module("idna==3.10")
|
|
31
|
+
|
|
32
|
+
assert idna_2.__depfix_version__ == "2.10"
|
|
33
|
+
assert idna_3.__depfix_version__ == "3.10"
|
|
34
|
+
assert idna_2 is not idna_3
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
No virtual-environment switching. No `sys.path` swapping. No installation into the active `site-packages`.
|
|
38
|
+
|
|
39
|
+
## Why Depfix
|
|
40
|
+
|
|
41
|
+
| Capability | Why it matters |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| **Side-by-side versions** | Load different versions of the same pure-Python distribution in one process. |
|
|
44
|
+
| **Dependency realms** | Each root keeps parent-specific dependency edges, so one graph does not flatten into another. |
|
|
45
|
+
| **Zero-configuration start** | Call `import_module()` directly; the first request prepares an exact graph in the user cache. |
|
|
46
|
+
| **Reproducible deployments** | Export deterministic manifests, install frozen state, and build complete air-gap bundles. |
|
|
47
|
+
| **Real package sources** | Resolve PyPI requirements, Git refs, URLs, local projects, wheels, and standalone Python files. |
|
|
48
|
+
| **Honest isolation** | Pure-Python realm loading is supported; unsafe native-extension loading fails explicitly. |
|
|
49
|
+
|
|
50
|
+
## Quick start
|
|
51
|
+
|
|
52
|
+
Install Depfix from PyPI:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
python -m pip install depfix
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Then ask for the package version your code needs:
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
from depfix import import_module, load_package
|
|
62
|
+
|
|
63
|
+
requests = import_module("requests>=2.31,<3")
|
|
64
|
+
tools = load_package("setuptools==75.0.0")
|
|
65
|
+
|
|
66
|
+
print(requests.__depfix_version__)
|
|
67
|
+
print(tools.name, tools.version, tools.module_names)
|
|
68
|
+
setuptools = tools.modules.setuptools
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`import_module()` returns exactly one canonical module. If a distribution exposes zero or several public roots, Depfix
|
|
72
|
+
raises a typed discovery error instead of guessing. Use `module=` to select a known root or `load_package()` to inspect a
|
|
73
|
+
lazy package handle.
|
|
74
|
+
|
|
75
|
+
Importing `depfix` itself performs no resolution, network, cache, or subprocess work. Those begin only when a load or
|
|
76
|
+
preparation API is called.
|
|
77
|
+
|
|
78
|
+
## How it works
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
requirement or source
|
|
82
|
+
→ exact uv-backed resolution
|
|
83
|
+
→ hash-pinned artifact graph
|
|
84
|
+
→ verified, content-addressed cache
|
|
85
|
+
→ parent-specific dependency realm
|
|
86
|
+
→ canonical synthetic module identity
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Realm modules live under graph- and node-qualified internal names. Their logical imports are resolved through declared
|
|
90
|
+
dependency edges, not the process's ambient third-party packages. Repeated calls for the same graph and logical module
|
|
91
|
+
return the same module object.
|
|
92
|
+
|
|
93
|
+
Depfix invokes uv through its documented executable interface. It does not import uv internals, vendor a uv binary, alter
|
|
94
|
+
the active environment, or add prepared package trees to global `sys.path`.
|
|
95
|
+
|
|
96
|
+
## Sources
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
import_module("requests>=2.31,<3")
|
|
100
|
+
import_module("pypi:requests[socks]~=2.32")
|
|
101
|
+
import_module("git:https://github.com/acme/sdk.git@v2.4.0")
|
|
102
|
+
import_module("url:https://packages.example/acme_sdk-2.4.0-py3-none-any.whl#sha256=<digest>")
|
|
103
|
+
import_module("file:../acme-sdk")
|
|
104
|
+
import_module("file:./helpers.py")
|
|
105
|
+
import_module("py:https://modules.example/utilities.py#sha256=<digest>")
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Standard PEP 508 direct references work too. Mutable Git refs are pinned to commits during export. Credentials remain in
|
|
109
|
+
external uv, index, keyring, or Git configuration and are never serialized into manifests.
|
|
110
|
+
|
|
111
|
+
## From live imports to locked deployments
|
|
112
|
+
|
|
113
|
+
Live mode is ideal for exploration: it resolves into the platform cache and creates no project files. When the graph must
|
|
114
|
+
be reproducible, prepare it explicitly:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
depfix export . --output .depfix/imports.lock
|
|
118
|
+
depfix install .depfix/imports.lock --frozen
|
|
119
|
+
DEPFIX_FROZEN=1 python application.py
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`export` scans static `import_module()` and `load_package()` calls without executing application code. The manifest records
|
|
123
|
+
exact artifacts, hashes, target identity, import ownership, source provenance, policy, and parent-specific edges.
|
|
124
|
+
|
|
125
|
+
For disconnected targets:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
depfix bundle .depfix/imports.lock --output dist/application.depfixbundle --include-depfix-runtime
|
|
129
|
+
depfix install dist/application.depfixbundle --offline --frozen
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
| Mode | Resolution | Network | Project state |
|
|
133
|
+
| --- | --- | --- | --- |
|
|
134
|
+
| **Live** | On the first request | Allowed by policy | None |
|
|
135
|
+
| **Prepared** | During export | Optional during install | Deterministic manifest |
|
|
136
|
+
| **Air-gapped** | On the connected build host | Forbidden on target | Manifest + exact bundle |
|
|
137
|
+
|
|
138
|
+
## IDE support
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
depfix ide sync .depfix/imports.lock
|
|
142
|
+
depfix ide configure .depfix/imports.lock
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Depfix generates a physical `depfix_imports` package with graph-specific stubs, editor snippets, and source maps. Distinct
|
|
146
|
+
aliases keep distinct version-specific APIs while runtime loading continues to use canonical realm identities.
|
|
147
|
+
|
|
148
|
+
## Boundaries worth knowing
|
|
149
|
+
|
|
150
|
+
Depfix is an alpha release focused on CPython 3.11–3.13. Its isolation boundary prevents dependency-graph collisions; it
|
|
151
|
+
is not a sandbox for untrusted Python code.
|
|
152
|
+
|
|
153
|
+
Pure-Python wheels, namespace packages, resources, relative and circular imports, selected metadata access, threads, and
|
|
154
|
+
spawn workers are covered. Native extensions can carry process-global ABI and library state that cannot be made safe by
|
|
155
|
+
renaming a module. Depfix rejects unknown native loading with `NativeIsolationRequired`; use an application-owned worker
|
|
156
|
+
process when native code is required.
|
|
157
|
+
|
|
158
|
+
## Documentation
|
|
159
|
+
|
|
160
|
+
| I want to… | Start here |
|
|
161
|
+
| --- | --- |
|
|
162
|
+
| Get a project running | [Getting started](https://github.com/agent0ai/depfix/blob/main/docs/guides/getting-started.md) |
|
|
163
|
+
| Understand dependency isolation | [Import realms](https://github.com/agent0ai/depfix/tree/main/docs/concepts/import-realms) |
|
|
164
|
+
| Follow resolution and package discovery | [Resolution](https://github.com/agent0ai/depfix/tree/main/docs/concepts/resolution) |
|
|
165
|
+
| Prepare containers or offline systems | [Deployment](https://github.com/agent0ai/depfix/tree/main/docs/concepts/deployment) |
|
|
166
|
+
| Inspect the Python surface | [Python API](https://github.com/agent0ai/depfix/blob/main/docs/reference/api.md) |
|
|
167
|
+
| Inspect every command | [CLI reference](https://github.com/agent0ai/depfix/blob/main/docs/reference/cli.md) |
|
|
168
|
+
| Review security assumptions | [Threat model](https://github.com/agent0ai/depfix/blob/main/docs/operations/threat-model.md) |
|
|
169
|
+
| Diagnose a failure | [Troubleshooting](https://github.com/agent0ai/depfix/blob/main/docs/guides/troubleshooting.md) |
|
|
170
|
+
|
|
171
|
+
Browse the complete [documentation map](https://github.com/agent0ai/depfix/tree/main/docs).
|
|
172
|
+
|
|
173
|
+
## Created by agent0ai
|
|
174
|
+
|
|
175
|
+
Depfix is an open-source project by [agent0ai](https://github.com/agent0ai), creator of
|
|
176
|
+
[Agent Zero](https://github.com/agent0ai/agent-zero), [Space Agent](https://github.com/agent0ai/space-agent), and
|
|
177
|
+
[DOX](https://github.com/agent0ai/dox).
|
|
178
|
+
|
|
179
|
+
- Found a bug or compatibility gap? [Open an issue](https://github.com/agent0ai/depfix/issues).
|
|
180
|
+
- Want to contribute? Read [CONTRIBUTING.md](https://github.com/agent0ai/depfix/blob/main/CONTRIBUTING.md).
|
|
181
|
+
- Preparing a release? Follow [RELEASING.md](https://github.com/agent0ai/depfix/blob/main/RELEASING.md).
|
|
182
|
+
- Want to support agent0ai's work? [Sponsor on GitHub](https://github.com/sponsors/agent0ai).
|
|
183
|
+
|
|
184
|
+
## License status
|
|
185
|
+
|
|
186
|
+
No license has been selected yet. Until the owner adds an explicit `LICENSE`, the source is publicly visible but no open-
|
|
187
|
+
source license grant should be assumed. License selection remains a blocker for the first public release.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Release checklist
|
|
2
|
+
|
|
3
|
+
No command or workflow in this repository publishes automatically. The first accepted upload is the definitive PyPI name
|
|
4
|
+
allocation.
|
|
5
|
+
|
|
6
|
+
## Owner-controlled blockers
|
|
7
|
+
|
|
8
|
+
- [ ] Choose and add an owner-approved `LICENSE`; update PEP 621 license metadata and classifiers.
|
|
9
|
+
- [x] Record `agent0ai` as project owner in package metadata.
|
|
10
|
+
- [x] Record the owner-specified canonical source, documentation, issue, and changelog URLs.
|
|
11
|
+
- [ ] Apply [the prepared GitHub About metadata](.github/REPOSITORY_METADATA.md) in repository settings.
|
|
12
|
+
- [ ] Run `python scripts/name_preflight.py`; confirm the normalized `depfix` name with PyPI. A missing page is not a
|
|
13
|
+
reservation guarantee. Do not upload an empty placeholder.
|
|
14
|
+
- [ ] Configure protected `testpypi` and `pypi` repository environments with required reviewers.
|
|
15
|
+
- [ ] Configure matching TestPyPI/PyPI trusted publishers for the workflow and environment names.
|
|
16
|
+
- [ ] Add the private security reporting contact to `SECURITY.md`.
|
|
17
|
+
|
|
18
|
+
## Candidate validation
|
|
19
|
+
|
|
20
|
+
- [ ] Update `_version.py` and `CHANGELOG.md`; confirm no unintended API/manifest format change.
|
|
21
|
+
- [ ] Run `python scripts/release_check.py` on a clean connected host.
|
|
22
|
+
- [ ] Review the printed wheel/sdist SHA-256 values and archive inventories.
|
|
23
|
+
- [ ] Confirm the wheel is `py3-none-any`, contains `py.typed` and schemas, and contains no tests, caches, credentials,
|
|
24
|
+
third-party packages, uv binaries, or project manifests.
|
|
25
|
+
- [ ] Install the exact wheel locally and verify `import depfix`, `depfix --help`, `depfix --version`, uv discovery, one live
|
|
26
|
+
import, and one export/install/offline run.
|
|
27
|
+
- [ ] Confirm CI passes Windows, macOS, Linux, supported Python versions, minimum uv, current uv, build, and clean-wheel jobs.
|
|
28
|
+
|
|
29
|
+
## TestPyPI (explicit manual workflow)
|
|
30
|
+
|
|
31
|
+
- [ ] Invoke `Publish TestPyPI` manually for the reviewed commit.
|
|
32
|
+
- [ ] Install from TestPyPI while sourcing dependencies from PyPI, then repeat CLI/live/prepared checks.
|
|
33
|
+
- [ ] Verify rendered metadata, README, files, and dependency declarations.
|
|
34
|
+
|
|
35
|
+
## PyPI (explicit manual workflow)
|
|
36
|
+
|
|
37
|
+
- [ ] Create and push the deliberate signed/annotated release tag according to owner policy.
|
|
38
|
+
- [ ] Invoke `Publish PyPI` manually with that tag and pass the protected-environment approval.
|
|
39
|
+
- [ ] Verify the PyPI page, artifact hashes, `pip install depfix`, `depfix --version`, uv installation, and a basic live import.
|
|
40
|
+
- [ ] Create the repository-host release from the same tag and changelog entry.
|
depfix-0.1.0/SECURITY.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Security policy
|
|
2
|
+
|
|
3
|
+
## Supported versions
|
|
4
|
+
|
|
5
|
+
Until the first public release, only the current `0.1.x` source line receives security fixes. This document will be updated
|
|
6
|
+
when another maintained line exists.
|
|
7
|
+
|
|
8
|
+
## Reporting
|
|
9
|
+
|
|
10
|
+
There is no owner-approved private security contact in the repository. Before publication, the owner must add the intended
|
|
11
|
+
private reporting channel. Until then, do not post live credentials, private index URLs, proprietary packages, or exploit
|
|
12
|
+
details in a public issue; contact the repository owner through an already established private channel.
|
|
13
|
+
|
|
14
|
+
Include the Depfix version, Python/uv versions, platform, source kind, frozen/offline state, and a minimal redacted
|
|
15
|
+
reproduction. `depfix doctor --json` is useful after review.
|
|
16
|
+
|
|
17
|
+
## Scope
|
|
18
|
+
|
|
19
|
+
Relevant issues include artifact/manifest/bundle verification bypasses, archive traversal or links, credential disclosure,
|
|
20
|
+
unexpected network access in offline mode, resolution in frozen mode, cache race/collision attacks, ambient dependency
|
|
21
|
+
leaks, and unsafe native-module loading. Malicious behavior inherent to intentionally executed third-party Python code is
|
|
22
|
+
outside the isolation claim, though validation escapes remain in scope.
|
|
23
|
+
|
|
24
|
+
See [the threat model](docs/operations/threat-model.md) for controls and residual risks.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Documentation
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
- Explain Depfix to users, operators, contributors, and runtime implementers beyond the README quick path.
|
|
6
|
+
|
|
7
|
+
## Ownership
|
|
8
|
+
|
|
9
|
+
- This tree owns API, CLI, architecture, resolution, realm, deployment, security, migration, troubleshooting, verification, and research documentation.
|
|
10
|
+
|
|
11
|
+
## Local Contracts
|
|
12
|
+
|
|
13
|
+
- Describe shipped behavior in the present tense and label proposals or experiments explicitly.
|
|
14
|
+
- Keep commands executable from the repository root unless a document says otherwise.
|
|
15
|
+
- Link to the canonical contract rather than duplicating long normative details.
|
|
16
|
+
|
|
17
|
+
## Work Guidance
|
|
18
|
+
|
|
19
|
+
- Organize durable product concepts into named folders with their own DOX contracts.
|
|
20
|
+
- Keep the root README concise; move deep operational and internal explanations here.
|
|
21
|
+
|
|
22
|
+
## Verification
|
|
23
|
+
|
|
24
|
+
- Check relative links and run the commands a changed guide promises when practical.
|
|
25
|
+
|
|
26
|
+
## Child DOX Index
|
|
27
|
+
|
|
28
|
+
- [`concepts/AGENTS.md`](concepts/AGENTS.md) — core technical concepts, each in an independent folder.
|
|
29
|
+
- [`guides/AGENTS.md`](guides/AGENTS.md) — task-oriented onboarding and troubleshooting.
|
|
30
|
+
- [`operations/AGENTS.md`](operations/AGENTS.md) — security and verification procedures.
|
|
31
|
+
- [`project/AGENTS.md`](project/AGENTS.md) — implementation records and historical baselines.
|
|
32
|
+
- [`reference/AGENTS.md`](reference/AGENTS.md) — exact Python and CLI interfaces.
|
|
33
|
+
- [`research/AGENTS.md`](research/AGENTS.md) — explicitly non-shipping design research.
|
|
34
|
+
|
|
35
|
+
`README.md` is the human documentation index and remains owned by this parent.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Depfix documentation
|
|
2
|
+
|
|
3
|
+
Start with the [getting-started guide](guides/getting-started.md), then use this map to go deeper.
|
|
4
|
+
|
|
5
|
+
| I want to… | Start here |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| Load two versions in one process | [Import realms](concepts/import-realms/) |
|
|
8
|
+
| Understand how a request becomes an exact graph | [Resolution](concepts/resolution/) |
|
|
9
|
+
| Understand downloaded and extracted package state | [Artifacts and cache](concepts/artifacts-and-cache/) |
|
|
10
|
+
| Prepare reproducible or offline execution | [Deployment](concepts/deployment/) |
|
|
11
|
+
| Inspect the lock format | [Resolved manifests](concepts/manifests/) |
|
|
12
|
+
| Look up Python calls | [Python API](reference/api.md) |
|
|
13
|
+
| Look up commands | [CLI reference](reference/cli.md) |
|
|
14
|
+
| Fix an error | [Troubleshooting](guides/troubleshooting.md) |
|
|
15
|
+
| Review safety boundaries | [Threat model](operations/threat-model.md) |
|
|
16
|
+
| Validate a change or release | [Verification](operations/verification.md) |
|
|
17
|
+
|
|
18
|
+
The [research area](research/) contains forward-looking import-system work and is not a promise of shipped behavior. The
|
|
19
|
+
[project records](project/) preserve implementation audits without mixing historical detail into user guidance.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Core concepts
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
- Separate Depfix's stable technical ideas into independently understandable and maintainable domains.
|
|
6
|
+
|
|
7
|
+
## Ownership
|
|
8
|
+
|
|
9
|
+
- Each child folder owns one concept, its boundaries, and links to deeper reference material.
|
|
10
|
+
|
|
11
|
+
## Local Contracts
|
|
12
|
+
|
|
13
|
+
- Concept docs explain why the system is shaped this way; references define exact syntax and guides define tasks.
|
|
14
|
+
- A concept folder must remain useful when read independently with the parent documentation index.
|
|
15
|
+
|
|
16
|
+
## Work Guidance
|
|
17
|
+
|
|
18
|
+
- Keep concept boundaries narrow and add cross-links where a workflow crosses domains.
|
|
19
|
+
|
|
20
|
+
## Verification
|
|
21
|
+
|
|
22
|
+
- Compare concept claims with implementation tests and the current public API.
|
|
23
|
+
|
|
24
|
+
## Child DOX Index
|
|
25
|
+
|
|
26
|
+
- [`artifacts-and-cache/AGENTS.md`](artifacts-and-cache/AGENTS.md) — immutable content, verification, and materialization.
|
|
27
|
+
- [`deployment/AGENTS.md`](deployment/AGENTS.md) — live, prepared, and air-gapped operation.
|
|
28
|
+
- [`import-realms/AGENTS.md`](import-realms/AGENTS.md) — runtime identity and dependency isolation.
|
|
29
|
+
- [`manifests/AGENTS.md`](manifests/AGENTS.md) — deterministic resolved graph records.
|
|
30
|
+
- [`resolution/AGENTS.md`](resolution/AGENTS.md) — source normalization, selection, inspection, and uv.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Artifacts and cache
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
- Document immutable package content, integrity checks, and safe local materialization.
|
|
6
|
+
|
|
7
|
+
## Ownership
|
|
8
|
+
|
|
9
|
+
- This folder owns the content-addressed cache model and artifact lifecycle.
|
|
10
|
+
|
|
11
|
+
## Local Contracts
|
|
12
|
+
|
|
13
|
+
- Blob identity is SHA-256 content identity; completed extracted targets are environment-specific and read-only.
|
|
14
|
+
- Cache mutation uses bounded input, locks, temporary construction, verification, and atomic promotion.
|
|
15
|
+
|
|
16
|
+
## Work Guidance
|
|
17
|
+
|
|
18
|
+
- Distinguish immutable artifacts from realm nodes and request-resolution entries.
|
|
19
|
+
|
|
20
|
+
## Verification
|
|
21
|
+
|
|
22
|
+
- Use cache, wheel-safety, bundle, and concurrency tests for changed claims.
|
|
23
|
+
|
|
24
|
+
## Child DOX Index
|