Skip to content

Commit 48aa3b9

Browse files
SNAPKITTYWESTclaude
andcommitted
feat: sacred geometry view — Pentagon/pentagram layout of 5 agents
Dee's cipher system had 4 things Terry missed: 1. Book of Soyga: algorithmic derivation from seed to sacred text (our HKDF-SHA256) 2. Monas Hieroglyphica: one symbol encoding multiple simultaneous layers (our emoji pairs) 3. Enochian Watchtower tablets: cipher grids with directional reading rules (our 4-layer dictionary) 4. RTL dictation of the 48 calls: encoded during transmission (our 49th Call reversal) Sacred geometry view: - 5 agents at pentagon vertices, φ = 1.618 diagonal/side ratio - Pentagram star connections (all-to-all via skip-2 pattern) - Pentagon edges (pipeline order) - Click any node: agent cipher role + Dee correspondence - Run pipeline: animates nodes in sequence - Center glyph: ☿ Monas Hieroglyphica approximation - Each emoji pair is a Monad (Dee's 1564 compressed symbol) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 760c497 commit 48aa3b9

6 files changed

Lines changed: 358 additions & 0 deletions

File tree

docs/agents.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<a href="query.html">query</a>
4747
<a href="twins.html">twins</a>
4848
<a href="agents.html" class="active">agents</a>
49+
<a href="geometry.html">geometry</a>
4950
<a href="debate.html">debate</a>
5051
<a href="repl.html">repl</a>
5152
</div>

docs/geometry.html

Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,353 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
5+
<title>sacred geometry · holy-agents</title>
6+
<style>
7+
*{margin:0;padding:0;box-sizing:border-box}
8+
body{background:#0a0a0a;color:#b0b0b0;font-family:'Courier New',monospace;min-height:100vh}
9+
.nav{display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid #1a1a1a}
10+
.nav-brand{color:#e0e0e0;font-size:14px;letter-spacing:2px}
11+
.nav-links a{color:#555;text-decoration:none;margin-left:16px;font-size:11px}
12+
.nav-links a:hover,.nav-links a.active{color:#e0e0e0}
13+
.container{max-width:960px;margin:0 auto;padding:24px 20px}
14+
h1{color:#e0e0e0;font-size:16px;letter-spacing:2px;margin-bottom:6px}
15+
.sub{color:#555;font-size:11px;margin-bottom:24px;line-height:1.6}
16+
.layout{display:flex;gap:24px;flex-wrap:wrap;align-items:flex-start}
17+
#geo-canvas{border:1px solid #1a1a1a;display:block;flex-shrink:0}
18+
.side{flex:1;min-width:260px}
19+
.cipher-block{border:1px solid #1a1a1a;padding:14px;margin-bottom:12px}
20+
.cipher-block h3{color:#e0e0e0;font-size:11px;letter-spacing:1px;margin-bottom:8px}
21+
.cipher-block p{color:#555;font-size:11px;line-height:1.6}
22+
.cipher-block .highlight{color:#4a9}
23+
.cipher-block .gold{color:#a84}
24+
.cipher-block .dim{color:#333}
25+
.controls{margin-bottom:16px;display:flex;gap:8px;flex-wrap:wrap}
26+
.btn{background:#0a0a0a;border:1px solid #1a1a1a;color:#555;padding:6px 14px;font-family:'Courier New',monospace;font-size:10px;cursor:pointer;letter-spacing:1px;text-transform:uppercase}
27+
.btn:hover{border-color:#333;color:#e0e0e0}
28+
.btn.active{border-color:#4a9;color:#4a9}
29+
.reading{border:1px solid #1a1a1a;padding:12px;margin-top:12px;font-size:11px;min-height:80px}
30+
.reading .r-label{color:#444;font-size:10px;letter-spacing:1px;margin-bottom:6px}
31+
.reading .r-line{margin:3px 0;line-height:1.5}
32+
.reading .r-agent{font-weight:bold}
33+
.status-bar{border-top:1px solid #1a1a1a;padding:12px 20px;font-size:10px;color:#333;margin-top:32px;display:flex;justify-content:space-between}
34+
</style>
35+
</head>
36+
<body>
37+
38+
<div class="nav">
39+
<div class="nav-brand">holy-agents</div>
40+
<div class="nav-links">
41+
<a href="index.html">home</a>
42+
<a href="query.html">query</a>
43+
<a href="agents.html">agents</a>
44+
<a href="twins.html">twins</a>
45+
<a href="debate.html">debate</a>
46+
<a href="repl.html">repl</a>
47+
<a href="geometry.html" class="active">geometry</a>
48+
</div>
49+
</div>
50+
51+
<div class="container">
52+
<h1>SACRED GEOMETRY</h1>
53+
<div class="sub">
54+
Five agents. Pentagon nodes. Pentagram connections.<br>
55+
John Dee's Monas Hieroglyphica (1564): one symbol encoding multiple layers simultaneously.<br>
56+
Each connecting line carries a formal relationship. Each diagonal = golden ratio φ ≈ 1.618.
57+
</div>
58+
59+
<div class="controls">
60+
<button class="btn active" id="btn-all" onclick="setMode('all')">All connections</button>
61+
<button class="btn" id="btn-pipeline" onclick="setMode('pipeline')">Pipeline order</button>
62+
<button class="btn" id="btn-star" onclick="setMode('star')">Star only</button>
63+
<button class="btn" id="btn-animate" onclick="animatePipeline()">Run pipeline</button>
64+
</div>
65+
66+
<div class="layout">
67+
<canvas id="geo-canvas" width="440" height="440"></canvas>
68+
69+
<div class="side">
70+
<div class="cipher-block">
71+
<h3>DEE'S CIPHER CONNECTION</h3>
72+
<p>
73+
Dee's <span class="gold">Book of Soyga</span> — "Soyga" is "Agyos" (holy) spelled backwards.
74+
36 cipher tables, each generated by an algorithm from a seed word.
75+
An early PRNG: formal derivation from seed to sacred text.<br><br>
76+
<span class="highlight">Terry had:</span> rand() % wordCount → Bible word. No formal derivation.<br>
77+
<span class="highlight">Dee had:</span> Soyga_algorithm(seed) → cipher table → meaning.<br>
78+
<span class="highlight">We have:</span> ANU_QRNG → HKDF-SHA256 → dictionary → WORM seal.
79+
</p>
80+
</div>
81+
82+
<div class="cipher-block">
83+
<h3>MONAS HIEROGLYPHICA</h3>
84+
<p>
85+
One glyph encoding: ☀ sun · ☽ moon · + cross · △ fire · ♄ Saturn · all simultaneously.
86+
<br><br>
87+
<span class="highlight">Each emoji pair is a monad:</span><br>
88+
<span class="gold">🔍📖</span> — seeking encoded into scripture<br>
89+
<span class="gold">⚖️🧠</span> — balance encoded into reason<br>
90+
<span class="gold">🔥🚫</span> — fire encoded into prohibition<br>
91+
<span class="gold">🕊️✅</span> — peace encoded into approval<br>
92+
<span class="gold">🧾🔐</span> — record encoded into seal<br><br>
93+
Two symbols. One meaning. Dee designed this pattern in 1564.
94+
</p>
95+
</div>
96+
97+
<div class="cipher-block">
98+
<h3>PENTAGRAM RATIOS</h3>
99+
<p>
100+
Every diagonal of a regular pentagon ÷ its side = <span class="highlight">φ = 1.618...</span><br>
101+
φ appears in: Enochian tablet proportions · Dee's Monas symbol · Arabic geometric art · Hebrew gematria ratios · Lean 4 type hierarchies.<br><br>
102+
<span class="dim">The golden ratio is the formal proof that the pentagon is self-similar at every scale. The cipher is built into the geometry.</span>
103+
</p>
104+
</div>
105+
106+
<div class="reading" id="reading-panel">
107+
<div class="r-label">[ AGENT READING — click a node ]</div>
108+
<div class="r-line" style="color:#333">Select a node to see the agent's cipher role and Dee correspondence.</div>
109+
</div>
110+
</div>
111+
</div>
112+
</div>
113+
114+
<div class="status-bar">
115+
<span>holy-agents · sacred geometry · 5 agents · pentagram · φ = 1.618</span>
116+
<span>John Dee (1527–1608/9) · completed</span>
117+
</div>
118+
119+
<script>
120+
const canvas = document.getElementById('geo-canvas')
121+
const ctx = canvas.getContext('2d')
122+
const W = canvas.width
123+
const H = canvas.height
124+
const CX = W / 2
125+
const CY = H / 2
126+
const R = 160 // pentagon circumradius
127+
const PHI = 1.6180339887
128+
129+
// Five agents at pentagon vertices
130+
// Start from top, go clockwise
131+
const AGENTS = [
132+
{
133+
name: 'SCRIBE',
134+
emoji: '🔍📖',
135+
color: '#4a9',
136+
zone: 'Library',
137+
cipher: 'Seeks scripture. In Dee\'s system: the SCRYER who receives the call. Reads the cipher tables.',
138+
dee: 'Kelley (scryer) — receives Enochian calls in RTL cipher, passes to Dee for reversal',
139+
angle: -Math.PI/2, // top
140+
},
141+
{
142+
name: 'JUDGE',
143+
emoji: '⚖️🧠',
144+
color: '#a84',
145+
zone: 'Court',
146+
cipher: 'Validates logic. In Dee\'s system: the formal grammar check of the Enochian language.',
147+
dee: 'The Watchtower tablets — formal 12×13 grids where names are read by specific rules',
148+
angle: -Math.PI/2 + 2*Math.PI/5,
149+
},
150+
{
151+
name: 'PROPHET',
152+
emoji: '🔥',
153+
color: '#a44',
154+
zone: 'Forge',
155+
cipher: 'Warning system. In Dee\'s system: the POWER of the calls — why Kelley dictated them RTL.',
156+
dee: 'The 48 calls were too powerful to speak forward during reception — encoded in reverse',
157+
angle: -Math.PI/2 + 4*Math.PI/5,
158+
},
159+
{
160+
name: 'LEDGE',
161+
emoji: '🧾🔐',
162+
color: '#888',
163+
zone: 'Ledger Vault',
164+
cipher: 'WORM seals decisions. In Dee\'s system: the physical diary of scrying sessions — append-only.',
165+
dee: 'Dee\'s diaries (Cotton MS Appendix XLVI) — 420 sessions, dated, append-only, witnessed',
166+
angle: -Math.PI/2 + 6*Math.PI/5,
167+
},
168+
{
169+
name: 'SENTINEL',
170+
emoji: '🛡️',
171+
color: '#44a',
172+
zone: 'Sentinel Gate',
173+
cipher: 'Security gate. In Dee\'s system: the Enochian "BANISHING" — gates that block unsafe calls.',
174+
dee: 'The Lesser Banishing Ritual of the Pentagram — five-pointed gate, directional sealing',
175+
angle: -Math.PI/2 + 8*Math.PI/5,
176+
},
177+
]
178+
179+
// Compute x,y from angle + radius
180+
AGENTS.forEach(a => {
181+
a.x = CX + R * Math.cos(a.angle)
182+
a.y = CY + R * Math.sin(a.angle)
183+
})
184+
185+
let mode = 'all'
186+
let activeNodes = new Set()
187+
let pulseT = 0
188+
let animFrame = null
189+
let hoveredNode = -1
190+
191+
function nodeAt(mx, my) {
192+
for (let i = 0; i < AGENTS.length; i++) {
193+
const a = AGENTS[i]
194+
const d = Math.hypot(mx - a.x, my - a.y)
195+
if (d < 28) return i
196+
}
197+
return -1
198+
}
199+
200+
canvas.addEventListener('mousemove', e => {
201+
const rect = canvas.getBoundingClientRect()
202+
hoveredNode = nodeAt(e.clientX - rect.left, e.clientY - rect.top)
203+
canvas.style.cursor = hoveredNode >= 0 ? 'pointer' : 'default'
204+
})
205+
206+
canvas.addEventListener('click', e => {
207+
const rect = canvas.getBoundingClientRect()
208+
const idx = nodeAt(e.clientX - rect.left, e.clientY - rect.top)
209+
if (idx >= 0) showReading(idx)
210+
})
211+
212+
function showReading(idx) {
213+
const a = AGENTS[idx]
214+
const el = document.getElementById('reading-panel')
215+
el.innerHTML = `
216+
<div class="r-label">[ ${a.name}${a.zone} ]</div>
217+
<div class="r-line"><span class="r-agent" style="color:${a.color}">${a.emoji} ${a.name}</span></div>
218+
<div class="r-line" style="color:#888;margin-top:6px">${a.cipher}</div>
219+
<div class="r-line" style="color:#444;margin-top:6px;font-size:10px">Dee: ${a.dee}</div>
220+
`
221+
}
222+
223+
function setMode(m) {
224+
mode = m
225+
document.querySelectorAll('.btn').forEach(b => b.classList.remove('active'))
226+
document.getElementById('btn-' + m)?.classList.add('active')
227+
}
228+
229+
async function animatePipeline() {
230+
setMode('pipeline')
231+
activeNodes.clear()
232+
for (let i = 0; i < AGENTS.length; i++) {
233+
activeNodes.clear()
234+
activeNodes.add(i)
235+
showReading(i)
236+
await new Promise(r => setTimeout(r, 700))
237+
}
238+
activeNodes.clear()
239+
setMode('all')
240+
}
241+
242+
function draw() {
243+
pulseT += 0.04
244+
ctx.clearRect(0, 0, W, H)
245+
246+
// Background glow at center
247+
const grd = ctx.createRadialGradient(CX, CY, 0, CX, CY, R)
248+
grd.addColorStop(0, 'rgba(74,153,120,0.03)')
249+
grd.addColorStop(1, 'rgba(0,0,0,0)')
250+
ctx.fillStyle = grd
251+
ctx.fillRect(0, 0, W, H)
252+
253+
// Draw connections based on mode
254+
if (mode === 'all' || mode === 'star') {
255+
// Pentagram diagonals (star connections — skip adjacent, connect every other)
256+
for (let i = 0; i < 5; i++) {
257+
for (let j = i + 2; j < 5; j++) {
258+
if (j === i + 2 || (i === 0 && j === 3)) { // pentagram diagonals only
259+
const a = AGENTS[i], b = AGENTS[(i+2)%5]
260+
drawLine(a.x, a.y, b.x, b.y, 'rgba(74,153,120,0.15)', 1)
261+
}
262+
}
263+
}
264+
// Actually draw proper pentagram: connect every vertex to vertex+2
265+
ctx.beginPath()
266+
const order = [0,2,4,1,3,0]
267+
ctx.moveTo(AGENTS[0].x, AGENTS[0].y)
268+
for (const idx of order) ctx.lineTo(AGENTS[idx].x, AGENTS[idx].y)
269+
ctx.strokeStyle = 'rgba(74,153,120,0.20)'
270+
ctx.lineWidth = 1
271+
ctx.stroke()
272+
}
273+
274+
if (mode === 'all' || mode === 'pipeline') {
275+
// Pentagon edges (adjacent connections)
276+
for (let i = 0; i < 5; i++) {
277+
const a = AGENTS[i], b = AGENTS[(i+1)%5]
278+
const active = activeNodes.has(i) || activeNodes.has((i+1)%5)
279+
drawLine(a.x, a.y, b.x, b.y,
280+
active ? 'rgba(168,132,60,0.7)' : 'rgba(40,40,40,0.8)', active ? 2 : 1)
281+
}
282+
}
283+
284+
// Nodes
285+
AGENTS.forEach((a, i) => {
286+
const isActive = activeNodes.has(i)
287+
const isHovered = hoveredNode === i
288+
const pulse = isActive ? 0.5 + 0.5 * Math.sin(pulseT * 3) : 0
289+
290+
// Outer glow for active
291+
if (isActive) {
292+
ctx.beginPath()
293+
ctx.arc(a.x, a.y, 34 + pulse * 6, 0, Math.PI * 2)
294+
ctx.fillStyle = a.color + '22'
295+
ctx.fill()
296+
}
297+
298+
// Node circle
299+
ctx.beginPath()
300+
ctx.arc(a.x, a.y, 26, 0, Math.PI * 2)
301+
ctx.fillStyle = isActive ? a.color + '33' : isHovered ? '#1a1a1a' : '#111'
302+
ctx.strokeStyle = isActive ? a.color : isHovered ? '#333' : '#1e1e1e'
303+
ctx.lineWidth = isActive ? 2 : 1
304+
ctx.fill()
305+
ctx.stroke()
306+
307+
// Emoji
308+
ctx.font = '18px serif'
309+
ctx.textAlign = 'center'
310+
ctx.textBaseline = 'middle'
311+
ctx.fillText(a.emoji, a.x, a.y)
312+
313+
// Agent name below
314+
ctx.font = '8px Courier New'
315+
ctx.fillStyle = isActive ? a.color : '#444'
316+
ctx.textBaseline = 'top'
317+
ctx.fillText(a.name, a.x, a.y + 30)
318+
319+
// Zone label
320+
ctx.font = '7px Courier New'
321+
ctx.fillStyle = '#2a2a2a'
322+
ctx.fillText(a.zone, a.x, a.y + 40)
323+
})
324+
325+
// Center symbol — Monas Hieroglyphica approximation
326+
ctx.font = '22px serif'
327+
ctx.textAlign = 'center'
328+
ctx.textBaseline = 'middle'
329+
ctx.fillStyle = 'rgba(168,132,60,0.3)'
330+
ctx.fillText('☿', CX, CY)
331+
332+
// φ label
333+
ctx.font = '9px Courier New'
334+
ctx.fillStyle = '#2a2a2a'
335+
ctx.textAlign = 'center'
336+
ctx.fillText('φ = 1.618', CX, CY + 16)
337+
338+
animFrame = requestAnimationFrame(draw)
339+
}
340+
341+
function drawLine(x1, y1, x2, y2, color, width) {
342+
ctx.beginPath()
343+
ctx.moveTo(x1, y1)
344+
ctx.lineTo(x2, y2)
345+
ctx.strokeStyle = color
346+
ctx.lineWidth = width
347+
ctx.stroke()
348+
}
349+
350+
draw()
351+
</script>
352+
</body>
353+
</html>

docs/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
<a href="query.html">query</a>
3232
<a href="agents.html">agents</a>
3333
<a href="twins.html">twins</a>
34+
<a href="geometry.html">geometry</a>
3435
<a href="debate.html">debate</a>
3536
<a href="repl.html">repl</a>
3637
</div>

docs/query.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
<a href="query.html" class="active">query</a>
9292
<a href="twins.html">twins</a>
9393
<a href="agents.html">agents</a>
94+
<a href="geometry.html">geometry</a>
9495
<a href="debate.html">debate</a>
9596
<a href="repl.html">repl</a>
9697
</div>

docs/repl.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<a href="query.html">query</a>
1818
<a href="agents.html">agents</a>
1919
<a href="twins.html">twins</a>
20+
<a href="geometry.html">geometry</a>
2021
<a href="debate.html">debate</a>
2122
</div>
2223
</div>

docs/twins.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
<a href="query.html">query</a>
7878
<a href="twins.html" class="active">twins</a>
7979
<a href="agents.html">agents</a>
80+
<a href="geometry.html">geometry</a>
8081
<a href="debate.html">debate</a>
8182
<a href="repl.html">repl</a>
8283
</div>

0 commit comments

Comments
 (0)