It is better for you to read that something does not work than to spend an afternoon proving it. Every entry below says what happens, what it looks like from where you are sitting, and what to do instead. Entries leave this page when they are fixed.
How to read an entry
Three conventions hold for every row and every section.
Each entry is named by the symptom you would see, not by its internal cause. If you are scanning, scan the first column.
Workaround is a real instruction or the words “None today”. It is never a hedge. “Consider restructuring your content” is not a workaround and does not appear here.
A limitation is not a plan gate and not a fixed ceiling. Both of those have their own pages, linked once in the note above and not repeated.
Writing and formatting
These are round-trip and editor defects: the content survives, one detail of it does not.
| What you see | Why | Workaround |
|---|---|---|
| A numbered list that started at 14 renders from 1 on the site | The editor writes the start number without quotes; the site parser only reads quoted attributes | None today |
| Table column alignment is gone after you save | Alignment is not carried into the editor’s document model | Author the table outside the editor and do not re-save it |
| A colored icon produces broken markup on the site | The color is written into the icon’s class list rather than as its own attribute | Leave icon color unset |
| Tabs inside tabs come out flattened | A nested tab group is not parsed as a child | Do not nest tab groups |
| An AI or import write fails on markdown that contains HTML | Only the few inline tags the editor itself emits are understood | Convert the HTML to Leed Markdown before writing |
A numbered list restarts at 1
Set a numbered list to start at 14 in the editor and it looks right in the editor. On the published site it starts at 1. The editor serializes the start number as a bare value while the site’s markdown parser only recognizes a quoted one, so the attribute is dropped on the way through and the list falls back to the default.
Workaround: none today. If the numbering matters — a continued procedure, a numbered requirement — write the number into the item text rather than relying on the list’s start value.
Table column alignment is lost
Leed Markdown carries column alignment the way markdown always has, with colons in the header separator. The editor’s document model does not carry it, so alignment is dropped the first time the page is saved from the editor.
Workaround: alignment authored in Leed Markdown and written through an import or an MCP client survives until someone opens the page in the editor and saves it. There is no way to set or preserve alignment from the editor itself. The rest of what the editor does and does not carry across a round trip is described from the format’s side at Fidelity and Unsupported Syntax.
A colored icon can emit invalid markup
An icon’s parameters are emitted straight into the rendered element’s class list. A color, which is written as color="…", therefore lands inside a quoted attribute value — and the quotes collide. The resulting markup is malformed, and how a browser recovers from it is not something you can rely on.
Workaround: leave icon color unset and let the icon inherit the surrounding text color, or color it with a class instead.
Nested tabs mis-parse
A tab group inside another tab group is not read as a child of the outer group. The inner tabs are flattened into siblings of the outer ones and the text that was around them appears loose in the container.
Workaround: do not nest tab groups. If you need two axes, put one of them in a table.
Markdown containing raw HTML is rejected on import
Leed’s markdown parser understands a short list of inline tags because the editor itself emits them — line breaks, superscript and subscript. Everything else is a parse failure, and a parse failure fails the whole write. This does not affect typing in the editor; it affects markdown arriving from an AI client, an import, or the MCP page tools.
Workaround: convert the HTML to Leed Markdown before writing. Almost everything an importer reaches for has a Leed Markdown equivalent — Fidelity and Unsupported Syntax maps them.
The exact difference, for the three round-trip defects
The editor writes a numbered list’s start value unquoted; the site parser reads only quoted values:
Written by the editor: 1. Item 14 {start=14}
Read by the site parser: 1. Item 14 {start="14"}An icon’s color is written into the positional class list, so its quotes end up inside the class attribute:
{% icon fa-solid fa-star lg color="#ff0000" %}And raw HTML in an imported page fails the write rather than being stripped:
Could not parse the provided markdownTabs that look right and are not
Three defects share one property: the page renders, nothing errors, and the reader is the one who pays. You will not see any of these while you are authoring — which is exactly why they are here.
| What you see | Why | Workaround |
|---|---|---|
| Tabs show your raw typed labels, with no icons | The group attribute was written with a lower-case i | Write data-tabs-groupId, capital I |
| A tab container you did not group is styled as if it were | The parser keeps the last group it saw and never clears it | Bind every container on the page to a group id |
| A reader is put on a tab they did not choose | Cross-page sync is by position, not by name | Give every container in a group all of that group’s tabs, in the group’s order |
Lower-case groupid silently loses your titles and icons
Your tabs render. They still switch. They still sync across pages. They just show the labels you typed instead of the group’s display titles, and they carry no icons. Nothing warns you, and nothing looks broken unless you know what the group was supposed to look like.
The cause is a single character: the build matches the literal attribute data-tabs-groupId, with a capital I. Written as data-tabs-groupid the browser still finds the attribute — HTML attribute names are case-insensitive at runtime — so switching and syncing keep working, while the build-time lookup that supplies titles and icons misses entirely.
Workaround: write the capital I. Tab Groups for Consistent Examples has the rules that avoid all three of these entries, and Tabs has the syntax.
An ungrouped tab container inherits the previous group’s styling
Put a grouped tab container on a page, then a plain one below it, and the plain one picks up the first one’s display titles and icons. It looks grouped. It is not: it emits no group attribute of its own, so it does not sync with anything and a reader’s choice on it is forgotten immediately.
The parser records the group id of each container it sees and never clears it, so an unbound container simply keeps whatever was set last.
Workaround: bind every tab container on a page to a group id, including one-off ones. A container that belongs to no shared axis still needs its own unique id.
A reader is switched to the wrong tab across pages
Tab choices follow a reader from page to page, which is the point of a tab group. The choice is stored as a position, not as a tab name. So if two containers in the same group hold different tabs, a different number of tabs, or the same tabs in a different order, a reader who picked the third tab on one page lands on whatever happens to be third on the next — or on nothing at all, if that container has fewer tabs.
Themes and code themes that do not apply
Two entries with sharply different symptoms, which is the reason they are documented together. A color theme that fails to load falls through to your site’s own palette, so the page merely looks un-branded. A code theme that fails to load has nothing to fall through to, so your code blocks ship with no colors at all.
| What you see | Why | Workaround |
|---|---|---|
| Code blocks ship completely unstyled after picking a Gruvbox theme | The three Gruvbox entries in the picker do not match the class the shipped CSS declares | Pick any other built-in code theme, or write a custom one |
| You picked a color theme and your headings did not change color | No built-in theme sets heading colors; they follow your site’s own typography | Set them in a custom theme, or accept the site’s colors |
Three Gruvbox code themes do nothing
code-theme-gruvbox-hard, code-theme-gruvbox-medium and code-theme-gruvbox-soft are all offered in the code-theme picker. The stylesheets that ship for them declare a misspelled name, so selecting one emits a class with no rule behind it. The result is not a fallback to a different theme — it is code with no syntax coloring at all, on every page of the set.
Workaround: pick any other built-in code theme, or author your own. Custom Documentation Themes covers both.
A built-in theme does not color everything
Choosing one of the built-in color themes sets the palette a docs site is judged on — the accent, the grounds, the borders, the sidebar and the search chrome. It does not set heading colors, the active link color, the inline maths color or the menu ground. Those fall through to your site’s own tokens by design, so a docs set inherits the typography of the site it belongs to rather than overriding it.
The consequence is that a stock built-in theme looks less “themed” than a custom one. That is not a fault; it is the fallback chain doing its job.
Workaround: if you want the headings in the accent color, that is a custom theme — the tokens are read, they are just not set by the built-ins. Custom Documentation Themes names each one.
Navigation and links in the CMS
Three cosmetic and navigational defects, each with a one-line answer.
| What you see | Why | Workaround |
|---|---|---|
| The “open page” links on Settings → URL Paths 404 | The link is built against a route that does not exist | Open the page from the Design workspace instead |
| No rail tab is highlighted while you edit a documentation page | Documentation routes are missing from the Design tab’s match list | Nothing is wrong; the page is under Design |
| The standalone Asset Library screen is unreachable | Its URL is claimed by another screen declared earlier | Use the asset sidebar in the Design workspace |
The second of these has a small tail worth knowing about: the same lookup that highlights a rail tab also records where you were last. Because a documentation page matches nothing, that visit is not remembered — so clicking Design afterwards returns you to whatever page you were on before, not to the documentation set you were just editing.
Surfaces that store a plan and do not execute it
Three surfaces persist real settings and then stop. What they save is real and shareable; what they do not do is deliver anything.
| What you see | Why | Workaround |
|---|---|---|
| A distribution channel is armed on the Workflows tab and nothing is ever posted or emailed | Channel settings are stored; there is no send path behind them yet | Publish, then post or send through the channel yourself |
| A campaign is built and approved and never goes out | Campaigns track the plan; sending reuses the existing email pipeline and is deferred | Send the email from the marketing email screen |
| The “recommended reading” block in a marketing email is unrelated to the page | The block picks three published pages at random rather than using the recommendation engine | Choose a layout without the block if the mismatch matters |
For each of these, be clear about what is real. The Workflows tab genuinely stores per-page channel settings and their on-page toggles, and they persist across publishes — Page Workflows and Release Notes and Auto-Posting describe exactly what is recorded. Campaigns genuinely hold a plan, a schedule and an approval state, and the calendar shows them — Campaigns and Deliverables. Neither of them delivers.
Surfaces that render empty on purpose
An empty screen means one of two things and you cannot tell them apart by looking: either you have no data yet, or there is no source behind the widget. These are the second kind.
| What you see | Why | Workaround |
|---|---|---|
| The Know dashboard’s Search Gaps panel says “No search gaps detected” forever | There is no source of zero-result searches yet; the endpoint returns an empty list by design | None today |
| An asset’s Analytics panel always says “No usage data for this asset yet” | The panel is a fixed placeholder for every asset type | Video and audio assets show their real engagement numbers inline in the asset body instead |
Which Know widgets have a real source, and what each one counts, is enumerated at Know Widgets Reference. The asset placeholder appears on every asset regardless of kind — Asset Details and Usage.
Things that fail without telling you
The two most expensive entries on this page. Both look like success.
| What you see | Why | Workaround |
|---|---|---|
| A marketing blast was accepted and never appears in Sent Emails | Your tier or your monthly allowance changed between acceptance and fan-out, and the whole batch was dropped | Check your allowance, then send again — Usage and Limits |
| A video sits on Processing… indefinitely | A genuinely failed encode is never marked as failed, so the processing state never ends | Delete the asset and upload the video again |
Configuration that does not do what it says
Four settings that accept a value and then do not use it, or do not use it where you expect.
| What you see | Why | Workaround |
|---|---|---|
| A YouTube handle is configured and no YouTube icon appears | The footer template reads a different key from the one the record stores | None today |
| A syntax language added under the documentation block is never highlighted | The build reads the company-level highlighter setting, not the documentation one | Set it at the top level of your site data, with a matching highlighter file |
| One of the fonts the builder ships is not in the font picker | The picker offers five of the six installed fonts | Pick one of the five, or set the font as a custom name |
| Connect LinkedIn Profile on a user’s profile does nothing | The button has no flow behind it | Set the LinkedIn handle in the field beside it |
The highlighter entry is the one likely to cost you time, because there are two keys with the same name at two levels. Extra syntax languages are read from the top level of your site data, not from inside the documentation configuration block, and each language additionally needs its matching highlighter file in the repository — a missing file logs a build warning and is skipped rather than failing the build. Documentation Configuration Reference marks the key that is read and the one that is not.
A hard-bounced contact is a related case with no entry of its own: once an address is recorded as hard-bounced, nothing in the CMS clears that flag, so a fixed address stays suppressed. Bounces and Deliverability explains what a hard bounce means for the rest of your list.
What we do with this list
Every entry here is handed to engineering, and this page is edited when a fix ships rather than left to accumulate. That is not a claim about a roadmap — it is how the page is maintained. One entry has already left it: a link to a specific heading on another page used to lose its anchor at build time, and now it does not, so the row is gone rather than being demoted to “fixed”.
If you have hit something that belongs here, use the feedback control in the CMS rail. A symptom you cannot find on this page may be a plan gate, a fixed ceiling, or something Leed simply does not have — Troubleshooting Index routes all three, and capabilities that were never built rather than built-and-broken are at What Leed Does Not Do. A setting you cannot find in the CMS at all is probably named at Settings You Will Not Find.