code wiki / (root) / nx_ux_standard.nx

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}