Skip to content

Commit 8c27a7c

Browse files
authored
Merge pull request #43 from AdaWorldAPI/claude/aiwar-dual-use-tenant
feat(cockpit): aiwar dual-use enrichment as a value tenant on the OSINT:Aiwar class
2 parents 5237caa + 6f7dbc0 commit 8c27a7c

2 files changed

Lines changed: 385 additions & 6 deletions

File tree

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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

Comments
 (0)