dotslot: let agents fill the blanks, and prove they touched nothing else.
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)
CLI · pre-commit · GitHub Action · MCP server (Claude Code, Cursor, aider)
· MIT · v0.2.1 · Spec · Experiments · Changelog
What it is
Mark the parts of a file that may change with <./________>. An agent or script fills those blanks and nothing else. dotslot check proves the diff touched only the blanks, and that each blank kept its width, so columns and line wraps stay put. It works in docs, configs and code comments.
A file with slots is fill-only. That turns "don't touch the rest" into a rule a machine can check.
Install
Install from PyPI:
pip install dotslot
dotslot --help
Requires Python 3.10+ and wcwidth.
Use
dotslot new notes --width 26 --lines 3 --comment '# ' # generate a slot or block
dotslot scan FILE # list slots, widths, capacity
dotslot fill FILE --set name=value -i # fill in place, width kept
dotslot check FILE --git-base HEAD [--allow a,b] # prove only slots changed
dotslot repad FILE --base OLD -i # restore padding after a hand edit
dotslot fit FILE --targets 80,100,120 # where will lines wrap?
Slot forms: <./______> (unnamed), <./owner:____> (named), <./status~:____> (ellipsis on overflow). In Markdown, put slots in backticks. Full grammar: SPEC.md.
Integrations
| tool | files | what it does |
|---|---|---|
| MCP server | dotslot-mcp --root . |
dotslot_scan, dotslot_fill, dotslot_check over stdio; fill verifies before writing; paths confined to root |
| Claude Code | integrations/claude-code/ |
.mcp.json, a PostToolUse hook that exits 2 on a violation, and a skill |
| Cursor | integrations/cursor/.cursor/ |
mcp.json and a fill-only rule |
| aider | integrations/aider/ |
lint-cmd: dotslot check --git-base HEAD with auto-lint |
| any agent | integrations/AGENTS.md |
snippet to paste into your AGENTS.md |
| pre-commit | .pre-commit-hooks.yaml |
dotslot-check, dotslot-lint |
| GitHub Action | action.yml |
checks PR files against the base SHA, writes a JSON report to the step summary |
pre-commit:
- repo: https://github.com/ao3575911/dotslot
rev: v0.2.1
hooks: [{ id: dotslot-check }]
GitHub Action:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: ao3575911/dotslot@v0.2.1
with: { files: "docs/**/*.md config/*.yaml", allow: "status,owner" }
Limits
dotslot is a check, not a sandbox. The comment finder is a heuristic until tree-sitter lands; formatters such as gofmt can move columns, so run dotslot after them; trailing whitespace counts as a change. See CHANGELOG.md for open items and PLAN.md for the roadmap.
Repository layout
dotslot/: the v0.2 package (CLI, MCP server).slot/,bin/slot: the v0.1 reference, kept only soexperiments/run.shreproduces findings (a)–(g). Not installed.tests/: 45 tests (12 v0.1, 33 v0.2). Runpip install -e ".[test]" && pytest -q.experiments/:run.sh(a–g) andrun_v02.sh(v02, h, i), with recorded output inout/.
Licence
MIT. See LICENSE. Releases are GPG-signed in CI and carry SHA256SUMS and build provenance; see RELEASING.md.
Metadata
Release files for dotslot 0.2.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.2.1.tar.gz | 22.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dotslot-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.8 kB
Release files / dotslot-0.2.1.tar.gz
| Download URL | dotslot-0.2.1.tar.gz |
|---|---|
| Size | 22.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
80f3c6ddc4af16b1ed86c96eff7d85c39cb37e5fd971d7517bf8041e707ebe12
|
|
BLAKE2b-256 checksum How to use checksums |
56bf580e46cec530124708813002b760129ec1a682d96e4799ebbf5bad797afb
|
| 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 13, 2026.
Transparency logRelease files / dotslot-0.2.1-py3-none-any.whl
| Download URL | dotslot-0.2.1-py3-none-any.whl |
|---|---|
| Size | 19.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc796fea11a5cfbd79a5cabdc5698771658806888ca639a254aae77651c43aca
|
|
BLAKE2b-256 checksum How to use checksums |
a036143d11992b0f6381eb28c0dcfa5e9f64848ec7d35a6613eb0854d85e6fee
|
| 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 13, 2026.
Transparency log