Repository guide · getting started · v3
psf / black · Getting started
Platform metadata describes an uncompromising Python code formatter under an MIT license, 482 analyzed files, latest release 26.5.1. The analysis lists 18 entrypoint records, 17 with __main__ guards, and bounded paths that stop at unresolved boundaries. Dependency records are empty because only requirements-style manifests are parsed, and no installation or run commands are verified.
- Original repository
- psf/black
- License
- MIT · open-source license
- Analyzed revision · last verified
- 20622e1259c29bda81831962ace1348ba1921c84 ·
Newer revision observed; the code this guide cites is unchanged. The default branch moved to 5fe7881e6e40, checked 2026-10-03. A revision diff of 48 changed files found no change in the code regions this guide cites. The guide still describes revision 20622e1259c2; repository-wide counts (files, calls and so on) refer to that revision.
Getting started with psf/black: metadata, entrypoints, manifests
Terms used on this page
- Entrypoint record
- A file the analyzer marks as a place where execution can start. When it carries a __main__ guard excerpt, the file contains an if __name__ == "__main__": block and the excerpt shows what that block calls; without an excerpt, the file was flagged by its name only.
- Bounded static execution path
- A call chain reconstructed from the source code without running it, stopped after a fixed number of steps. It shows how far the code can be followed on paper, not what happens at run time.
- Unresolved boundary
- Where a static path stops because the next call goes into an external library or cannot be resolved without running the code. It marks the edge of this analysis, not a defect in the repository.
- Static relations
- Calls and imports found in the source. "External or unresolved" relations point outside the analyzed files.
- Module role
- The analyzer's label for a file, inferred from how many calls go in and out (for example core, entry/orchestration, leaf). It describes a position in the call graph, not the authors' design.
- Test-like files
- Files whose names or locations look like tests. This analysis counts them; it does not run them.
- Observed · inferred · author-claimed · unresolved
- How each statement is supported: read directly from the analyzed files; derived by the analyzer from them; stated by the repository's authors (metadata, README); or not established by this analysis.
- Verified
- Two uses on these pages. In an analyzer record ("verified provenance", "a verified entrypoint") it means the record was read directly from the analyzed files, which these guides call observed; for an entrypoint, the __main__ guard text is present. Since the analyzer fix of 2026-10-04, a file that only has an entrypoint-like name such as cli.py or main.py is recorded as inferred; guides analyzed before that still call such a file verified, and it is still only a guess about how the file is used. It does not mean the code was run or tested. "Last verified" is the date the guide last passed the lab's checks against the analysis record of the stated revision; it is not a review of the repository itself.
What you are looking at
The metadata also records concrete facts: the primary language is Python, and almost all tracked language bytes are Python — 5,440,093 of about 5.46 million — with small Vim Script, Jupyter Notebook and Dockerfile shares. The license is recorded as MIT, with origin given as both the GitHub API and a repository file. The latest release is 26.5.1, published 2026-05-18, and the repository counted 41,844 stargazers on 2026-09-14. The analyzer's maturity signals list 482 analyzed files, 326 test-like files, 7 manifest files, 9,339 static relation edges and 176 bounded execution paths.
What it needs — and what this packet cannot show
If your question is what to install, this packet cannot answer it. It contains no dependency records; dependency records come only from requirements-style manifests parsed by analyzer v0.10, and none were parsed for this repository. pyproject.toml dependency tables are not parsed, so declared dependencies and version constraints are not listed — even though pyproject.toml is present and classified as a project-level important file. The maturity signals count 7 manifest files in the inventory, but with no parsed-manifest records their contents are not reflected here. Because install, run and build inference is partial and installation commands are not verified, the asset also cannot name packages or versions to install.
How it starts
Eighteen entrypoint records are listed: seventeen whose excerpts show a Python __main__ execution guard — the excerpt fields of those records are where you can see what such a guard looks like — plus one filename-heuristic candidate, action/main.py (the analysis labels it a filename-heuristic candidate, based on the filename rather than a guard excerpt). In the src tree, the package inits src/black/__init__.py and src/blackd/__init__.py each guard a call to patched_main(). Under src/blib2to3/pgen2, driver.py ends with sys.exit(int(not main())), while literals.py and tokenize.py carry smaller, test-oriented guards. In scripts/, diff_shades_gha_helper.py, generate_schema.py and make_width_table.py guard a call to main(); release.py ends with sys.exit(main()) and release_tests.py calls unittest.main(). scripts/fuzz.py's guard runs test_idempotent_any_syntactically_valid_python() and, when the Atheris fuzzing library is available, coverage-guided fuzzing. Guard-bearing records also include tests/test_tokenize.py, whose guard reads stdin, tokenizes it and prints an assert_tokenizes assertion, and paths under tests/data/cases/. The reconstruction tallies 18 entrypoints and 176 bounded execution paths; the five bounded paths listed for action/main.py are execution-path records, and their steps show them terminating immediately at unresolved external boundaries such as Path and os.getenv. The analysis's limitations list records the general point behind that last term: dynamic behaviour of several kinds is not resolved by this static analysis. Runtime behaviour beyond these guard and bounded-path records, including how the package is invoked as an installed command, is not established by this analysis.
Where to look first
README.md, pyproject.toml and LICENSE are classified as project-level important files. The analyzer's learning-path claim advises starting from manifests and important symbols, then tracing the bounded execution path and inspecting unresolved boundaries before changing code; this packet cannot show the manifest contents that advice presupposes, so the advice is not actionable from this packet alone. Its modify-guide claim says to begin modification analysis at the detected entrypoint action/main.py, then verify downstream effects manually. By analyzed file count the top-level tree is tests (326), docs (48), src (48), .github (22), scripts (9), profiling (7), 19 files at the root, and action, plugin and autoload with one file each. src holds the guard-bearing package inits src/black/__init__.py and src/blackd/__init__.py and the src/blib2to3/pgen2 modules named in the entrypoint records. The 326 test-like files are roughly two thirds of all 482 analyzed files; the counts alone do not show what those files contain. docs/ spans 48 files, and entrypoint excerpts show two scripts opening CHANGES.md and docs files such as docs/usage_and_configuration/the_basics.md and docs/integrations/source_version_control.md.
What this analysis cannot tell you
This is a static analysis, and the packet documents the boundary itself. Installation, build and run commands are not verified, and install/run/build inference is partial, which is why this asset contains no commands. Only requirements-style manifests feed dependency records and pyproject.toml dependency tables are not parsed, so the dependency picture here is empty. README-derived statements are extracted line-by-line and may capture code lines instead of prose, so any README claim is author_claimed at best. Reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring and dynamic dispatch are not resolved. Of 9,339 static relation edges, the reconstruction counts only 813 resolved call relations, so most edges remain unresolved or external. The packet also contradicts itself: one teaching claim says no bounded static execution path is available, yet five bounded paths are listed for action/main.py and 176 overall, and the summary prose names scripts/check_pre_commit_rev_in_example.py as the main starting place while the teaching claims point to action/main.py. How the project is meant to be invoked day-to-day is not established.
What the project says about itself
The repository metadata describes the project as 'The uncompromising Python code formatter'; treat that as the authors' self-description, not an analysis finding. The homepage field points to a Black documentation site on Read the Docs, stable channel. Attached topics include formatter, codeformatter, python, pre-commit-hook, autopep8, yapf, gofmt, hacktoberfest and code.
What this analysis could not establish
The writing model's own notes on the analysis record. Identifiers such as lim_3, exec_* or claim_… name records of that analysis; the claims table cites the same records.
- dependency_records and dependency_manifests_parsed are empty; per lim_3 only requirements-style manifests are parsed, so this repository's declared dependencies are unknown to this asset.
- Teaching claim claim_4d30ade3e21e states no bounded static execution path is available, but the packet lists five bounded paths for action/main.py (exec_*) and counts 176 overall — internal inconsistency.
- repository_summary's inferred purpose names scripts/check_pre_commit_rev_in_example.py as the main starting place, while claim_227144a415af names action/main.py — internal inconsistency.
- Teaching claim claim_31723c5d9328 cites architecture_reconstruction, which does not appear as a record in this packet; the 18-entrypoint and 813-relation tallies rest on that claim alone.
- Three entrypoint records point into tests/data/cases/; whether their __main__ guards are runnable scripts or fixture content is not disambiguated by the records.
Claims and evidence — 38 claims, 38 supported by an independent verifier
Every substantive statement above is a claim bound to grounding IDs of the analyzed revision. Global grounding IDs are namespaced by the analysis run.
| Claim | Epistemic status | Verifier | Grounding (global IDs) |
|---|---|---|---|
| c1 The metadata's primary-language field says Python. | observed | supported | analysis_f07f1c5b3429400e:meta_primary_language |
| c2 Tracked language bytes are almost entirely Python (5,440,093 of about 5.46 million), with small Vim Script, Jupyter Notebook and Dockerfile shares. | observed | supported | analysis_f07f1c5b3429400e:meta_language_bytes |
| c3 The license is recorded as MIT, with origin given as both the GitHub API and a repository file. | observed | supported | analysis_f07f1c5b3429400e:meta_license |
| c4 The latest recorded release is 26.5.1, published 2026-05-18. | observed | supported | analysis_f07f1c5b3429400e:meta_latest_release |
| c5 The repository counted 41,844 stargazers on 2026-09-14. | observed | supported | analysis_f07f1c5b3429400e:meta_stars |
| c6 Maturity signals list 482 analyzed files, 326 test-like files, 7 manifest files, 9,339 static relation edges and 176 bounded execution paths. | inferred | supported | analysis_f07f1c5b3429400e:summary_repository |
| c7 This packet contains no dependency records; dependency records come only from requirements-style manifests parsed by analyzer v0.10, and none were parsed for this repository. | observed | supported | analysis_f07f1c5b3429400e:lim_3 |
| c8 pyproject.toml dependency tables are not parsed, so declared dependencies and version constraints cannot be listed from this packet. | observed | supported | analysis_f07f1c5b3429400e:lim_3 |
| c9 pyproject.toml is present and classified as a project-level important file. | observed | supported | analysis_f07f1c5b3429400e:important_3 |
| c10 Maturity signals count 7 manifest files in the inventory, but the analysis lists no parsed manifests, so their contents are not reflected here. | inferred | supported | analysis_f07f1c5b3429400e:summary_repository, analysis_f07f1c5b3429400e:lim_3 |
| c11 Install, run and build inference is partial, and installation commands are not verified by this analysis. | observed | supported | analysis_f07f1c5b3429400e:lim_2 |
| c12 The packet lists 18 entrypoint records: 17 whose excerpts show a Python __main__ execution guard, plus one filename-heuristic candidate, action/main.py. | observed | supported | analysis_f07f1c5b3429400e:py_entry_6375211a42e2, analysis_f07f1c5b3429400e:py_entry_49b6285f03c4, analysis_f07f1c5b3429400e:py_entry_a7be1b170db3, analysis_f07f1c5b3429400e:py_entry_45e63aec2981, analysis_f07f1c5b3429400e:py_entry_2d43f7cb959d, analysis_f07f1c5b3429400e:py_entry_078791731a33, analysis_f07f1c5b3429400e:py_entry_8be0649f8947, analysis_f07f1c5b3429400e:py_entry_f86a7886b9b8, analysis_f07f1c5b3429400e:py_entry_0ad4d7a9c321, analysis_f07f1c5b3429400e:py_entry_fce0ce2b9b79, analysis_f07f1c5b3429400e:py_entry_479e85cc920d, analysis_f07f1c5b3429400e:py_entry_fae1962d2b1e, analysis_f07f1c5b3429400e:py_entry_2525738168fe, analysis_f07f1c5b3429400e:py_entry_bde361c6e00a, analysis_f07f1c5b3429400e:py_entry_b93757a7ff5d, analysis_f07f1c5b3429400e:py_entry_ae3dafb0586c, analysis_f07f1c5b3429400e:py_entry_7a35d8e2430b, analysis_f07f1c5b3429400e:entry_1 |
| c13 The package inits src/black/__init__.py and src/blackd/__init__.py each carry a __main__ guard whose body calls patched_main(). | observed | supported | analysis_f07f1c5b3429400e:py_entry_fce0ce2b9b79, analysis_f07f1c5b3429400e:py_entry_479e85cc920d |
| c14 src/blib2to3/pgen2/driver.py's guard ends with sys.exit(int(not main())), src/blib2to3/pgen2/literals.py guards a call to test(), and src/blib2to3/pgen2/tokenize.py's guard, marked as testing, tokenizes stdin or a file named in argv. | observed | supported | analysis_f07f1c5b3429400e:py_entry_fae1962d2b1e, analysis_f07f1c5b3429400e:py_entry_2525738168fe, analysis_f07f1c5b3429400e:py_entry_bde361c6e00a |
| c15 In scripts/, diff_shades_gha_helper.py, generate_schema.py and make_width_table.py guard a call to main(); release.py's guard ends with sys.exit(main()) and release_tests.py's calls unittest.main(). | observed | supported | analysis_f07f1c5b3429400e:py_entry_a7be1b170db3, analysis_f07f1c5b3429400e:py_entry_2d43f7cb959d, analysis_f07f1c5b3429400e:py_entry_078791731a33, analysis_f07f1c5b3429400e:py_entry_8be0649f8947, analysis_f07f1c5b3429400e:py_entry_f86a7886b9b8 |
| c16 scripts/fuzz.py's guard runs test_idempotent_any_syntactically_valid_python() and, when the Atheris fuzzing library is available, coverage-guided fuzzing. | observed | supported | analysis_f07f1c5b3429400e:py_entry_45e63aec2981 |
| c17 Guard-bearing records also include tests/test_tokenize.py, whose guard reads stdin, tokenizes it and prints an assert_tokenizes assertion, and paths under tests/data/cases/. | observed | supported | analysis_f07f1c5b3429400e:py_entry_0ad4d7a9c321, analysis_f07f1c5b3429400e:py_entry_b93757a7ff5d, analysis_f07f1c5b3429400e:py_entry_ae3dafb0586c, analysis_f07f1c5b3429400e:py_entry_7a35d8e2430b |
| c18 The analyzer's reconstruction tallies 18 entrypoints and 176 bounded execution paths. | inferred | supported | analysis_f07f1c5b3429400e:claim_31723c5d9328, analysis_f07f1c5b3429400e:summary_repository |
| c19 All five bounded static paths listed for action/main.py terminate immediately at unresolved external boundaries such as Path and os.getenv. | inferred | supported | analysis_f07f1c5b3429400e:exec_bfd58df29904, analysis_f07f1c5b3429400e:exec_5daffbde25d6, analysis_f07f1c5b3429400e:exec_12046e1e9958, analysis_f07f1c5b3429400e:exec_dbb7510ec43e, analysis_f07f1c5b3429400e:exec_73307b610151 |
| c20 Runtime behaviour beyond these guard and bounded-path records, including how the package is invoked as an installed command, is not established by this analysis. | unresolved | supported | analysis_f07f1c5b3429400e:lim_1, analysis_f07f1c5b3429400e:lim_2 |
| c21 README.md, pyproject.toml and LICENSE are classified as project-level important files. | observed | supported | analysis_f07f1c5b3429400e:important_1, analysis_f07f1c5b3429400e:important_3, analysis_f07f1c5b3429400e:important_4 |
| c22 The analyzer's learning-path claim advises starting from manifests and important symbols, then tracing the bounded execution path and inspecting unresolved boundaries before changing code; this packet cannot show the manifest contents that advice presupposes, so the advice is not actionable from this packet alone. | inferred | supported | analysis_f07f1c5b3429400e:claim_e56db45165bf |
| c23 The modify-guide claim says to begin modification analysis at the detected entrypoint action/main.py, then verify downstream effects manually. | inferred | supported | analysis_f07f1c5b3429400e:claim_c3ece21fa115 |
| c24 Top-level directories by analyzed file count: tests (326), docs (48), src (48), .github (22), scripts (9), profiling (7), 19 at the root, and action, plugin and autoload with one file each. | inferred | supported | analysis_f07f1c5b3429400e:summary_repository |
| c25 src holds the guard-bearing package inits src/black/__init__.py and src/blackd/__init__.py and the src/blib2to3/pgen2 modules named in the entrypoint records. | observed | supported | analysis_f07f1c5b3429400e:py_entry_fce0ce2b9b79, analysis_f07f1c5b3429400e:py_entry_479e85cc920d, analysis_f07f1c5b3429400e:py_entry_fae1962d2b1e, analysis_f07f1c5b3429400e:py_entry_2525738168fe, analysis_f07f1c5b3429400e:py_entry_bde361c6e00a |
| c26 The 326 test-like files are roughly two thirds of all 482 analyzed files; the counts alone do not show what those files contain. | inferred | supported | analysis_f07f1c5b3429400e:summary_repository |
| c27 Entrypoint excerpts show scripts/check_version_in_basics_example.py and scripts/check_pre_commit_rev_in_example.py opening CHANGES.md and docs files such as docs/usage_and_configuration/the_basics.md and docs/integrations/source_version_control.md. | observed | supported | analysis_f07f1c5b3429400e:py_entry_49b6285f03c4, analysis_f07f1c5b3429400e:py_entry_6375211a42e2 |
| c28 Installation, build and run commands are not verified by this analysis; install/run/build inference is partial. | observed | supported | analysis_f07f1c5b3429400e:lim_2 |
| c29 Only requirements-style manifests feed dependency records and pyproject.toml dependency tables are not parsed, so the dependency picture here is empty. | observed | supported | analysis_f07f1c5b3429400e:lim_3 |
| c30 README claim extraction is line-based and may capture code lines instead of prose, so any README claim is author_claimed at best. | observed | supported | analysis_f07f1c5b3429400e:lim_4 |
| c31 The analysis is static only: reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring and dynamic dispatch are not resolved. | observed | supported | analysis_f07f1c5b3429400e:lim_1 |
| c32 The reconstruction counts 813 resolved static call relations against 9,339 static relation edges, so most edges remain unresolved or external. | inferred | supported | analysis_f07f1c5b3429400e:claim_31723c5d9328, analysis_f07f1c5b3429400e:summary_repository |
| c33 The packet contradicts itself on runtime flow: one teaching claim says no bounded static execution path is available, yet the packet lists five bounded paths for action/main.py and counts 176 overall. | inferred | supported | analysis_f07f1c5b3429400e:claim_4d30ade3e21e, analysis_f07f1c5b3429400e:exec_bfd58df29904, analysis_f07f1c5b3429400e:summary_repository |
| c34 The summary prose names scripts/check_pre_commit_rev_in_example.py as the main starting place, while the teaching claims and entrypoint candidate point to action/main.py — a second internal inconsistency. | inferred | supported | analysis_f07f1c5b3429400e:claim_227144a415af, analysis_f07f1c5b3429400e:summary_repository |
| c35 How the project is meant to be invoked day-to-day is not established by this packet. | unresolved | supported | analysis_f07f1c5b3429400e:lim_1, analysis_f07f1c5b3429400e:lim_2 |
| c36 The repository metadata describes the project as 'The uncompromising Python code formatter'. | author_claimed | supported | analysis_f07f1c5b3429400e:meta_description |
| c37 The metadata homepage points to a Black documentation site on Read the Docs, stable channel. | author_claimed | supported | analysis_f07f1c5b3429400e:meta_homepage |
| c38 Repository topics include formatter, codeformatter, python, pre-commit-hook, autopep8, yapf, gofmt, hacktoberfest and code. | author_claimed | supported | analysis_f07f1c5b3429400e:meta_topics |
Sources, rights and disclosure · attribution-license-templates/v0.1
Rights notice. Original repository hosted on GitHub. Repository source code, documentation, names, media, and related project materials remain subject to the rights of their respective authors, contributors, and other rights holders and to applicable repository license terms.
Platform notice. GitHub is the source hosting platform for the linked repository. GitHub and related marks are trademarks of GitHub, Inc. EVEMISS Technology is not affiliated with or endorsed by GitHub unless explicitly stated otherwise.
How this page is produced. This page was produced using revision-aware repository analysis and AI-assisted editorial tooling. Technical claims are tied to the analyzed repository revision and may be revalidated when the source repository changes.
AI-assisted analysis. Reviewed by EVEMISS Technology through human–AI collaborative review. · Report a rights concern · Back to the overview