|
| 1 | +# aiwar dual-use → value tenant on the OSINT:Aiwar class |
| 2 | + |
| 3 | +## Overview |
| 4 | + |
| 5 | +The aiwar "AI War Cloud Database" (Sarah Ciston, STARTS Prize 2025) is a |
| 6 | +**dual-use taxonomy**: every AI decision system carries a military use and a |
| 7 | +civic use, and the actors carry an AIRO role (AISubject / AIDeveloper / |
| 8 | +AIDeployer / AIProvider). The project's thesis is the *techno-imperial |
| 9 | +boomerang* — tech built for war, turned on citizens — and its method is |
| 10 | +"drawing a direct line" between the two. |
| 11 | + |
| 12 | +The dual-use axes (`militaryUse`, `civicUse`, `airo:type`, `MLType`, |
| 13 | +`purpose:vair`, `capacity:airo`) were **unwired** in the cockpit. The source |
| 14 | +(`AdaWorldAPI/aiwar` + `AdaWorldAPI/aiwar-neo4j-harvest`) models them as |
| 15 | +**schema-as-data**: each axis is a `SchemaAxis` node, each value a |
| 16 | +`SchemaValue` node linked `VALID_FOR`. `aiwar-neo4j-harvest/src/model.rs` |
| 17 | +calls this a *faceted graph* — "nodes belong to multiple overlapping |
| 18 | +taxonomies simultaneously." |
| 19 | + |
| 20 | +### The architecture decision (operator, 2026-06-23) |
| 21 | + |
| 22 | +Not separate `SchemaAxis`/`SchemaValue` nodes, not cold name-join metadata, |
| 23 | +not a per-axis family-adapter class. **A value tenant in the OSINT:Aiwar |
| 24 | +class node's value region**, now that the node is the 4096-bit / 512-byte |
| 25 | +CANON node (`key(16) | edges(16) | value(480)`). |
| 26 | + |
| 27 | +This *extends an existing precedent*: `osint_gotham.rs` already uses |
| 28 | +`value[CLASS_ORDER_TENANT=0]` as a tenant (the class-label order — an |
| 29 | +instance "inherits its label by the order it carries in its value tenant"). |
| 30 | +The OGAR `ClassView` is display-only over classid `0x0700`. The dual-use |
| 31 | +facets become **more tenant bytes** in the same `[0u8; 480]` slab, read by |
| 32 | +the same ClassView. This makes dual-use **hot** (a SIMD scan over the value |
| 33 | +column filters/groups by facet without touching any cold blob). |
| 34 | + |
| 35 | +The boomerang is literally in the data: `2× "AIDeployer, AISubject"` — one |
| 36 | +node that both *fields* the tech and has it *turned on itself* — so |
| 37 | +`airo:type` is a **bitset** (compound), not a single code. |
| 38 | + |
| 39 | +## Tenant layout (value-slab bytes) |
| 40 | + |
| 41 | +| byte | tenant | encoding | |
| 42 | +|---|---|---| |
| 43 | +| 0 | `CLASS_ORDER_TENANT` (existing) | label order into `OSINT_SCHEMA` | |
| 44 | +| 1 | `FACET_MILITARY` | `militaryUse` primary token → u8 code (1+idx) | |
| 45 | +| 2 | `FACET_CIVIC` | `civicUse` primary token → u8 code | |
| 46 | +| 3 | `FACET_AIRO_ROLE` | `airo:type` → u8 **bitset** (Subject/Deployer/Developer/Provider/Operator/Supplier) | |
| 47 | +| 4 | `FACET_MLTYPE` | `MLTask`/`MLTasks` primary → u8 code | |
| 48 | +| 5 | `FACET_PURPOSE` | `purpose`/`purpose:vair` → u8 code | |
| 49 | +| 6 | `FACET_CAPACITY` | `capacity`/`capacity:airo` → u8 code | |
| 50 | + |
| 51 | +Codebooks are the schema-as-data value sets (closed enums), stabilised as |
| 52 | +sorted `&[&str]`; `0` = absent/unknown (graceful). Systems fill 1/2/4/5/6; |
| 53 | +stakeholders & people fill 3; schema nodes fill none. |
| 54 | + |
| 55 | +## Work items |
| 56 | + |
| 57 | +### Phase 1 — model (this increment, asset-neutral) |
| 58 | +- [ ] Add the facet codebook + `facet_code` / `airo_role_bits` / |
| 59 | + `write_facet_tenant` to `osint_gotham.rs`. |
| 60 | +- [ ] Populate `value[1..=6]` in `osint_node_rows`. |
| 61 | +- [ ] Update the existing tenant-invariant test (byte 0 → bytes 0..=6). |
| 62 | +- [ ] New test: a System packs mil/civic/ML/purpose/capacity; a boomerang |
| 63 | + stakeholder packs AIDeployer|AISubject bits. |
| 64 | +- [ ] `cargo nextest run -p cockpit-server` green. |
| 65 | + |
| 66 | +### Phase 2 — wire + view (next increment, touches the baked asset) |
| 67 | +- [ ] Emit the 6-byte facet tail per node on the OSO1 wire (additive, after |
| 68 | + the label tail; old readers ignore it). |
| 69 | +- [ ] Mirror the codebook in `OsintGraph.tsx`; decode the facet tail. |
| 70 | +- [ ] Surface dual-use in node tooltips + the reasoning readout (the "direct |
| 71 | + line" narration). |
| 72 | +- [ ] Add the **AIRO-role "meta" lens**: recolour actors by game-theory role |
| 73 | + (Subject = harm lands here, Deployer fields, Developer builds, Provider |
| 74 | + supplies); boomerang nodes (Subject+Deployer) flagged. |
| 75 | +- [ ] Re-bake `assets/osint_scene.soa` from the FULL harvest |
| 76 | + (`/home/user/aiwar-neo4j-harvest` — must be the 920-node enriched |
| 77 | + source, NOT the 221-node `public/` fallback) and verify node count |
| 78 | + unchanged. |
| 79 | +- [ ] `npm run build` (cockpit) green; inspect the rendered scene. |
| 80 | + |
| 81 | +## Notes |
| 82 | +- Source repos cloned to scratchpad: `aiwar` (Quarto site + canonical CSV), |
| 83 | + `aiwar-neo4j-harvest` (cypher schema + Rust harvest model + 30 enrichments). |
| 84 | +- Join verified earlier: 65/65 aiwar systems present in the SoA by name. |
| 85 | +- `airo:type` lives on Stakeholder/Person (the *player*), not System (the |
| 86 | + *instrument*) — the game-theory actor structure. |
0 commit comments