Back to Plate

Existing Feature Coverage Matrix for Plate

docs/editor-behavior/markdown-parity-matrix.md

53.0.564.7 KB
Original Source

Existing Feature Coverage Matrix for Plate

This is the major-release coverage gate for Plate's existing editor features.

Despite the filename, this file is no longer only about markdown-native constructs. The major can break any existing content-affecting feature, so the matrix needs to track:

  • markdown-native behavior
  • markdown extensions
  • block-editor-native elements
  • document styling and layout behavior
  • collaboration and editor-only content surfaces

Use this with:

This file is not the exhaustive scenario matrix. It answers:

  • which feature families exist
  • which ones are covered enough for release
  • which ones are deferred

Authority Model

Use the strongest external precedent available for each concrete surface.

This family table is routing guidance only. It does not pre-decide every row.

FamilyCommon Parse / Serialize CandidatesCommon UX CandidatesCommon Cross-Checks / Adjacent RefsFallback
Markdown-native syntaxCommonMark / GFM / GitHub Docs for GFM-only constructs / LaTeX-style math / MDX when applicableTypora when the concrete surface really matches markdown-first editing intentMilkdown, GitHub Docs, or other stronger surface-specific refsexplicit repo decision only if refs disagree or are silent
Markdown mode architecture and note-linked navigationcurrent serialized shape or editor-only contract where neededObsidian when the concrete surface is truly dual-mode or note-linkedGoogle Docs, Typora, or other stronger navigation refsfallback only when stronger navigation precedent runs out
Block-editor-native elementsfeature's current serialized shape or explicit non-markdown contractNotion when the concrete element actually matches block-editor-native behaviorMilkdown, then the strongest adjacent mainstream precedentfallback only when no clear external standard exists
Tables and linear document editingGFM / HTML table rules when applicableGoogle Docs when the concrete surface is really document/table behaviorObsidian, Notion, Milkdown, or another stronger row-level reffallback only after stronger table precedent runs out
Collaboration and reviewingcurrent serialized shape or editor-only contractGoogle Docs when the concrete collaboration surface matches review-style behaviorNotion or the stronger collaboration precedent for the rowfallback only after stronger collaboration precedent runs out
Styling and layoutcurrent serialized shape plus HTML / CSS expectations where relevantGoogle Docs when the concrete styling surface matches document-style editingNotion or the stronger adjacent precedent for the rowfallback only after stronger styling precedent runs out

Status Meaning

  • locked: strong enough to build on without blocking the major
  • partial: existing feature works, but the contract or coverage is still thin
  • gap: existing feature is under-specified, lossy, or weakly covered
  • profile-divergence: existing feature works, but it is outside the strict markdown-first profile and still needs explicit behavior policy
  • deferred-minor: not part of this major even though the parser or docs mention it

Scope Rule

This file tracks existing content-affecting surfaces only.

It does not try to gate:

  • AI workflows
  • slash menu / toolbar UI
  • docx / html / csv export quality unless it changes editor behavior
  • browser-only chrome around the editor

How To Read A Row

  • Node Model / Affinity records whether the feature is void plus its inline affinity class when one exists
  • Behavior Scope is the user-facing behavior that must be spec'd
  • Current Evidence lists representative seams, not every test
  • Next Work is the concrete remaining work for the major lane
  • Editing Spec IDs should point to concrete spec IDs or the pending family ID

Markdown-Native Core

FeatureFamilyNode Model / AffinityParse AuthorityPrimary UX RefSecondary RefBehavior ScopeEditing Spec IDsCurrent EvidenceNext WorkStatus
Paragraphmarkdown-nativeblock non-void; n/aCommonMarkTyporaMilkdown, , , , root-empty behaviorEDIT-P-*packages/markdown/src/lib/deserializer/deserializeMd.spec.ts
packages/indent/src/lib/withIndent.spec.tsx
apps/www/src/__tests__/package-integration/markdown-rich/serializeMd.spec.tsxfinish explicit non-empty root fallbacklocked
Headingmarkdown-nativeblock non-void; n/aCommonMarkTyporaMilkdownsplit, reset, depth-specific behaviorEDIT-H-*packages/markdown/src/lib/deserializer/deserializeMd.spec.ts
packages/markdown/src/lib/serializer/convertNodesSerialize.spec.ts
packages/core/src/lib/plugins/override/withBreakRules.spec.tsx
packages/core/src/lib/plugins/override/withDeleteRules.spec.tsxno active major blockerlocked
Blockquotemarkdown-nativeblock non-void container; n/aCommonMarkTyporaMilkdownnested blocks, empty exit, , , quoted list interactionEDIT-BQ-*packages/markdown/src/lib/deserializer/deserializeMd.spec.ts
packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/core/src/lib/plugins/override/withBreakRules.spec.tsx
packages/core/src/lib/plugins/override/withDeleteRules.spec.tsxno active major blockerlocked
Unordered listmarkdown-nativeblock non-void container; n/aCommonMarkTyporaMilkdownsplit, exit, outdent, quoted-list interactionEDIT-LIST-*packages/markdown/src/lib/deserializer/deserializeMdList.spec.tsx
packages/list/src/lib/withList.spec.tsx
packages/core/src/lib/plugins/override/withDeleteRules.spec.tsxricher mixed-document editing matriceslocked
Ordered listmarkdown-nativeblock non-void container; n/aCommonMarkTyporaMilkdownrestart numbering, split, exit, outdentEDIT-LIST-*packages/markdown/src/lib/deserializer/deserializeMdList.spec.tsx
packages/markdown/src/lib/serializer/standardList.spec.tsx
packages/list/src/lib/withList.spec.tsxno active major blockerlocked
Linkmarkdown-nativeinline non-void span; directionalCommonMarkTyporaMilkdownround-trip, directional affinity, plain-link paragraphs, source-entry interactionEDIT-AFF-LINK-001, EDIT-LINK-CLICK-*, EDIT-INTERACT-*packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/markdown/src/lib/deserializer/deserializeMentionLink.spec.tsx
packages/core/src/lib/plugins/affinity/AffinityPlugin.spec.tsx
content/(plugins)/(elements)/link.mdxcurrent link law is covered; denser transform permutations still live in protocol rows instead of the backloglocked
Imagemarkdown-nativeblock void media atom; n/aCommonMarkTyporaMilkdownalt vs title, attribute precedence, plain-image paragraphs, source-entry interactionEDIT-IMG-*, EDIT-INTERACT-*packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/markdown/src/lib/defaultRules.spec.ts
apps/www/src/__tests__/package-integration/markdown-rich/serializeMd.spec.tsxplain markdown image output is limited to alt, src, and optional title; width/height remain HTML/MDX-onlylocked
HTML blockmarkdown-nativeblock non-void; n/aCommonMark HTML block semanticsTyporaMilkdownsource-canonical editable HTML block source as a source-entry surface, with richer rendered edit chrome deferredEDIT-INTERACT-*docs/research/sources/typora/links-images-and-html-behavior.md
docs/research/decisions/links-images-and-html-share-a-source-entry-surface.md
docs/research/concepts/source-entry-surface.md
packages/markdown/src/lib/deserializer/deserializeMd.spec.ts
packages/markdown/src/lib/deserializer/utils/customMdxDeserialize.spec.ts
docs/editor-behavior/editor-protocol-matrix.mdcurrent Plate evidence now covers the source-canonical HTML-block surface honestly enough to lock it; richer rendered HTML-block chrome is deferred as a later product lanelocked
Emphasis / italicmarkdown-nativeleaf mark; directionalCommonMarkTyporaMilkdownround-trip and markdown-native parse/serialize behaviorEDIT-AFF-MARK-001packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/autoformat/src/lib/__tests__/withAutoformat/mark/basic-marks.spec.tsxno active major blockerlocked
Strong / boldmarkdown-nativeleaf mark; directionalCommonMarkTyporaMilkdownround-trip and markdown-native parse/serialize behaviorEDIT-AFF-MARK-001packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/markdown/src/lib/serializer/convertNodesSerialize.spec.tsno active major blockerlocked
Inline codemarkdown-nativeleaf mark; hardCommonMarkTyporaMilkdownround-trip, hard-edge typing, mixed-mark behaviorEDIT-AFF-HARD-001packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/core/src/lib/plugins/affinity/AffinityPlugin.spec.tsx
packages/markdown/src/lib/serializer/convertTextsSerialize.spec.tsno active major blockerlocked
Fenced code blockmarkdown-nativeblock non-void owner; n/aCommonMarkTyporaMilkdowndirect raw markdown, , , , , language preservationEDIT-CB-*packages/markdown/src/lib/deserializer/deserializeMd.spec.ts
packages/code-block/src/lib/withCodeBlock.spec.tsx
packages/code-block/src/react/CodeBlockPlugin.spec.tsxno active major blockerlocked
Thematic breakmarkdown-nativeblock void atom; n/aCommonMarkTyporaMilkdowncreation and adjacent block behaviorEDIT-HR-*packages/markdown/src/lib/serializer/convertNodesSerialize.spec.ts
packages/markdown/src/lib/deserializer/convertNodesDeserialize.spec.tsno active major blockerlocked
Hard line breakmarkdown-nativetext token; n/aCommonMark + HTML fallbackTyporaMilkdownparagraph and blockquote parity, html fallback, trailing breaksEDIT-HARD-*packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/markdown/src/lib/deserializer/splitLineBreaks.spec.tsx
apps/www/src/__tests__/package-integration/markdown-rich/serializeMd.spec.tsxno active major blockerlocked

Markdown Extensions

FeatureFamilyNode Model / AffinityParse AuthorityPrimary UX RefSecondary RefBehavior ScopeEditing Spec IDsCurrent EvidenceNext WorkStatus
Task listmarkdown extensionblock non-void container; n/aGFM / GitHub DocsTyporaMilkdownchecked-state round-trip, list editing rulesEDIT-LIST-*packages/markdown/src/lib/taskList.spec.ts
packages/markdown/src/lib/deserializer/deserializeMdList.spec.tsx
packages/markdown/src/lib/serializer/listToMdastTree.spec.ts
packages/list/src/lib/normalizers/withInsertBreakList.spec.tsx
packages/list/src/lib/withList.spec.tsxno active major blockerlocked
Tablemarkdown extensionblock non-void grid owner; n/aGFMGoogle DocsNotion, Milkdowncell nav, , /, , multi-cell selection, copy/paste, merge/split, row/column insert/delete, deserialize/serialize, and intentional inline `
` fallback for multi-paragraph cell contentEDIT-TABLE-*packages/markdown/src/lib/table.spec.ts
packages/table/src/lib/withTable.spec.tsx
packages/table/src/lib/withApplyTable.spec.tsx
packages/table/src/lib/withDeleteTable.spec.tsx
packages/table/src/lib/withTableCellSelection.spec.tsx
packages/table/src/lib/withInsertFragmentTable.spec.tsx
packages/table/src/lib/transforms/*.spec.tsx
packages/table/src/lib/merge/*.spec.tsx
apps/www/src/__tests__/package-integration/markdown-rich/serializeMd.spec.tsxmulti-paragraph cells intentionally degrade to inline `
` fallback because plain markdown table syntax cannot carry nested block structurelocked
Strikethroughmarkdown extensionleaf mark; directionalGFM / GitHub DocsTyporaMilkdownround-trip as a markdown deletion markEDIT-AFF-MARK-001packages/basic-nodes/src/lib/BaseStrikethroughPlugin.ts
packages/basic-nodes/src/lib/BaseMarkPlugins.spec.ts
packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/markdown/src/lib/serializer/serializeInlineMd.spec.tsno active major blockerlocked
Highlightmarkdown extensionleaf mark; directionallocal MDX mark contractTyporaMilkdown<mark> round-trip and mark togglingEDIT-MARK-MDX-*, EDIT-AFF-MARK-001packages/basic-nodes/src/lib/BaseHighlightPlugin.ts
packages/markdown/src/lib/mdxMarks.spec.tsx
content/(plugins)/(marks)/highlight.mdxexisting plugin and markdown surface are coveredlocked
Subscriptmarkdown extensionleaf mark; directionallocal MDX mark contractTyporaMilkdown<sub> round-trip and mutual exclusion with superscriptEDIT-MARK-MDX-*, EDIT-AFF-MARK-001packages/basic-nodes/src/lib/BaseSubscriptPlugin.ts
packages/markdown/src/lib/mdxMarks.spec.tsx
content/(plugins)/(marks)/subscript.mdxexisting plugin and markdown surface are coveredlocked
Superscriptmarkdown extensionleaf mark; directionallocal MDX mark contractTyporaMilkdown<sup> round-trip and mutual exclusion with subscriptEDIT-MARK-MDX-*, EDIT-AFF-MARK-001packages/basic-nodes/src/lib/BaseSuperscriptPlugin.ts
packages/markdown/src/lib/mdxMarks.spec.tsx
content/(plugins)/(marks)/superscript.mdxexisting plugin and markdown surface are coveredlocked
Emoji shortcodemarkdown extensiontext token after parse; n/alocal remark plugin contractTyporaGitHub Docs:shortcode: parse in the default markdown profileEDIT-EMOJI-*packages/markdown/src/lib/emojiSurface.spec.tsx
packages/markdown/src/lib/__tests__/createTestEditor.tsx
apps/www/src/registry/components/editor/plugins/markdown-kit.tsxshortcode input is covered; the current contract normalizes to unicode text on serializelocked
Inline mathmarkdown extensioninline void atom; n/aLaTeX-style math / KaTeX conventionsTyporaMilkdownround-trip, boundary behavior, inline/table interactionEDIT-MATH-*packages/markdown/src/lib/mathSurface.spec.ts
packages/math/src/lib/BaseInlineEquationPlugin.spec.ts
packages/math/src/lib/transforms/insertInlineEquation.spec.ts
packages/math/src/react/hooks/useEquationInput.spec.tsxno active major blockerlocked
Block mathmarkdown extensionblock void atom; n/aLaTeX-style math / KaTeX conventionsTyporaMilkdownround-trip, empty exit, block selection behaviorEDIT-MATH-*packages/markdown/src/lib/mathSurface.spec.ts
packages/math/src/lib/BaseEquationPlugin.spec.ts
packages/math/src/lib/transforms/insertEquation.spec.ts
apps/www/src/__tests__/package-integration/ai-chat-streaming/streamSerializeMd.slow.tsxno active major blockerlocked
Autolink literalmarkdown extensioninline non-void link span; directionalGFM / GitHub DocsTyporaMilkdownbare URL parse/serialize and editingEDIT-AFF-LINK-001packages/link/src/lib/withLink.spec.tsx
packages/markdown/src/lib/gfmSurface.spec.tsno active major blockerlocked
Footnotemarkdown extensioninline void ref atom + block non-void definition; n/aGFM / GitHub DocsTyporaMilkdownreference/definition round-trip, insert flow, registry-backed lookup helpers, duplicate-definition normalization and repair, navigation helpers, shared navigation feedback, and dedicated node modelEDIT-FOOTNOTE-*, EDIT-NAV-FEEDBACK-*packages/markdown/src/lib/gfmSurface.spec.ts
packages/footnote/src/lib/BaseFootnoteReferencePlugin.ts
packages/footnote/src/lib/BaseFootnoteDefinitionPlugin.ts
packages/footnote/src/lib/registry.ts
packages/footnote/src/lib/queries/footnoteRegistry.spec.ts
packages/footnote/src/lib/transforms/insertFootnote.spec.ts
packages/footnote/src/lib/BaseFootnotePlugins.spec.ts
packages/markdown/src/lib/rules/defaultRules.ts
apps/www/src/registry/components/editor/transforms.ts
apps/www/src/registry/ui/slash-node.tsx
apps/www/src/registry/ui/footnote-node.spec.tsxno active major blockerlocked

Block-Editor-Native Existing Elements

FeatureFamilyNode Model / AffinityParse AuthorityPrimary UX RefSecondary RefBehavior ScopeEditing Spec IDsCurrent EvidenceNext WorkStatus
Mentionblock-editor-nativeinline void atom; n/alocal mention markdown contractNotionMilkdowninline insertion, spacing, keyboard access, markdown mention link round-tripEDIT-MENTION-*packages/mention/src/lib/BaseMentionPlugin.spec.tsx
packages/mention/src/lib/getMentionOnSelectItem.spec.tsx
packages/markdown/src/lib/deserializer/deserializeMentionLink.spec.tsx
packages/markdown/src/lib/serializer/serializeMention.spec.tsexplicit local contract informed by mainstream mention-chip behaviorlocked
Calloutblock-editor-nativeblock non-void container; n/alocal MDX callout contractNotionMilkdowninsert, nested content, keyboard behavior, markdown round-tripEDIT-CALLOUT-*packages/callout/src/lib/BaseCalloutPlugin.spec.ts
packages/callout/src/lib/transforms/insertCallout.spec.ts
packages/core/src/lib/plugins/override/withBreakRules.spec.tsx
packages/core/src/lib/plugins/override/withDeleteRules.spec.tsx
packages/markdown/src/lib/mdx.spec.tsxexplicit local contract; not claimed as a stronger external standard than the evidence supportslocked
Toggleblock-editor-nativeblock non-void container; n/acurrent toggle node contractNotionMilkdownopen/close, nested blocks, , , , EDIT-TOGGLE-*packages/toggle/src/lib/BaseTogglePlugin.spec.ts
packages/toggle/src/lib/queries/someToggle.spec.ts
packages/toggle/src/react/hooks/toggleHooks.spec.tsx
packages/toggle/src/react/queries/toggleQueries.spec.ts
packages/toggle/src/react/withToggle.spec.tsxbehavior is specified; implementation work stays in the planned toggle rewrite lanedeferred-minor
Dateblock-editor-nativeinline void atom; n/alocal MDX date contractNotionGoogle Docsinline insertion, adjacency checks, keyboard access, markdown round-tripEDIT-DATE-*packages/date/src/lib/BaseDatePlugin.spec.tsx
packages/date/src/lib/transforms/insertDate.spec.tsx
packages/date/src/lib/utils/dateValue.spec.ts
packages/date/src/lib/queries/isPointNextToNode.spec.tsx
packages/markdown/src/lib/dateElement.spec.ts
apps/www/src/registry/ui/date-node.spec.tsx
apps/www/src/registry/ui/date-node-static.spec.tsxcanonical YYYY-MM-DD node values are locked; markdown writes canonical dates as <date value=\"...\" />, dual-reads legacy child-text, and preserves non-normalizable legacy text on a raw fallback pathlocked
TOCblock-editor-nativeblock void atom shell + generated entry overlay controls; n/alocal MDX TOC contractNotionTypora, Google Docsinsert, atomic boundary behavior, navigation-only activation, keyboard activation, active-section tracking, shared navigation feedback, scrolling hooks, serialization policyEDIT-TOC-*, EDIT-NAV-FEEDBACK-*packages/toc/src/lib/BaseTocPlugin.spec.ts
packages/toc/src/lib/transforms/insertToc.spec.ts
packages/toc/src/react/hooks/*.spec.tsx
apps/www/src/registry/ui/toc-node.spec.tsx
packages/markdown/src/lib/mdx.spec.tsxexplicit local contract with split shell-vs-navigation authorities; not sold as a strong public standardlocked
Column group / column itemblock-editor-nativeblock non-void container; n/alocal MDX column contractNotiondocs referenceinsert, split, move, select-all, nested editing, serializationEDIT-COLUMN-*packages/layout/src/lib/withColumn.spec.ts
packages/layout/src/lib/transforms/insertColumnGroup.spec.ts
packages/layout/src/lib/transforms/insertColumn.spec.ts
packages/layout/src/lib/transforms/toggleColumnGroup.spec.tsx
packages/layout/src/lib/transforms/setColumns.spec.tsx
packages/markdown/src/lib/columnSurface.spec.tsexplicit local contract; not sold as a strong public standardlocked
Media embedblock-editor-nativeblock void atom; n/alocal media MDX contractNotiondocs referenceembed insertion, editing, serializationEDIT-MEDIA-*packages/media/src/lib/media-embed/BaseMediaEmbedPlugin.spec.ts
packages/media/src/lib/media-embed/transforms/insertMediaEmbed.spec.ts
packages/media/src/lib/BaseMediaPluginContracts.spec.ts
packages/media/src/lib/media/parseMediaUrl.spec.ts
packages/media/src/lib/media-embed/parseIframeUrl.spec.ts
packages/media/src/lib/media-embed/parseVideoUrl.spec.ts
packages/media/src/lib/media-embed/parseTwitterUrl.spec.ts
packages/media/src/react/media/FloatingMedia/submitFloatingMedia.spec.ts
packages/media/src/react/media/useMediaState.spec.ts
packages/markdown/src/lib/mediaSurface.spec.ts
apps/www/src/registry/ui/media-video-node.spec.tsxnormalized embed metadata is locked for the current contract: canonical render url, current provider / id, optional sourceUrl for edit reversibility, and allowlisted Twitter/X snippet extraction; broader script/embed behavior and PDF remain outside the contractlocked
Image / file / audio / video blocksblock-editor-nativeblock void media node + non-void caption helper; n/alocal media contractsNotionGoogle Docs for file-ish behaviorinsert, caption/title, selection, serializationEDIT-MEDIA-*packages/media/src/lib/BaseMediaPluginContracts.spec.ts
packages/media/src/lib/image/withImageEmbed.spec.tsx
packages/media/src/lib/image/withImageUpload.spec.tsx
packages/media/src/lib/media/insertMedia.spec.ts
packages/media/src/lib/placeholder/BasePlaceholderPlugin.spec.ts
packages/media/src/react/placeholder/utils/history.spec.ts
packages/markdown/src/lib/commonmarkSurface.spec.ts
packages/markdown/src/lib/mediaSurface.spec.ts
packages/markdown/src/lib/rules/utils/parseAttributes.spec.tscurrent media node, placeholder, and MDX attribute contract is locked; richer source-entry and file-system semantics stay deferredlocked
Code drawing / Excalidrawblock-editor-nativeblock void atom; n/alocal non-markdown contractNotion-like board toolsdocs referenceinsertion, selection, serialization policyEDIT-DRAWING-*packages/code-drawing/src/lib/transforms/insertCodeDrawing.spec.ts
packages/code-drawing/src/lib/BaseCodeDrawingPlugin.spec.ts
packages/excalidraw/src/lib/transforms/insertExcalidraw.spec.ts
packages/excalidraw/src/lib/BaseExcalidrawPlugin.spec.tsbehavior is specified; richer product work still stays in a later release lanedeferred-minor
Captionblock-editor-native helperblock non-void helper; n/alocal caption contractNotionGoogle Docsmovement into/out of captions, media integrationEDIT-CAPTION-*packages/caption/src/lib/withCaption.spec.tsxexplicit local contract informed by media-caption behavior in block editors and docs toolslocked

Document Styling And Layout

FeatureFamilyNode Model / AffinityParse AuthorityPrimary UX RefSecondary RefBehavior ScopeEditing Spec IDsCurrent EvidenceNext WorkStatus
Indentstyling/layoutblock non-void property; n/alocal block style contractGoogle DocsNotionparagraph indent, interaction with quote/list ownersEDIT-INDENT-*packages/indent/src/lib/withIndent.spec.tsx
packages/indent/src/lib/transforms/setIndent.spec.ts
packages/list/src/lib/withList.spec.tsx
content/(plugins)/(styles)/indent.mdxexplicit local style contract informed by Docs-style paragraph indentationlocked
Text alignstyling/layoutblock non-void property; n/alocal block style contractGoogle DocsNotionalign transform, affected blocks, serialization policyEDIT-ALIGN-*packages/basic-styles/src/lib/BaseTextAlignPlugin.spec.ts
content/(plugins)/(styles)/text-align.mdxexplicit local style contract informed by Docs-style alignment controlslocked
Text indentstyling/layoutblock non-void property; n/alocal block style contractGoogle DocsNotionindent transform, interaction with paragraph/list/quoteEDIT-TEXT-INDENT-*packages/basic-styles/src/lib/BaseTextIndentPlugin.spec.tsexplicit local style contract informed by Docs-style indentation controlslocked
Line heightstyling/layoutblock non-void property; n/alocal style contractGoogle DocsNotionapplication/removal, affected blocks, serialization policyEDIT-LINE-HEIGHT-*packages/basic-styles/src/lib/BaseLineHeightPlugin.spec.tsexplicit local style contract informed by document-style spacing controlslocked
Font family / size / weight / color / backgroundstyling/layoutleaf style marks; directionallocal style span contractGoogle DocsNotionmark boundaries, serialization policy, mixed markdown behaviorEDIT-STYLE-*, EDIT-AFF-MARK-001packages/basic-styles/src/lib/BaseFontFamilyPlugin.spec.ts
packages/basic-styles/src/lib/BaseFontSizePlugin.spec.ts
packages/basic-styles/src/lib/BaseFontWeightPlugin.spec.ts
packages/basic-styles/src/lib/BaseFontColorPlugin.spec.ts
packages/basic-styles/src/lib/BaseFontBackgroundColorPlugin.spec.ts
packages/markdown/src/lib/rules/fontRules.tsexplicit local style contract informed by document-style formatting controlslocked

Collaboration And Editor-Only Existing Features

FeatureFamilyNode Model / AffinityParse AuthorityPrimary UX RefSecondary RefBehavior ScopeEditing Spec IDsCurrent EvidenceNext WorkStatus
Commentcollaborationleaf metadata mark; outwardeditor-only contractGoogle DocsNotionmark boundaries, creation/removal, serialization exclusionEDIT-COMMENT-*packages/comment/src/lib/BaseCommentPlugin.spec.ts
packages/comment/src/lib/utils/getCommentKeys.spec.ts
packages/comment/src/lib/utils/getCommentCount.spec.ts
packages/markdown/src/lib/rules/defaultRules.tsbehavior is specified; implementation hardening still belongs to the collaboration lanedeferred-minor
Suggestioncollaborationleaf metadata mark plus block suggestion wrapper; outwardeditor-only contractGoogle DocsNotionsuggestion ranges, insertion/deletion behavior, serialization exclusionEDIT-SUGGESTION-*packages/suggestion/src/lib/BaseSuggestionPlugin.spec.ts
packages/suggestion/src/lib/withSuggestion.spec.tsx
packages/suggestion/src/lib/transforms/acceptSuggestion.spec.tsx
packages/suggestion/src/lib/transforms/rejectSuggestion.spec.tsx
packages/suggestion/src/lib/insertBreakSuggestion.spec.tsx
packages/suggestion/src/lib/transforms/deleteSuggestion.spec.ts
packages/markdown/src/lib/rules/defaultRules.tsbehavior is specified; implementation hardening still belongs to the collaboration lanedeferred-minor
Discussioncollaborationoverlay / anchor surface; n/aeditor-only contractGoogle DocsNotionanchor behavior, selection coupling, serialization exclusionEDIT-DISCUSSION-*docs surface onlybehavior is specified; product implementation work still belongs to the collaboration lanedeferred-minor
Yjs cursor / collaboration overlayscollaborationoverlay / no node; n/aeditor-only contractGoogle DocsFigma/Notionconcurrent cursor and presence behaviorEDIT-COLLAB-*docs and package surfacesbehavior is specified; implementation hardening still belongs to the collaboration lanedeferred-minor

Current Major Gate

The active major-release gate is now closed.

Search / find-replace stays outside the active gate for now.

The behavior law and protocol rows exist, but the editor search surface is still intentionally deferred until that product lane is picked up for real.

What is considered closed for this major:

  1. markdown-native release-critical behavior
  2. the main existing-feature editor behavior seams that were actually changing or clearly under-specified:
    • blockquote
    • list
    • heading
    • code block
    • table core behavior
    • indentation ownership
    • callout reset/soft-break behavior
    • mention/date/TOC boundary behavior
    • column package-surface round-trip
    • media/caption package-surface behavior

What remains outside this closed major but still belongs in the editor-behavior backlog:

  • markdown-feature follow-up:
    • typed syntax-trigger conversion surfaces inside the broader source-preserving conversion family are split:
      • link automd now ships through the richer link/source-entry interaction lane while staying outside the plain autoformat family
      • math delimiter triggers now ship a safe rich-mode slice:
        • completed $...$ converts to inline math on the closing delimiter
        • $$ + Enter promotes to block math
        • selection-wrap stays deferred for future markdown-native or explicitly-approved profile behavior
    • if product later wants Enter-owned normalization for code-fence or horizontal-rule shorthand, that belongs to a neighboring input-rule lane, not to the closed autoformat alignment lane
    • heavier date serialized semantics beyond the current canonical YYYY-MM-DD node contract, canonical <date value=\"...\" /> write output, and legacy child-text read compatibility
    • media/embed product expansion beyond the current normalized url / provider / id / optional sourceUrl contract is explicitly deferred; it is too broad for the current markdown lane and should not be treated as the next markdown-native follow-up
  • toggle rewrite lane
  • editor-behavior-wide search / find-replace product lane:
    • current-file search
    • seeded search from selection
    • find next / previous
    • replace
    • search-target navigation feedback
    • outline header search
    • this is a cross-surface editor-behavior lane, not a markdown-native lane
  • code-drawing / Excalidraw lane
  • collaboration/editor-only lane:
    • comment
    • suggestion
    • discussion
    • yjs
  • streaming improvements unless a current-feature change regresses them

Remaining Backlog Families

Use master-roadmap.md for the actual implementation order.

This section only names the backlog families that still exist outside the closed major gate.