@@ -114,6 +114,16 @@ const FACET_AIRO_ROLE: usize = 3; // airo:type — u8 bitset (compound)
114114const FACET_MLTYPE : usize = 4 ; // MLTask/MLTasks primary token, u8 code
115115const FACET_PURPOSE : usize = 5 ; // purpose / purpose:vair — u8 code
116116const FACET_CAPACITY : usize = 6 ; // capacity / capacity:airo — u8 code
117+ // V3 6×(8:8) completion (bytes 7..=11) — the six AIRO/VAIR dimensions the
118+ // original 1..=6 tenant left unstacked. Additive: byte offsets 1..=6 are
119+ // unchanged (client + committed asset stay compatible); these complete the
120+ // stacked cascade so every used property is a hot, groupable value tenant —
121+ // HEEL currentStatus:type · family output:impact · identity stakeholder:airo.
122+ const FACET_STATUS : usize = 7 ; // currentStatus — lifecycle stage, u8 code
123+ const FACET_TYPE : usize = 8 ; // type — system/actor class, u8 code
124+ const FACET_OUTPUT : usize = 9 ; // output:airo — u8 code
125+ const FACET_IMPACT : usize = 10 ; // impact:vair — primary harm token, u8 code
126+ const FACET_STAKEHOLDER : usize = 11 ; // stakeholder — owning actor class, u8 code
117127
118128/// `airo:type` actor roles in bit order. The four canonical AIRO players plus
119129/// the two rare variants the harvest carries; the game-theory structure is
@@ -275,6 +285,107 @@ const CAPACITY_AIRO: &[&str] = &[
275285 "SignalTracking" ,
276286] ;
277287
288+ /// `currentStatus:airo` lifecycle stage (aiwc.ods column ∪ actor states).
289+ const CURRENT_STATUS : & [ & str ] = & [
290+ "Development" ,
291+ "Deployment" ,
292+ "Operation" ,
293+ "Retirement" ,
294+ "Active" ,
295+ "Historical" ,
296+ "Deployed" ,
297+ ] ;
298+
299+ /// `type` — the system/actor class (aiwc.ods `type` column ∪ common instances).
300+ const NODE_TYPE : & [ & str ] = & [
301+ "IntelligentControlSystem" ,
302+ "GenerativeModel" ,
303+ "GenerativeAI" ,
304+ "NarrowAI" ,
305+ "TrainingDatabase" ,
306+ "ExpertSystem" ,
307+ "ServiceRobot" ,
308+ "MultiAgentSystem" ,
309+ "Dashboard" ,
310+ "Nation" ,
311+ "TechCompany" ,
312+ "DefenseCompany" ,
313+ "Military" ,
314+ "Investor" ,
315+ "Institution" ,
316+ "Utility" ,
317+ "SurveillanceSystem" ,
318+ "FacialRecognition" ,
319+ "AutonomousWeapon" ,
320+ "TargetingSystem" ,
321+ "RoboticSystem" ,
322+ "LoiteringMunition" ,
323+ "PredictiveAnalytics" ,
324+ "DataAnalyticsCompany" ,
325+ "FoundationModelProvider" ,
326+ "SurveillanceVendor" ,
327+ "AILab" ,
328+ "GovernmentOfficial" ,
329+ "HeadOfState" ,
330+ "Investor" ,
331+ "Financier" ,
332+ "TechExecutive" ,
333+ ] ;
334+
335+ /// `output:airo` — what the system emits.
336+ const OUTPUT_AIRO : & [ & str ] = & [
337+ "Action" ,
338+ "Content" ,
339+ "Decision" ,
340+ "Prediction" ,
341+ "Recommendation" ,
342+ "Detection" ,
343+ "Monitoring" ,
344+ "Identification" ,
345+ "Generation" ,
346+ "Investment" ,
347+ "Influence" ,
348+ ] ;
349+
350+ /// `impact:vair` — the VAIR harm (primary token of a compound list).
351+ const IMPACT_VAIR : & [ & str ] = & [
352+ "PsychologicalHarm" ,
353+ "PhysicalInjury" ,
354+ "PhysicalHarm" ,
355+ "WellbeingImpact" ,
356+ "DistortionInHumanBehavior" ,
357+ "Overreliance" ,
358+ "UnderminingFreedom" ,
359+ "LossOfLife" ,
360+ "LossOfHumanControl" ,
361+ "LossOfPrivacy" ,
362+ "DiscriminationBias" ,
363+ "ConcentrationOfPower" ,
364+ "Escalation" ,
365+ "PolicyCapture" ,
366+ "Deregulation" ,
367+ ] ;
368+
369+ /// `stakeholder` — the owning/operating actor class.
370+ const STAKEHOLDER : & [ & str ] = & [
371+ "Nation" ,
372+ "TechCompany" ,
373+ "DefenseCompany" ,
374+ "Institution" ,
375+ "Military" ,
376+ "Police" ,
377+ "Company" ,
378+ "Investor" ,
379+ "Utility" ,
380+ "Owner" ,
381+ "CEO" ,
382+ "Politician" ,
383+ "Agency" ,
384+ "Person" ,
385+ "NGO" ,
386+ "Consortium" ,
387+ ] ;
388+
278389/// Code a single facet value (`1 + index` in its codebook; `0` = absent /
279390/// unknown). Compound axes (comma-joined) code their **primary** token; the
280391/// match is case-insensitive so harvest casing drift never silently drops.
@@ -326,6 +437,22 @@ fn write_facet_tenant(value: &mut [u8; 480], props: &HashMap<String, Value>) {
326437 if let Some ( v) = s ( "capacity" ) . or_else ( || s ( "capacity:airo" ) ) {
327438 value[ FACET_CAPACITY ] = facet_code ( CAPACITY_AIRO , v) ;
328439 }
440+ // V3 6×(8:8) completion — the six dims the original tenant left unstacked.
441+ if let Some ( v) = s ( "currentStatus" ) . or_else ( || s ( "currentStatus:airo" ) ) {
442+ value[ FACET_STATUS ] = facet_code ( CURRENT_STATUS , v) ;
443+ }
444+ if let Some ( v) = s ( "type" ) {
445+ value[ FACET_TYPE ] = facet_code ( NODE_TYPE , v) ;
446+ }
447+ if let Some ( v) = s ( "output" ) . or_else ( || s ( "output:airo" ) ) {
448+ value[ FACET_OUTPUT ] = facet_code ( OUTPUT_AIRO , v) ;
449+ }
450+ if let Some ( v) = s ( "impact" ) . or_else ( || s ( "impact:vair" ) ) {
451+ value[ FACET_IMPACT ] = facet_code ( IMPACT_VAIR , v) ;
452+ }
453+ if let Some ( v) = s ( "stakeholder" ) {
454+ value[ FACET_STAKEHOLDER ] = facet_code ( STAKEHOLDER , v) ;
455+ }
329456}
330457
331458/// Golden angle (radians) — the φ-spiral / Vogel constant.
@@ -858,6 +985,14 @@ const REL_FACET_AIRO: u8 = 12;
858985const REL_FACET_MLTYPE : u8 = 13 ;
859986const REL_FACET_PURPOSE : u8 = 14 ;
860987const REL_FACET_CAPACITY : u8 = 15 ;
988+ // V3 6×(8:8) completion — the remaining stacked dimensions as traversable facet
989+ // edges (rel 16..20). Same distinct-layer contract as 10..15 (toggleable in the
990+ // client); together the eleven rels put the WHOLE cascade in the schema graph.
991+ const REL_FACET_STATUS : u8 = 16 ;
992+ const REL_FACET_TYPE : u8 = 17 ;
993+ const REL_FACET_OUTPUT : u8 = 18 ;
994+ const REL_FACET_IMPACT : u8 = 19 ;
995+ const REL_FACET_STAKEHOLDER : u8 = 20 ;
861996
862997/// (property-key candidates, facet rel) per dual-use axis. First matching key
863998/// wins (e.g. `MLTask` before `MLTasks`). Mirrors the facet tenant axes.
@@ -868,6 +1003,11 @@ const FACET_AXES: &[(&[&str], u8)] = &[
8681003 ( & [ "MLTask" , "MLTasks" ] , REL_FACET_MLTYPE ) ,
8691004 ( & [ "purpose" , "purpose:vair" ] , REL_FACET_PURPOSE ) ,
8701005 ( & [ "capacity" , "capacity:airo" ] , REL_FACET_CAPACITY ) ,
1006+ ( & [ "currentStatus" , "currentStatus:airo" ] , REL_FACET_STATUS ) ,
1007+ ( & [ "type" ] , REL_FACET_TYPE ) ,
1008+ ( & [ "output" , "output:airo" ] , REL_FACET_OUTPUT ) ,
1009+ ( & [ "impact" , "impact:vair" ] , REL_FACET_IMPACT ) ,
1010+ ( & [ "stakeholder" ] , REL_FACET_STAKEHOLDER ) ,
8711011] ;
8721012
8731013/// Entity → `SchemaValue` facet edges: for each node carrying a dual-use facet
0 commit comments