dotslot
Let agents fill the blanks in a file, and prove they touched nothing else.
Mark the editable parts of a file with fixed-width slots. An agent or script fills them; dotslot check
proves the diff changed only the slots and that each slot kept its width, so columns and wraps stay put.
Works in Markdown, config files and code comments.
Owner: `<./owner:____________>` Status: `<./status~:____________>`
$ dotslot fill release.md --set owner=Adam --set status="ready for tag" -i
$ dotslot check release.md --git-base HEAD
release.md: fill-safe (2 slot(s) changed)
Install
| Surface | Install |
|---|---|
| CLI (Python 3.10+) | pip install dotslot (optional: pip install "dotslot[treesitter]") |
| CLI (Node 18+) | npx dotslot or npm i -g dotslot (scan, fill, check) |
| GitHub Action | uses: ao3575911/dotslot@v0.8.1 (Marketplace) |
| pre-commit | repo: https://github.com/ao3575911/dotslot, rev: v0.8.1 |
| MCP server | dotslot-mcp --root . (installed with the Python package) |
| Editor extension | Open VSX ao3575911.dotslot (VS Code, Cursor, VSCodium) |
Use
dotslot new owner --width 12 # print a correctly sized slot
dotslot scan FILE # list slots, widths, capacity
dotslot fill FILE --set owner=Adam -i # fill in place; width kept
dotslot check FILE --git-base HEAD # prove only slots changed (--allow a,b to narrow)
dotslot check FILE --base OLD --ignore-whitespace
dotslot repad FILE --base OLD -i # restore padding an editor dropped
dotslot migrate FILE -i # convert v0.1 `=` slots
dotslot fit FILE --targets 80,100,120 # where lines will wrap
dotslot fit FILE --fail-at 100 # exit 1 if any line is wider
Slot forms: <./______> unnamed, <./owner:____> named, <./status~:____> ellipsis on overflow
(! error, + grow). In Markdown, keep slots in backticks. Grammar: SPEC.md.
Values with control, bidi or zero-width characters are rejected; pass --allow-unsafe-chars to permit them.
Headers like <./:___> or <./a b:__> are errors.
Exit codes: 0 ok, 1 violation, 2 usage or input error.
GitHub Action
- uses: actions/checkout@v5
with: { fetch-depth: 0 }
- uses: ao3575911/dotslot@v0.8.1
with: { files: "docs/**/*.md config/*.yaml", allow: "status,owner" }
Inputs: files (required), allow, base (default: PR base SHA), ignore-whitespace, report
(default dotslot-report.json). Violations and the JSON report go to the step summary. No matched files
passes; a missing base revision fails.
pre-commit
Run after formatters.
- repo: https://github.com/ao3575911/dotslot
rev: v0.8.1
hooks: [{ id: dotslot-check }, { id: dotslot-lint }]
Agents (MCP)
dotslot-mcp serves dotslot_scan, dotslot_fill and dotslot_check over stdio. Arguments are
schema-validated before any write, bad JSON gets a -32700 reply, dry_run returns a diff, allow limits which slots may change, writes are atomic and
confined to --root. Ready-made setups: Claude Code, Cursor,
aider, and an AGENTS.md snippet. See integrations/README.md.
Limits
dotslot is a check, not a sandbox. Without dotslot[treesitter], comment detection is a line heuristic.
Formatters such as gofmt can move columns, so run dotslot after them. Trailing whitespace counts as a change
unless you pass --ignore-whitespace. Roadmap: PLAN.md.
Development
pip install -e ".[test]" && pytest -q runs the Python tests and the shared conformance
fixtures; npm test in npm/ and vscode/ runs the others. slot/ and bin/slot are the v0.1 reference,
kept for EXPERIMENTS.md; not installed.
Licence
MIT. Releases are GPG-signed in CI with SHA256SUMS and build provenance; see RELEASING.md and SECURITY.md.
Metadata
Release files for dotslot 0.8.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dotslot-0.8.1.tar.gz | 32.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dotslot-0.8.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 56.7 kB
Release files / dotslot-0.8.1.tar.gz
| Download URL | dotslot-0.8.1.tar.gz |
|---|---|
| Size | 32.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5d9a37924670f8acb857fb5809a2c75e7f416333b98b5cf7fc660e812acc6fe3
|
|
BLAKE2b-256 checksum How to use checksums |
81e66cbf2ca390a837095aaaf36332691913410ed65e6100c0edc98deccb98c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / dotslot-0.8.1-py3-none-any.whl
| Download URL | dotslot-0.8.1-py3-none-any.whl |
|---|---|
| Size | 24.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a6d49b05779ea14e8bd9f32d86869979a45c4737a2c17521d6162c5c5dd1477c
|
|
BLAKE2b-256 checksum How to use checksums |
1e68bb77b54c4073a36b285a54156c7ac6bbd55f6c29f7932192593e96217aaa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency log