Repository navigation
RR-55: core 0.14 names, Findings in Review, fonts handle, core slide context (lockstep) - #116
Merged
Merged
Conversation
This was referenced Oct 7, 2026
michaeljgrimm
force-pushed
the
codex/rr-55-short-verb-api
branch
from
October 7, 2026 06:21
075ce52 to
3f89734
Compare
michaeljgrimm
marked this pull request as ready for review
October 7, 2026 06:21
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: a46284e7-8b6e-4365-821d-d88b4cf2116c) |
… handle (lockstep with core 0.14)
Session validation runs validate(doc, { only: ["format"] }); the Review panel runs the full validate on a
debounce, groups findings by category and merges an optional hosted reviewer's FindingReport by source.
composeSlide/paginateSlide resolve the slide context with core's resolveSlideContext. createCanvasEditor,
exportDeck, composeSlide and paginateSlide take the renderer's loadFonts() handle as { fonts }; the font
gate is the handle's pending/ensure. Old names and every typeof-core feature detection are removed.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
exportDeck gave the fonts handle to svgToPdf, which embeds every face the registry holds whatever its license. It now gives the converter only the faces the SVG may embed (OFL-1.1, Apache-2.0, MIT, UFL-1.0), as fontData. A dropped face is reported once as export-font-license; when none is left for some text the PDF rejects with export-fonts-unlicensed (the converter's error is the cause). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
editor.presentation (was editor.document), the presentation of every snapshot, change, prepare result, transfer and restoreState state, the presentation option of createCanvasEditor and the presentation handed to onRender, onDraft, onCommit and the template preview. A DOM document option stays. The autosave record holds presentation (record version 2, key prefix opf-editor/v2/). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… rule ids) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…urement only - Test fixes for the FA tests under the RR-55 names (renderSlideSvg, /composition imports, full validate with rule ids for the content and layout rules, presentation fields); core-features also scans test imports. - Remove the duplicate opf.requiresUnreleasedCore key FA already carries; fix two bare document references left in FA code. - A preview (canvas, thumbnails, panel previews) hands the renderer only the fonts handle's text measurement: the full handle lists embeddedFonts, which the renderer writes into every SVG, and the playground's preview SVG grew from 2 KB to 12.7 MB (three times slower clicks, timeouts in the browser suites). test/preview-fonts.mjs covers it. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
michaeljgrimm
force-pushed
the
codex/rr-55-short-verb-api
branch
from
October 7, 2026 07:49
3f89734 to
572cf94
Compare
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: add8732d-5e25-4ffc-9929-2bbd4244a971) |
This was referenced Oct 7, 2026
Closed
michaeljgrimm
added a commit
that referenced
this pull request
Oct 8, 2026
#132) * RR-61: canvas and previews draw with the fonts handle and embedFonts: false Closes #129. opf-render's RR-61 (opf-render#165) embeds only the faces a slide draws and adds embedFonts: false. The canvas and the playground previews now pass the full handle with embedFonts: false instead of the internal previewFonts helper (measurement only, #116): the browser handle already added the faces to the page, so the SVGs carry no @font-face data. Exports keep the default and embed the faces each slide draws. canvas-fonts-browser asserts the canvas SVG embeds no face. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * RR-61: rebuilt dist (canvas and font-gate without previewFonts) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Depends-On: OpenPresentation/opf#423
Depends-On: OpenPresentation/opf-render#150
Depends-On: OpenPresentation/opf-pptx#196
RR-55, the editor part, in lockstep with core 0.14, renderer 0.14 and PPTX 0.14. Old names are deleted: no aliases, no
@deprecated, no shims.Summary
validate(doc, { only: ["format"] })(no layout is built);rejectInvalidfollowsvalid.editor.validationand thevalidationof every change, event and snapshot are core'sValidationReport(valid,findings,counts).validateOpfDocumentand the session'svalidateoption are removed.validate(doc)after 300 ms of quiet (never per keystroke), groups findings by category with severity, appliesFindingFix(title, RFC 6902patch) as one undoable edit, and takes an optionalreview(presentation, options) => Promise<FindingReport>hook whose findings merge with core's byFinding.source(hosted reviewers such as pptx.dev appear in the same list).composeSlideandpaginateSlideuse core'sresolveSlideContext; the editor's own font and theme chain andresolveSlideFontsare deleted. Unknown layout, theme, colour scheme and font-scheme ids fall back and reportunresolved-*; none throws.createCanvasEditor,exportDeck,composeSlideandpaginateSlidetake the renderer'sloadFonts()handle as{ fonts }; the font gate is the handle'spending/ensure.export-font-license; if that leaves the converter no face for some text the export rejects withexport-fonts-unlicensed.documentispresentationin the editor's public API, as in core and PowerPoint.deckStats(editor)(corestats, neutral facts). Everytypeof core.x === "function"feature detection is gone;test/core-features.mjsfails by name when a linked package lacks an import.Old → new API
validateOpfDocument(doc);session.validation = { valid, errors, warnings, result }validate(doc, { only: ["format"] });session.validationis aValidationReport(findings,counts)createEditorSession(input, { validate }){ rejectInvalid }stays)OPFEditorError.issues= validator errorsrunAudit,auditAvailable,getAuditOptions,ReviewReport.diagnostics,audit/<rule>validatefrom core,getValidateOptions,findings,opf/<rule>; newmergeFindingReports,groupFindings,sortFindingsReviewFix.labelFindingFix.titleresolveSlideFonts(doc, i)resolveSlideContext(doc, i).options.fontFamilies(core)composeSlide/paginateSlide(i, { textMeasurement }){ fonts }createFontGate(registry),fonts.run(...)whenFontsReady(fonts, ...)exportDeck(deck, { renderOptions: { textMeasurement }, fonts: gate, registry })exportDeck(deck, { fonts })createCanvasEditor(el, { renderOptions: { textMeasurement }, fonts: gate })createCanvasEditor(el, { fonts })createDataContent;PatchError;applyPatchWithInverse().document; convert{ document }importData;OPFPatchError;.presentation;{ presentation }checkPptxTypefaces(bytes, { fonts })checkTypefaces(bytes, { families })chartOptionsAvailable,numberingAvailable,templatesAvailable,supportsChartTableData,*-unavailableerrorseditor.document, snapshot/change/prepare/transfer/restoreState.document,createCanvasEditor({ document }),onRender/onDraft{ document },renderPreview({ document })presentationin eachopf-editor/v1/…, recorddocumentopf-editor/v2/…, recordpresentation(an old copy is never read)Vetoable calls
fontGate(handle)stays internal (non-throwingpending,fonts-unavailable, abort rethrown as is);createFontGateis removed.autoReview: true(hosted reviews can be slow or metered); its findings stay listed, marked out of date, after an edit; an edit during a run drops that run.formatcategory only; the schema inspector runsformat+references.move/copysources are refused.export-fonts-unlicensed) rather than substituting silently when the license rule leaves no face; when only some faces drop, the PDF is written with the remaining face standing in andexport-font-licensereports it.documentoptions (createTextInput,createCatalogSelect,installFindShortcuts,loadImagePixels,cropImagePixels), themissing-documenterror code, the storage namedocuments, the persistence option namekey, the playground'sdocument-bar/document-nameids, and prose in messages.unwrapOpfis nowpresentation(it wasdocument).Removed legacy
font-defaults.js(a local copy of core's default font scheme), the old-core test and fixture, all*Available/typeof core.xguards, "installed renderer predates" skip blocks in 5 tests,OPF_REQUIRE_FF08in two workflows, theslideImageSupported/slideImageDrawn/lazyFacesprobes, the dead "painted" mode ofrich-input-browser,loadOfficeFontRegistry/loadBrowserFontRegistrycalls in the playground build and tests.Test evidence (local, Node 24, Edge channel)
npm test: 48 node tests pass (incl.check:runners,check:changes);npm run typecheck: 179 files, 0 failed;npm run validate: ready;node scripts/published-core-gate.mjsprints the skip notice.scripts/quarantine.mjs run-suite playground: 20 tests pass;run-suite browser: 10 pass.core-features,slide-context,deck-stats,review-hook-browser(grouping, debounce, hook merge by source, hosted fix undo, out-of-date marking, failing hook, dropped run),export-license-browser(real converter: permissive face embedded; all faces dropped givesexport-fonts-unlicensed; bold dropped writes the PDF with regular standing in), plus the PDF license cases intest/export.mjs.composeSlideandrenderSlideSvgover all 805 slides of the 126 bundled examples, origin/main with published packages vs this branch with the linked ones: 0 geometry differences, 0 SVG differences (48 slides of one Japanese deck fail identically on both: no Meiryo face).What cannot pass before core 0.14 is published
npm run test:packed(the packed install against published dependencies) is skipped by theopf.requiresUnreleasedCoregate from #114; the field is deleted by the release-prep PR.npm auditandnpm ciuse the lockfile of 0.13 packages. Every linked-ecosystem step runs against the Depends-On PRs, so a red there is real; a red that needs@openpresentation/opf0.14 from npm is expected until it is published.🤖 Generated with Claude Code
Note
High Risk
Wide breaking API and behavioral changes across validation, fonts, export, and persistence; requires coordinated 0.14 ecosystem upgrades and breaks autosave v1 and prior integration patterns.
Overview
RR-55 is a breaking lockstep release with core/renderer/PPTX 0.14: old APIs are removed (no aliases). The editor public surface renames
document→presentationeverywhere (session, canvas, prepare helpers, autosave v2 keys), and per-edit validation goes through corevalidate(presentation, { only: ["format"] })via newchecks.js, replacingvalidateOpfDocumentand the old{ errors, warnings }shape withValidationReport/Finding.The Review panel switches from audit helpers to full
validateon idle, applies coreFindingFixpatches, and optionally merges a hostedreview()hook byFinding.source. Composition uses coreresolveSlideContext(dropsresolveSlideFonts; unresolved design ids diagnose instead of throwing).Fonts unify on the renderer
loadFonts()handle: canvas, export, compose/paginate take{ fonts };createFontGateand separatetextMeasurement/registryexport options are gone in favor ofwhenFontsReady. PDF export shares SVG license rules and can fail withexport-fonts-unlicensed.Docs (
README,AGENTS.md),changes/rr-55-short-verb-api.md, anddist/typings/implementations reflect the rename and dropped*Availableruntime probes. CI dropsOPF_REQUIRE_FF08now that linked PPTX always runscheckTypefaces.Reviewed by Cursor Bugbot for commit 572cf94. Configure here.