Skip to content

Commit 7df6343

Browse files
DocAtPromptclaude
andcommitted
0.11.0 — the geometry read back, and a calendar that speaks its own language
A minor and not a patch, and the reason is worth stating: a definition with Polish month names built at 0.10.0 and is refused now. Silently dropping the character was the bug and refusing it is the fix, but a definition that used to build and no longer does is not a patch-level change under any reading. Two new DSL keys came with it — `words:` and `font:` on a document — which says the same thing from the other side. Since 0.10.0: - **every blade's geometry read back out of a finished PDF** — the discipline § 13.2 calls the most important test in the suite, extended from `lines` to all of them, with every expected number taken from the definition or from a sentence of the specification and never from the code - **`check_page_furniture`** — the frame is now checked on both page paths, not only drawn on both; found by re-reading my own fix from four commits earlier - **the glyph check on generator text** (§ 12 point 13), which was the whole reason a Polish calendar printed a box - **`words:` and `font:`** on `calendar` and `notebook`, so every word on the sheet comes from the definition and there is a way out of Latin-1 for it The version is in /Creator, /Producer and on the cover sheet, so the gallery is rebuilt. Checked rather than assumed: rasterised at 50 dpi and compared page by page against the previous build, **only the cover sheet differs visually**, in the line reading `tool ctrlgrid 0.11.0`. Its preview is rebuilt with it. 1231 tests green, ruff clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 375cb1e commit 7df6343

21 files changed

Lines changed: 16 additions & 10 deletions

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ fillable forms, perspective grids and mandalas — plus a **linked, write-on
1010
calendar** and a **notebook** that binds any of them into one document — for
1111
paper formats **and** for e-ink tablets.
1212

13-
> **Status: 0.10.0 — everything the specification describes is built, and
14-
> audited against a first-time user.** The
13+
> **Status: 0.11.0 — everything the specification describes is built, audited
14+
> against a first-time user, and every generator's geometry read back out of a
15+
> finished PDF.** The
1516
> eleven generators of the table below work, and so do the two *document*
1617
> generators (`calendar`, `notebook`); the dimensional test described below
1718
> measures `lines` out of a finished PDF on every commit, and `net` puts the

ctrlgrid/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
everything it describes is built; see docs/CLAUDE.md for orientation.
55
"""
66

7-
__version__ = "0.10.0"
7+
__version__ = "0.11.0"

docs/CLAUDE.md

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@ Nothing refuses with "a later milestone" any more — that mechanism is still
2727
there (`Section.deferred`, `loader.DEFERRED_KEYS`) and currently empty, which is
2828
worth knowing when the next unbuilt key arrives.
2929

30-
**0.10.0** is the version in the code (2026-07-26). 0.9.0 said the features were
31-
complete; 0.10.0 says they have been **audited against a first user**, which is a
32-
different claim and was worth its own number. What that audit found is in the
30+
**0.11.0** is the version in the code (2026-07-26). 0.9.0 said the features were
31+
complete; 0.10.0 said they had been **audited against a first user**; 0.11.0 adds
32+
what that audit's last question turned up — every blade's geometry read back out
33+
of a finished PDF (`tests/test_geometry_readback.py`), a glyph check on generator
34+
text, and the two DSL keys a non-English calendar needs (`words:` and `font:` on
35+
a document). It is a minor and not a patch because a definition with Polish month
36+
names built at 0.10.0 and is refused now: silently losing a character was the
37+
bug, and refusing it is the fix. What that audit found is in the
3338
five commits before this one and summarised under *The release-readiness pass*
3439
below; the short version is that the core promises — dimensional accuracy and
3540
byte-identical output — held under measurement, and the edges did not.
@@ -49,7 +54,7 @@ sheet's preview with them, since that sheet prints the version.
4954
uv sync --extra dev && uv run pytest && uv run ruff check .
5055
```
5156

52-
1192 tests, all green, ruff clean, linear history on
57+
1231 tests, all green, ruff clean, linear history on
5358
**[github.com/DocAtPrompt/ctrlgrid](https://github.com/DocAtPrompt/ctrlgrid)**
5459
(public); CI runs green there on Linux (3.11–3.13), macOS and Windows. Nineteen
5560
presets — twelve that show a generator (`dots-5mm`, `grid-a4`, `mandala-a4`,
@@ -149,7 +154,7 @@ edge, so a tick now carries its position *and* its value separately. `unit` says
149154
https://pypi.org/manage/account/publishing/ for `DocAtPrompt/ctrlgrid`,
150155
workflow `release.yml`, environment `pypi` — then the tag is pushed.
151156
**There are no tags at all** (the stale `v0.1.0` was deleted on 2026-07-26), so
152-
the next one is the first real release tag and must read `v0.10.0`.
157+
the next one is the first real release tag and must read `v0.11.0`.
153158
Two things worth knowing before it goes: a version can never be re-uploaded to
154159
PyPI, only yanked; and the README's links were made absolute for exactly this,
155160
because a relative link resolves against pypi.org on the project page and dies.
@@ -207,7 +212,7 @@ things accepted and then ignored (a ruler font file, a tick off the edge, an
207212
unreachable capability guard); and twenty-six comments the code beside them had
208213
outgrown. All fixed, each test-first, one commit per coherent block.
209214

210-
**Why 1192 tests had not caught the biggest one:** they exercise the blade path.
215+
**Why the tests had not caught the biggest one:** they exercise the blade path.
211216
The document path is young, has two generators and far thinner coverage, and four
212217
of the five serious findings were there. That is where to look first.
213218

@@ -390,7 +395,7 @@ supply:
390395
|---|---|
391396
| a device | the empty `quirks` (decision 31), and the rM2 figures nobody has measured on the device — the Paper Pro is owner-checked, the rM2 is not |
392397
| a pair of scissors | print `examples/16-net-tray.yaml` and `box-tuck-a4` at 100 %, cut, fold. The tray checks the geometry; the tuck-top also checks the thickness rule. **No test can do this**, and until someone does, the tests only agree with themselves |
393-
| a pypi.org login | trusted publishing, then the first real tag — `v0.10.0`. Everything on this side is ready and the name is free; see *Not done* |
398+
| a pypi.org login | trusted publishing, then the first real tag — `v0.11.0`. Everything on this side is ready and the name is free; see *Not done* |
394399
| use | the three § 15 questions below, and 1.0.0 itself: 0.10.0 says the features are done and audited, and the DSL has not yet met anyone else |
395400

396401
If a new feature *is* wanted, the recipe has not changed since M1: a design

examples/01-lines-squared.pdf

0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.

examples/02-dots-grid.pdf

0 Bytes
Binary file not shown.

examples/03-grid-battleship.pdf

0 Bytes
Binary file not shown.

examples/04-staves-treble.pdf

0 Bytes
Binary file not shown.

examples/05-maze-booklet.pdf

0 Bytes
Binary file not shown.

examples/06-polar-target.pdf

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)