RiverSync
SPEC-UIX-SCH · v1.1
1 July 2026
Owner: Platform team

Design specification · build-ready · Support · Scheduling

The service scheduling system — one calendar, three apps

The exhaustive design specification for RiverSync's centralized visit scheduling: the surface a customer uses to confirm and reschedule the slots RiverSync proposes, a RiverSync dispatcher uses to propose / assign / reschedule / complete visits across every tenant, and a servicing partner uses to work the visits assigned to it. It is specified as one reusable surface — the same command bar, calendar, upcoming rail and visit detail, reskinned per app by a single persona setting (and an optional partner scope) — so Portal, Admin and Partners never diverge. Written so an implementer needs no further decisions: each region, state, class, icon and persona rule is named.

Prototyped Design spec · v1.1 Reusable across 3 apps
This is a design view over a settled model. The negotiation it presents is SPEC-ERD DM-57 (service scheduling is a propose → select negotiation), shaped by DM-58 (standing SchedulingPreference) and scoped for partners by DM-59; the entities Visit · VisitProposal · VisitProposalOption live in the Field ERD; the events & service in the Field service domain; the process in SPEC-PWF-SCH and the lifecycle in SPEC-DWF-FLD. This document owns no model — it specifies how that model is presented and operated, and the rules for reusing the one surface across apps. On any conflict the platform master wins. Prototype of record: the shared engine apps/portal/portal-schedule.jsx (exposed as PV.Schedule) and mounter apps/portal/schedule-app.jsx, deployed as a dedicated page in each app — customer inside apps/portal/Portal.html, RiverSync dispatch in apps/admin/Admin Schedule.html, servicing partner in apps/partners/Partner Schedule.html.

1What it is — and what it is not

The service scheduling system is the shared visit calendar for preventive maintenance and on-site incident / install / remote-advisory visits. RiverSync (or a servicing partner) proposes one or more candidate slots; the customer confirms one or asks to reschedule; the confirmed visit is assigned to an engineer and rides a lifecycle to completion. Every party works the same calendar — only what they may see and do changes.

It is
  • The customer↔RiverSync↔partner visit calendar, anchored to a DeviceId, a SiteId and a Visit / VisitProposal.
  • One reusable surface (PV.Schedule) reskinned by personacustomer (Portal), riversync (Admin), partner (Partners, scoped).
  • The negotiation: propose → confirm / reschedule → complete, with the year / month / week calendar and an upcoming-visits rail.
  • Cross-linked: every visit deep-links its device, its ticket thread, its maintenance-agreement tier and its site on the branded map.
It is not
  • The Field on-site execution app — that is Field (check-in, runbook tasks, parts, evidence, sign-off). This surface ends where the engineer arrives.
  • A second source of truth for the device, ticket or agreement — it links to them; they stay canonical.
  • A generic calendar — every block is a visit with a type, status, priority, assigned engineer and agreement context.

2The shape at a glance

One immersive page: a full-width context-aware command bar, then the DS Calendar filling the body with an upcoming-visits rail overlaid at the right, and a visit detail off-canvas that docks to the left of that rail. The surface is identical across the three apps; the differences are captured entirely by persona (+ partner scope).

3 personas customerriversyncpartner
visit status proposedconfirmedrescheduledcompletedcancelled
visit type preventiveincidentinstallremote

The five W's of every visit are visible before it is opened — what (type tag + title), which device (id), where (site), when (day + time range), what state (status badge + colour rail).

RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 1

3One surface, three personas

The component takes a single persona prop (and, for a partner, a scope — its organization). Everything app-specific — the shell chrome (App pill, nav, tenant), which visits are in view, the available lifecycle actions and the wording — derives from it. There is no forked code per app, and no in-app persona switcher — each app deploys its own persona-locked page through the shared mounter, so a customer only ever sees the customer view (in Portal), a dispatcher the dispatch view (in Admin), a partner the scoped partner view (in Partners).

personaApp / pillSigned-in partyWhat this persona can do
customerPortal · --portalCustomer (Sanyodenki)Sees every visit on its own fleet. Confirms a proposed slot, requests a reschedule, opens the linked ticket. Cannot propose or cancel — RiverSync owns dispatch.
riversyncAdmin · --adminRiverSync dispatchSees every tenant's visits. Proposes visits, confirms on behalf, reschedules, marks completed, cancels and re-proposes. The full dispatch authority.
partnerPartners · --partnersServicing partner (Nera)Sees only the visits assigned to it (servicer === scope), across every customer it covers. Proposes slots for its devices, reschedules and marks its visits completed.
ReuseThe persona maps to one capability flag. canManage = persona ∈ {riversync, partner} drives three things only: (1) the visit scope — a partner is pre-filtered to servicer === scope, customer + riversync see their full set; (2) the command bar primaryPropose visit for managers, Today for the customer; (3) the footer actions — confirm-on-behalf / mark-completed / reschedule / cancel for managers; confirm / request-reschedule for the customer. Same data, same component.
ScopeThe partner list is pre-scoped (DM-59). A partner persona only ever sees visits whose servicer is its org — enforced in a scoped memo before the calendar, the upcoming rail, the counts and the triage jump are computed, so "X awaiting" and the year-grid busy days all read within its own scope. Fleet-wide RiverSync maintenance windows are excluded from the partner view.
IdentityEach persona writes activity under its own name. Every lifecycle action appends a history entry attributed to the signed-in party — customer → the customer contact, riversync → "RiverSync dispatch", partner → "{Partner} dispatch" — passed as the me prop and surfaced in the visit's Activity log.
RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 2

4The data the surface renders

The UI never invents fields. Every rendered value maps to the VisitProposalVisit model owned by the Field service domain and defined in SPEC-ERD-FLD. The surface presents two ERD records as one "visit" row: while a slot is being negotiated the record is a VisitProposal with its VisitProposalOptions; once a slot is confirmed it is the accepted Visit. Field names below are the presentation contract the prototype reads.

VisitProposal → Visitscheduling record · SV-NNNN
FieldKeyMeaning & UI use
IdPKSV-NNNN — calendar block, rail row, detail header. (Maps to VisitProposal.Id / Visit.Id.)
Type · Kindpreventiveincidentinstallremote — the type tag + icon + calendar tone. (ERD Visit.Kind + VisitProposal.SourceKind.)
Statusproposedconfirmedrescheduledcompletedcancelled — the negotiation lifecycle (§9); drives the status badge + colour rail.
DeviceIdFK→ Device · 0..1 (null = fleet-wide window). The linked device chip; fleet visits service the whole fleet.
SiteIdFK→ OrganizationSite. The location line + the branded VectorMap pin.
EngineerUser · ServicerFK→ the assigned engineer + their org (RiverSync field XOR a servicing partner). The dispatch line; Servicer is the partner-scope key (DM-59).
TierFK→ the device's maintenance-agreement tier (Silver / Gold) · 0..1. The TierBadge in Linked.
TicketIdFK→ ServiceTicket · 0..1 — the support thread the visit was arranged in; the Linked ticket chip.
Priority · Originhigh / medium / low + a one-line origin (alarm id, PM trigger, provisioning) shown under the engineer.
ScopeThe free-text description of what the visit covers — the detail body paragraph.
Start · End · AllDayThe confirmed window (ISO); AllDay blocks span the day. (ERD Visit.ScheduledAt.)
RescheduledFromThe previous start when moved — the "Moved from …" line (§9).
History[]Ordered activity entries {when, by, text} — the Activity log.
VisitProposalOptionper proposal · the slots[]
FieldKeyMeaning & UI use
ProposalId · OptionNoPFParent proposal + slot ordinal. Rendered as the slots[] radio list on a proposed visit.
StartAt · EndAtThe candidate window — one selectable .pv-sch__slot row; the first is the recommended slot and seeds the calendar block before confirmation.
WindowLabelHuman label (e.g. Mon 9–12) — the slot row caption.
Two lifecyclesThis surface owns the scheduling negotiation, not the on-site execution. The presented status (proposed → confirmed → rescheduled → completed / cancelled) is the VisitProposal + pre-execution Visit lifecycle. The ERD Visit.Status (scheduled · enroute · onsite · complete) is the Field execution lifecycle (SPEC-DWF-FLD), driven by the Field app once an engineer is dispatched. completed here corresponds to Visit.Status = complete after Field sign-off seals it (DM-30).
RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 3

5Layout & grid

Below the shell chrome the page is a vertical stack: a full-width command bar, then a body that fills the remaining height — the DS Calendar across the full width, the upcoming-visits rail lifted out of flow and overlaid at the right edge, and the visit detail off-canvas docked to the left of that rail. The calendar never reflows when the rail or detail open; the page itself does not scroll.

Schedule 12 upcoming · 6 awaiting 6 to confirm Search… Today LINKED CHOOSE A SLOT Rayong Plant · map ▾ Upcoming visits 1 2 3 4 5 6 7
Scheduling surface anatomy (reference layout, not to absolute scale). Numbered regions are specified below.
RegionSizingSpecification
1Command bar .pv-cmdbarfull width · 40pxFixed at the top (height 40px, matching the shell top bar). Left: identity tile (Schedule + live counts). Middle: the triage command. Right: search + the primary (Propose visit / Today). Never scrolls. (§6.)
2Calendar body .pv-sch__calfillsThe DS Calendar (year ⇄ month ⇄ week) fills the width. Scroll-through-time at the inner boundary moves the period. (§7.)
3Visit blockautoOne calendar event per visit — {type short} · {device}, toned by status. Click opens the detail.
4Busy-day highlightautoIn the year view a day carrying scheduled visits gets an accent background (not just the DS dot); today keeps its solid fill. (§7.1.)
5Visit detail .pv-schoc440px · docks left of railThe off-canvas reader. Absolute inside the calendar body (never over the top bar or command bar), docked to the left of the upcoming rail (right: var(--sch-rail-w)) so the rail stays visible. Collapses to a 40px rail. (§8.)
6Map toggleauto · pinned bottomThe site map sits at the bottom of the detail as secondary context; the location title toggles it open / closed. (§8.)
7Upcoming rail .pv-sch__rail364px / 40pxLifted out of flow and overlaid at the right edge (never squeezes the calendar). Filter + the upcoming list; collapses to a 40px clickable stub (chevron + filter + count). (§7.2.)

Grid: the body is .pv-sch{position:relative; --sch-rail-w:364px;}; the rail is position:absolute; right:0; z-index:40 (collapsed → .pv-sch.is-railsm{--sch-rail-w:40px}); the detail is .pv-schoc{position:absolute; right:var(--sch-rail-w); z-index:60}. The page is immersive (.pv-tkpage--immersive): no page padding, fills below the 40px top bar. Under 1120px the rail narrows to 320px; the detail offset follows it.

RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 4

6The command bar

The same context-aware navbar idiom as the ticket surface and Pipeline: a full-width, square, hairline-divided strip. It carries the schedule's identity + live counts, a triage command, search, and a persona-appropriate primary. Time navigation (period range, prev/next, year/month/week) lives in the calendar's own head — the command bar never duplicates it; it owns search, triage and dispatch.

ElementIcon · styleShown forBehavior
Identity + countscalendarall"Schedule" + a live meta line: {upcoming} upcoming · {proposed} awaiting confirmation (scoped per persona).
Triagealert · warnall · proposed>0A warn-tinted {n} to confirm (customer) / {n} awaiting (managers) — jumps the calendar to, and opens, the next proposed visit.
SearchsearchallFree-text over id · title · device · engineer · servicer · site; filters both the calendar and the upcoming rail live. Clear button when set.
Propose visitplus · primaryriversync · partnerRight edge. Opens the propose off-canvas (the slot composer). The dispatch primary.
Todaycalendar · primarycustomerRight edge. Jumps the calendar to the current day. The customer primary (the customer never proposes).
DivisionThe calendar head navigates time; the command bar searches, triages and dispatches. Filtering lives in the upcoming rail (its own filter control), not the command bar — so the bar stays a short, stable strip and never duplicates the calendar's period controls.

6.1Propose a visit

The dispatch primary opens a propose off-canvas (the same .pv-schoc shell as the detail) — a small form: visit type, device, assigned engineer, date, start/end and an optional scope. For a partner persona the engineer list is pre-filtered to that partner's own engineers, and the copy reads "You propose a slot — the customer confirms or reschedules." The proposed visit lands as status=proposed with one slot, attributed to the proposing party.

RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 5

7The calendar

The body is the DS Calendar — year, month and week views with the DS zoom transitions, its own period title + prev/next + Today + view switcher in its head. Each visit is one calendar event, coloured by status; clicking a block opens the visit detail.

ElementSpec
Event{type short} · {device or "Fleet"}; tone = status (proposed warning · confirmed accent · rescheduled info · completed/cancelled muted/done). Assignee = the partner engineer (RiverSync field shows no avatar).
Scroll-through-timeAt the inner scroll boundary (year list / week scroll), an overscroll step advances the period (year ± 1, week ± 7d); month view scrolls week-by-week natively. A debounced Scroll to move through time hint sits at the body foot.
TodayThe command-bar / calendar-head Today jumps date back to PSD.NOW.

7.1Busy-day highlight

CAL-1

A day with visits reads as a filled day. In the year view a busy day gets an accent-soft background + accent text (.pv-sch__cal .rs-calyear__day.is-busy), tinted like the weekend/today affordances — the bare 3px DS dot was too faint. Today keeps its solid accent fill even when busy.

7.2The upcoming rail

The rail overlays the right edge of the calendar (it never squeezes it). It lists the persona's upcoming visits (future, non-terminal, matching the active filter + search), each a row with type tag, title, id · device · site, the day + time, and a status badge. A header carries a filter toggle, the title + count, and a collapse chevron.

ElementSpec
Filter .pv-schfilterType · Status · Site chip rows (multi-select), with a Clear. An active filter shows a warning dot on the toggle. The command bar has no filter — it lives only here.
Collapsed stubA 40px in-flow rail: an expand chevron, a filter icon (expands straight into the filter panel), the count + label (vertical), a calendar glyph. The whole stub is clickable to expand (the filter button stops propagation).
Row → detailClicking a row opens that visit's detail off-canvas (docked left of the rail) and keeps the rail in view.
RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 6

8The visit detail off-canvas

Opening a visit slides in the detail — a scrimless, non-blocking panel bounded to the calendar body (it never covers the app top bar or the command bar) and docked to the left of the upcoming rail so the list stays visible. A 40px header (collapse + close, type glyph, title, id) over a scrolling body over a footer of lifecycle actions. The reader leads with the primary facts and ends with the map.

Region (top → bottom)Specification
Status lineThe status badge + a persona-aware blurb ("A slot has been proposed — confirm or reschedule" for the customer; "Proposed to the customer — awaiting their confirmation" for managers).
WhenCalendar glyph + the confirmed day + time range (or All day); a Moved from … line when rescheduledFrom is set.
ScopeThe free-text description of what the visit covers.
Linked .pv-schdetail__linksLinked + a chip per related record: Device → device view, Ticket → the ticket thread, Gold/Silver agreement (the TierBadge) → maintenance. Each deep-links.
Servicing engineerThe assigned engineer line — RiverSync field (hub glyph) or a partner engineer (avatar + org tag) — and the Origin (alarm / PM trigger).
Choose a slot · RescheduleOn a proposed visit, the slots[] radio list (Choose a slot to confirm / Proposed slots). The Reschedule mode swaps in date + start/end pickers (the branded DateInput/TimeInput).
ActivityThe history[] log — each entry's time · author · text.
Where (map) .pv-schdetail__mapPinned at the bottom as secondary context. The location title is a toggle: clicking it expands the branded VectorMap with the site pin; clicking again collapses it (a rotating chevron shows state). Fleet-wide visits show a "Fleet-wide · all sites" line instead.
ContainmentThe detail lives inside the calendar plane, not over the chrome. It is position:absolute within .pv-sch (which is position:relative), offset from the right by the live rail width, so it tucks beside the rail (expanded 364px or the 40px stub) and never overlaps the top navigation or the schedule command bar. It collapses to its own 40px rail, also docked left of the upcoming rail.
RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 7

9The lifecycle & its actions

A visit rides proposed → confirmed → (rescheduled) → completed, with cancelled as a leaf and re-propose returning a cancelled visit to proposed. Every transition appends a history entry (attributed to the persona) and raises a toast. The footer actions are persona-gated.

StatusTone · meaningFooter actions by persona
proposedwarning · awaiting confirmationcustomer: Open ticket · Reschedule · Confirmed (primary). managers: Confirm on behalf (primary) · Reschedule · Cancel.
confirmedaccent · engineer assignedcustomer: Open ticket · Reschedule. managers: Mark completed (primary) · Reschedule · Cancel.
rescheduledinfo · moved & re-confirmedAs confirmed; carries the Moved from … line.
completedsuccess · signed offTerminal. Open ticket · Close. (Corresponds to Field sign-off, DM-30.)
cancelledneutral · no dispatchTerminal. Open ticket · Close; managers get Re-propose.
ActionPersonaResultToast
Confirm slotcustomerSets confirmed at the chosen slot; assigns the engineer; clears slots."Visit … confirmed · Engineer assigned and notified." (success)
Confirm on behalfmanagersSame, performed by RiverSync / the partner for the customer."Visit … confirmed …" (success)
Request reschedule / RescheduleallSets rescheduled, records rescheduledFrom, moves start/end. Customer wording = "Reschedule requested"; managers = "Rescheduled"."Visit … rescheduled · Moved to …" (info)
Mark completedmanagersSets completed."Visit … completed …" (success)
CancelmanagersSets cancelled."Visit … cancelled · No engineer dispatched." (warning)
Re-proposemanagersReturns a cancelled visit to proposed with a fresh slot."Visit … re-proposed · Awaiting customer confirmation." (accent)
Propose visitmanagersCreates a new proposed visit (the propose off-canvas, §6.1)."Visit … proposed · Sent to the customer for confirmation." (accent)
TraceThe negotiation maps to DM-57 (propose → select). Customer confirm/reschedule = accepting / countering a VisitProposalOption; manager propose/complete/cancel = dispatch authority. Partner propose/reschedule/complete is the elevation flagged in §12 (DM-59 today reads partner schedule as read-only).
RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 8

10Design-system mapping

Every element resolves to a RiverSync DS v2 component, class, icon or token. The surface is a React page composing the DS calendar + map; the pv-sch* / pv-cmdbar* classes are the Portal-local layer (portal-schedule.css + portal.css), themed entirely through DS tokens.

ElementClass / componentDS basis
App pill (top bar)rs-portalbadge--portal / --admin / --partnersCanonical app badge per persona (shell-chrome.css). Mandatory.
ShellAppShell (hub / admin) · re-tinted pill (partners)The DS shell; the partner pill is re-tinted where AppShell ships no partners config (§10.1, shared with the ticket spec).
CalendarCalendar (+ CalendarUtils)DS calendar system — year/month/week, zoom, event popover.
MapVectorMapDS branded vector map — diamond site pin, no third-party tiles.
Tier badgeTierBadgeDS maintenance-tier chip (Silver / Gold + SLA tooltip).
Status badgeBadge (tone)DS status badge — 2px radius, soft tint, sentence case (facts, never counts).
PickersDateInput · TimeInput · Select · Segmented · Textarea · FieldDS form controls (branded, never the OS picker).
Command buttonspv-cmd pv-cmd--primary / --warnCommand-bar buttons over DS tokens (the pipeline / ticket idiom).
ToastPVToast(title, msg, kind)Portal toast — success / info / warning / accent.
Icons<Icon name="…"/>Proprietary icon system (the G table) — never a third-party set.

Icons in use: calendar · alert · search · close · plus · check · success · history · chevron-down / -up / -left / -right · map-pin · hub · server · ticket · shield-check · filter · x · send · info. Any new glyph is added to the DS G table first, never drawn inline.

11Reuse rules & responsive

R-1

One engine, embedded per app. The surface is the single component PV.Schedule, mounted through the shared helper PV.mountScheduleApp (schedule-app.jsx). Each app deploys its own page (Portal · Admin · Partners); they embed the engine, they do not copy it.

R-2

Configure by props, not forks. An embedding app passes only: persona (+ partner scope), me, go (navigation) and toast. Visit data + lifecycle live inside the engine. No app reaches in.

R-3

The shell is the app's, the surface is shared. Each app wraps the surface in its own shell + App pill; the surface renders only the immersive page content.

R-4

Scope & capability are centralized. Partner scoping (servicer === scope) and the canManage action gating are computed inside the component from persona — never re-implemented per app.

BreakpointBehavior
> 1120pxCalendar + 364px rail; the detail docks at right:364px. Collapsed rail → 40px, detail follows.
≤ 1120pxRail narrows to 320px; the detail offset (--sch-rail-w) follows.
≤ 1180pxCommand-bar count chip hides; triage + search + primary stay.

Accessibility: calendar events & rail rows are buttons; status/type pair an icon or text with their tint (never colour alone); the branded pickers are keyboard-operable; the map toggle and rail stub carry aria-expanded/labels; DS zoom & entrance motion honor prefers-reduced-motion. Hit targets ≥ 40px.

RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 9

12As-built vs production targets

The prototype is the source of truth for look & behavior; these are the deltas a production build must close. None changes the model except where flagged.

AreaAs-builtProduction target
Partner actionspropose / reschedule / completeModel change. DM-59 reads partner schedule as read-only; the chosen product model elevates a servicing partner to act on its assigned visits. Cascade to DM-59 + a PAR- requirement (§12.1).
Partner shellre-tinted pillFirst-class partners portal in AppShell (shared with SPEC-UIX-TKT §10.1).
Scheduling preferencesnot surfacedHonor SchedulingPreference (DM-58) — preferred windows, blackouts, min-lead — when proposing slots.
Slots / proposalinline slots[]Persist VisitProposal + VisitProposalOption; emit visit.proposed / confirmed / rescheduled domain events.
Execution hand-off"completed" set hereHand a confirmed visit to the Field app; let Field's scheduled → enroute → onsite → complete + sign-off drive the final completion.
Cross-app sticky stateshared localStorage keysNamespace sch-view / sch-lens / sch-rail-collapsed per app so a view choice in one app doesn't carry to another.

12.1Open questions & proposed requirements

13Traceability

This specTraces to
Whole documentDM-57 (propose → select scheduling) · DM-58 (preferences) · DM-59 (partner scope) — reused across Portal · Admin · Partners.
Data model (§4)Visit · VisitProposal · VisitProposalOption (SPEC-ERD-FLD), Field service domain (SPEC-DDD-FLD).
Process (§9)SPEC-PWF-SCH · visit lifecycle in SPEC-DWF-FLD.
Execution boundary (§4)Visit.Status + sign-off (DM-27, DM-30) — the Field app (SPEC-APP-FLD).
Cross-links (§8)Device (SPEC-ERD-PTL) · device monitoring (SPEC-UIX-DEV) · ticket (SPEC-UIX-TKT) · agreement tier (SPEC-PRD-MNT).

14Revision history

VersionDateChanges
1.11 Jul 2026Added the on-page contents nav (page-local navigation) and cross-linked the new device monitoring spec (SPEC-UIX-DEV) from the traceability cross-links — a visit's Device chip opens the device detail specified there. No change to the surface, model or lifecycle; the shared .pgnav style now lives in comms-design.css.
1.029 Jun 2026First issue — the service scheduling system specified as one reusable surface deployed as a dedicated, persona-locked page inside each app (no in-app switcher): Portal (customer) · Admin (RiverSync dispatch) · Partners (servicing partner, scoped). Scope & distinctions (§1–2), the three personas & the canManage/scope rules (§3), the Visit/VisitProposal/VisitProposalOption presentation contract and the two-lifecycle boundary (§4), layout & grid with annotated wireframe — calendar body, rail overlay, and the detail docked left of the rail (§5), the context-aware command bar + propose (§6), the calendar, busy-day highlight, scroll-through-time & the upcoming rail (§7), the visit detail with the bottom map toggle (§8), the lifecycle & persona-gated actions (§9), design-system mapping, reuse rules & responsive (§10–11), as-built vs target, open questions / proposed requirements incl. the partner-action vs DM-59 conflict, traceability (§12–14). A presentation view over a settled model — no new entities or fields; the partner-write elevation is logged as a proposed DM-59/PAR change for the ERD/PRD cascade. Added to the Design specs family (SPEC-UIX-SCH).
RiverSync Co., Ltd. · BangkokSPEC-UIX-SCH · 10