Repository navigation
Define candidate interaction, binding, presentation and pixel profiles - #29
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
The validator’s new failure path reports schema errors as a raw Python list, reducing the clarity and consistency of validation output.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds the 0.3.0 candidate interaction, binding, and presentation profile contract surface for MEDUI-DEC-008, including new JSON Schemas, profile registry entries, and a large conformance corpus (profile vectors + schema contract cases) while keeping the repo implementation-neutral.
Changes:
- Extend schema/validation plumbing to recognize and validate new binding and presentation contract documents and profile-case identifiers/operations.
- Define new JSON Schemas for
bindingandpresentation, plus update manifest/profile-case schemas to include the new profile IDs/rules/operations. - Add synthetic fixtures and extensive conformance vectors covering interaction event semantics, bindings, presentation declarations, and pixel-identity checks.
File summaries
| File | Description |
|---|---|
| tools/validate.py | Adds validation of the synthetic presentation fixture against the presentation schema. |
| spec/component-model.md | Clarifies that formatted clock text observations live in the optional binding profile (not compiler corpus). |
| schemas/profile-case.schema.json | Extends profile-case schema to include new profile IDs, rules, and operations. |
| schemas/presentation.schema.json | Adds the presentation declaration schema (theme/font/assets/backend/surface + variants). |
| schemas/contract-case.schema.json | Extends contract-case schema to allow presentation and binding schema cases. |
| schemas/consumer-manifest.schema.json | Extends consumer manifest profile claim enum to include interaction/binding/presentation. |
| schemas/binding.schema.json | Adds the binding declaration schema (screen/snapshot/frame + typed entry variants per component). |
| profiles/registry.json | Registers new optional profile IDs with their rule sets (I*, B*, P*). |
| profiles/presentation-fixture.json | Adds a synthetic presentation declaration fixture covering all components and key states. |
| governance/versioning.md | Updates 0.3.0 candidate description to include MEDUI-DEC-008 delivery. |
| decisions/MEDUI-DEC-008-interaction-profiles.md | Updates decision record to point at the delivered 0.3.0 profile contract and summarize candidate delivery. |
| conformance/profiles/viewport-zero-dimension.json | Adds binding profile vector for invalid viewport dimensions. |
| conformance/profiles/viewport-transparent.json | Adds binding profile vector for alpha compositing behavior (transparent source). |
| conformance/profiles/viewport-short.json | Adds binding profile vector for invalid rgba8 length. |
| conformance/profiles/viewport-rows.json | Adds binding profile vector for row ordering / exact byte preservation. |
| conformance/profiles/viewport-rounding.json | Adds binding profile vector for alpha blend rounding expectations. |
| conformance/profiles/viewport-range.json | Adds binding profile vector for invalid channel range. |
| conformance/profiles/viewport-opaque.json | Adds binding profile vector for opaque source passthrough. |
| conformance/profiles/viewport-negative-channel.json | Adds binding profile vector for invalid negative channel values. |
| conformance/profiles/viewport-format.json | Adds binding profile vector for invalid viewport format. |
| conformance/profiles/viewport-excess-pixels.json | Adds binding profile vector for excess rgba8 data. |
| conformance/profiles/viewport-dimensions.json | Adds binding profile vector for declared size mismatch. |
| conformance/profiles/trace-range.json | Adds binding profile vector for trace sample out-of-range rejection. |
| conformance/profiles/trace-order.json | Adds binding profile vector for preserving trace sample order. |
| conformance/profiles/trace-invalid-range.json | Adds binding profile vector for invalid min/max trace bounds. |
| conformance/profiles/trace-invalid-capacity.json | Adds binding profile vector for invalid trace capacity. |
| conformance/profiles/trace-empty.json | Adds binding profile vector for valid empty trace samples. |
| conformance/profiles/trace-capacity.json | Adds binding profile vector for trace capacity overflow rejection. |
| conformance/profiles/text-value.json | Adds binding profile vector for valid TextInput value including Unicode scalar. |
| conformance/profiles/text-too-long.json | Adds binding profile vector for TextInput max-length rejection. |
| conformance/profiles/text-invalid-glyph.json | Adds binding profile vector for glyph-set rejection. |
| conformance/profiles/status-type.json | Adds binding profile vector for StatusIndicator type rejection. |
| conformance/profiles/status-range.json | Adds binding profile vector for StatusIndicator index range rejection. |
| conformance/profiles/status-order.json | Adds binding profile vector for StatusIndicator state/color ordering. |
| conformance/profiles/status-negative-index.json | Adds binding profile vector for negative status index rejection. |
| conformance/profiles/status-color-count.json | Adds binding profile vector for mismatched state/color list lengths. |
| conformance/profiles/static-row.json | Adds binding profile vector for valid static Row binding. |
| conformance/profiles/static-label.json | Adds binding profile vector for valid static Label binding. |
| conformance/profiles/static-image.json | Adds binding profile vector for valid static Image binding. |
| conformance/profiles/static-extra-row.json | Adds binding profile vector for invalid extra entries on static Row. |
| conformance/profiles/static-extra-label.json | Adds binding profile vector for invalid extra entries on static Label. |
| conformance/profiles/static-extra-image.json | Adds binding profile vector for invalid extra entries on static Image. |
| conformance/profiles/static-extra-criticalbutton.json | Adds binding profile vector for invalid extra entries on static CriticalButton. |
| conformance/profiles/static-extra-button.json | Adds binding profile vector for invalid extra entries on static Button. |
| conformance/profiles/static-criticalbutton.json | Adds binding profile vector for valid static CriticalButton binding. |
| conformance/profiles/static-button.json | Adds binding profile vector for valid static Button binding. |
| conformance/profiles/snapshot-mixed.json | Adds interaction profile vector for snapshot consistency failures (mixed snapshot IDs). |
| conformance/profiles/snapshot-missing.json | Adds interaction profile vector for missing snapshot handling. |
| conformance/profiles/snapshot-boundary.json | Adds interaction profile vector for consume/update/bind/render/capture ordering and activation. |
| conformance/profiles/queue-saturate.json | Adds interaction profile vector for queue saturation and activation suppression behavior. |
| conformance/profiles/queue-reset.json | Adds interaction profile vector for queue behavior across batches and dropped counter reset rules. |
| conformance/profiles/queue-queued-activation-overflow.json | Adds interaction profile vector for activation cancellation when overflow occurs mid-sequence. |
| conformance/profiles/queue-overflow.json | Adds interaction profile vector for drop-newest overflow behavior. |
| conformance/profiles/queue-invalid.json | Adds interaction profile vector for rejecting invalid events while still processing valid ones. |
| conformance/profiles/queue-invalid-capacity.json | Adds interaction profile vector for invalid queue capacity rejection. |
| conformance/profiles/queue-full.json | Adds interaction profile vector for successful activation when queue is not overflowing. |
| conformance/profiles/presentation-invalid-missing-component.json | Adds presentation profile vector for missing component coverage failure. |
| conformance/profiles/pixel-identity-theme.json | Adds presentation profile vector for pixel evidence identity mismatch on theme digest. |
| conformance/profiles/pixel-identity-surface.json | Adds presentation profile vector for pixel evidence identity mismatch on surface. |
| conformance/profiles/pixel-identity-scenario.json | Adds presentation profile vector for pixel evidence identity mismatch on scenario digest. |
| conformance/profiles/pixel-identity-locale.json | Adds presentation profile vector for pixel evidence identity mismatch on locale. |
| conformance/profiles/pixel-identity-frame.json | Adds presentation profile vector for pixel evidence identity mismatch on frame. |
| conformance/profiles/pixel-identity-font.json | Adds presentation profile vector for pixel evidence identity mismatch on font digest. |
| conformance/profiles/pixel-identity-declaration.json | Adds presentation profile vector for pixel evidence identity mismatch on declaration digest. |
| conformance/profiles/pixel-identity-backend.json | Adds presentation profile vector for pixel evidence identity mismatch on backend. |
| conformance/profiles/pixel-identity-assets.json | Adds presentation profile vector for pixel evidence identity mismatch on assets digest. |
| conformance/profiles/pixel-equal.json | Adds presentation profile vector for passing exact pixel equality when identities match. |
| conformance/profiles/pixel-different.json | Adds presentation profile vector for failing exact pixel comparison when bytes differ. |
| conformance/profiles/occlusion-disabled.json | Adds interaction hit-testing vector for disabled control occlusion behavior. |
| conformance/profiles/occlusion-decoration.json | Adds interaction hit-testing vector for non-control occlusion behavior. |
| conformance/profiles/occlusion-control.json | Adds interaction hit-testing vector for reverse paint order target selection. |
| conformance/profiles/occlusion-clipped.json | Adds interaction hit-testing vector for clipping intersection behavior. |
| conformance/profiles/numeric-template.json | Adds binding vector for numeric formatting with prefix/suffix and scale. |
| conformance/profiles/numeric-scale-bound.json | Adds binding vector for rejecting excessive numeric scale. |
| conformance/profiles/numeric-padding.json | Adds binding vector for numeric zero-padding behavior. |
| conformance/profiles/numeric-negative-zero.json | Adds binding vector for rejecting “-0”. |
| conformance/profiles/numeric-negative-scale.json | Adds binding vector for rejecting negative scale. |
| conformance/profiles/numeric-leading-zero.json | Adds binding vector for rejecting leading-zero integers. |
| conformance/profiles/numeric-integer.json | Adds binding vector for integer-only numeric formatting. |
| conformance/profiles/numeric-fraction.json | Adds binding vector for fractional formatting behavior. |
| conformance/profiles/numeric-float.json | Adds binding vector for rejecting non-integer integer fields. |
| conformance/profiles/numeric-digit-bound.json | Adds binding vector for rejecting too many digits. |
| conformance/profiles/normalize-origin.json | Adds interaction normalize vector for origin/scale conversion. |
| conformance/profiles/normalize-negative-floor.json | Adds interaction normalize vector for negative coordinate flooring behavior. |
| conformance/profiles/normalize-invalid-scalenumerator.json | Adds interaction normalize vector for invalid scale numerator rejection. |
| conformance/profiles/normalize-invalid-scaledenominator.json | Adds interaction normalize vector for invalid scale denominator rejection. |
| conformance/profiles/normalize-fraction.json | Adds interaction normalize vector for fractional scaling behavior. |
| conformance/profiles/mapping-unknown.json | Adds binding vector for rejecting mapping to unknown node. |
| conformance/profiles/mapping-type.json | Adds binding vector for rejecting value type mismatch. |
| conformance/profiles/mapping-source.json | Adds binding vector for rejecting wrong declared source mapping. |
| conformance/profiles/mapping-snapshot.json | Adds binding vector for rejecting wrong snapshot id in entries. |
| conformance/profiles/mapping-screen.json | Adds binding vector for rejecting wrong screen id in entries. |
| conformance/profiles/mapping-missing.json | Adds binding vector for rejecting missing mapping entries. |
| conformance/profiles/mapping-duplicate.json | Adds binding vector for rejecting duplicate mapping entries. |
| conformance/profiles/hit-surface.json | Adds interaction hit-testing vector for half-open surface bounds. |
| conformance/profiles/hit-right.json | Adds interaction hit-testing vector for half-open rect right edge. |
| conformance/profiles/hit-origin.json | Adds interaction hit-testing vector for rect origin inclusion. |
| conformance/profiles/hit-negative.json | Adds interaction hit-testing vector for negative coordinates. |
| conformance/profiles/hit-interior.json | Adds interaction hit-testing vector for interior points. |
| conformance/profiles/hit-bottom.json | Adds interaction hit-testing vector for half-open rect bottom edge. |
| conformance/profiles/focus-traversal.json | Adds interaction events vector for focus traversal and armed-state clearing. |
| conformance/profiles/focus-press.json | Adds interaction events vector for press-to-focus TextInput behavior. |
| conformance/profiles/focus-outside.json | Adds interaction events vector for focus loss on outside press. |
| conformance/profiles/focus-loss-editing.json | Adds interaction events vector for explicit focus-loss clearing behavior. |
| conformance/profiles/focus-initial.json | Adds interaction events vector for initial focus-next behavior. |
| conformance/profiles/edit-unfocused.json | Adds interaction edit vector ensuring edits are ignored when unfocused. |
| conformance/profiles/edit-selection.json | Adds interaction edit vector for selection replacement semantics. |
| conformance/profiles/edit-selection-right.json | Adds interaction edit vector for right navigation collapsing selection. |
| conformance/profiles/edit-selection-left.json | Adds interaction edit vector for left navigation collapsing selection. |
| conformance/profiles/edit-selection-delete.json | Adds interaction edit vector for delete over selection. |
| conformance/profiles/edit-selection-backspace.json | Adds interaction edit vector for backspace over selection. |
| conformance/profiles/edit-scalar.json | Adds interaction edit vector for Unicode scalar boundary deletion. |
| conformance/profiles/edit-right.json | Adds interaction edit vector for right navigation across scalars. |
| conformance/profiles/edit-repeat-navigation.json | Adds interaction edit vector for repeat-flag navigation behavior. |
| conformance/profiles/edit-repeat-deletion.json | Adds interaction edit vector for repeat-flag deletion behavior. |
| conformance/profiles/edit-reject-surrogate.json | Adds interaction edit vector for rejecting invalid UTF-8 (surrogate) paste. |
| conformance/profiles/edit-reject-selection.json | Adds interaction edit vector for rejecting invalid selection bounds. |
| conformance/profiles/edit-reject-repeat-paste.json | Adds interaction edit vector for rejecting repeated paste events. |
| conformance/profiles/edit-reject-repeat-insert.json | Adds interaction edit vector for rejecting repeated insert events. |
| conformance/profiles/edit-reject-oversize.json | Adds interaction edit vector for rejecting oversize edits. |
| conformance/profiles/edit-reject-overlong.json | Adds interaction edit vector for rejecting overlong/invalid UTF-8 sequences. |
| conformance/profiles/edit-reject-glyph.json | Adds interaction edit vector for rejecting disallowed glyph insertion. |
| conformance/profiles/edit-reject-encoding.json | Adds interaction edit vector for rejecting malformed UTF-8 sequences. |
| conformance/profiles/edit-paste.json | Adds interaction edit vector for valid paste behavior across scalars. |
| conformance/profiles/edit-left.json | Adds interaction edit vector for left navigation across scalars. |
| conformance/profiles/edit-home.json | Adds interaction edit vector for home navigation. |
| conformance/profiles/edit-end.json | Adds interaction edit vector for end navigation. |
| conformance/profiles/edit-end-edge.json | Adds interaction edit vector for end-edge delete behavior. |
| conformance/profiles/edit-edge.json | Adds interaction edit vector for caret-edge backspace behavior. |
| conformance/profiles/edit-delete.json | Adds interaction edit vector for delete behavior at scalar boundary. |
| conformance/profiles/different-control.json | Adds interaction events vector for press/release on different controls (no activation). |
| conformance/profiles/critical-triggerhalt.json | Adds interaction events vector for CriticalButton action output emission. |
| conformance/profiles/critical-noop.json | Adds interaction events vector for CriticalButton NoOp output emission. |
| conformance/profiles/clock-year-bound.json | Adds binding vector for rejecting out-of-range clock year. |
| conformance/profiles/clock-timeseconds.json | Adds binding vector for TimeSeconds formatting. |
| conformance/profiles/clock-leap-second.json | Adds binding vector for rejecting leap-second inputs. |
| conformance/profiles/clock-invalid-date.json | Adds binding vector for rejecting invalid dates. |
| conformance/profiles/clock-datetimeseconds.json | Adds binding vector for DateTimeSeconds formatting. |
| conformance/profiles/activation-unarmed.json | Adds interaction events vector for release without armed control (no activation). |
| conformance/profiles/activation-repress-outside.json | Adds interaction events vector for re-press outside cancelling activation. |
| conformance/profiles/activation-repeated-press.json | Adds interaction events vector for repeated press handling. |
| conformance/profiles/activation-removed.json | Adds interaction events vector for removal cancelling activation. |
| conformance/profiles/activation-release-outside.json | Adds interaction events vector for release outside cancelling activation. |
| conformance/profiles/activation-focus-loss.json | Adds interaction events vector for focus-loss cancelling activation. |
| conformance/profiles/activation-disabled.json | Adds interaction events vector for eligibility change cancelling activation. |
| conformance/profiles/activation-cancel.json | Adds interaction events vector for explicit cancel cancelling activation. |
| conformance/profiles/activation-activate.json | Adds interaction events vector for successful press/release activation. |
| conformance/contracts/presentation-unknown-component.json | Adds schema contract case ensuring unknown component is rejected by presentation schema. |
| conformance/contracts/presentation-missing-variants.json | Adds schema contract case ensuring missing variants is rejected by presentation schema. |
| conformance/contracts/presentation-missing-font.json | Adds schema contract case ensuring required field enforcement in presentation schema. |
| conformance/contracts/presentation-channel-range.json | Adds schema contract case ensuring tint channel range enforcement in presentation schema. |
| conformance/contracts/manifest-profiles.json | Updates manifest schema contract case to include new profile claims. |
| conformance/contracts/binding-wrong-vulkanviewport.json | Adds schema contract case rejecting wrong VulkanViewport binding value type. |
| conformance/contracts/binding-wrong-textinput.json | Adds schema contract case rejecting wrong TextInput binding value type. |
| conformance/contracts/binding-wrong-statusindicator.json | Adds schema contract case rejecting wrong StatusIndicator binding value type. |
| conformance/contracts/binding-wrong-signaltrace.json | Adds schema contract case rejecting wrong SignalTrace binding value type. |
| conformance/contracts/binding-wrong-numericdisplay.json | Adds schema contract case rejecting wrong NumericDisplay binding value type. |
| conformance/contracts/binding-wrong-clock.json | Adds schema contract case rejecting wrong Clock binding value type. |
| conformance/contracts/binding-vulkanviewport.json | Adds schema contract case for valid VulkanViewport binding document. |
| conformance/contracts/binding-textinput.json | Adds schema contract case for valid TextInput binding document. |
| conformance/contracts/binding-statusindicator.json | Adds schema contract case for valid StatusIndicator binding document. |
| conformance/contracts/binding-signaltrace.json | Adds schema contract case for valid SignalTrace binding document. |
| conformance/contracts/binding-numericdisplay.json | Adds schema contract case for valid NumericDisplay binding document. |
| conformance/contracts/binding-clock.json | Adds schema contract case for valid Clock binding document. |
Review details
- Files reviewed: 190/190 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
ambroise-leclerc
left a comment
There was a problem hiding this comment.
Review — candidate interaction, binding and presentation profiles (#29)
Reviewed from the MduX side. This PR delivers MEDUI-DEC-008 (MEDUI-PROFILE-INTERACTION/BINDING/PRESENTATION) and is not on MduX #314's critical path — #314 is the shared rendered-check / evidence corpus gate, which is #28. This PR maps to MduX epics #308–#311 (input, monitor, dynamic evidence, viewport, authoring) and their design children #315/#316/#317/#322/#325, none of which is unblocked yet on the MduX side (they need MduX-local design decisions first).
The PR body correctly records the stacking: it targets contract/rendered-evidence-profiles and must be retargeted to main after #28 merges. Please also rebase so the diff stays clean once #28's amendments land.
Alignment with MduX's prospective requirements — good
The interaction rules line up closely with MduX's already-drafted docs/parity/requirements.md (PAR-REQ-004..008) and resolvePress():
- I02 half-open reverse-paint all-node occlusion, disabled foreground not transparent — matches
src/medui/Screen.cpp::covers()/resolvePress()exactly. - I04 "any saturation clears the arm and suppresses all activation for the entire accepted batch" — matches PAR-REQ-005's "cancel pending activation" and is stronger/clearer than MduX's current wording; MduX would adopt this.
- I03 CriticalButton emits
{kind:"action",node,action,requirement}even forNoOp; neither output executes — matches MduX'sresolvePress()returning traced action data without dispatch. - I05 "one complete snapshot, bind, render, capture; injected time in the same snapshot; no wall-clock read" — matches PAR-REQ-005/008 and ADR-011.
- I06 atomic edits, no normalization/grapheme shaping, reject invalid UTF-8 / disallowed glyph / oversize without mutation — matches PAR-REQ-007 and ADR-010.
Points to resolve
-
B04 viewport composition rounding vs MduX's
blend(). B04 specifiesfloor((src*alpha + bg*(255-alpha) + 127)/255). MduX's governedblend()(src/verify/Verify.cpp) computes the mix asfrom + round(span*alpha/(255*255))with sign-aware round-to-nearest, i.e. a different factoring of the same intent. These should be checked to produce identical bytes for all inputs, or one adjusted — a viewport pixel corpus that MduX can't reproduce bit-for-bit is not usable. -
P03 exact-pixel evidence vs MduX's committed-artifact doctrine. P03 requires "once identities agree, bytes compare exactly." MduX's ADR-014 decision 4 deliberately keeps captured pixel baselines out of byte-compared committed artifacts (a digest/baseline is a property of the driver tuple, not the inputs). MduX would therefore not claim P03 for its committed screens — it would run P03 only against a non-committed product corpus, if at all. Worth stating in
spec/profiles.mdthat P03 is opt-in per capture corpus and a consumer may claim PRESENTATION (P01/P02) without P03. -
I01 normalization
floor((device-origin)*scaleDenominator/scaleNumerator)for negative values.floorof a negative rational is the mathematically clean choice; confirm this is intended over truncation-toward-zero, since C/C++ integer division truncates and a naive consumer implementation would diverge on negative coordinates. A vector with a negative device coordinate and a non-1 scale would pin it (thenormalize-negative-floorfixture exists — good; make sure its expected value isfloor, not trunc). -
B02 NumericDisplay formatting ("inserts a decimal point
scaledigits from the right, zero-padding, no rounding, no grouping, ASCII digits,.separator, negative zero invalid") is a complete spec and matches MduXmdux.medui.readingintent. One gap: it does not state behaviour whenscaleis0(point omitted entirely, or trailing.?). Please pin with a vector. -
Schema/enum extensions are handled correctly —
consumer-manifest,profile-case,contract-caseenums andvalidate.py'sdocumented_rulesregex ([REIBP][0-9]{2}) all extend cleanly.evidence.schema.jsonis (correctly) left rendered-only; the interaction/binding/presentation profiles produce operation outputs rather than E01 report rows. Worth a sentence inspec/profiles.mdmaking that asymmetry explicit — a reader may expect an "evidence" envelope for every profile. -
profiles/presentation-fixture.jsonlives underprofiles/while every other vector is underconformance/profiles/orconformance/contracts/.validate.pyspecial-cases it. Consider moving it underconformance/for consistency, or documenting why it is a repository fixture rather than a portable vector.
Bottom line
Well-constructed and closely aligned with MduX's own draft interaction requirements. It does not affect #314. It becomes relevant to MduX once #315/#322/#325 have their MduX-side design decisions and can pin this corpus. Recommend merging #28 first (with its amendments), retargeting this to main, then a focused pass on B04/P03/I01 arithmetic against both consumers.
b9c74fd to
eb385b6
Compare
|
Addressed in eb385b6, after rebasing this PR onto #28's amended head 35f5a09.
The combined candidate passes validation with 27 compiler cases, 231 profile cases, and 60 schema cases; all 19 regression tests pass. This PR remains stacked on #28 and is separate from MduX #314. It should be retargeted to |
ambroise-leclerc
left a comment
There was a problem hiding this comment.
Follow-up — eb385b6
All points resolved.
B04 viewport composition. governance/profile-arithmetic.md records an exhaustive audit: all 16,777,216 (s,b,a) channel triples enumerated against MduX's blend() at a3f8b6d, zero differences, with the reasoning (c = 255 not c = a; odd 255 denominator ⇒ no half-integer tie ⇒ same nearest integer including for negative spans). This is exactly the cross-check requested, done more thoroughly than asked.
P03 → MEDUI-PROFILE-PIXELS. Exact-pixel comparison is now its own optional profile; "products choose captured corpora independently and need not commit pixel baselines." This keeps MduX's ADR-014 decision 4 intact — MduX can claim PRESENTATION (P01/P02) without PIXELS, and run PIXELS only against a non-committed product corpus if ever.
I01 negative floor. "Floor means rounding toward negative infinity, not integer truncation toward zero: -1/2 normalizes to -1", with normalize-negative-floor / normalize-negative-nonunit distinguishing it from C/C++ truncation.
B02 scale = 0. "omit the decimal point entirely; integer 123 renders 123, not 123." — pinned.
python3 tools/validate.py → OK (27 / 231 / 60); 19/19 tests pass on the combined checkout.
Unchanged from my first review: this is MEDUI-DEC-008 and does not affect MduX #314. It becomes relevant once MduX #315/#322/#325 have their MduX-side design decisions. Recommend merging #28, retargeting this to main, then a consumer pass.
The accepted interaction decision lacked detailed profiles and shared cases. This delivers candidate interaction, binding, and presentation contracts: all-node hit testing, press/release activation, whole-batch activation suppression on overflow, atomic Unicode edits, consistent snapshot/capture ordering, injected time, and typed bindings for every component.
Presentation claims cover P01/P02 geometry and state observations. P03 exact-pixel comparison has its own optional PIXELS claim; products choose captured corpora independently and need not commit pixel baselines. B04 viewport composition specifies full additional coverage and matches the audited MduX arithmetic across all 16,777,216 byte-channel triples.
Adds 167 profile vectors and 23 schema cases on top of #28. Observations remain implementation-neutral; no event loop, renderer, device action, or native artifact format is introduced.
Depends on #28 and has been rebased onto its amended head. Merge #28 first, then retarget this PR to
main. This delivery is separate from the MduX #314 rendered-evidence gate.Validation:
python3 tools/validate.pypasses for the combined candidate (27 compiler cases, 231 profile cases, 60 schema cases); all 19 regression tests pass;git diff --checkpasses. The arithmetic audit and its scope are recorded ingovernance/profile-arithmetic.md. The seven previously documented diagnostic coverage gaps remain unchanged.These profiles remain candidate contracts. Repository validation checks schemas and coverage, not consumer behavior. Each consumer must execute its claimed corpus at an exact candidate SHA before adoption.
Closes #16.