Skip to content

Define candidate interaction, binding, presentation and pixel profiles - #29

Merged
AM-L merged 2 commits into
mainfrom
contract/interaction-binding-presentation
Sep 7, 2026
Merged

AM-L merged 2 commits into
mainfrom
contract/interaction-binding-presentation

Conversation

@ambroise-leclerc

@ambroise-leclerc ambroise-leclerc commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

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.py passes for the combined candidate (27 compiler cases, 231 profile cases, 60 schema cases); all 19 regression tests pass; git diff --check passes. The arithmetic audit and its scope are recorded in governance/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.

Copilot AI lite review requested due to automatic review settings September 7, 2026 13:08

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 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 binding and presentation, 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.

Comment thread tools/validate.py Outdated

@ambroise-leclerc ambroise-leclerc left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 for NoOp; neither output executes — matches MduX's resolvePress() 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

  1. B04 viewport composition rounding vs MduX's blend(). B04 specifies floor((src*alpha + bg*(255-alpha) + 127)/255). MduX's governed blend() (src/verify/Verify.cpp) computes the mix as from + 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.

  2. 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.md that P03 is opt-in per capture corpus and a consumer may claim PRESENTATION (P01/P02) without P03.

  3. I01 normalization floor((device-origin)*scaleDenominator/scaleNumerator) for negative values. floor of 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 (the normalize-negative-floor fixture exists — good; make sure its expected value is floor, not trunc).

  4. B02 NumericDisplay formatting ("inserts a decimal point scale digits from the right, zero-padding, no rounding, no grouping, ASCII digits, . separator, negative zero invalid") is a complete spec and matches MduX mdux.medui.reading intent. One gap: it does not state behaviour when scale is 0 (point omitted entirely, or trailing .?). Please pin with a vector.

  5. Schema/enum extensions are handled correctly — consumer-manifest, profile-case, contract-case enums and validate.py's documented_rules regex ([REIBP][0-9]{2}) all extend cleanly. evidence.schema.json is (correctly) left rendered-only; the interaction/binding/presentation profiles produce operation outputs rather than E01 report rows. Worth a sentence in spec/profiles.md making that asymmetry explicit — a reader may expect an "evidence" envelope for every profile.

  6. profiles/presentation-fixture.json lives under profiles/ while every other vector is under conformance/profiles/ or conformance/contracts/. validate.py special-cases it. Consider moving it under conformance/ 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.

@ambroise-leclerc
ambroise-leclerc force-pushed the contract/interaction-binding-presentation branch from b9c74fd to eb385b6 Compare September 7, 2026 14:03
@ambroise-leclerc ambroise-leclerc changed the title Define candidate interaction, binding and presentation profiles Define candidate interaction, binding, presentation and pixel profiles Sep 7, 2026
@ambroise-leclerc

Copy link
Copy Markdown
Contributor Author

Addressed in eb385b6, after rebasing this PR onto #28's amended head 35f5a09.

  1. B04: retained the formula after checking every one of the 16,777,216 source/background/alpha channel triples against the signed-delta expression in MduX blend(). They agree for opaque backgrounds with the helper's additional coverage set to 255. The specification states that mapping explicitly; governance/profile-arithmetic.md records the algebra and audit limits. Added six ascending/descending boundary and extreme-value vectors. This arithmetic comparison does not claim that either consumer has executed the shared corpus.
  2. P03: separated it into the independently optional MEDUI-PROFILE-PIXELS/1 claim. PRESENTATION now covers P01/P02 only. Pixel support still requires all synthetic P03 vectors, while captured product corpora opt in individually and need not be committed. Manifest cases demonstrate independent presentation and pixel claims.
  3. I01: explicitly states floor toward negative infinity. The existing -1/2 -> -1 vector was already correct; added (-3/2,-5/2) -> (-2,-3).
  4. B02: states that scale zero omits the point. Retained the 123 -> "123" case and added zero and negative values with suffixes to catch an accidental trailing point.
  5. Envelope scope: clarified that E01 is rendered-only; the other profiles return their specified operation outputs.
  6. Fixture and diagnostics: removed the duplicate profiles/presentation-fixture.json and its special validator path. The identical declaration already lives in the portable conformance/contracts/presentation-valid.json case. Common schema failure messages now join errors with ; rather than printing a Python list. Presentation and pixel asset identities also use Define candidate rendered-check profiles and evidence identities #28's explicit ordered asset representation.

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 main after #28 merges; no consumer adoption or merge is asserted here.

@ambroise-leclerc ambroise-leclerc left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Base automatically changed from contract/rendered-evidence-profiles to main September 7, 2026 14:44
@AM-L
AM-L merged commit 9a57f64 into main Sep 7, 2026
2 checks passed
@AM-L
AM-L deleted the contract/interaction-binding-presentation branch September 7, 2026 14:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Define optional interaction, data-binding and presentation profiles

3 participants