Asi glamorous-gay
Glamorous Toolkit integration with Gay.jl deterministic coloring. Moldable inspectors with GF(3)-balanced views, Lepiter color-coded knowledge graphs, and Bloc visualizations with SplitMix64 palettes.
git clone https://github.com/plurigrid/asi
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/glamorous-gay" ~/.claude/skills/plurigrid-asi-glamorous-gay && rm -rf "$T"
skills/glamorous-gay/SKILL.mdGlamorous Gay Skill
Status: ✅ Production Ready Trit: +1 (PLUS - generative/visual) Color: #E91E63 (Pink) Principle: Moldable development with deterministic coloring Frame: Every object gets a reproducible color; every view tells a story
Overview
Glamorous Toolkit (GT) is a moldable development environment where you shape the IDE to your problem. Glamorous Gay integrates Gay.jl's deterministic coloring:
- Moldable Inspectors: Objects colored by identity hash
- Lepiter Knowledge Graphs: Pages/snippets with GF(3) trits
- Bloc Visualizations: Reproducible palettes for diagrams
- Parallel Tempering Views: Pigeons.jl chains in GT
Core Concept: Every Object Has a Color
"In GT, everything is inspectable. Now everything is colorable." Object >> gayColor "Deterministic color from object identity" ^ GaySplitMix64 colorAt: self identityHash seed: GayGlobalSeed value Object >> gayTrit "GF(3) trit from hue" ^ self gayColor hue gayTritFromHue Number >> gayTritFromHue "Hue → Trit mapping" self < 60 ifTrue: [ ^ 1 ]. "warm → PLUS" self < 180 ifTrue: [ ^ 0 ]. "neutral → ERGODIC" self < 300 ifTrue: [ ^ -1 ]. "cool → MINUS" ^ 1 "wrap around"
SplitMix64 in Smalltalk
Class: GaySplitMix64 instanceVariables: 'state' classVariables: 'Golden Mix1 Mix2 Mask64' GaySplitMix64 class >> initialize Golden := 16r9E3779B97F4A7C15. Mix1 := 16rBF58476D1CE4E5B9. Mix2 := 16r94D049BB133111EB. Mask64 := 16rFFFFFFFFFFFFFFFF. GaySplitMix64 >> nextState state := (state + Golden) bitAnd: Mask64. ^ self mix: state GaySplitMix64 >> mix: z | z1 z2 z3 | z1 := ((z bitXor: (z bitShift: -30)) * Mix1) bitAnd: Mask64. z2 := ((z1 bitXor: (z1 bitShift: -27)) * Mix2) bitAnd: Mask64. z3 := z2 bitXor: (z2 bitShift: -31). ^ z3 GaySplitMix64 >> colorAt: index "Generate OkLCH color at index" | rng L C H | rng := self class seed: (state bitXor: index). L := 10 + (rng nextFloat * 85). "Lightness 10-95" C := rng nextFloat * 100. "Chroma 0-100" H := rng nextFloat * 360. "Hue 0-360" ^ GayColor L: L C: C H: H
Moldable Inspectors
Colored Object Inspector
Object >> gtGayInspectorFor: aView <gtView> ^ aView explicit title: 'Gay Color'; priority: 50; stencil: [ | container colorBox tritLabel | container := BlElement new layout: BlLinearLayout horizontal; constraintsDo: [ :c | c horizontal fitContent. c vertical fitContent ]. colorBox := BlElement new size: 50@50; background: self gayColor asBlColor. tritLabel := BrLabel new text: ('Trit: ', self gayTrit asString); aptitude: BrGlamorousLabelAptitude. container addChildren: { colorBox. tritLabel }. container ]
Collection Inspector with Rainbow
SequenceableCollection >> gtGayRainbowFor: aView <gtView> ^ aView columnedList title: 'Rainbow'; priority: 45; items: [ self withIndexCollect: [:item :i | i -> item ] ]; column: 'Color' icon: [ :assoc | BlElement new size: 20@20; background: (GaySplitMix64 colorAt: assoc key) asBlColor ] width: 30; column: 'Index' text: [ :assoc | assoc key ]; column: 'Item' text: [ :assoc | assoc value ]; column: 'Trit' text: [ :assoc | (GaySplitMix64 colorAt: assoc key) trit ]
Lepiter Integration
Color-Coded Pages
LePage >> gayColor "Page color from title hash" ^ GaySplitMix64 colorAt: self title hash LeSnippet >> gayColor "Snippet color from content hash" ^ GaySplitMix64 colorAt: self contentAsString hash LePage >> gtGayMapFor: aView <gtView> ^ aView mondrian title: 'Gay Map'; priority: 60; painting: [ :m | m nodes shape: [ :page | BlElement new size: (50 @ 50); background: page gayColor asBlColor; addChild: (BrLabel new text: page title) ]; with: self database pages. m edges shape: [ :link | BlLineElement new border: (BlBorder paint: Color gray width: 1) ]; fromRightCenter; toLeftCenter; connectToAll: #outgoingLinks. m layout force ]
GF(3) Snippet Triads
LePage >> verifyGF3Conservation "Check that snippet trits sum to 0 mod 3" | trits sum | trits := self children collect: #gayTrit. sum := trits sum. ^ (sum \\ 3) = 0 ifTrue: [ 'GF(3) conserved ✓' ] ifFalse: [ 'GF(3) violated: sum = ', sum asString ] LePage >> balanceSnippets "Add balancing snippet if needed" | sum neededTrit | sum := (self children collect: #gayTrit) sum. (sum \\ 3) = 0 ifTrue: [ ^ self ]. neededTrit := (3 - (sum \\ 3)) \\ 3. neededTrit = 2 ifTrue: [ neededTrit := -1 ]. self addSnippet: (LeTextSnippet string: '[Balancing snippet, trit = ', neededTrit asString, ']')
Bloc Visualizations
Parallel Tempering View
PigeonsResult >> gtGayTemperingFor: aView <gtView> ^ aView explicit title: 'Tempering Chains'; priority: 40; stencil: [ | container | container := BlElement new layout: BlLinearLayout vertical; constraintsDo: [ :c | c horizontal matchParent ]. self chains withIndexDo: [ :chain :i | | row beta color | beta := self schedule at: i. color := GaySplitMix64 colorAt: i. row := BlElement new layout: BlLinearLayout horizontal; constraintsDo: [ :c | c horizontal matchParent ]; addChildren: { "Color swatch" BlElement new size: 30@30; background: color asBlColor. "Beta label" BrLabel new text: ('β = ', beta printString). "Energy bar" BlElement new size: ((chain energy / self maxEnergy * 200) @ 20); background: color asBlColor. "Trit" BrLabel new text: ('trit: ', color trit asString) }. container addChild: row ]. container ]
Directed Landscape Visualization
DirectedLandscape >> gtGayLandscapeFor: aView <gtView> ^ aView explicit title: 'Landscape'; priority: 35; stencil: [ | canvas | canvas := BlElement new size: 600@400; background: Color black. self geodesics do: [ :geo | | path color | color := GaySplitMix64 colorAt: geo hash. path := BlPolylineElement vertices: geo asPoints. path border: (BlBorder paint: color asBlColor width: 2). canvas addChild: path ]. canvas ]
KPZ Integration
Colored Height Function View
KPZHeightFunction >> gtGayHeightFor: aView <gtView> ^ aView explicit title: 'Colored Height'; priority: 30; stencil: [ | canvas | canvas := BlElement new size: 800@400. self grid withIndexDo: [ :row :y | row withIndexDo: [ :height :x | | color elem | color := self heightToColor: height atColor: (self colorAt: x@y). elem := BlElement new position: (x * 4) @ (400 - (height * 2)); size: 4 @ (height * 2); background: color asBlColor. canvas addChild: elem ]]. canvas ] KPZHeightFunction >> heightToColor: h atColor: k "Gay.jl color modulated by height" | base | base := GaySplitMix64 colorAt: k. ^ GayColor L: (base L + (h * 0.5) min: 95) C: base C H: base H
Commands
# Load Glamorous Gay into GT just gt-load-gay # Color an object just gt-gay-color object=MyClass # Generate Lepiter color map just gt-lepiter-gay-map # Visualize tempering chains just gt-pigeons-view result.ston
Installation
"Load via Metacello" Metacello new repository: 'github://bmorphism/glamorous-gay:main/src'; baseline: 'GlamorousGay'; load. "Set global seed" GayGlobalSeed value: 1069. "Verify installation" 42 gayColor inspect.
GF(3) Triad
| Trit | Role | GT Component |
|---|---|---|
| -1 | Validation | Inspector assertions |
| 0 | Coordination | Lepiter knowledge base |
| +1 | Generation | Bloc visualizations |
Conservation: (-1) + (0) + (+1) = 0 ✓
Related Skills
- gay-mcp (+1): Core coloring algorithm
- kpz-universality (0): Height function coloring
- pigeons-tempering: Chain visualization
- discopy (+1): String diagram rendering
Skill Name: glamorous-gay Type: IDE Integration / Visualization Trit: +1 (PLUS) Key Property: Every object has a deterministic, reproducible color Status: ✅ Production Ready
Autopoietic Marginalia
The IDE molds to the problem. The colors reveal the structure. GF(3) conserves.
Every use of this skill is an opportunity for worlding:
- MEMORY (-1): Record effective inspector patterns
- REMEMBERING (0): Connect visualizations across domains
- WORLDING (+1): Create new moldable views
Add Interaction Exemplars here as the skill is used.