Bugs

Bugs

34 of 34 bugs
Reported 1
BUG-033 main
playlist and track publish byArtist and duration on types that do not define them
Found by WORK-628, which ran @adobe/structured-data-validator over the SEO baseline. These are the only schema.org-layer findings on today's baseline, and every one of them is real. The baseline never recorded them as defects: SPEC-130 D5 leaves a schema row to the reviewer, and the rows that carry these properties say in their own comments that nothing checks them.
Confirmed 10
BUG-012 main
There is no way to write a comment in refrakt content
Neither comment form is a comment. Both render as visible text, for different reasons, and there is no third option:
0/7 criteria
BUG-017 main
bento documents a frame cascade the engine does not implement
site/content/runes/marketing/bento.md described grid-level frame chrome cascading to every bento cell, and demonstrated it in a live preview:
BUG-019 main
A comma attribution leaves the comma in the testimonial role
{% testimonial %} parses its attribution line as **Name** — Role, stripping a leading -, – or — from the text after the <strong>. It does not strip a comma, so the comma form — which is the obvious alternative and which nothing rejects — carries the separator into the role.
BUG-023 main
data-meta-rank is styled and specified but emitted by nothing
data-meta-rank is the channel by which density compaction is meant to drop secondary metadata. It is specified, it is styled, and no code path ever puts it on an element.
BUG-024 main
Four runes duplicate the sequence dimension, and which rule wins differs per rune
howto, recipe, steps and track each hand-roll a CSS counter that the sequence dimension already provides for them. The duplication is invisible because the output looks identical — but the two rules land at different specificities, so which one is actually in effect differs from rune to rune.
BUG-026 main
migrate ids can renumber the published claimant, breaking references it never scans
When two files claim an ID, runMigrateIds sorts the claimants by path and keeps the first (plugins/plan/src/commands/migrate-ids.ts:165). Which claimant is already published on the base ref plays no part, so on a branch the tool will happily renumber the entity that is already on main and leave the local draft holding the ID.The safety argument for that choice is stated in the code:
BUG-034 main
Injected design tokens never reach the sandbox iframe
The design plugin's postProcess (plugins/design/src/pipeline.ts) and the editor preview's client-side stand-in (packages/editor/app/src/lib/preview/block-renderer.ts) both deliver a sandbox's design-context tokens as a child element: <meta data-field="design-tokens" content="{…}">. The identity transform leaves it in place (it is not a modifier), so it ships inside <rf-sandbox>.The rf-sandbox behaviour never reads that child. It looks for the tokens on a host attribute, this.dataset.designTokens (packages/behaviors/src/elements/sandbox.ts:112), and otherwise falls back to RfContext.designTokens. Nothing in the repo sets either: no transform emits data-design-tokens, and no code assigns RfContext.designTokens. So this._tokens is always null and the iframe never receives a token set, whichever context the sandbox names.Found while fixing BUG-032. That fix makes the build pick the right token set per context. This bug is what keeps that set from reaching the page.
BUG-035 main
Five create-refrakt starters link a nav item to a page that does not exist
Found by WORK-634 (#695), which scaffolds a project in its tests.The starters ship content/docs/getting-started.md, but five of the six _layout.md files list the nav item as getting-started instead of docs/getting-started:
BUG-036 main
The HTML starter never passes plugins to loadContent
Found by WORK-634 (#695).packages/create-refrakt/template-html/build.ts calls loadContent without the plugins option. Its own comment (around line 127) says plugins should be passed through, matching the option shape createRefraktLoader uses for the Vite-based adapters. As a result:
BUG-037 main
The runes.prefer docs example uses an npm name that mergePlugins never matches
Found by WORK-634 (#695).site/content/extend/plugin-authoring/authoring.md ("Name Collision Resolution") shows:
In Progress 0
Fixed 23
BUG-001 main
Hero, feature, and step stacked media-position labels are inverted
The shared stacked-layout contract (packages/lumina/styles/layouts/split.css) assumes media-first source order: top is plain DOM order, bottom flips visually via a generic column-reverse. But hero, feature, and step emit content-first DOM (text before media — the right reading order for their classic media-beneath-text presentation). Result: both stacked labels lie — the default top rendered media at the bottom, and an explicit bottom hoisted it to the top. Found in SPEC-101 review (PR #432); pre-existing.
BUG-003 main
Character drops prose written directly in the rune body
Found while auditing section roles for WORK-530: Character's entity-level body slot is emitted, placed by layout, and always empty. Prose an author writes directly inside {% character %} never reaches the output.Realm and Faction — the two runes that otherwise share Character's exact shape — handle the same content correctly, which is what makes this a bug rather than a design choice.
BUG-004 main
Scaffolded projects reference schema URLs the site does not serve
create-refrakt writes a $schema URL derived from its own package version:
7/7 criteria
BUG-005 main
Heading IDs drop inline code and keep punctuation, silently breaking deep links
extractHeadings in packages/runes/src/util.ts builds a heading's id by joining only the text child nodes, stripping ?, collapsing whitespace runs to -, and lowercasing. It does not strip any other punctuation, and inline code inside a heading contributes nothing at all — a code node is not a text node, so it is skipped.The result is ids that nobody writing a link would guess:
BUG-006 main
Rune attribute tables document attributes that do not exist, and omit ones that do
Thirteen rune reference pages carry a hand-written ## Attributes table. Two of them disagree with the rune's actual schema.
4/4 criteria
BUG-007 main
Plan entity attribute tables omit attributes the plan workflow requires
site/content/plan/docs/plan-entities.md documents the attributes of {% spec %}, {% work %}, {% bug %}, {% decision %}, and {% milestone %}. All five tables are incomplete, and two of the omissions are attributes the project's own mandatory workflow depends on.Measured against refrakt reference <rune> --format json --site plan:
6/6 criteria
BUG-008 main
Two universal attributes have no author-facing documentation
spacing and inset are universal attributes — every one of the 45 block runes that carries universals accepts both. Neither has a page that says what it does.Found while checking whether /runes/surfaces was a sound link target for SPEC-128 D1's axis accordion. It is, for most axes, but not all.
4/4 criteria
BUG-009 main
The reference command disagrees with itself about which runes exist
refrakt reference answers "which runes are there?" differently depending on which way you ask. Two symptoms, one question, so they are filed together.Found by WORK-547's survey, which reads reference dump as the rune set and got a set that matches neither reference <name> nor check-rune-docs.mjs.
7/7 criteria
BUG-010 main
An unresolvable data where value silently matches every row
{% data %} resolves where through resolveString, which handles string literals and Variable nodes. Anything else — a Function node, most obviously — returns the empty string, and applyWhere treats an empty expression as no filter. So a where the rune cannot understand renders the entire source instead of erroring.
5/5 criteria
BUG-011 main
A legitimately empty data filter is a build error, because nothing else catches a typo
{% data %} throws result is empty after projection (no rows to render) whenever the projection chain ends with zero rows. That fires on a filter which is correct and simply has no matches — a normal thing to ask of real data.The check cannot be relaxed on its own, because it is the only thing standing between an author and a silently wrong page. Measured against a two-row source with headers name,scope:
7/7 criteria
BUG-014 main
Markdoc validation never runs outside the language server
Markdoc.validate() is never called on site content. A rune typo, an unknown attribute, a missing required attribute and an out-of-enum modifier value all render silently, and the only user who ever learns is one running the VS Code extension.It is called in two places, neither of which sees a user's pages:
BUG-015 main
Lumina rules selecting on schema.org property attributes have gone stale
Six Lumina rules style runes by selecting on the RDFa property attribute rather than the BEM element class the rune's refs already produce. Four of them now match nothing: the schema property was renamed, moved onto a <meta>, or removed entirely, and the stylesheet was never updated.Nothing detected it. The CSS coverage test checks that the selectors derived from config exist in the CSS; it has no way to notice a hand-written selector that matches no element.
BUG-016 main
A track inside a playlist is not one of its tracks
/runes/media/track tells authors that "tracks can be used independently or inside a playlist rune". The composition does not work. A {% track %} inside a {% playlist %} is not a track of that playlist in the rendered HTML or in the structured data — it renders as a bare <li> in the prose body and publishes a detached top-level entity.Found while settling SPEC-130's open question about the two MusicRecording emitters. The question turned out to rest on this composition working; it does not.
0/6 criteria
BUG-018 main
breadcrumb auto loses every ancestor below depth 1
deriveParentUrl returns a parent URL with a trailing slash; the router registers page URLs without one. So parentOf maps /docs/guide to /docs/, no page is registered under that key, and the ancestor walk stops dead. {% breadcrumb auto=true %} renders the current page and nothing else.Found while landing WORK-563, which moved the SEO harvest past the pipeline and so put a page-level assertion on this hook's output for the first time.
BUG-021 main
The top-level validation shorthand is declared everywhere but read nowhere
WORK-559 added validation to RefraktConfig "as a deprecated shorthand, matching sandbox". The type is there, the JSON Schema declares it, the generated reference documents it — and nothing reads it.A user who configures validation the documented shorthand way gets editor autocomplete, schema shape-checking, no warning, and no effect.
BUG-022 main
validateManifest enforces the pre-ADR-024 manifest shape, so every scaffolded theme fails it
ADR-024 made themes framework-agnostic: no target, and layouts declare regions rather than pointing at framework components. validateManifest (packages/transform/src/validate.ts:467) was never updated.It still requires target and layouts.*.component, so it rejects the manifest create-refrakt generates and the manifest Lumina ships. Nobody noticed because nothing ran it — until WORK-579 gave it a command of its own.
BUG-025 main
Grouping by a multi-value field keys on the whole comma-string
collection, aggregate and backlog all accept group="<field>". When that field is multi-valued — tags, source, pr — the group key becomes the entire comma-separated string, so "runes, data, csv" is one group rather than three memberships.The filter side of the same grammar already disagrees: candidates() (packages/runes/src/field-match.ts:126) splits a comma-string into members, so filter="tags:runes" matches an entity tagged runes, data, csv. Grouping that same entity puts it in a group called runes, data, csv. One field, two incompatible readings, in one rune.
BUG-027 main
A {% snippet %} produced by a {% data %} row template resolves before its row is bound
The core preprocess phase runs three whole-AST passes in a fixed order — include, then snippet, then data (packages/runes/src/config.ts:2464). A row template that contains a {% snippet %} is therefore walked by snippet's pass before data has bound any row, so path=$row.path is unresolvable and the snippet fails. data then clones the resulting error fence once per row.
BUG-028 main
figure silently drops every child that is not an image
figure's transform builds its children from imgs — the nodes passing isMediaNode — plus an optional figcaption (packages/runes/src/tags/figure.ts:82-87):
BUG-030 main
A mixed list|tag:x field with emitTag silently drops the authored tags
resolveSequence's emit branch walks the nodes a field collected and skips anything that is not a list (packages/runes/src/lib/resolver.ts:194):
BUG-031 main
The reference drops the field-level authoring grammar
For a rune whose primary syntax is a Markdown list, refrakt reference documents that a list is accepted and nothing about what goes in it. Three facts are lost, at two different points in the pipeline.
BUG-032 main
Sandbox context attribute is never emitted, so every sandbox gets the default design tokens
sandbox declares a context attribute ("Shared context scope for multiple sandboxes", packages/runes/src/tags/sandbox.ts:92), and the design plugin reads it to choose which design-context token set to inject. The sandbox transform never puts the value anywhere. The attribute is read nowhere in sandbox.ts (lines 142–155 read the others), and createComponentRenderable is called with no properties (:247), so the rune carries no data-rune-fields entry and no <meta data-field="context">.The consumers therefore always fall back:
Won't fix 0
Duplicate 0