Skip to content

Releases

1.0.0, the marketplace release

Choose a tag to compare

@uchimata2 uchimata2 released this 14 Sep 23:57
e9ab628

The release that goes to Anthropic's community plugin marketplace.

Thirty tasks closed since 0.7.0. Most of them change what you can do with a deck in front of people:

  • A word in a sentence can carry its definition. Hover shows it in a small bubble, a press pins it, and the reading view and print show the definition beside the word.
  • The page controls gain first and last buttons, and the slide ruler has marks you can aim at, with a readout.
  • A source link can open its document at the heading the slide cites.
  • A slide's one-time motions wait until the slide has finished arriving.
  • A press that starts on the edge of a page button still turns the page.
  • A deck's source names the htmldeck version that built it. Nothing on a slide shows it.

The checks got more accurate as well. The render tool now sees a change in SVG paint, a scripted hover state and a figure painting over its neighbour. A deck can also record a deviation from a rule that its owner licensed.

The number is 1.0.0 because this is the version going to the marketplace. The deck contract changed shape too, and by this project's own rule that alone would have made it at least a minor release.

Upgrading a deck built on 0.7.0 or earlier

Carried from docs/PUBLISHING.md section 8.1, which is the home for this and stays true after the release page scrolls away. Only the link targets are changed, to absolute ones that resolve here.

What it newly required

One contracted part became required, and one declaration moved. .ruler-tip, the ruler's readout, is 1 p inside .ruler and ships in the skeleton (T-307, given its drop by T-314). The chart-engine declaration moved from <meta name="htmldeck-chart-engine"> in head to an htmldeck-chart-engine: line in the head comment, because sync deleted the meta (T-311). Optional additions, which take nothing away: .term, .term-btn and .term-bub, an inline term and its definition bubble (T-309); data-qv-at on a quick-view opener, naming a heading in the source (T-271); the --term-line token (T-315). .is-back and .chev go from 0-1 to 0+ (T-307). A GENERATOR region carries <meta name="generator"> at the installed version, and sync writes it (T-318). The shared shell moved in all three regions. A contracted part added is at least a minor, and the major is the owner's ruling of 2026-09-13 that the marketplace release is 1.0.0.

What newly fails

shell.py check on every deck built before this release: SKELETON, COMPONENTS and SCRIPT all differ. check.py — DS-229, every authored part is the element, place and count the contract names, on every such deck, because none carries a .ruler-tip. DS-122 on a deck that declared a chart engine in the old <meta>, with a reason naming where the line went (T-311). Measured rather than derived, unlike 0.7.0's row: today's check.py against all four decks this repository shipped at v0.7.0 failed DS-229 on each and nothing else. Fifteen rule rows in DESIGN-SYSTEM.md changed text, and none of them fails any of the four.

The smallest edit

python tools/deck/shell.py sync <deck> --write settles the three regions, and .ruler-tip and the generator tag with them. Verified on sort-window at v0.7.0: DS-229 fails, then sync, then check.py exits 0. For a chart engine declared in a <meta>, delete the meta and put htmldeck-chart-engine: engine=…; version=…; licence=…; output=svg on its own line in the head comment.

Installing

Inside Claude Code:

/plugin marketplace add uchimata2/htmldeck
/plugin install htmldeck@htmldeck

Upgrading an installed copy runs in a terminal instead, and refreshing the marketplace is not an
upgrade:

claude plugin update htmldeck@htmldeck

Restart Claude Code afterwards. The @htmldeck suffix names the marketplace and is not optional.

0.7.0 — the release the repository read itself

Choose a tag to compare

@uchimata2 uchimata2 released this 02 Sep 23:52

The release where the repository read itself end to end and fixed what it found.

The pre-release audit covered every tracked file. It raised one hundred and twenty-nine findings,
each with the command that proves it, and every one is now closed or accepted with a reason and a
date. Eight were serious enough to hold the release.

Eighteen more fixes started as somebody else's problem. An adopter built decks with this plugin and
sent back twenty-seven reports. Most were right. The ones that were not still pointed at something
real behind what they described.

This is a minor release rather than a patch because the deck contract changed shape twice, which is
the only test that moves the digit here.

Upgrading a deck built on 0.6.0 or earlier

Carried from docs/PUBLISHING.md section 8.1, which is the home for this and stays true after the
release page scrolls away. Only the link targets are changed, to absolute ones that resolve here.

What it newly required

A contracted token retired and a contracted part added, which is why this is a minor. --accent-ink is gone from the theme contract (T-275): no theme varied it and every deck carried it. .turn is a new part — 0+ inside .slide, with a motion row .slide[data-arrived] .turn reading --turn-dur and --turn-ease, so DS-140's Turn is a component rather than two dials wired by hand (T-274). Three optional tokens arrive with DS-141's licensed long band — --long-dur, --long-ease, --long-delay — because the request licence the rule grants had nowhere to put its number (T-264). DS-010 now scans custom properties, which it skipped outright before, so a duration hidden in --x:1000ms beside a policed animation:1000ms no longer passes where the literal fails. The shared shell moved in all three regions. Four rules narrowed rather than tightened and this says so rather than leaving it inferred: DS-110 by where a raster sits, DS-100 to the question a slide puts in its header, DS-092 by excluding provenance from its paragraph half, and DS-236 to the text column a diagram sits in rather than the slide's. Each had been failing decks for doing something the rule was never written to prevent.

What newly fails

shell.py check on every deck built before this release: SKELETON, COMPONENTS and SCRIPT all differ. check.py — DS-013 on any deck that declares --accent-ink, because the contract no longer names it; DS-010, and DS-141 behind it, on a deck holding a duration or a colour in a custom property, which the check could not see before; DS-219 on a label whose ground is an ancestor rather than its parent, because the check now walks the whole chain (T-256); and DS-106 on the word its check omitted (T-229). Nothing newly fails for .turn or the three optional tokens: a part at 0+ and a token whose absence is legal take nothing away, and the four narrowings can only turn a red green. Derived from the contract diffs and the task records rather than from running this gate against a v0.6.0 deck — 177 rule rows at both ends, none added, none removed, and no rule's label, check or auto column moved.

The smallest edit

python tools/deck/shell.py sync <deck> --write settles the three regions and is the only part a command settles. Delete --accent-ink from the deck's theme region; nothing replaces it. For DS-010 and DS-141, either bring the duration back under 500 ms or declare --motion-long with a reason from loop, illustration, emphasis, request and put the number in --long-dur. DS-219 and DS-106 are per-deck edits a command cannot make: raise the contrast on the pair the row names, and reword the line it quotes.

Installing

Inside Claude Code:

/plugin marketplace add uchimata2/htmldeck
/plugin install htmldeck@htmldeck

Upgrading an installed copy runs in a terminal instead, and refreshing the marketplace is not an
upgrade:

claude plugin update htmldeck@htmldeck

Restart Claude Code afterwards. The @htmldeck suffix names the marketplace and is not optional.

0.6.0

Choose a tag to compare

@uchimata2 uchimata2 released this 22 Aug 19:49

This is the release where the gate stopped taking the deck's word for things. Every check used to
read the file. Now it also opens the file, clicks through every slide, and reports what the browser
actually did.

Seven of those reports are new. The console has to stay clean from the load to the last slide. The
embedded faces have to load, and the text has to come out in them. Nothing may scroll out of its box
or jump when the fonts arrive. Every canvas has to draw, and every slide has to be reachable without
a script error. Reading the file answers none of that.

Diagram labels no longer sit on top of one another. A deck here passed every check while carrying
fifteen chart defects that only people found, and three separate readings each missed some of them.
A tool now measures label against label on the rendered page.

Charts can use a chart engine, if the reader is meant to interrogate them by hovering a series for
its value or brushing a range of it. The deck declares the engine in its own head. A deck that
declares nothing is held to hand-written SVG, which is where every deck stands today.

The motion rules read what a motion says about itself instead of what it is called. One of them was
an allow-list of a single class name, so any looping animation you wrote that was not that one class
failed a gate for a design the rules permit.

Speaker notes have somewhere to live. They go into a presenter build, a second file made from the
same specification. It carries a marker the gate fails on, so it cannot become the file you send.

Upgrading

This is the 0.6.0 row of docs/PUBLISHING.md section 8.1, which is where the repository keeps it.

What it newly required. Seven glitch-free conditions and a collision rule, both decided on the rendered page rather than in the markup. GF-2 to GF-8 (T-041) decompose ../CLAUDE.md rule 2 and are answered from one browser walk: the console clean over the load and one pass; every declared @font-face reporting loaded; text rendered in an embedded face rather than a fallback; no slide's stage scrolling past its own box; no box moving over the font swap; every canvas surface drawing something; every slide reached first to last without a script error. DS-244 (T-204) is new and gates: two diagram labels sharing more than 30% of the smaller one's extent in both axes are a collision. Two declarations a motion makes about itself, both replacing an instrument that read a name instead of a claim: --motion-long, DS-141's licence to run past the 500 ms cap (T-187), and --motion-subject, which is what DS-142 now reads instead of the class name .current (T-214). The shared shell moved in components.css and in neither other region. Two changes require nothing of a deck and this says so rather than leaving it inferred: DS-122 now admits a declared chart engine (T-202) through one <meta name="htmldeck-chart-engine">, and a deck that declares nothing is held to the hand-authored default, which is where every deck today stands; and DS-142's rebinding removes a failure rather than adding one, since a looping motion that was not .current could not pass at all before.

What newly fails. check.py on every deck built before this release, and for the first time the failures need a browser to see. GF-3 and GF-4 on a deck whose faces are linked rather than embedded — which rule 1 forbade from the start and nothing here could measure; GF-6 on a deck whose layout moves over the font swap; GF-8 on a deck with a script error on any slide past the first. DS-244 on any deck whose diagram labels overlap — it is the instrument written after the portfolio-review deck passed every gate here while carrying fifteen chart defects that only people found. DS-141 on a deck's own motion running past 500 ms in a rule declaring no --motion-long: the waiver used to be the declaration reads --pulse-dur or --current-dur, so a deck reusing either token name passed without ever saying why, and now it says why. Also shell.py check — COMPONENTS differs from shell/components.css. GF-7 returns NO SUBJECT on a deck that draws no canvas, which is the gate's third state and is not a pass.

The smallest edit. python tools/deck/shell.py sync <deck> --write settles the shell row and is the only part a command can settle. The rest need the deck opened in a browser, because six of the seven conditions are facts about what the browser did and no markup states them: python tools/deck/check.py <deck> runs the walk and prints GF-2 to GF-8 with what each measured. For DS-244, move the colliding label — the row names both boxes and the slide it is on. For DS-141, add --motion-long:<reason> to the rule from the closed set loop, illustration, emphasis, request; for a motion that loops, add --motion-subject:live beside it.

Twenty tasks closed into this release. The board is in
tasks/README.md.

0.5.1

Choose a tag to compare

@uchimata2 uchimata2 released this 20 Aug 15:59

A patch, and an uncomfortable one. The rule 0.5.0 introduced about slide copy shipped with a check
that could not see the defect it was written for.

DS-241 says an eyebrow must name the slide's subject rather than repeat the position and the
section. Its check reads the eyebrow through a helper that decodes &nbsp; and &amp; and nothing
else, so 07 &middot; Structure arrived as that literal string. A digit followed by an ampersand is
not a digit followed by a separator, so it passed.

&middot; is how a build writes the separator. The gate reported zero offending eyebrows on a deck
where all fifteen were the defect, a few hours after the tag went out.

It was found by rendering a slide and reading the top strip, after the gate had already called that
deck clean. Nothing in this project would have found it otherwise.

Both forms are now seeded in the variants suite, because a rule that catches only the typed form
catches only decks nobody built.

Upgrading

Nothing is newly required. DS-241 has required this since 0.5.0, and what changed is that the check
now enforces it. A deck that passed 0.5.0 on that rule may fail now, and the fix is the same one
0.5.0's notes gave: one line of copy per slide, naming what is on it.

0.5.0

Choose a tag to compare

@uchimata2 uchimata2 released this 20 Aug 15:48

Most of this release came from watching somebody else build a deck with 0.4.0 in their own project,
reading the whole session back afterwards, and writing down everything that got in their way. Four
of the defects that came out of it were in the published plugin, which is why this is a minor
release rather than a patch.

The commands in the instructions now run

Every command this plugin documents was written against ${CLAUDE_PLUGIN_ROOT}. Claude Code
interpolates that into a plugin's manifest files. It does not put it into a shell, so the commands
expanded to python /tools/deck/check.py and failed. The build that found this read the documents
in full, never used the variable once, and hardcoded a version-pinned path into its own home
directory 87 times instead, in a session that had updated the plugin an hour earlier.

SKILL.md now opens with a section that resolves the plugin directory by looking for it.

Controls answer the hand

Pressing the back or forward arrow used to take most of half a second to show anything, because the
pager borrowed its timing from a slide reveal. The back arrow never showed anything at all: the rule
that gives it its correct lean carried one more class than the rule for the press, so it won, and
the press never rendered. Every deck this project has ever shipped had that, and no check here could
see it, because nothing here can watch an animation play.

There are now two short bands for a control, separate from the timings the slides move on, and a
check that reads the cascade rather than the declarations.

Every slide says what it is about

The line above the headline used to repeat the slide number and the section name, both of which the
bar along the bottom was already showing. Now it names the thing on the slide, so a presenter
glancing up learns something they could not get from the chrome. Two of the three example decks here
had the old habit across 23 slides, and both are rewritten.

A deck can open on a lobby

The slide an audience looks at while the room fills: the topic, who is presenting, what the occasion
is, and nothing from the argument. It is optional, exactly as the sources page at the end is, and
neither of them counts towards the slide numbers any more. They are covers, not content.

Smaller things

A quoted source reads like a document now rather than like a slide. Its headings had been smaller
than its own body text.

A failing check names what failed. Two rules used to report how many icons were dead or how many
elements were too wide while holding the list of them, so the only way forward was to read this
project's source, which the build that reported it did seven times.

shell.py icons --help printed a traceback. render.py shots 12 rendered slide 13.

spec.py could not express a figure worked out from two documents, which is exactly what a deck
comparing two documents is made of.

Upgrading

Version What it newly required What newly fails The smallest edit
0.5.0 Four theme tokens and one rule about copy. --afford-dur, --afford-ease, --press-dur and --press-ease are required declarations, the band a control's answer to the hand runs in (DS-240). DS-241 is new and it is about words, which is the first requirement here that an adopter cannot settle with a command: every eyebrow must name its slide's subject rather than the position, the stage or the headline's own words. The shared shell moved in components.css and deck.js. data-stage gains a third non-index value, front, which is additive: a deck using no lobby is unaffected. render.py shots counts slides from one. check.py on every deck built before this release: DS-013, four tokens not declared; DS-229, three motion rows now naming --afford-*; DS-240, the pager's press outranked by its hover, which is a real defect every shipped deck carried; and DS-241 on any slide whose eyebrow reads 02 · Why now. Also shell.py check, where COMPONENTS and SCRIPT differ. Measured on a real outside deck before the tag, which is where three of the four came from. python tools/deck/shell.py tokens <deck> --write, then sync <deck> --write, settles DS-013, DS-229, DS-240 and the shell rows. DS-241 is the one that needs a person: one line of copy per slide, naming what is on it.

One thing worth saying about the checks

Three of the checks written for this release found nothing on their first run and were wrong to.
Two matched on the wrong relation and one had an assertion that could not fail. All three were
caught the same way, by putting the defect back and watching the check go red before believing the
green.

0.4.0 - the chrome row's shape

Choose a tag to compare

@uchimata2 uchimata2 released this 18 Aug 15:00

0.4.0 rebuilds the row of controls along the bottom of a deck.

Someone using 0.2.2 said the back and forward arrows read as an afterthought, and they were
right. The arrows sat between a slide counter and two wide labelled buttons, so the one control
you actually press was the quietest thing in the row.

The ruler, the counter and the arrows now share a drawn box, because between them they answer one
question: where am I, and how do I move. The arrows are filled and nothing else in the row is, so
they are easy to find. Everything else moved out to the right, behind a More button.

Motion is the exception. A deck with looping motion has to keep a visible way to stop it, so that
button stays outside the menu, and moves inside it only in decks with nothing running. The build
decides which, and a check enforces it.

The menu was also rendered open for the first time, which is how a defect nothing measures got
found: a menu item was drawn as a button inside a box. It is drawn as a row now.

Upgrading an existing deck

Your deck will fail the shell check until you migrate it. The report you get first is
NOT A SHELL, which reads worse than it is: it means your shell is one release behind, not that
your file is broken.

What it newly required

The chrome row's shape (T-114). New contracted parts — .navbox, .more, .more-menu and the .btn--pager modifier — and .controls is gone. .chrome carries a twelfth slot, CHROME_TAIL, holding More and, in a deck whose motion loops, Motion beside it. DS-218 is tightened from a control exists to a control not shut inside .more-menu; DS-217's measured bound moves 17 → 16 because the container is drawn. One new token, --more-menu-w. The shared shell moved in all three regions, and then in components.css once more before the tag: a menu item is drawn as a row rather than as a button in a box, which is a look fixed after rendering the menu open for the first time and requires nothing of a deck beyond the sync this row already asks for. T-177 requires nothing of a deck and the row says so rather than leaving it inferred: it fixes tokens --write carrying a dual-band colour's dark value into the light band, which is this repository's own tooling

What newly fails

shell.py check says NOT A SHELL, and that is the whole report — the deck has no CHROME_TAIL anchor, so the cut stops there and the three region failures behind it are never printed. It reads as your file is broken rather than your shell is one release behind, and it is the second. Then, after the repair below and because of it, audit.py — DS-218 on any deck whose motion loops or runs past 5 s, because the migration puts Motion in the menu and a control behind a click is not persistent. Also theme.py / shell.py check — TOKENS, --more-menu-w

The smallest edit

Three commands, in order, and the third is not optional on a deck with looping motion: python tools/deck/shell.py sync <deck> --write installs the anchor and settles the three regions, announcing MIGRATING when it does; python tools/deck/shell.py tokens <deck> --write adds --more-menu-w; then, if anything in the deck loops, python tools/deck/shell.py tail <deck> --loops --write moves Motion out beside More. Verified in that order on a deck built before this change: NOT A SHELL → three regions synced → one token → DS-218 pass

Known, and not fixed here

Past 16 slides the ruler goes dense and the mark for the current slide drops to 7 px beside 14 px
section marks, against 30 px for the ring below that bound. Both rules behind it predate this
release, but this release lowers the bound from 17 to 16, so one more deck length reaches it.
Tracked as T-178.

0.3.1

Choose a tag to compare

@uchimata2 uchimata2 released this 17 Aug 22:56

A source reference is now one component wherever it appears: the mark in a slide's corner, the list
behind a mark that cites more than one document, and the colophon at the back. Those three used to be
authored separately, and they drifted. A colophon would name the documents a deck rested on, link to
none of them, and send the reader back through the slides to find the links.

The ruleset was audited, all 165 rules. Four changed and none were removed. Thirteen turned out to be
rules that no tool and no reviewer could apply, and they are now named instead of left looking
enforced.

Two fixes to this repository's own tooling round it out: a gate over the references inside the
documentation, and a self-test that blocked the one command able to fix what it failed on.

Upgrading a deck built on an earlier version

This is the row from docs/PUBLISHING.md §8.1, which every release fills in so that a wall of
failures against a file you did not touch is readable as a new requirement rather than a regression.

What it newly required. The four-kind source vocabulary: a source reference is one component
wherever it renders, typed by what the source is. New contracted parts, .sources-id,
.sources-icon, .sources--list and .qv-file, and .sources may now sit anywhere in a .slide
rather than only in its .provenance. .sources-open gains a required data-file. The shared shell
moved in all three regions.

What newly fails. shell.py check on every deck built before this release: SKELETON,
COMPONENTS and SCRIPT all differ. component.py check: .qv-file: 0 per .qv-head, and
.sources-open: N of N carry no data-file on any deck carrying a quick view. check.py:
DS-105 marks wearing the wrong kind's glyph on any deck whose multi-source marks draw the
single-source glyph, which was every such deck before this release. Nothing fails for the identifier
bound, because no deck written before this release has a .sources-id to exceed it.

The smallest edit.

python tools/deck/shell.py sync <deck> --write
python tools/deck/shell.py tokens <deck> --write

sync settles the three regions and .qv-file with them, because .qv-file ships in the skeleton.
The other two are per-deck markup and sync must not touch them: add data-file="<the source's base name>" to each .sources-open, and point every multi-source mark's <use> at a symbol drawn by
Lucide library, which python tools/deck/shell.py icons <deck> --set sources=library --write adds.

The release's other three tasks require nothing of a deck. The audit narrowed one rule and split
another so the gate keeps only the half it can decide, which loosens what a deck must satisfy rather
than tightening it, and the two tooling fixes never reach a deck at all.

0.3.0

Choose a tag to compare

@uchimata2 uchimata2 released this 17 Aug 17:59

The first release shaped by somebody else's deck.

Someone built a presentation with the published skill, in their own project, against a brief this repository had no part in. That deck now ships as a third worked example, and running the gates over it found four defects that neither deck written here could have exposed. Two more turned up when a person opened it and clicked.

If you have a deck built before this release

Nothing new is required of a deck's content. The shared shell moved, so the shell check will report on any deck built earlier. Both fixes are one command.

What newly fails The smallest edit
shell.py check: COMPONENTS differs from shell/components.css and SCRIPT differs from shell/deck.js, on every deck built before this release python tools/deck/shell.py sync <deck> --write
TOKENS on any deck built before 0.2.3 that never declared --qv-measure. That requirement is 0.2.3's, arriving with the quick-view measure. What is new here is that a gate can finally see it, so you will read it as this release's failure and it is the previous one's python tools/deck/shell.py tokens <deck> --write

Neither command touches a per-deck region. sync rewrites only the shared blocks, and tokens adds only the declarations that are missing, at the shipped theme's value.

New commands

  • shell.py sync refreshes a deck's shared shell after a release. Before this, every release broke every deck in the wild and the only advice was to rebuild.
  • shell.py tokens declares the values the new shell reads.
  • check_all.py runs every checker a clone receives against every deck this repository ships, and ends with a partition: each one ran, was skipped with a stated reason, or failed. A checker in none of those three fails the run.

Fixed in the published plugin

Found by running the gates over the adopter's deck:

  • The upgrade path reported success and left the deck failing the theme gate. The shell it installs reads a token the deck never declared, and sync must not write into a per-deck region.
  • The content gate charged a deck for what its quoted sources said. 122 of 152 supposed deck figures came out of quotations.
  • The control that opens a quoted source shipped with no minimum target size, so the 24 px accessibility floor held only by luck of the surrounding type scale.
  • The figure binder could not bind a value whose label sits in the next table cell.

Found by opening the deck and clicking, which no check here reaches:

  • The quick view reopened at the previous document's scroll position, so asking for a source you had never seen dropped you most of the way down it.
  • A colophon filed as an argument slide, so its contents card took that stage's label and icon and the stage census counted a slide that argues nothing.

The example

examples/measure-first/ ships with two specifications, five source documents and two process models. The case, the company and every figure in it were invented for a training exercise and are published with the author's permission, renamed, with the training context removed. The analysis is untouched.

It is the only deck in the folder that was not written against this repository's own rules by whoever was also holding them.

v0.2.4

Choose a tag to compare

@uchimata2 uchimata2 released this 14 Aug 00:36

Nothing to upgrade for. No file under skills/, shell/ or tools/ differs from 0.2.3 except
the version string. A deck that passed 0.2.3 passes this one unchanged. The version moves because the
published line takes the next patch number, not because the plugin did.

What it carries is the project's own record. A finding this repository ranked, published and cited in
five documents turned out to have measured the wrong thing, and this release withdraws it.

The finding said three tool files were mostly docstring: 85%, 58% and 36%, against 30% for the whole
tools directory. Every one of those numbers counted triple-quoted string tokens. Measured by what
Python actually calls a docstring, the same files are 3.2%, 15.3% and 11.6%, against 16.3%. The file
reported at 85% is the least documented of the 38 files there. The strings being counted are the
probe pages and CSS blocks those tools write out, so the change the finding proposed would have
deleted two tools' own output.

Four figures agreed with each other and all four were about something else. The task is cancelled
rather than deleted, its measurements kept, and the corrections are marked in place in the audit
instead of edited away. The rule it left behind is that a share-of-file figure is a claim about a
unit, and the instrument has to count that unit.

What each release newly required

From docs/PUBLISHING.md §8.1, verbatim:

Version What it newly required What newly fails The smallest edit
0.2.4 Nothing. Not "nothing required of a deck's content" as in 0.2.3 — nothing at all. No file under skills/, shell/ or tools/ differs from 0.2.3 but the version string, so the shared shell is byte-identical and shell.py check has nothing new to say Nothing. Any deck that passed 0.2.3 passes 0.2.4 unchanged, and a deck already behind on the shell is behind by exactly what 0.2.3 said None. If shell.py check reports a difference, it is 0.2.3's row, not this one

0.2.3

Choose a tag to compare

@uchimata2 uchimata2 released this 13 Aug 01:38

Three fixes to the published plugin. Two of them came from looking at a rendered deck rather than
from running anything, and both turned out to be in this repository's own example deck as well as in
the deck that reported them.

The printed contents page collided at 13 entries (T-116)

On paper, cards printed through each other and the last one printed through the page footnote and off
the sheet. The stated limit was 24 entries.

The entry height was part of it, but the first cause is that the fault lives only in paged layout.
On screen a grid item's automatic minimum size is zeroed by overflow:hidden, so a card takes its
track and clips. Chrome's paged layout gives it its own content height instead. Same deck, same day:

screen, with the print rules lifted onto it   card 175.7 du   row gap +26.0 du   clean
the printed PDF                               card 267 du     row gap -49.2 pt   overlap

A 267 du card in a 201 du pitch overhangs by a third of a row. .cbox now states both bounds,
max-height: min(268du, 100%), instead of trusting the stretch to hold.

Holding the cards to their rows then exposed a second-line clip that the overflow had been hiding: a
box printing outside its own card looks like a full description until you notice it is sitting in the
card below. The room per row band is fractional, so the description clamp is now per band and every
band shows a whole number of lines.

The compression bound was re-measured against a three-line description in every entry, which is the
case the old fixture lacked. It is still 16 entries with descriptions and 24 without.

A colophon had to claim a stage it was not in (T-108)

data-stage was mandatory and its vocabulary held only argument stages, so back matter had nowhere to
go. The ruler named the borrowed stage at rest, the section ticks counted it, and the contents page
labelled it. Four renderings read one manifest, so the miscount was in all four.

data-stage="back" is the value that was missing. A slide carrying it starts no section, is counted
in no stage, is named by its own title on the ruler, and is labelled Back matter on the contents
page. It carries no mark, because the mark is keyed to the stage and it has none.

This repository had the same defect in a worse form: the reference deck had invented an eighth stage
and left STAGE_ICON at seven, so its contents box drew a mark that referenced nothing. shell.py check now gates that pair.

The page-count checker failed a correct deck (T-120)

printpages.py's own entry point defaulted the slide count to a hardcoded 12, so it reported FAIL on
a deck printing 14 correct pages while check.py, calling the same function with a rendered count,
reported pass on the same file. It now counts the slides in the deck.

What newly fails, and the smallest edit

Nothing new is required of a deck's content. What changed is the shared shell: the component block
and the deck script. data-stage="back" is additive and takes no existing value away.

What newly fails The smallest edit
shell.py check on every deck built before this release: COMPONENTS differs from shell/components.css and SCRIPT differs from shell/deck.js There is no command for this yet. Rebuild the deck, or replace the two regions by hand. T-124 exists to make it one command
shell.py check reporting STAGE TABLE Give every stage an icon, or move back matter to data-stage="back" and delete the stage invented for it. This one is a real defect the gate could not see before

The two region failures are the deck being one release behind rather than anything wrong with it. A
byte-for-byte shell comparison is what makes the shared half trustworthy, and its other edge is that
every release touching shell/ fails every deck in the wild.

Also

contents_bound.py pins its fixture entry height and says what the bound assumes. render.slide_count
matches slide as a class token rather than a prefix, so it cannot disagree with the DOM count it is
compared against. DS-225 and DS-226 both took dated corrections.

Nothing here can see a print-only layout fault. That gap is T-123.