PF — Package Floor
English | 简体中文
Find verified lower bounds for a Python package's direct dependencies.
What it does
PF discovers candidate versions in isolated environments, captures a ty static baseline from the highest versions your declarations allow, then runs the project's full test command. It returns an explainable, reproducible floor for each managed direct dependency.
The search unit is one installable package and one compatibility cell: exact uv target triple, CPython minor, and extra surface. On a frozen candidate snapshot, PF returns a coordinate-minimal vector that passed full tests. It does not claim a global minimum over the Cartesian product of dependencies, and it does not prove that unprobed versions or other combinations work. The product contract is D001.
Installation
uv tool install package-floor
pip install package-floor also works. The CLI name is pf. From a clone, uv run pf uses the local tree.
Quick Start
The target project needs static project.dependencies (and optional-dependencies, if used), a test dependency group (may be empty), and a [tool.pf] test command:
[tool.pf]
test-command = ["pytest"]
Then:
pf smoke
pf search
pf apply
smoke checks a fresh install at the newest allowed versions. search writes package-floor.json. apply updates the project's requirement floors from that report when authorization succeeds.
Commands
| Command | What it does |
|---|---|
pf smoke |
Fresh-install at newest allowed versions, capture a ty baseline, run the full tests. Does not search or write a report. |
pf check |
Verify the lower bounds the project already declares. Does not search or write a report. |
pf search |
Find verified floors and write package-floor.json. Never edits project metadata. |
pf explain |
Read the report and show floors, coverage, and apply blockers. |
pf apply |
Edit project metadata from an authorized report. --force only waives source-layer drift. |
pf minimize |
Run search, then the default apply. |
pf diagnose FAILURE_ID |
Explain one recorded rejection or indeterminate result. Offline; does not replay. |
pf merge REPORT ... --output PATH |
Combine compatible reports produced on different hosts. |
Typical workflow: pf smoke → pf search → pf explain → pf apply. Use pf minimize to search and apply in one step.
Requirements
- Omit
--packageto select the installable workspace root. An explicit value is a canonical distribution name of one workspace member, not a path. - Each process only runs the target that matches the current host. Merge other hosts with
pf merge. When this host succeeds and the only gaps are other hosts,pf searchexits 0 with an incomplete report so CI can collect artifacts. searchwritespackage-floor.json.applydoes not re-resolve dependencies or reruntyor tests.
Configuration
Persistent settings merge two layers: workspace-root [tool.pf], then the selected member's own [tool.pf]. CLI flags override that run only. Unknown keys fail. The values below are the omitted defaults except test-command, pythons, and platforms, which have no static default.
[tool.pf]
test-command = ["pytest"] # required argv; not a shell string; must not start with "uv run"
# pythons = ["3.10", "3.11", "3.12"] # CPython minors; omit to infer from requires-python
# platforms = ["x86_64-unknown-linux-gnu"] # uv target triples; omit to use the host
extra-policy = "each" # none | each | all
extra-surfaces = [] # extra extra-combinations, e.g. [["docs", "check"]]
search-space = "all" # all | current-major | current-minor
search-step = "minor" # major | minor | patch
search-prereleases = false
resolve-artifact = "wheel" # wheel | sdist | any
# managed-deps = ["rich"] # mutually exclusive with unmanaged-deps
# unmanaged-deps = ["build"] # omit both to manage every searchable direct dependency
test-group = "test" # may be empty
test-cwd = "package" # package | root
ty-args = []
max-cells = "auto" # auto or a positive integer; cell concurrency
ty-jobs = "auto" # ty process concurrency
test-jobs = "auto" # verifier concurrency
resolve-timeout = "10m"
ty-timeout = "10m"
test-timeout = "30m" # each timeout may be "none"
# [[tool.pf.dep]]
# name = "rich" # canonical distribution name
# search-space = "current-major" # or a PEP 440 specifier; omitted fields inherit the globals
# search-step = "minor"
# search-prereleases = false
search-space × search-step must be one of all × major|minor|patch, current-major × minor|patch, or current-minor × patch. Per-dependency [[tool.pf.dep]] rows replace as a whole table; omit dep on a member to inherit the root table, or set dep = [] to clear it. Full fields and exit codes are in D001.
Pinned tools
Released PF pins uv 0.12.5 and ty 0.0.74. The resolver protocol accepts only that uv version; other versions fail closed. Upgrading either tool requires re-qualification before the pin changes.
Documentation
- D001 — product and command contract: floors, commands, configuration, reports, and exit codes
- Engineering docs index: contract ownership and layout
License
Apache License 2.0. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file package_floor-0.1.0.tar.gz.
File metadata
- Download URL: package_floor-0.1.0.tar.gz
- Upload date:
- Size: 197.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
456ae534bb63d520ca0ce9ee0324408b7c42d86e40c9910333ba9c586bd034b2
|
|
| MD5 |
611ffaba1cf2574822f7842732a1cc3f
|
|
| BLAKE2b-256 |
b64367c560156f1e8f54a281a67b1c9140820779ebc693ea84126b406de785a8
|
Provenance
The following attestation bundles were made for package_floor-0.1.0.tar.gz:
Publisher:
publish.yml on BigTailFox/pf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
package_floor-0.1.0.tar.gz -
Subject digest:
456ae534bb63d520ca0ce9ee0324408b7c42d86e40c9910333ba9c586bd034b2 - Sigstore transparency entry: 2720644467
- Sigstore integration time:
-
Permalink:
BigTailFox/pf@684df373070fab081e8db195d434c722c731cc0b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/BigTailFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@684df373070fab081e8db195d434c722c731cc0b -
Trigger Event:
release
-
Statement type:
File details
Details for the file package_floor-0.1.0-py3-none-any.whl.
File metadata
- Download URL: package_floor-0.1.0-py3-none-any.whl
- Upload date:
- Size: 225.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5171cc22585698e044a918073c335d81f3f1c664baac8f655acfae606b3c4d89
|
|
| MD5 |
8ae089ec1ab311ffb37390d1432933a7
|
|
| BLAKE2b-256 |
ad6d55d5edd7f1b7ca78fca1866d781af14ca0189b15bb4426532a7f1b21e2b6
|
Provenance
The following attestation bundles were made for package_floor-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on BigTailFox/pf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
package_floor-0.1.0-py3-none-any.whl -
Subject digest:
5171cc22585698e044a918073c335d81f3f1c664baac8f655acfae606b3c4d89 - Sigstore transparency entry: 2720645238
- Sigstore integration time:
-
Permalink:
BigTailFox/pf@684df373070fab081e8db195d434c722c731cc0b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/BigTailFox
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@684df373070fab081e8db195d434c722c731cc0b -
Trigger Event:
release
-
Statement type: