nx_ux_standard.nx source
↩ module page · 214 lines · 12992 B
1// nx_ux_standard.nx -- sealed-enum catalogue of UX standards clauses.
2//
3// T1 of NISHI_UX_TRIANGULATION_ROADMAP. Each clause = (id, source,
4// short title). Source IDs let nx_ux_triangulate enforce the
5// ≥3-independent-sources-agree rule.
6//
7// Standards covered in this initial T1:
8// NN/g 10 heuristics (Nielsen 1994/2020)
9// WCAG 2.2 selected SC (W3C)
10// Apple HIG core (Apple 2024)
11// Material Design 3 core (Google 2024)
12// ISO 9241-110 dialogue principles (2020)
13//
14// Cardinal: triangulation requires three INDEPENDENT sources. Source
15// id discrimination matters; we don't let two NN/g clauses count as
16// independent.
17//
18// license_tier: ORIGINAL -- standards referenced by clause ID only,
19// substrate re-derives semantic interpretation first-principles.
20// genealogy_id: international-research-sources/nn_g + w3c/wcag_22 +
21// apple/hig + google/material_3 + iso/9241_110
22// lineage_id: nishi_ux_standard_q10
23
24import "nx_syscalls.nx"
25const NX_MAGIC_1099: i64 = 1099
26
27// Source organisation IDs (used for triangulation independence check).
28const NX_UX_SRC_NNG: i64 = 1 // Nielsen Norman Group
29const NX_UX_SRC_WCAG: i64 = 2 // W3C WCAG
30const NX_UX_SRC_APPLE_HIG: i64 = 3 // Apple Human Interface Guidelines
31const NX_UX_SRC_MATERIAL: i64 = 4 // Google Material Design 3
32const NX_UX_SRC_ISO_9241: i64 = 5 // ISO 9241 family
33const NX_UX_SRC_SIGCHI: i64 = 6 // ACM SIGCHI canon
34// Arc E expansion -- W3C beyond WCAG plus Microsoft Inclusive Design.
35const NX_UX_SRC_W3C_HTML: i64 = 7 // W3C HTML Living Standard
36const NX_UX_SRC_W3C_ARIA: i64 = 8 // W3C ARIA 1.2
37const NX_UX_SRC_W3C_DOM: i64 = 9 // W3C DOM Living Standard
38const NX_UX_SRC_W3C_CSS: i64 = 10 // W3C CSS specs
39const NX_UX_SRC_MS_INCL: i64 = 11 // Microsoft Inclusive Design
40const NX_UX_SRC_N: i64 = 12
41
42// Clause IDs (extensible; current set covers floor + first batch of innovation).
43const NX_UX_NN1_VISIBILITY: i64 = 101
44const NX_UX_NN2_REAL_WORLD: i64 = 102
45const NX_UX_NN3_USER_CONTROL: i64 = 103
46const NX_UX_NN4_CONSISTENCY: i64 = 104
47const NX_UX_NN5_ERROR_PREVENTION: i64 = 105
48const NX_UX_NN6_RECOGNITION: i64 = 106
49const NX_UX_NN7_FLEXIBILITY: i64 = 107
50const NX_UX_NN8_MINIMALIST: i64 = 108
51const NX_UX_NN9_ERROR_RECOVERY: i64 = 109
52const NX_UX_NN10_HELP: i64 = 110
53
54const NX_UX_WCAG_1_4_3_CONTRAST: i64 = 201 // 4.5:1 min text
55const NX_UX_WCAG_1_4_11_NONTEXT: i64 = 202 // 3:1 non-text
56const NX_UX_WCAG_2_1_1_KEYBOARD: i64 = 203 // keyboard accessible
57const NX_UX_WCAG_2_4_7_FOCUS: i64 = 204 // focus visible
58const NX_UX_WCAG_4_1_2_NRV: i64 = 205 // name, role, value (AT)
59
60const NX_UX_APPLE_CLARITY: i64 = 301
61const NX_UX_APPLE_DEFERENCE: i64 = 302
62const NX_UX_APPLE_FEEDBACK: i64 = 303
63
64const NX_UX_MATERIAL_DYNAMIC: i64 = 401
65const NX_UX_MATERIAL_MOTION: i64 = 402
66const NX_UX_MATERIAL_TYPESCALE: i64 = 403
67
68const NX_UX_ISO_SELFDESCRIPTIVE: i64 = 501
69const NX_UX_ISO_CONTROLLABILITY: i64 = 502
70const NX_UX_ISO_ERROR_TOLERANCE: i64 = 503
71const NX_UX_ISO_INDIVIDUALISATION: i64 = 504
72
73// W3C HTML Living Standard
74const NX_UX_W3C_HTML_SEMANTIC: i64 = 601 // proper semantic elements
75const NX_UX_W3C_HTML_VOID: i64 = 602 // void-element rules
76// W3C ARIA 1.2
77const NX_UX_W3C_ARIA_ROLES: i64 = 701 // explicit role declarations
78const NX_UX_W3C_ARIA_LABELS: i64 = 702 // accessible labels
79// W3C DOM Living Standard
80const NX_UX_W3C_DOM_TREE: i64 = 801 // well-formed tree
81// W3C CSS
82const NX_UX_W3C_CSS_CONTRAST: i64 = 901 // computable color contrast
83// Microsoft Inclusive Design
84const NX_UX_MS_INCL_EXCLUSION: i64 = 1001 // think about excluded users
85
86// Given a clause id, return its owning source (for triangulation
87// independence). Returns 0 if id is unknown.
88func nx_ux_clause_source(clause_id: i64) -> i64 {
89 if clause_id >= 101 { if clause_id <= 110 { return NX_UX_SRC_NNG } }
90 if clause_id >= 201 { if clause_id <= 299 { return NX_UX_SRC_WCAG } }
91 if clause_id >= 301 { if clause_id <= 399 { return NX_UX_SRC_APPLE_HIG } }
92 if clause_id >= 401 { if clause_id <= 499 { return NX_UX_SRC_MATERIAL } }
93 if clause_id >= 501 { if clause_id <= 599 { return NX_UX_SRC_ISO_9241 } }
94 if clause_id >= 601 { if clause_id <= 699 { return NX_UX_SRC_W3C_HTML } }
95 if clause_id >= 701 { if clause_id <= 799 { return NX_UX_SRC_W3C_ARIA } }
96 if clause_id >= 801 { if clause_id <= 899 { return NX_UX_SRC_W3C_DOM } }
97 if clause_id >= 901 { if clause_id <= 999 { return NX_UX_SRC_W3C_CSS } }
98 if clause_id >= 1001 { if clause_id <= NX_MAGIC_1099 { return NX_UX_SRC_MS_INCL } }
99 return 0
100}
101
102// Human-readable label for a clause (for the report).
103func nx_ux_clause_label(clause_id: i64) -> *u8 {
104 if clause_id == NX_UX_NN1_VISIBILITY { return "NN/g #1 visibility of system status" as *u8 }
105 if clause_id == NX_UX_NN2_REAL_WORLD { return "NN/g #2 match real-world" as *u8 }
106 if clause_id == NX_UX_NN3_USER_CONTROL { return "NN/g #3 user control & freedom" as *u8 }
107 if clause_id == NX_UX_NN4_CONSISTENCY { return "NN/g #4 consistency & standards" as *u8 }
108 if clause_id == NX_UX_NN5_ERROR_PREVENTION { return "NN/g #5 error prevention" as *u8 }
109 if clause_id == NX_UX_NN6_RECOGNITION { return "NN/g #6 recognition not recall" as *u8 }
110 if clause_id == NX_UX_NN7_FLEXIBILITY { return "NN/g #7 flexibility & efficiency" as *u8 }
111 if clause_id == NX_UX_NN8_MINIMALIST { return "NN/g #8 aesthetic & minimalist" as *u8 }
112 if clause_id == NX_UX_NN9_ERROR_RECOVERY { return "NN/g #9 help recognise/diagnose/recover from errors" as *u8 }
113 if clause_id == NX_UX_NN10_HELP { return "NN/g #10 help & documentation" as *u8 }
114 if clause_id == NX_UX_WCAG_1_4_3_CONTRAST { return "WCAG 1.4.3 contrast (min 4.5:1)" as *u8 }
115 if clause_id == NX_UX_WCAG_1_4_11_NONTEXT { return "WCAG 1.4.11 non-text contrast (3:1)" as *u8 }
116 if clause_id == NX_UX_WCAG_2_1_1_KEYBOARD { return "WCAG 2.1.1 keyboard accessible" as *u8 }
117 if clause_id == NX_UX_WCAG_2_4_7_FOCUS { return "WCAG 2.4.7 focus visible" as *u8 }
118 if clause_id == NX_UX_WCAG_4_1_2_NRV { return "WCAG 4.1.2 name/role/value" as *u8 }
119 if clause_id == NX_UX_APPLE_CLARITY { return "Apple HIG clarity" as *u8 }
120 if clause_id == NX_UX_APPLE_DEFERENCE { return "Apple HIG deference" as *u8 }
121 if clause_id == NX_UX_APPLE_FEEDBACK { return "Apple HIG feedback" as *u8 }
122 if clause_id == NX_UX_MATERIAL_DYNAMIC { return "Material 3 dynamic color" as *u8 }
123 if clause_id == NX_UX_MATERIAL_MOTION { return "Material 3 motion" as *u8 }
124 if clause_id == NX_UX_MATERIAL_TYPESCALE { return "Material 3 type scale" as *u8 }
125 if clause_id == NX_UX_ISO_SELFDESCRIPTIVE { return "ISO 9241-110 self-descriptiveness" as *u8 }
126 if clause_id == NX_UX_ISO_CONTROLLABILITY { return "ISO 9241-110 controllability" as *u8 }
127 if clause_id == NX_UX_ISO_ERROR_TOLERANCE { return "ISO 9241-110 error tolerance" as *u8 }
128 if clause_id == NX_UX_ISO_INDIVIDUALISATION { return "ISO 9241-110 individualisation" as *u8 }
129 if clause_id == NX_UX_W3C_HTML_SEMANTIC { return "W3C HTML semantic elements" as *u8 }
130 if clause_id == NX_UX_W3C_HTML_VOID { return "W3C HTML void-element rules" as *u8 }
131 if clause_id == NX_UX_W3C_ARIA_ROLES { return "W3C ARIA 1.2 role declarations" as *u8 }
132 if clause_id == NX_UX_W3C_ARIA_LABELS { return "W3C ARIA 1.2 accessible labels" as *u8 }
133 if clause_id == NX_UX_W3C_DOM_TREE { return "W3C DOM well-formed tree" as *u8 }
134 if clause_id == NX_UX_W3C_CSS_CONTRAST { return "W3C CSS computable color contrast" as *u8 }
135 if clause_id == NX_UX_MS_INCL_EXCLUSION { return "MS Inclusive Design exclusion thinking" as *u8 }
136 return "(unknown clause)" as *u8
137}
138
139// ---- Pattern clusters (T4) --------------------------------------------
140// Each clause belongs to exactly one cluster. Triangulation is run
141// *per cluster*, so a weak signal in cluster X does not poison the
142// verdict for cluster Y. This is how an honest "WCAG floor is
143// VALIDATED while error-prevention is UNVERIFIED" report is possible.
144const NX_UX_CLUSTER_NONE: i64 = 0
145const NX_UX_CLUSTER_FEEDBACK: i64 = 1 // visibility of status, action feedback
146const NX_UX_CLUSTER_CONTROL: i64 = 2 // user control & freedom, flexibility
147const NX_UX_CLUSTER_CONSISTENCY: i64 = 3 // standards adherence, type scale
148const NX_UX_CLUSTER_ACCESSIBILITY: i64 = 4 // a11y, recognition, ARIA, inclusive
149const NX_UX_CLUSTER_ERROR_PREVENT: i64 = 5 // prevention + recovery + tolerance
150const NX_UX_CLUSTER_AESTHETICS: i64 = 6 // minimalist, clarity, contrast
151const NX_UX_CLUSTER_DOCUMENTATION: i64 = 7 // help, self-descriptive
152const NX_UX_CLUSTER_SEMANTIC: i64 = 8 // semantic structure, DOM tree
153const NX_UX_CLUSTER_N: i64 = 9
154
155func nx_ux_clause_cluster(clause_id: i64) -> i64 {
156 if clause_id == NX_UX_NN1_VISIBILITY { return NX_UX_CLUSTER_FEEDBACK }
157 if clause_id == NX_UX_APPLE_FEEDBACK { return NX_UX_CLUSTER_FEEDBACK }
158 if clause_id == NX_UX_NN3_USER_CONTROL { return NX_UX_CLUSTER_CONTROL }
159 if clause_id == NX_UX_NN7_FLEXIBILITY { return NX_UX_CLUSTER_CONTROL }
160 if clause_id == NX_UX_ISO_CONTROLLABILITY { return NX_UX_CLUSTER_CONTROL }
161 if clause_id == NX_UX_NN4_CONSISTENCY { return NX_UX_CLUSTER_CONSISTENCY }
162 if clause_id == NX_UX_MATERIAL_TYPESCALE { return NX_UX_CLUSTER_CONSISTENCY }
163 if clause_id == NX_UX_NN6_RECOGNITION { return NX_UX_CLUSTER_ACCESSIBILITY }
164 if clause_id == NX_UX_WCAG_2_1_1_KEYBOARD { return NX_UX_CLUSTER_ACCESSIBILITY }
165 if clause_id == NX_UX_WCAG_2_4_7_FOCUS { return NX_UX_CLUSTER_ACCESSIBILITY }
166 if clause_id == NX_UX_WCAG_4_1_2_NRV { return NX_UX_CLUSTER_ACCESSIBILITY }
167 if clause_id == NX_UX_W3C_ARIA_ROLES { return NX_UX_CLUSTER_ACCESSIBILITY }
168 if clause_id == NX_UX_W3C_ARIA_LABELS { return NX_UX_CLUSTER_ACCESSIBILITY }
169 if clause_id == NX_UX_MS_INCL_EXCLUSION { return NX_UX_CLUSTER_ACCESSIBILITY }
170 if clause_id == NX_UX_NN5_ERROR_PREVENTION { return NX_UX_CLUSTER_ERROR_PREVENT }
171 if clause_id == NX_UX_NN9_ERROR_RECOVERY { return NX_UX_CLUSTER_ERROR_PREVENT }
172 if clause_id == NX_UX_ISO_ERROR_TOLERANCE { return NX_UX_CLUSTER_ERROR_PREVENT }
173 if clause_id == NX_UX_NN8_MINIMALIST { return NX_UX_CLUSTER_AESTHETICS }
174 if clause_id == NX_UX_APPLE_CLARITY { return NX_UX_CLUSTER_AESTHETICS }
175 if clause_id == NX_UX_MATERIAL_DYNAMIC { return NX_UX_CLUSTER_AESTHETICS }
176 if clause_id == NX_UX_W3C_CSS_CONTRAST { return NX_UX_CLUSTER_AESTHETICS }
177 if clause_id == NX_UX_NN10_HELP { return NX_UX_CLUSTER_DOCUMENTATION }
178 if clause_id == NX_UX_ISO_SELFDESCRIPTIVE { return NX_UX_CLUSTER_DOCUMENTATION }
179 if clause_id == NX_UX_W3C_HTML_SEMANTIC { return NX_UX_CLUSTER_SEMANTIC }
180 if clause_id == NX_UX_W3C_HTML_VOID { return NX_UX_CLUSTER_SEMANTIC }
181 if clause_id == NX_UX_W3C_DOM_TREE { return NX_UX_CLUSTER_SEMANTIC }
182 return NX_UX_CLUSTER_NONE
183}
184
185func nx_ux_cluster_label(cluster_id: i64) -> *u8 {
186 if cluster_id == NX_UX_CLUSTER_FEEDBACK { return "feedback" as *u8 }
187 if cluster_id == NX_UX_CLUSTER_CONTROL { return "control" as *u8 }
188 if cluster_id == NX_UX_CLUSTER_CONSISTENCY { return "consistency" as *u8 }
189 if cluster_id == NX_UX_CLUSTER_ACCESSIBILITY { return "accessibility" as *u8 }
190 if cluster_id == NX_UX_CLUSTER_ERROR_PREVENT { return "error-prevention" as *u8 }
191 if cluster_id == NX_UX_CLUSTER_AESTHETICS { return "aesthetics" as *u8 }
192 if cluster_id == NX_UX_CLUSTER_DOCUMENTATION { return "documentation" as *u8 }
193 if cluster_id == NX_UX_CLUSTER_SEMANTIC { return "semantic" as *u8 }
194 return "(none)" as *u8
195}
196
197func nx_ux_source_label(source_id: i64) -> *u8 {
198 if source_id == NX_UX_SRC_NNG { return "NN/g" as *u8 }
199 if source_id == NX_UX_SRC_WCAG { return "WCAG" as *u8 }
200 if source_id == NX_UX_SRC_APPLE_HIG { return "AppleHIG" as *u8 }
201 if source_id == NX_UX_SRC_MATERIAL { return "Material" as *u8 }
202 if source_id == NX_UX_SRC_ISO_9241 { return "ISO9241" as *u8 }
203 if source_id == NX_UX_SRC_SIGCHI { return "SIGCHI" as *u8 }
204 if source_id == NX_UX_SRC_W3C_HTML { return "W3C-HTML" as *u8 }
205 if source_id == NX_UX_SRC_W3C_ARIA { return "W3C-ARIA" as *u8 }
206 if source_id == NX_UX_SRC_W3C_DOM { return "W3C-DOM" as *u8 }
207 if source_id == NX_UX_SRC_W3C_CSS { return "W3C-CSS" as *u8 }
208 if source_id == NX_UX_SRC_MS_INCL { return "MS-Inclusive" as *u8 }
209 return "(unknown)" as *u8
210}
211
212func main() -> i64 {
213 return 0
214}