Skip to main content

Runtime Compatibility Baseline

This page tracks three independent dimensions for Luau surfaces:

  • what is bound in runtime
  • what is documented upstream
  • what is editor-visible / usable in typical production workflows

Baseline Snapshot

  • Audit date: August 14, 2026
  • Runtime repo: rive-app/rive-runtime
  • Released C++ WASM runtime line: @rive-app/*@2.40.0, backed by runtime-v0.1.271 at 526625850eaf34fc1263d181808ffca10cae6ac1
  • Released package gitHead: 1e9391880df1d501b98d165d2db89284025462eb (all four checked packages aligned)
  • Canary parser pin: runtime-v0.1.272 remains a parser canary and is not the released Web boundary
  • Docs comparison source: local /Users/ivg/github/rive-docs and /Users/ivg/github/rive-runtime-docs, reviewed August 14, 2026
  • Source-level impact snapshot: runtime-v0.1.262 through the RFP-authored impact note; claims below distinguish that source evidence from the released Web line
  • Superseded historical source audit: runtime-v0.1.64 at commit b25a32218c6308ac8dc4b1cb69df62de84d78ba4

Use this snapshot when deciding whether LERP content is current for C++ runtime behavior.

Separate runtime facts from editor rollout

LERP now tracks the released package/docs baseline (2.40.0 -> runtime-v0.1.271), the source-level impact snapshot, and the editor availability tier separately. Shader/GPU APIs remain Rive Early Access only unless a focused probe proves otherwise.

Source-of-truth rule

For release tracking, LERP records both:

  • npm package metadata (version, time, gitHead) for shipped web runtime line
  • upstream runtime tag/commit used for binding-level API verification

Release Tiering Used in LERP

LERP uses the following tier labels:

  • Officially released: teach as stable curriculum surface (runtime + docs + editor workflow are broadly usable)
  • Rive Early Access only: runtime/reference material exists, but the editor workflow currently requires Rive Early Access; do not assume availability in standard workspaces
  • Preview / rollout-dependent: runtime/docs may expose it, but editor visibility/tooling is not consistently available yet
  • Not exposed: not usable from current C++ Luau bindings

This prevents course drift when upstream API pages move faster than editor rollout.

Released boundary versus source/canary evidence

The accepted suite boundary is released Web 2.40.0 -> C++ runtime-v0.1.271. The RFP parser canary pin runtime-v0.1.272 is intentionally separate. The new Luau surfaces below were identified in the v0.1.262 source impact snapshot; do not present them as released Web/editor behavior without a focused probe.


Current Editor Reference and "Coming Soon" Reality Check

Status legend:

  • Live: Exposed and usable in current runtime bindings
  • Analyzer-accepted: The current Editor reference and checker accept the type/signature
  • Source-confirmed: The pinned runtime source contains the corresponding binding/dispatch path
  • Not exposed: Not currently available in Luau bindings at this baseline
Surface in docsCurrent evidenceNotes
PointerType + PointerEvent.typeAnalyzer-accepted; reference label still says "Coming soon"PointerType is the exact eight-string union used by PointerEvent.type; it is not a runtime enum table
KeyPhase + KeyboardEventAnalyzer-accepted; source wrapper uses historical nameCurrent fields are key, modifiers, and phase; pinned runtime source calls the Lua wrapper KeyboardInvocation
TextInputAnalyzer-accepted; source wrapper uses historical nameCurrent reference exposes text; pinned runtime source calls the wrapper TextInputInvocation
FocusEventAnalyzer-accepted; source wrapper uses historical nameCurrent reference exposes isFocus; pinned runtime source calls the wrapper FocusInvocation
ReportedEventAnalyzer-accepted; empty in current referenceDo not teach delaySeconds as a current Editor field; that field belongs to the historical ReportedEventInvocation source wrapper
ViewModelChangeAnalyzer-accepted; empty in current referenceCurrent Editor reference exposes presence/kind only
NoneEventAnalyzer-accepted; empty in current referenceisNone() / asNone() are current; the pinned source wrapper name is NoneInvocation
GamepadMappingKind, GamepadConnected, GamepadEvent, GamepadDisconnectedAnalyzer-accepted + source-confirmedFull connected/change state and query methods are referenced; hardware gamepad dispatch was not executed in the August 14 probe
ListenerContextAnalyzer-accepted + source-confirmedCurrent gamepad API is the connected/event/disconnected guard/accessor triad; generic isGamepad() / asGamepad() is stale
Node gamepadConnected / gamepadEvent / gamepadDisconnectedAnalyzer-accepted + source-confirmedExact current Node<T> signatures passed the analyzer probe; actual gamepad dispatch was not executed
NodeReadData.paint + node:asPath() + node:asPaint()LivePaint/path access is implemented in Lua artboard bindings
AudioSource.durationLivesource.duration is exposed in Lua audio bindings
ViewModel.nameNot exposedDocumented upstream but not exposed in current Lua ViewModel wrapper
OutputNot exposedNo runtime Lua Output surface at this baseline

Runtime Surfaces Tracked in the August 14 Current Baseline

These rows are re-evaluated against the released Web 2.40.0 / C++ runtime-v0.1.271 boundary and the local source/docs snapshot reviewed on August 14. The Evidence basis column is deliberately separate from runtime status: the focused MCP passes covered Vector/Mat4/ViewModel behavior, matrix equality, a ranged GPUBuffer write, and exact analyzer-reference surfaces. They did not execute every row below.

SurfaceRuntime statusLERP tierEvidence basis and notes
Mat4Source-confirmed + MCP-tested subsetOfficially releasedRuntime/docs confirm the broader constructors, multiplication, inversion, transpose, and transforms; MCP tested composition and buffer writing, not every method
Vector.xyz, Vector.cross3, vector buffer writesSource-confirmed + MCP-testedPreview / rollout-dependentRive Beta 0.8.5390 build 5377 passed the named constructors, cross product, and buffer writes; released Web availability remains separate
Mat4.lookAt, Mat4.orthoSource-confirmed + MCP-testedPreview / rollout-dependentRive Beta 0.8.5390 build 5377 passed both helpers, composition, and writeToBuffer; helpers do not make the scene graph generally 3D
Mat2D / Mat4 equality (==)Editor-reference-confirmed + MCP runtime-testedOfficially releasedIdentity matrices compared equal and translated matrices compared unequal for both types in the live Tests-protocol probe
Promise, async, awaitSource-confirmedOfficially releasedRuntime/docs confirm the chaining, cancellation/status, and coroutine bridge; not live-tested in the August 14 MCP script
ViewModel:getImage(name)Source-confirmed + MCP-testedOfficially releasedRive Beta 0.8.5390 build 5377 returned the typed image property; broader image workflows were not live-tested
Context:globalViewModel(name) / globalViewModelNames()Source-confirmedPreview / rollout-dependentRuntime/source docs describe named file-global models and unknown-name nil; explicitly not executed in the MCP probe
ViewModel:getFont(name) / getBlob(name)Source-confirmed + MCP-testedPreview / rollout-dependentBeta probe passed typed lookup and missing/null behavior; Blob string/buffer/nil writes passed only after payload :: any, while uncast values were rejected by the editor checker
ViewModel:getIndex()Source-confirmedOfficially releasedRuntime/docs confirm list-item index and detached -1; not live-tested in the August 14 MCP script
PropertyList:removeAt, removeAllOf, clearSource-confirmedOfficially releasedRuntime/docs confirm removal and clear operations, including 1-based removeAt; not live-tested in this probe
Current event types + ListenerContext guard/accessor setSource-confirmed + Editor-analyzer-testedPreview / rollout-dependentExact Pointer/keyboard/text/focus/reported/view-model/none and three-way gamepad signatures passed with diagnostics []; event dispatch was not executed
Node gamepadConnected / gamepadEvent / gamepadDisconnectedSource-confirmed + Editor-analyzer-testedPreview / rollout-dependentExact Node<T> callbacks passed the Editor checker; hardware gamepad dispatch was not executed
AudioSound:pause() / resume() / play()Editor-reference-confirmed + Editor-analyzer-testedPreview / rollout-dependentThe exact no-argument transport methods passed with diagnostics []; the calls were not runtime-executed
Node keyboardEvent(self, event)Source-confirmed; absent from current Editor Node<T> referencePreview / rollout-dependentPinned runtime source uses KeyboardInvocation and stops propagation on true; not executed in the August 14 probe
Node textEvent(self, event)Source-confirmed; absent from current Editor Node<T> referencePreview / rollout-dependentPinned runtime source uses TextInputInvocation and stops propagation on true; not executed in the August 14 probe
context:canvas(options) + Canvas methodsSource-confirmedOfficially releasedRuntime/docs confirm offscreen canvas frame/resize/image methods; not live-tested in this probe
context:decodeImage(buffer) + DecodedImageSource-confirmedOfficially releasedRuntime/docs confirm the promise and RGBA payload shape; not live-tested in this probe
context:gpuCanvas(options) + GPUCanvasSource/docs-confirmed; not runtime-testedRive Early Access onlyThe broader GPUCanvas/render-pass lifecycle was not executed; one standalone GPUBuffer allocation/write probe does not establish this workflow
context:features() + GPUFeaturesSource/docs-confirmed; not runtime-testedRive Early Access onlyCapability flags/limits are documented for GPU preview; the live probe did not execute this Context method
context:shader(name) + ShaderSource/docs-confirmed; not runtime-testedRive Early Access onlyShader asset lookup is documented, but the current Editor analyzer did not expose Context.shader and no imported shader asset was executed
GPUBuffer, GPUTexture, GPUSampler, GPUBindGroup, GPUBindGroupLayout, GPUPipeline, GPURenderPass, GPUTextureViewMixed live evidence; analyzer omits GPU globalsRive Early Access onlyGPUBuffer/GPUTexture constructors executed despite unknown-global analyzer diagnostics; the broader object-family lifecycle was not executed
GPUBuffer:write(source, destinationOffset, sourceOffset, byteLength)MCP runtime-tested; analyzer omits GPUBufferRive Early Access onlyA valid ranged write passed and both source- and destination-overflow cases were rejected in Rive Beta; this is narrow buffer evidence, not full GPU workflow validation
GPUTextureView.formatSource-confirmed; MCP runtime probe failedRive Early Access onlyLive access failed with attempt to index userdata with 'format'; do not teach it as a working property in this Editor build
drawCanvas callbackSource/docs-confirmed retiredMigration requiredCurrent guidance merges Canvas/GPUCanvas work into draw(self, renderer); serialized bit 15 remains legacy metadata, not a callable callback
Scripted Interpolator protocolSource/docs-confirmedOfficially releasedtransform / transformValue hooks and linear fallback are documented/source-confirmed; not live-tested in this probe

Historical (June 4, 2026) Shader Early-Access Baseline Addendum

This appendix preserves the June 4, 2026 shader audit evidence. It is not the current release baseline above: that historical pass used public npm/docs 2.37.8 and source-level runtime-v0.1.106. Shader/GPU scripting was and remains Rive Early Access only because the editor workflow for shader assets is not broadly available.

Use this addendum as the source of truth for LERP's shader lessons, not as a signal that shader scripting is broadly released in standard Rive workspaces.

  • Shader baseline date: June 4, 2026
  • Shader API source reviewed: runtime-v0.1.106 at commit 5360c834eac2adbdfc49c808d1b2a8c61b014bbf
  • Public/local docs source checked: current local scripting protocol pages and runtime source bindings; older drawCanvas examples are treated as migration inputs, not current guidance
  • Local reference document: /Users/ivg/github/luau-scripting/rive_shader_api_reference_runtime_v0106_type_safe.md
  • Local example corpus: /Users/ivg/github/luau-scripting/gpu_shaders
  • Current availability tier: Rive Early Access only

LERP now teaches the following shader-specific rules:

SurfaceLERP guidanceNotes
draw(self, renderer)Record Canvas/GPUCanvas work and composite with RendererdrawCanvas is retired; keep frame/pass pairing inside draw
context:shader(name)Use for compiled .wgsl shader asset lookupReturns Shader?; guard nil
GPUCanvas.formatUse for pipeline color-target formatAvoid hard-coded formats unless you intentionally own the render target
Image:view()Use to sample image assets in shader bind groupsShader usage is Rive Early Access only because it depends on GPU workflow availability
Dynamic UBO offsetsTreat as layout/binding ordered byte offsetsUse 256-byte alignment
Direct 3D model importNot provided by the shader API itselfConvert mesh data externally into buffers/textures

Compatibility naming note: older docs and examples may mention context:loadShader(name) or context:preferredCanvasFormat(). New LERP shader examples use context:shader(name) and GPUCanvas.format.


Practical Guidance for LERP Content

  • Teach ListenerAction.performAction(self, listenerContext) as the primary listener callback shape.
  • Use listenerContext:is...() and listenerContext:as...() for event-safe branching.
  • Treat PointerEvent.type as the PointerType string union; do not invent a runtime enum table.
  • Use separate isGamepadConnected/Event/Disconnected and matching as... methods. Do not use the stale generic isGamepad() / asGamepad() form.
  • Use current Editor event type names in new examples. Keep *Invocation names only when explicitly discussing pinned source/runtime compatibility.
  • Do not teach viewModel.name as available in Luau at this baseline.
  • Do not present Output<T> as currently exposed in C++ Luau bindings.
  • For list-bound ViewModels, use viewModel:getIndex() and handle detached state (-1).
  • For PropertyList:removeAt(index), use 1-based indices and validate bounds.
  • Keep GPU shader/pipeline material in Rive Early Access only sections until editor-side shader asset visibility is broadly available.
  • When context:shader(name) returns nil, treat that as a possible asset name, packaging, or rollout/tooling gap before assuming script logic failure.
  • Merge GPU/offscreen Canvas recording and normal compositing into draw(self, renderer); keep beginFrame/endFrame and beginRenderPass/finish paired. drawCanvas is retired and its serialized method bit is reserved legacy metadata.

Re-Audit Workflow (for future updates)

  1. Fetch latest runtime: git clone/git pull rive-app/rive-runtime.
  2. Record latest npm release line for C++ WASM runtime packages:
    • npm view @rive-app/canvas version
    • npm view @rive-app/canvas-lite version
    • npm view @rive-app/webgl2 version
    • npm view @rive-app/canvas-advanced version
  3. Pin npm gitHead hash and npm publish timestamp in this page.
  4. Pin upstream runtime source tag/commit used for API verification.
  5. Pull latest docs machine-readable source (/docs/llms-full.txt) and list (Coming soon) API sections.
  6. For each surface, verify:
    • type/wrapper exists in runtime headers
    • Lua atoms/bindings exist
    • invocation/dispatch path exists (not only a stub)
  7. Update:
    • this page
    • affected API lessons/examples/quizzes
    • changelog entry with audit protocol details

Audit Protocol (what this update checked)

For the August 14, 2026 pass, LERP used this verification sequence:

  1. Released boundary and source separation
    • Pinned released Web 2.40.0 to C++ runtime-v0.1.271 and recorded the aligned package gitHead.
    • Kept parser canary runtime-v0.1.272 and the RFP source-impact snapshot separate from released-runtime claims.
  2. Live Editor runtime cases through the Rive MCP
    • Ran LERP_130_Runtime_Surface_Tests in Rive Beta 0.8.5390 build 5377.
    • All three original Vector/Mat4/ViewModel cases passed with final diagnostics [].
    • Focused follow-up runtime assertions passed for Mat2D/Mat4 equality and ranged GPUBuffer:write; the valid range succeeded and both source- and destination-overflow cases were rejected.
    • GPUTextureView.format was also executed and failed with attempt to index userdata with 'format'.
  3. Current Editor reference and analyzer reconciliation
    • Retrieved rive/artboards and rive/interfaces from the live built-in scripting reference.
    • Compiled a temporary Tests probe covering the exact event types, ListenerContext guards/accessors, full gamepad fields/methods, AudioSound:pause/resume/play, and Node gamepad callbacks; diagnostics were [].
    • Recorded that the same analyzer omits the GPUBuffer and GPUTexture globals even though their runtime constructors executed.
    • Removed the temporary probe, reran the original three cases, and confirmed final diagnostics remained clean.
  4. Pinned runtime-source comparison
    • Confirmed why historical *Invocation names appear in runtime-v0.1.262 Lua userdata wrappers.
    • Confirmed that the same source snapshot already uses the current connected/event/disconnected gamepad triad, so LERP's former generic GamepadInvocation surface was stale rather than a required compatibility alias.
  5. Explicit non-claims
    • The event probe validated analyzer acceptance, not keyboard/focus/reported/ view-model-change or hardware gamepad dispatch; the AudioSound transport calls were likewise not executed.
    • Released Web 2.40.0, global ViewModel Context methods, imported-library asset resolution, and the broader Early Access GPUCanvas/shader/lifecycle workflow were not established by the Editor probe.

For the June 4, 2026 pass, LERP used this verification sequence:

  1. Runtime release check via npm registry
    • Ran npm view for @rive-app/canvas, @rive-app/canvas-lite, @rive-app/webgl2, and @rive-app/canvas-advanced
    • Confirmed all report 2.37.8
  2. npm source pin
    • Pinned npm gitHead bc560112ab2ee7d0afd3418bd97970c2fcb36532 for runtime line 2.37.8
    • Recorded the @rive-app/[email protected] publish timestamp: May 21, 2026 18:06:40 UTC
  3. Public docs source
    • Fetched https://rive.app/docs/llms-full.txt
    • Confirmed the docs now include GPUCanvas, GPU object-family pages, context:gpuCanvas, context:features, context:shader, and drawCanvas
    • Confirmed Output remains marked (Coming soon)
  4. Shader/API source pin
    • Pinned runtime-v0.1.106 at 5360c834eac2adbdfc49c808d1b2a8c61b014bbf for source-level API verification
    • Spot-checked the compatibility rows in Luau binding headers/source/tests, including listener payloads, NodeReadData.paint, asPath, asPaint, audio duration, ViewModel property/list helpers, Promise/async, Mat4, canvas/GPU context APIs, GPU object bindings, and Scripted Interpolator
    • Kept shader/GPU lessons in Rive Early Access only tier because editor-side shader asset workflow availability is not broadly assumed
  5. Course sync pass
    • Updated runtime compatibility notes, API baseline callouts, errata header, and changelog wording

For the May 12, 2026 pass, LERP used this verification sequence:

  1. Runtime release check via npm registry
    • Ran npm view for @rive-app/canvas, @rive-app/canvas-lite, @rive-app/webgl2, and @rive-app/canvas-advanced
    • Confirmed all report 2.37.6
  2. npm source pin
    • Pinned npm gitHead 2833de372c0d22596494c89c328008ce5b1106d7 for runtime line 2.37.6
  3. Upstream runtime API snapshot pin
    • Pinned runtime-v0.1.64 at b25a32218c6308ac8dc4b1cb69df62de84d78ba4
  4. Docs delta source
    • Compared against https://rive.app/docs/llms-full.txt, including APIs marked (Coming soon)
  5. Binding-level verification
    • Confirmed availability/limits by checking runtime Luau bindings and invocation paths (not docs text alone)
  6. Course sync pass
    • Updated API pages, lessons, examples, quizzes, and compatibility notes

Changelog Requirements for Runtime Audits

Every runtime-audit changelog entry should include:

  • Audit date
  • Upstream source tag/commit used for API validation
  • npm runtime release line + packages checked
  • npm gitHead + npm publish timestamp
  • Which surfaces changed status (Officially released, Rive Early Access only, Preview / rollout-dependent, Not exposed)
  • Which course pages were updated (docs + lessons + quizzes)