Release Readiness
This page describes the current preview-release validation policy. It is a checklist for fresh release work, not a permanent observation ledger.
| Tier | Canonical routes | Gate |
|---|---|---|
| Tier 1 | macOS Skia, Web wasm-gc WebGPU (Canvas2D fallback) |
Blocking: PR build/test, daily presentation, and release evidence |
| Tier 2 | Windows Skia, Linux Skia |
Blocking: L0-L2 and first frame; complete L3 may remain partial |
| Tier 3 | macOS WGPU (CoreText, Cosmic fallback), Windows WGPU (DirectWrite, Cosmic fallback), Linux WGPU (Fontconfig, Cosmic fallback), Android window-hosted Skia, iOS window-hosted Skia, HarmonyOS window-hosted Skia, macOS Sun, Windows Sun, Linux Sun, WeChat Skyline Canvas2D |
Non-blocking: scheduled/manual build, run, and evidence |
Tier, L0-L3 evidence, and product_class/ready are independent. Source: checks/platform-matrix.json; actual observations remain in checks/platforms/*.json.
Baseline
MoUI is ready for a preview handoff when the repository can demonstrate:
- The platform-neutral runtime pipeline remains explicit:
View[Msg] -> internal view tree -> ElementTree -> LayoutTree -> RenderTree -> DrawCommand -> renderer. - Public view constructors return opaque
@moui.View[Msg]; app code uses the TEA-shapedProgramsurface with typed messages, explicitEffect[Msg]follow-up work when needed, app-levelSubscription[Msg]event sources for ongoing callbacks and pending host-service completions, and shared logic through Web wasm-gc, macOS native, and Windows native entrypoints where those platforms are supported. - Renderer capability status is synchronized between
render/capabilities.mbt,render/capabilities_test.mbt, anddocs/renderer-capability-report.md. - High-risk behavior uses the same four-layer conformance model:
corecontract tests, host routing tests, implementation/provider tests, and matrix/diagnostic conformance entrypoints. - Showcase serves as runnable documentation rather than hidden smoke tests.
- Showcase remains the preferred visible validation surface for framework features: new user-facing views, renderer capabilities, host-service flows, or example-worthy platform behaviors should add Showcase coverage unless they are impossible or misleading to demonstrate there.
- Platform backends stay adapters around
backend; unsupported platform paths are marked as scaffolds instead of implied as complete. - Development validation is bounded, repeatable, and documented.
AGENTS.mdand repo-local skills remain aligned with package boundaries, validation commands, examples, renderer capability rules, and text-system architecture.
Current Evidence
| Area | Evidence | Status |
|---|---|---|
| Daily validation | sh scripts/check.sh --profile daily runs the bounded mainline package tests, runner self-tests, maintenance baseline ratchets, API surface guard, checked conformance artifact guard, dedicated checked-artifact validators for capture/Web/platform/renderer-proof manifests, and Web wasm-gc builds for Showcase. Design Systems is addon diagnostic coverage through sh scripts/check.sh --profile theme. |
ready |
| Package boundaries | docs/architecture.md, AGENTS.md, and repo-local skills describe the same core / views / backend / render / examples split. |
ready |
| Public view model | View, Program, Effect, Subscription, ProgramCommand, and Program::with_commands are typed TEA APIs. ServiceTask[T] maps app service success/failure/cancellation to Msg; TimerSource and RouteSource create core subscriptions. Runtime queues view, effect, service, shortcut, system-menu, and context-menu messages FIFO. |
ready |
| Example shape | Production examples/*/app dependencies contain no runtime/backend/render packages. Example module-root integration packages pass neutral DTOs into apps. File Importer demonstrates typed service tasks without host request ids or completion subscriptions. |
ready |
| Renderer capability tracking | Capability status is recorded in code, tests, and docs/renderer-capability-report.md. |
ready with tracked gaps |
| Platform contracts | Root backend owns neutral protocols and DTOs; backend/common owns queues, lifecycle/frame/input state, mappings, and service adapters; moui/services owns the app-facing capability surface. Concrete backends expose app_environment() and PlatformEntry; composition roots use @runtime.run_app. Matching-host artifacts remain the source for platform-runtime claims. |
macOS/Web/Windows current; Linux and Tier 3 remain evidence-driven |
| Text system | docs/text-system.md documents TextSystem, paragraph layout geometry, provider composition, embedded fonts, Skia skia_text_system() diagnostic coverage, native SkParagraph routing, and supported text/emoji proof. Stable and diagnostic text conformance checks pass with paragraph line metrics/selection/hit-test coverage, and the Skia text maturity preflight now tracks bidi reordering, paragraph line breaking, Unicode 17 grapheme boundaries, and deterministic color emoji readiness. |
ready |
| Devtool counters | Core inspector snapshots expose runtime, cached layout, cached semantics, cached render command, structured dirty-state summaries with dirty element ids for pending rebuild/layout/paint/redraw work, rebuild/layout/paint/draw-command pass counters, TEA dispatch/update/message-queue/effect-plan/effect-kind counters that distinguish send, anonymous dispatch, structured run, and one-shot task effects, latest effect summaries with structured effect descriptors, aggregate duplicate effect descriptor-key counters/names, active/completed/cancelled effect-task counters and lifecycle entries, subscription-plan counters/summaries with planned source descriptors, aggregate duplicate subscription-key counters/names, active subscription descriptors, active subscription kind-count summaries, app subscription lifecycle entries, ignored stale effect-task/subscription dispatch counters, and ignored program-dispatch counters for late anonymous or structured effect callbacks after runtime destruction; message queue diagnostics now prove bounded per-turn drains by leaving excess synchronous self-queued click/effect/task/subscription messages in pending_message_count instead of unboundedly draining them, plus focused core tests prove pending Effect::send, structured Effect::run, and subscription-start work resumes FIFO on the next host callback while one-shot Effect::task dispatch completes once and counts immediate synchronous redispatch as stale; inspector capture does not drain pending dirty work, render snapshots also report open clip/layer/filter scopes and unbalanced pops, and Showcase Diagnostics surfaces render command/scope counters plus dirty summary, TEA message, structured effect, effect-task, subscription plan, active subscription, subscription kind summary, and descriptor labels with app-test coverage. |
ready for command-level diagnostics |
| Guidance surface | docs/ai-collaboration.md, AGENTS.md, and skills/ define focused agent workflows. |
ready |
Required Gates
| Gate | Required Observation | Command |
|---|---|---|
| daily baseline | Bounded package checks, guidance consistency, maintenance baseline ratchets, API surface guardrails, renderer/provider static checks, Showcase app tests, and Web wasm-gc builds pass. Design Systems is addon diagnostic coverage through --profile theme. |
sh scripts/check.sh --profile daily |
| release module closures | The base archive excludes concrete renderers, renderer bindings, WGPU/Cosmic/Swash/image, quickcheck, pixelmatch, and integration-test packages. Renderer modules depend only inward, moui_tests remains unpublished, workspace pins match current module versions, and the checked release stage topology remains valid. |
node scripts/validate-release-module-closures.mjs; package-mode base/Skia/Web commands in docs/testing.md |
| maintenance ratchets | Oversized source/test files, source-level pub(all), and root facade forwarding counts do not grow; completed refactors ratchet their budgets down. |
node scripts/validate-maintenance-baseline.mjs |
| Public API audit | Generated interfaces reviewed after public API changes and package budgets/boundary tokens still pass. | moon info, then node scripts/validate-api-surface.mjs |
| Focused conformance | Input/focus, layout, render, platform service, and text slices pass at their owning layer. | Focused moon test ... commands during editing; sh scripts/check.sh --profile platform for current-host platform services; sh scripts/check.sh --profile full before broad handoff. |
| Text conformance | Stable text contracts and diagnostic gaps are current. | sh scripts/check.sh --profile full |
| Native Skia paragraph/bidi proof | macOS, Windows, and Linux native Skia renderer-proof manifests pass with real SkParagraph evidence for paragraph wrapping, bidi visual order, selection rectangles, and hit testing. Fallback geometry, caret-only diagnostics, heuristic visual-order logs, package tests, provider preflights, and local manifests without GitHub Actions provenance do not satisfy this gate. | MOUI_SKIA_REQUIRE_SKPARAGRAPH=1 moon run moui_tests/skia_text_emoji_smoke/native --target native on each matching host; renderer-proof manifests are produced and validated by the MoUI CI GitHub Actions Native Skia renderer proof jobs (see the evidence table below) |
| Web runtime presentation | Web Showcase runs in a browser session with WebGPU, wasm startup, sized canvas, resize/input event-bridge delivery, text input, clean target close, clean console, nonblank screenshots, Showcase transform-scene pixel markers, and Web renderer-proof events for RGBA color emoji glyphs with font metadata plus glyph key/size metadata, ZWJ grapheme layout, bidi visual order, paragraph line metrics/pixels, selection rectangles/line ranges, grapheme edit boundaries/actions, IME candidate anchors/surrounding text, composition ranges/preedit pixels, and async image second-frame ordering before Web runtime claims are marked passed. The Web fold must retain provenance: github-actions with CI workflow/job/run URL/runner when produced by the successful non-skipped web-runtime-presentation Actions job, or matching-host-artifact with the local browser-session artifact bundle when produced on a matching host. |
sh scripts/ci-web-runtime-presentation.sh in CI or on a configured matching host; manual equivalent: node scripts/record-web-runtime-presentation.mjs --base-url http://127.0.0.1:18080 --cdp-url http://127.0.0.1:9223 --manifest artifacts/conformance/web-runtime-presentation.json --require-passed, then node scripts/validate-web-runtime-presentation-manifest.mjs artifacts/conformance/web-runtime-presentation.json --require-passed |
| Platform contracts | Shared host/Web service checks and current-host backend/provider checks stay covered, and matching-host runtime evidence has a validated manifest when claimed. Native passed entries must separately prove IME candidate anchors, surrounding text, composition visuals, commit/delete behavior, cursor updates, scroll anchors, scale/DPR anchors, and resize anchors from Showcase runtime artifacts. | sh scripts/check.sh --profile platform when platform behavior changes; the profile starts with shared platform service checks and leaves host-specific backend/provider package steps in checks/profiles.json. Matching-host runtime evidence manifests are recorded and validated by the MoUI CI macOS platform evidence dispatch workflow (see the evidence table below) |
| Examples | Showcase remains the default runnable doc; new user-facing framework features have visible Showcase coverage or a recorded reason to skip it. Design Systems is addon diagnostic coverage isolated in the dedicated moui_theme preview example. |
Mainline app package tests plus Showcase Web wasm-gc builds; sh scripts/check.sh --profile theme for addon checks |
| Guidance freshness | Docs, AGENTS.md, and repo-local skills agree after guidance-affecting changes. The guidance-consistency guard is implemented as the MoonBit tool at tools/moui/validate_guidance_consistency; run it directly with moon run tools/moui/validate_guidance_consistency --target native, plus manual audit notes in the handoff. |
The 0.2 module release order, when a release is explicitly authorized, is:
base and bindings; Skia/Web/WGPU/Sun renderer modules; addons and agent; then
agent MCP and CLI. checks/release-modules.json is the canonical
directory/stage catalog. Matching versions are only a 0.2 migration-release
condition; later module releases are independent.
Current Evidence Snapshot
This snapshot records the current preview-readiness evidence. The
GitHub Actions Evidence Refresh table below is auto-generated by
scripts/refresh-evidence-table.mjs; the Snapshot, Evidence, and Status
columns below are manually maintained.
Refresh the full gate set before a release candidate handoff.
| Gate | Current evidence | Status |
|---|---|---|
| Daily baseline | The default sh scripts/check.sh --profile daily now covers local dependency guards, guidance consistency, maintenance baseline ratchets, API surface guardrails, renderer/provider and native Skia entrypoint wiring, checked conformance artifacts, dedicated capture/Web/platform/renderer-proof manifest validators, core/views/render/backend/package tests, and Showcase app/Web wasm-gc validation. sh scripts/check.sh --profile theme keeps Design Systems and moui_theme as addon diagnostic coverage, and sh scripts/check.sh --profile platform remains the current-host backend/provider extension; on Darwin it previously covered macOS backend/provider checks. On 2026-06-03, scripts/macos-skia-renderer-smoke.sh --run-showcase-smoke passed on Darwin with the pinned JetBrains Skia provider, covering MoUI renderer pixels plus first-frame Showcase macOS Skia presentation. |
current default gate plus opt-in diagnostics and Darwin host extensions |
| Public API audit | moon info and validate-api-surface.mjs review the root run_app facade, AppBuilder / PlatformEntry / AppLaunchRequest, opaque HostSurface/NativeSurface, image contracts, ordered RendererProvider values, RendererSession, host diagnostics, effects/subscriptions, and platform options. Concrete renderer construction, platform policy, and decode APIs live only in moui_*_renderer; platform backends expose neutral entries, presenters, opaque handles, and raw-byte image sources. |
current |
| Web route/history API | The Web route/history bridge adds WebAppOptions.route_source, web_dispatch_route, and web_history_push_route / web_history_replace_route / web_history_back / web_history_forward so browser history can publish typed route events while shared app reducers keep route history app-owned. |
current for Web host route subscriptions; native deep-link dispatch remains follow-up |
| Renderer sync | render/capabilities.mbt, renderer package tests, and docs/renderer-capability-report.md remain the source of truth. Application entrypoints register ordered RendererProvider values; platform backends create opaque HostSurface values and frame state receives only a neutral RendererSession. Platform HostImageSource values read raw bytes, while Skia, Sun, and WGPU own RendererImageDecoder decode/completion logic. Backend image owners keep cancellable I/O tasks only; opaque request tokens and applied/stale/disposed completions keep redraw routing explicit, while renderer sessions own resource status and cache residency. Cross-renderer lifecycle tests live in moui_tests/renderer_contract; real renderer and matching-host artifacts remain separate from package tests. |
current |
| Focused conformance | sh scripts/check.sh --profile platform covers shared platform service checks plus host-specific backend/provider package tests, and sh scripts/check.sh --profile full adds text diagnostics plus capture scaffolds. The shared service check treats the wzzc-dev/window@0.5.4-0.1.7 registry package as the dependency source and uses its cached generated Wayland protocol sources for non-Linux Linux protocol/cache sanity when available; Linux host backend/provider tests live in the host-specific profile steps. |
current with host/setup-scoped Linux service evidence, passed macOS and Windows platform runtime evidence, and pending Linux runtime manifest entries |
| Text conformance | Stable text conformance covers core, native renderer/provider validation, Web adapter, and Web backend. Core fallback carets now keep per-character arrays while the shared UAX-style TextGraphemeBoundaries scanner stabilizes cluster interiors for deterministic selection and IME-anchor geometry; basic left/right caret movement and shift-selection use the same boundaries, with generated Unicode 17.0 property predicates for core grapheme classes plus Indic_Conjunct_Break Linker/Consonant/Extend data. Core tests cover CRLF/control segmentation, high-plane controls, ZWNJ-as-Extend behavior, emoji ZWJ restrictions, keycap/tag emoji, regional-indicator pairing, Indic conjuncts, virama-plus-Latin/space break behavior, extended Hangul Jamo, representative combining/spacing-mark clusters, Arabic/Thai/Lao/Sinhala/Khmer/Myanmar mark or conjunct clusters, supplementary musical Extend marks, and the full vendored Unicode 17.0 default GraphemeBreakTest.txt fixture. The generated full Unicode editing fixture also covers is_boundary, floor/ceil/nearest snapping, collapsed and expanded range normalization, surrounding delete ranges, raw boundary-to-UTF-8 offset conversion, and every-index nearest_boundary_utf8_offset snapping across every fixture row, while the generated layout fixture covers fallback paragraph caret rectangles, collapsed selection rectangles, and hit-test offsets for the same rows, so core selection, hit-test, and IME offset primitives now share the same Unicode 17 evidence. Skia renderer tests run the same full fixture through skia_grapheme_cluster_texts plus every-index normalized UTF-8 offset checks against the Skia-produced boundaries, so mixed-run fallback segmentation now has renderer-local Unicode 17 IME offset evidence before font resolution. The shared paragraph layout contract now exposes wrapped line metrics, caret rectangles, selection rectangles, and hit-test geometry with explicit native paragraph/bidi readiness flags. Diagnostic matrix tests cover core fallback, Cosmic, platform-default composed fallback/scaffolds, malformed-provider fallback, Skia fallback paragraph geometry, optional SkParagraph geometry, and Web text systems where available. Web host capability reporting now advertises browser IME plumbing because window/web accepts TextInputSession IME requests and emits browser composition lifecycle events; shaping/color-emoji/native SkParagraph proof and matching-host native IME runtime evidence remain tracked separately. |
current for Unicode 17 core editing/selection/hit-test/IME-offset primitives and Skia grapheme segmentation with future Unicode-data refreshes, shaping/color-emoji gaps, native SkParagraph proof gate, and native IME runtime evidence documented |
| Native Skia paragraph/bidi proof | moui_skia exposes skia_paragraph_available() plus the native Paragraph wrapper for UTF-8 layout, line metrics, selection boxes, and hit testing (built by default); moui_skia_renderer uses it when SkParagraph is available and keeps fallback readiness flags false otherwise. Renderer-proof validation now requires engine=skparagraph native_paragraph_ready=true line-metrics later-line-pixels for paragraphWrapping, engine=skparagraph bidi_visual_order_ready=true visual-order for bidiLayout, and engine=skparagraph selection-rects line-range rect-geometry hit-test for selectionRects. GitHub Actions run 27227687435 produced non-skipped successful macOS, Windows, and Linux native Skia renderer-proof jobs with github-actions provenance and status=passed; Renderer proof summary validated those manifests along with the WebGPU wasm proof manifest. The earlier macOS platform runtime evidence dispatch 27217345886 also uploaded a passed skia-native-macos.json inside the macOS-only runtime artifact bundle. |
current with macOS/Windows/Linux GitHub Actions renderer-proof provenance; platform runtime readiness remains a separate manifest gate |
| Platform contracts | backend covers window commands, host services, event sources, text input, and IME diagnostics. Stateful shared ownership is split across backend/common/{lifecycle,frame,image,input,services}; root common contains stateless workflows. Concrete platform packages expose PlatformEntry values plus opaque HostSurface capabilities; composition roots supply renderer providers through @runtime.run_app. Web history remains backend-owned host behavior, while native renderer selection, policy, and decode remain outside every backend. Package tests validate contracts and boundary wiring; matching-host first-frame, IME, service, and renderer artifacts remain the evidence source for runtime claims. |
macOS and Windows platform runtime passed in recorded artifacts (Windows: 2026-08-29, ADR 0031); Web route/history current; Linux runtime evidence remains matching-host pending |
| Examples | The default daily check runs moon test examples/showcase/app --target native and the Showcase Web wasm-gc build. Showcase capability cards now surface follow-up rows first, and the host capability card has app-test coverage for injected host summaries; native Showcase Skia entrypoints are statically validated to inject the matching platform capability summary. Meanwhile, sh scripts/check.sh --profile theme keeps Design Systems app/Web validation and moui_theme checks available as addon diagnostic coverage. File Importer app tests cover pending file-dialog completion through typed TEA messages plus mapped parent/child effect/subscription diagnostics. On 2026-06-03, the macOS Skia helper built and launched examples/showcase/macos_skia with a first-frame exit marker after the renderer pixel smoke. Showcase exposes Windows/Linux Skia first-frame env flags for matching-host smoke runs; package checks prove provider wiring, but Linux runtime evidence remains matching-host pending until those commands record passed artifacts; the Windows Showcase route recorded its first-frame and runtime-transcript evidence on 2026-08-29 (ADR 0031). node scripts/conformance-capture-scaffold.mjs --mode benchmark also rebuilt the Showcase Web wasm-gc target, validated its static Web runtime handoff, and validated its benchmark manifest target. scripts/record-web-runtime-presentation.mjs and scripts/validate-web-runtime-presentation-manifest.mjs define the browser-session evidence path for artifacts/conformance/web-runtime-presentation.json; the browser artifact is folded into the Web platform runtime entry by the web-runtime-presentation GitHub Actions job. GitHub Actions run 27227687435 has a non-skipped successful web-runtime-presentation job that ran the same record/validate path and uploaded moui-web-runtime-presentation. |
current with Darwin Showcase Skia first-frame, daily Showcase package/Web coverage, opt-in addon diagnostics, browser presentation evidence paths, and current-head Web CI evidence; Linux platform runtime evidence remains matching-host pending |
| Historical mobile first-frame | Non-fallback Component Gallery builds launched on Android (HUAWEI SCM-W09), iOS, and HarmonyOS devices; nonblank first-frame screenshots recorded in resource/screenshots/{android,ios,harmonyos}-componentgallery (2026-07-09/10). |
Historical pixels remain valid for those artifacts, but do not count as window-hosted Showcase evidence; fresh Showcase evidence is pending. |
| Embedded runtime host services | EmbedderHostChannel, text input, clipboard, semantics, and targeted actions are wired through Android, iOS, and HarmonyOS embedded runtime backends. |
Matching-device evidence remains required for presentation, input, lifecycle, and service claims; HarmonyOS device evidence also requires signing material. |
| Mobile GPU | SkiaGpuNative with an opaque NativeSurface is the product auto default on all native Skia platforms when a usable host capability is available. Renderer-local Metal/Vulkan/EGL/D3D policies are linked by default; iOS simulator, Android NDK/APK, and HarmonyOS native/HAP builds pass; macOS has matching-host claim evidence. |
Physical mobile / Windows / Linux seven-gate quality manifests remain incomplete; raster is explicit + recovery fallback. |
| Guidance freshness | AGENTS.md, framework skill, app skill, docs, README entrypoint wording, provider package paths, and example entrypoints are covered by the guidance-consistency guard at tools/moui/validate_guidance_consistency (run with moon run tools/moui/validate_guidance_consistency --target native) after guidance-affecting updates. On 2026-06-02, the guidance guard passed after adding the capture manifest validator self-test and benchmark target checks. |
current |
Platform evidence guard refresh: the platform runtime evidence manifest
validator rejects README.md placeholder artifacts when a platform or native
Skia evidence block is marked passed, including nested evidenceProvenance
artifact lists. Passed runtime claims must point at concrete logs, manifests,
screenshots, or uploaded CI artifacts rather than scaffold documentation. The
manifest is produced and validated by the MoUI CI macOS platform evidence dispatch workflow on matching hosts.
Skia async-image refresh: platform backends expose local-file bytes through
HostImageSource, while moui_skia_renderer owns the RendererImageDecoder,
resource cache, and tokenized completion diagnostics. Backend image owners only
schedule/cancel byte I/O and return the opaque token. The real Skia smoke records
MoUI Skia async image second-frame smoke passed when an applied token
completion requests repaint and draws on a second frame. Focused Skia renderer
and host-binding tests prove completion scheduling, stale/disposed rejection,
decoded cache insertion, and redraw routing through the host scheduler.
Deferred native async-image source refresh: platform loaders record pending
requests in WindowImageTasks and deliver ready/failed completions with the
same opaque token. Host tests prove schedule-return-first completion delivery,
redraw routing, cancellation cleanup, and missing late completion diagnostics.
Renderer package tests prove deferred native-source callbacks apply only in the
owning session before requesting redraw.
GitHub Actions Evidence Refresh
| Workflow | Run | Key successful jobs | Uploaded artifact names | Evidence boundary |
|---|---|---|---|---|
| MoUI CI | 28964136358 | Windows MSVC native smoke, Linux platform contracts, Public API surface, Benchmark scaffold, macOS packaging smoke, PR profile gate. | moui-webview-demo-windows-msvc-portable, moui-showcase-windows-msvc-portable, moui-showcase-macos-app. | Proves CI run 28964136358 for head SHA 91f596e80d5a5f80d30fa94a8510e5ce4653189e. |
| MoUI Renderer Real Skia CI | 28964136550 | macOS renderer real Skia; Linux renderer real Skia; Windows renderer real Skia. |
macos-renderer-real-skia-ci; linux-renderer-real-skia-ci; windows-renderer-real-skia-ci. |
Proves the current three-platform native Skia renderer L2 claim for head SHA 91f596e80d5a5f80d30fa94a8510e5ce4653189e: all three jobs were non-skipped and successful, with native smoke and acceptance summary verification steps passing. This is renderer proof, not full platform-service proof. |
| MoUI macOS Platform Evidence | 27217345886 | macOS platform runtime evidence; Native Skia renderer proof (macos). |
moui-macos-platform-runtime-evidence; moui-renderer-proof-skia-native-macos. |
Proves the macOS-only runtime claim for head SHA 5bb2d810cd7e4cc63602caa431d5851827bd69d9: the macOS platform runtime evidence job was non-skipped and successful, uploaded a platform manifest whose macOS entry is status=passed with evidenceProvenance.kind=github-actions, runId=27217345886, every runtime/IME observation set to yes, and skiaEvidence.status=passed; the downloaded skia-native-macos.json renderer-proof manifest also validates with --require-passed. The workflow conclusion is failure because unrelated Linux Skia proof and renderer proof summary jobs failed before the later 2d568ecb CI fix; cite this row only for macOS platform runtime evidence, and cite run 27227687435 above for the current all-green push CI state. |
| MoUI Linux Platform Evidence | 28889055278 | Linux platform runtime evidence. |
moui-linux-platform-evidence. |
Proves the Linux first-frame Wayland route for head SHA 8a054c5914adbfa34a6943570c1ceb01cc603ef5: the job ran under a headless Weston compositor with real Skia link flags, recorded the expected first-frame marker, verified the evidence marker, and uploaded the Linux platform evidence artifact. This should be cited as Linux first-frame/platform-route evidence only; Linux IME protocol functionality was verified on 2026-07-11 via WSL2 (all 8 IME probe fields passed), but IME interactive input (pointer/keyboard) as well as clipboard image read/write, directory listing, and transparent titlebar remain tracked gaps until matching-host Wayland desktop observations are recorded. |
| Deploy Website | 28964136340 | Build website; Deploy website. |
github-pages. |
Proves the website workspace builds and that GitHub Pages accepted the uploaded artifact for head SHA 91f596e80d5a5f80d30fa94a8510e5ce4653189e. It is website deployment evidence, not renderer or platform runtime proof. |
| MoUI Skia Provider Fallback CI | 27043267275 | fallback (ubuntu-latest); fallback (windows-latest). |
None. | Latest successful manual fallback-safe binding/workspace evidence, gathered for head SHA 045627245c5b320445e195e8f6eb7efe4d001de4, not the current MoUI CI SHA. It covers formatting, checks, all-target fallback compilation, ownership/borrow/capability/status verifiers, release-lock dry-run checks, and Windows fallback gate. It does not prove real Skia presentation and must be refreshed before a release candidate cites current-head fallback evidence. |
| MoUI Skia Provider Real Skia Acceptance | 27043266794 | Linux release Skia acceptance (static), (dynamic); macOS release Skia acceptance (static), (dynamic); Windows MSVC release Skia acceptance (static), (dynamic). |
linux-real-skia-acceptance-log-static; linux-real-skia-acceptance-log-dynamic; macos-real-skia-acceptance-log-static; macos-real-skia-acceptance-log-dynamic; windows-real-skia-acceptance-log-static; windows-real-skia-acceptance-log-dynamic. |
Latest successful manual real release Skia binding acceptance, gathered for head SHA 045627245c5b320445e195e8f6eb7efe4d001de4, not the current MoUI CI SHA. The Windows dynamic job preserves the shared package path and uploads windows-real-skia-acceptance-log-dynamic; it remains binding/provider acceptance evidence, not a claim that every MoUI Windows platform runtime service is passed. Refresh this workflow before a release candidate cites current-head real Skia acceptance. |
The Skia fallback workflow does not upload artifacts by design, so the run URL and successful job logs are the evidence handle. The acceptance workflow uploads per-platform/per-link-mode log bundles. Failed or missing artifacts must not be treated as passed evidence, and this table must be refreshed for a release candidate rather than reused as a permanent passed manifest.
Platform Validation Matrix
Preview handoffs must say which host produced platform evidence. Platform
claims should be scoped to the host that ran them; do not use a macOS check as
runtime evidence for Windows or Linux native behavior.
When GitHub CI is used as the authority, only non-skipped successful jobs with
uploaded logs, manifests, screenshots, or first-frame artifacts may support a
status=passed runtime claim. Workflow-dispatch paths that were not run,
build-only jobs, package-only jobs, and provider/preflight audits must stay
pending or be described as narrower setup evidence.
| Host | Routine command | What it proves | What remains out of scope |
|---|---|---|---|
| macOS / Darwin | sh scripts/check.sh --profile platform |
Daily package checks plus backend/macos and renderer package tests on the current macOS host. scripts/macos-skia-renderer-smoke.sh --run-showcase-smoke is the real Skia renderer plus Showcase first-frame evidence path. Platform promotion additionally requires the window package transcript and marker-validated native IME log. |
Other-host behavior and slow native examples unless their matching-host gates run. Package tests and the window smoke alone are not full platform evidence. |
| Windows / MSVC | powershell -ExecutionPolicy Bypass -File .\scripts\windows\build_windows_msvc.ps1 -Package examples/showcase/windows_skia -BuildOnly |
Windows native Skia composition-root build evidence; pair with moon test moui/backend/windows --target native and moon test moui_skia_renderer --target native from msvc_env.ps1. Run moon test moui_wgpu_renderer --target native only for native WGPU diagnostics. |
Packaged app runtime and first-frame/service evidence still require a matching Windows host. |
| Linux | sh scripts/check.sh --profile platform; sh scripts/linux-platform-evidence.sh (on a Wayland-capable host with real Skia) |
Daily package checks plus backend/linux and moui_skia_renderer native tests on a Linux host with Wayland headers. Linux first-frame/platform-route evidence is recorded by the MoUI Linux Platform Evidence workflow, which runs under a headless Weston compositor and records first-frame logs with Linux renderer presented first frame; exiting by request; title=... markers. Collect the window smoke transcript with scripts/run-window-package-smoke.sh linux --run when promoting broader platform evidence. The evidence script configures real Skia link flags, builds the composition root, runs it under Weston headless, and collects ignored artifacts. |
Current Linux evidence proves Skia rendering and first-frame presentation under a real Wayland compositor. It is not full platform-service proof; matching-host service and IME gaps remain tracked separately. |
| Android / NDK | sh scripts/window-hosted-hostsim-smoke.sh; MOUI_SKIA_DISABLE_PREBUILD_SKIA=1 moon test moui/backend/android --target native; moon check examples/showcase/android_window_hosted --target native. |
HostCmd callback path, neutral Android surface binding, and builder composition wiring. |
Matching-device presentation, input, lifecycle, renderer, and service evidence remains required. |
| iOS / Xcode | sh scripts/window-hosted-hostsim-smoke.sh; MOUI_SKIA_DISABLE_PREBUILD_SKIA=1 moon test moui/backend/ios --target native; moon check examples/showcase/ios_window_hosted --target native. |
HostCmd callback path, neutral iOS surface binding, and builder composition wiring. |
Matching simulator/device presentation, input, lifecycle, renderer, and service evidence remains required. |
| HarmonyOS / SDK | sh scripts/window-hosted-hostsim-smoke.sh; MOUI_SKIA_DISABLE_PREBUILD_SKIA=1 moon test moui/backend/harmonyos --target native; moon check examples/showcase/harmonyos_window_hosted --target native. |
HostCmd callback path, neutral HarmonyOS surface binding, and builder composition wiring. |
Signed-device presentation, input, lifecycle, renderer, and service evidence remains required. |
wzzc-dev/window@0.5.4-0.1.7 package evidence |
matching-host scripts/run-window-package-smoke.sh <platform> when collecting dependency runtime evidence. |
The registry package exposes the MoUI-oriented smoke/evidence files, including Web/macOS smoke templates and Linux/Windows matching-host pending templates shipped inside the window package. | These scripts prove the window package evidence surface exists; passed native runtime evidence still must be recorded on matching hosts and does not replace MoUI Showcase platform entrypoint evidence. |
Local moui_skia status evidence |
moui_skia/scripts/verify-platform-status.sh; moui_skia/scripts/verify-native-capability-contract.sh. |
The repo-local editable Skia binding workspace exposes skia-platform-status.json, skia-provider-lock.json, SKIA_PLATFORM_STATUS.md, native/capabilities.json, native/ownership.json, verifier scripts, CI gate evidence wiring, fallback parity, FFI ownership/borrow metadata, native smoke capability markers, and a pinned JetBrains provider artifact lock. |
This is binding-level dependency acceptance evidence. It does not prove MoUI renderer pixels or platform entrypoint runtime behavior; those still require scripts/macos-skia-renderer-smoke.sh, or matching-host Showcase runs. |
| Web runtime presentation manifest | sh scripts/ci-web-runtime-presentation.sh or node scripts/record-web-runtime-presentation.mjs --base-url http://127.0.0.1:18080 --cdp-url http://127.0.0.1:9223 --manifest artifacts/conformance/web-runtime-presentation.json --require-passed; then node scripts/validate-web-runtime-presentation-manifest.mjs artifacts/conformance/web-runtime-presentation.json --require-passed |
The recorder opens Showcase's Advanced Rendering section in a Chrome DevTools Protocol browser session and records page status, WebGPU availability, adapter/device request signals, wasm startup, canvas sizing, resize delivery, representative pointer/keyboard input, text input, clean target close, console errors, screenshot nonblank thresholds, Showcase transform-scene pixel markers, and Web renderer-proof events for RGBA color emoji glyph pixels plus font metadata and glyph key/size metadata, one-cluster ZWJ layout, bidi visual-order reordering, paragraph line metrics/later-line pixels, selection rectangles/line ranges, grapheme edit boundaries/actions, IME candidate anchors/surrounding text, composition ranges/preedit pixels, and placeholder -> image load -> repaint -> ready second-frame image ordering. Folding that manifest into the platform evidence derives github-actions provenance when the fold runs in the web-runtime-presentation Actions job, or matching-host-artifact provenance for local matching-host folds. |
This is browser-session evidence for the named Chrome run only. It does not prove cross-browser behavior, deterministic golden pixels beyond the marker thresholds, or Windows/Linux native runtime behavior. CI provenance proves where the browser-session artifact was produced and uploaded; it does not replace a passed presentation manifest. Failed manifests may be folded into the Web platform evidence entry as failed evidence, but must stay out of passed Web runtime claims. |
| Renderer proof manifest | renderer-proof manifests are produced and validated by the MoUI CI GitHub Actions Native Skia renderer proof and Renderer proof summary jobs; the Web proof comes from the browser-session WebGPU path recorded by scripts/record-web-runtime-presentation.mjs. |
Schema v1 renderer-proof manifests require GitHub Actions provenance plus exactly radialGradient, transformPixels, colorEmojiPixels, zwjGrapheme, bidiLayout, paragraphWrapping, selectionRects, graphemeEditing, imeCandidateAnchor, imeCompositionVisual, and asyncImageSecondFrame observations. Passed observations must include strong evidence tokens such as center/mid/edge radial pixels, transform pixel markers, high-saturation emoji pixels or glyph/raster evidence with font-metadata and glyph-metadata, no-interior-caret ZWJ grapheme evidence, visual bidi order, paragraph line metrics with later-line pixels, selection rectangles with line ranges and positive geometry, grapheme edit boundaries with edit actions, IME candidate anchors with surrounding text, composition ranges with preedit pixels, and late-completion/repaint/second-frame async image pixels. Native Skia paragraphWrapping, bidiLayout, and selectionRects observations must additionally carry engine=skparagraph plus native_paragraph_ready=true, bidi_visual_order_ready=true, line-metrics, later-line-pixels, visual-order, selection-rects, line-range, rect-geometry, and hit-test markers as appropriate; native Skia imeCandidateAnchor observations must additionally carry grapheme-boundary and utf8-offsets evidence from host IME diagnostics; native Skia imeCompositionVisual observations must additionally carry composition-cursor evidence. The colorEmojiPixels observation must also carry structured metadata.font and metadata.glyph fields, including a non-empty glyph key plus positive glyph width/height; native Skia color emoji proof additionally requires fallback-request, emoji-hint, stable-glyph-key, fallback script/language tag-list/count metadata, fallback request character metadata, resolved missing-glyph count, missing-glyph recovery readiness, and a glyph key containing the recorded source/text-system/shaper/script/language-tags/language-count/fallback-request-character/format fields. The Skia proof matrix configures the locked release Skia artifact before running real renderer/text smokes. |
Package tests, skipped jobs, missing uploaded artifacts, blank screenshots, caret-only diagnostics, heuristic visual-order logs, fallback paragraph geometry, coverage-only font matching, package-only checks, provider preflights, preflight-only checks, fallback-safe descriptor audits, and local renderer-proof manifests without GitHub Actions provenance are not passed renderer proof. Local manifests may preserve passed observations as diagnostics while keeping manifest status failed. Native WGPU proof remains a non-blocking diagnostic and still requires a usable runner WGPU adapter for its offscreen readback smoke. The metadata contract is a stronger artifact-audit boundary, not complete deterministic typeface/glyph-id parity by itself. |
| MoUI runtime evidence manifest | sh scripts/check.sh --profile platform; matching-host runtime evidence manifests are recorded and validated by the MoUI macOS Platform Evidence workflow, which folds native IME/Skia log markers, the window package smoke transcript, and a matching Showcase macos_skia first-frame log into the platform runtime entry before promotion. |
The schema v2 manifest records the required Web/macOS/Windows/Linux runtime evidence shape, expected Showcase targets including native Skia variants, wzzc-dev/window@0.5.4-0.1.7 package evidence command, consumer command, observations, artifact paths, and passed-entry provenance. It mirrors the window package monitor/cursor evidence as monitorCursor; native passed entries must record it as yes and must also set the native IME observations imeCandidateAnchor, imeSurroundingText, imeCompositionVisual, imeCommitDelete, imeCursorUpdate, imeScrollAnchor, imeScaleDprAnchor, and imeResizeAnchor to yes. Native entries also include skiaEvidence for Skia provider/preflight, fallback-unavailable, real renderer smoke, async image second-frame smoke, and Showcase first-frame status; native platform passed requires that Skia block to be passed too. The workflow validates log markers and updates only scoped observations before delegating platform promotion; for Web the workflow derives passed or failed platform observations from the browser presentation manifest. |
A pending manifest is only a contract. It becomes runtime evidence only after the platform entry records enough passed observations, artifacts, and evidenceProvenance for the platform being claimed. Passed provenance must trace to a non-skipped successful GitHub Actions job/run or to a matching-host artifact bundle. A passed skiaEvidence block is Skia-route proof, not full platform-service proof by itself, and the native Skia helper deliberately leaves the broader platform status unchanged. Host-core unit tests, package logs, provider preflights, coarse textInput observations, renderer-proof IME markers, window package smoke alone, or placeholder README artifacts cannot satisfy native IME observations or full macOS platform status. The native IME helper likewise leaves broader platform status unchanged and only records marker-validated IME observations. A Web presentation manifest is marked passed only when the browser session includes resize/input/text-input/shutdown platform observations and browser-session artifact provenance; Web may leave monitorCursor and native IME observations pending because browser CDP evidence does not prove native monitor/current-monitor, cursor, IME candidate-window, or platform-window anchor behavior. |
For release candidates on a configured host, add:
node scripts/smoke-gate.mjs --tier release --dry-run --json
Smoke Boundaries
Manual smoke logs may demonstrate real Skia linking, renderer pixel output, async image second-frame behavior, optional SkParagraph text behavior, WebGPU browser-session startup, nonblank canvas output, representative input delivery, or current-platform first-frame presentation.
smoke/gates.json is the smoke gate catalog and the source of truth for
mapping those observations to daily, nightly, and release gates. Use
node scripts/smoke-check.mjs --tier nightly --json or --tier release --json
to print the structured plan before triggering
.github/workflows/moui-runtime-gates.yml. Use
node scripts/smoke-gate.mjs --tier release --dry-run --json to preview the
exact catalog-backed commands before running a release gate.
Those logs are runtime observation logs for a named host/session. They do not become a checked-in manifest and they do not automatically promote unrelated platforms or renderers.
Artifact Policy
artifacts/ is ignored. Generated JSON, screenshots, browser logs, and smoke
logs under that directory are disposable local or CI artifacts. Release notes
should cite the CI run, uploaded artifact name, or local smoke log path that was
actually inspected.
Design Systems is addon diagnostic coverage. If release notes mention
moui_theme or examples/design_systems, include sh scripts/check.sh --profile theme evidence alongside the daily baseline.