Skip to content

The skill's links go somewhere, and WordCraft is named - #23

Merged
fabeat merged 7 commits into
mainfrom
feature/bleed-and-skill
Nov 3, 2026
Merged

fabeat merged 7 commits into
mainfrom
feature/bleed-and-skill

Conversation

@fabeat

@fabeat fabeat commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Three findings from the review of mdoffice 0.1.3, about the skill and the spec.

[S-4] Fifteen of the thirty-six links in the skill went nowhere

The bundle is distributed as an archive with no website beside it, and its pages carried the site's own paths:

/command-line/presentations/   ×3
/command-line/theme/           ×3
/files/                        ×3
/skills/                       ×2
/directives/syntax/            ×2
/command-line/installation/    ×1
/presentation/                 ×1

A link to a page the bundle carries is now a link to the file beside it — /files/ → general-files.md, /skills/ → install.md, /directives/syntax/ → directive-syntax.md. A link to a page it does not carry is the address of that page on the site.

The slides half's command line is carried too — references/command-line-presentations.md and references/command-line-theme.md — because the bundle claims to be about decks as well as about documents now, and a page that is not there is a page an agent cannot read. That is the report's own first suggestion.

The checker holds it to that. A new check reads every link in the bundle and asks where it goes: a link that is still a path of the site is a link that goes nowhere, and a link to a file that is not there is one as well. The fragment-only links are checked against the headings of the file they are in.

[S-3] WordCraft is named and never explained

It is in the table of renderers to believe, and there was nowhere in the bundle that said what it is or where it comes from — an agent reading it had a word and no meaning.

WordCraft is not Microsoft's. It is a clean-room implementation of Word — it draws a document the way Word does without being Word — and it comes from storytold/wordcraft; storytold/deckcraft is its half for decks. The script looks for them on the path as wordcraft-cli and deckcraft-cli, and a machine without them falls back to LibreOffice and says so.

[S-5] The description covers decks

The skill is called mdword and described itself in terms of Word only, while carrying eight .pptx beside its eight .docx. An agent asked to build a presentation did not match it, and the deck examples were never found.

Turn Markdown into a Word document — .docx, .odt or .rtf — or a PowerPoint deck, with the markdown-word and markdown-presentation libraries, and turn one back to Markdown. Use when asked to write or convert a Word document or a presentation, …

[L-8] and the spec

A blank slide draws the frontmatter's title as a heading in its body. The behaviour was deliberate — a title that is not drawn is a silence — and it was undocumented. The spec says so now, and says that title: "" leaves it as metadata only.

bleed=true is in the spec, on both halves: a free shape that runs off the edge of the slide, and a text box that hangs off the edge of the page. The rule is the same word on both, so a document and a deck are written the same way.

--preserve-geometry is in the command-line reference, with what it keeps and what it does not.

The checks

composer check passes, and it is stricter than it was: the reference check now holds the site to listing bleed and the new BleedingBox, and the skill check holds the bundle to every link going somewhere.

**The links.** The bundle is distributed as an archive with no website beside
it, and its pages carried the site's own paths: fifteen of the thirty-six
links in it went nowhere. A link to a page the bundle carries is now a link
to the file beside it, and a link to a page it does not carry is the address
of that page on the site.

The slides half's command line is carried too — `references/command-line-presentations.md`
and `references/command-line-theme.md` — because the bundle claims to be about
decks as well as about documents now, and a page that is not there is a page
an agent cannot read.

The checker holds it to that: every link in the bundle must go somewhere, and
a link that is still a path of the site is a link that goes nowhere.

**WordCraft is named.** It is in the table of renderers to believe and there
was nowhere in the bundle that said what it is or where it comes from, so an
agent reading it had a word and no meaning. It is a clean-room implementation
of Word from [storytold/wordcraft](https://github.com/storytold/wordcraft),
[storytold/deckcraft](https://github.com/storytold/deckcraft) is its half for
decks, and a machine without them falls back to LibreOffice and says so.

**The description covers decks.** The skill is called `mdword` and described
itself in terms of Word only, while carrying eight decks beside its eight
documents. An agent asked to build a presentation did not match it, and the
deck examples were never found.

**The spec** says what `bleed=true` does, on both halves, and what a `blank`
slide does with the frontmatter's title.
The library's patch now writes a gradient of more than two stops and a
background painted with a gradient, and the lock names the patch that does it.
Without this the site installs the older patch, and the library asks for what
the newer one has.
The frontmatter table has five more keys, and the themes page says what
`theme-variables:` is: the four keys a `theme.yml` holds a value in, read by
the reader that reads the theme's own file.

The three that hold the theme's identity are not a slide's, so naming one is
refused.

The errors page carries the new exception, and the index counts the keys as the
code does.
A gradient on a shape was nowhere on the page, and the errors page described
MalformedGradient as though a gradient could only be wrong in four ways, which
it could not: the stops have to move forward, there is a ceiling on how many
there are, and a shape cannot be filled with a colour and a gradient at once.
A definition names a template and nothing but its own settings, and the page
said it names a template and nothing else — which the key beside it refutes.
The pattern that looks at the bundle's reference files was written out three
times, and the one that reads a page's permalink could reach over a line, which
gives the engine two ways to match the same text and sends it back over what it
has already read.
The pattern that stripped them gave one of them back at a time, and it gave
one back for every place it tried, so a run of two hundred thousand slashes
that was not at the end took fourteen seconds. The address is the environment's
to give, and the environment is not a person who would not do that.
@sonarqubecloud

sonarqubecloud Bot commented Nov 3, 2026

Copy link
Copy Markdown

@fabeat
fabeat merged commit adce10d into main Nov 3, 2026
4 of 5 checks passed
@fabeat
fabeat deleted the feature/bleed-and-skill branch November 3, 2026 18:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant