WORK-521
ID:WORK-521Status:pending

Migrate the remaining scalar axes to facets

Move the remaining lettered sub-steps of transformRune into facets: density (1e), width / spacing / inset (1f), reading and dropcap (1f-bis), content-measure, and reveal / stagger. Individually these are small; together they are most of what remains between step 1 and step 2, and clearing them is what lets the lettered numbering go away.

Priority:mediumComplexity:moderateMilestone:v0.30.1Source:SPEC-124
claude/spec-124-facet-registry View source

Criteria completion

Criteria completion: 0 of 9 (0%) checked; tracking started on Aug 27, no incremental history yet0%25%50%75%100%Aug 27Sep 6

Tracking started Aug 27 — check back for trends.

Branches 2
claude/spec-124-facet-registry current pending
claude/transform-package-refactor-7mxi8a donemain done
History 2
  1. 7b91f9a
    Content editedby bjornolofandersson
  2. de0030a
    Created (pending)by bjornolofandersson

Acceptance Criteria

  • density, width, spacing, inset, reading, dropcap, content-measure and motion (reveal + stagger) are facets
  • dropcap declares after: ['reading'], replacing the current adjacency-only guarantee, and keeps its off-register warn
  • density continues to resolve author attribute ▸ parent childDensity ▸ rune default ▸ full, reading the parent rune's config through the facet context
  • motion keeps data-reveal / data-stagger emission and the --rf-reveal-index stamping on cascade items — the latter via postAssemble, since it walks assembled children
  • width, spacing and inset keep their default-suppression rules (content, default) so unmarked output stays byte-identical
  • No lettered sub-steps (1b1h) remain in transformRune
  • All 630 pre-existing transform tests pass unmodified
  • Unit tests cover each axis's default resolution and suppression rules, and the readingdropcap gate
  • npm run build, the full repo suite, and refrakt contracts --check pass

Approach

These are the axes the WORK-517 pattern was designed for, so most are a direct port. Three need care.

density reads the parent rune's childDensity, so the facet context must expose the parent config lookup — the first facet to need more than the current rune's own config.

stagger stamps an index on cascade items in document order, which is a children walk and therefore postAssemble, not resolve.

content-measure is config-derived rather than author-driven (config.contentMeasure === 'anchored'), a reminder that not every axis reads an attribute.

Each facet takes its vocabulary with it — READING_REGISTERS and READING_CAPABILITIES already live in reading.ts and can stay there, re-exported by the facet rather than duplicated.

Blocked by

  • WORK-518

References

  • SPEC-124 — facet registry (the spec this work item realizes)
  • SPEC-108 — reading register and the dropcap capability gate
  • SPEC-105 — scroll-reveal motion and stagger indices
  • SPEC-025 — the universal theming dimensions these axes belong to