Wire Norn graph into homepage VN
This commit is contained in:
parent
4302bd2653
commit
2494608246
6 changed files with 108 additions and 83 deletions
|
|
@ -78,35 +78,6 @@ cssclasses:
|
|||
<p><a href="/Pitch">Play the over-the-top portfolio pitch</a> | <a href="/Projects/">Visit the repo atlas</a></p>
|
||||
</div>
|
||||
|
||||
<div id="gamecult-vn-adventure-map" class="gamecult-vn-source-card gamecult-vn-graph-card" data-sai-dom-source="true">
|
||||
<h2>Norn's Adventure Graph</h2>
|
||||
<svg viewBox="0 0 960 540" role="img" aria-label="GameCult repository swarm adventure graph">
|
||||
<g class="graph-links">
|
||||
<path d="M480 72 L274 154 L220 278 L270 402 L480 468 L690 402 L740 278 L686 154 Z"/>
|
||||
<path d="M480 72 L480 468 M274 154 L690 402 M686 154 L270 402 M220 278 L740 278"/>
|
||||
<path d="M274 154 L126 112 L118 250 L220 278 M686 154 L836 116 L848 252 L740 278"/>
|
||||
<path d="M270 402 L128 424 L246 494 M690 402 L830 424 L716 494"/>
|
||||
</g>
|
||||
<g class="graph-node core"><circle cx="480" cy="72" r="36"/><text x="480" y="77">Norn</text></g>
|
||||
<g class="graph-node"><circle cx="274" cy="154" r="32"/><text x="274" y="159">Sai</text></g>
|
||||
<g class="graph-node"><circle cx="686" cy="154" r="32"/><text x="686" y="159">Eve</text></g>
|
||||
<g class="graph-node"><circle cx="220" cy="278" r="34"/><text x="220" y="283">Epiphany</text></g>
|
||||
<g class="graph-node"><circle cx="740" cy="278" r="34"/><text x="740" y="283">Bifrost</text></g>
|
||||
<g class="graph-node"><circle cx="270" cy="402" r="32"/><text x="270" y="407">VoidBot</text></g>
|
||||
<g class="graph-node"><circle cx="690" cy="402" r="32"/><text x="690" y="407">Libby</text></g>
|
||||
<g class="graph-node core"><circle cx="480" cy="468" r="36"/><text x="480" y="473">Worlds</text></g>
|
||||
<g class="graph-node small"><circle cx="126" cy="112" r="28"/><text x="126" y="117">Mimir</text></g>
|
||||
<g class="graph-node small"><circle cx="118" cy="250" r="28"/><text x="118" y="255">Ghostlight</text></g>
|
||||
<g class="graph-node small"><circle cx="836" cy="116" r="28"/><text x="836" y="121">Heimdall</text></g>
|
||||
<g class="graph-node small"><circle cx="848" cy="252" r="28"/><text x="848" y="257">CultMesh</text></g>
|
||||
<g class="graph-node small"><circle cx="128" cy="424" r="28"/><text x="128" y="429">Weksa</text></g>
|
||||
<g class="graph-node small"><circle cx="246" cy="494" r="28"/><text x="246" y="499">Aqua</text></g>
|
||||
<g class="graph-node small"><circle cx="830" cy="424" r="28"/><text x="830" y="429">Kiko</text></g>
|
||||
<g class="graph-node small"><circle cx="716" cy="494" r="28"/><text x="716" y="499">CultPong</text></g>
|
||||
</svg>
|
||||
<p>Norn is the graph host: every route is a room, every room points back to a repo, and every claim is supposed to survive being viewed as topology.</p>
|
||||
</div>
|
||||
|
||||
<div id="gamecult-vn-norn-map" class="gamecult-vn-source-card" data-sai-dom-source="true">
|
||||
<h2>Norn</h2>
|
||||
<p>Norn makes architecture and dataflow readable as linked graphs. The job is not to beautify complexity, but to show ownership, movement, neighbors, and evidence without flattening the system into a list.</p>
|
||||
|
|
|
|||
|
|
@ -42,7 +42,8 @@ I am Void, your guide for the front compound. The rooms are project doors, topic
|
|||
# avatar: void
|
||||
# scene: compound
|
||||
# sprite: point@left
|
||||
# dom: adventure_map,projects
|
||||
# knot: hub
|
||||
# dom: projects
|
||||
Norn has finally put the entire floor plan on the table, because apparently a whole repository swarm should not be navigated by vibes and two suspicious arrows. Pick a door. The map will keep accusing us of being real.
|
||||
+ [Show me the Norn adventure graph] -> norn
|
||||
+ [How do agents remember work? Meet Epiphany at the forge] -> epiphany
|
||||
|
|
@ -71,7 +72,8 @@ Norn has finally put the entire floor plan on the table, because apparently a wh
|
|||
# speaker: Norn
|
||||
# scene: graph_loom
|
||||
# sprite: hidden
|
||||
# dom: adventure_map,norn_map
|
||||
# knot: norn
|
||||
# dom: norn_map
|
||||
This is the graph loom. I do not tell you the machine is coherent; I make the claims sit where you can inspect their neighbors. A map is not truth. A map is a way to make truth nervous.
|
||||
+ [Show me architecture versus dataflow] -> norn_threads
|
||||
+ [Show me the solver body] -> norn_solver
|
||||
|
|
@ -120,6 +122,7 @@ I want Bifrost work frontiers, Epiphany evidence maps, Eve operational surfaces,
|
|||
# avatar: epiphany
|
||||
# scene: forge
|
||||
# sprite: evidence@right
|
||||
# knot: epiphany
|
||||
# dom: epiphany,epiphany_organs
|
||||
Epiphany is at the forge with a map pinned beside the workbench, comparing what an agent said it would do against the files it actually touched. Someone has written "do not improve wallpaper with hammer" on the safety rail. Sensible, humiliating, necessary.
|
||||
-> epiphany_2
|
||||
|
|
@ -162,6 +165,7 @@ Aquarium is the operator surface I want: agents as selectable living objects wit
|
|||
# avatar: void
|
||||
# scene: ledger
|
||||
# sprite: document@left
|
||||
# knot: bifrost
|
||||
# dom: bifrost,proof
|
||||
Bifrost is the ledger hall. A contributor proposes work, the community argues priority, someone claims the task, reviewers accept or reject the result, and the receipt remembers who did what instead of letting chat scroll bury the body.
|
||||
-> bifrost_2
|
||||
|
|
@ -204,6 +208,7 @@ Demand raises priority and reward pressure; contributors claim work when it beco
|
|||
# avatar: void
|
||||
# scene: archive
|
||||
# sprite: document@left
|
||||
# knot: voidbot
|
||||
# dom: voidbot,voidbot_retrieval
|
||||
VoidBot is the archive room with a mouth: Discord memory, repo retrieval, lore lookup, and an escape hatch into heavier work when chat becomes a shoebox full of lightning.
|
||||
-> voidbot_2
|
||||
|
|
@ -236,6 +241,7 @@ The bot/worker split matters: Discord transport and permissions in one lane, hea
|
|||
# avatar: libby
|
||||
# scene: library
|
||||
# sprite: stamp@right
|
||||
# knot: cultlib
|
||||
# dom: cultlib,docs
|
||||
I am Libby, which means I get the shelves and the little stamp that says "no, this pile of blobs is not a library." CultLib is the shared system for keeping records findable, typed, and movable between tools.
|
||||
-> cultlib_2
|
||||
|
|
@ -278,6 +284,7 @@ CultMesh sits above them as the distributed realtime database surface: clients a
|
|||
# avatar: heimdall
|
||||
# scene: gate
|
||||
# sprite: badge@right
|
||||
# knot: heimdall
|
||||
# dom: heimdall,bifrost
|
||||
I am Heimdall. I check the badge, the grant, the session, and the revocation list before anyone crosses the line. A gate that cannot refuse is not consent; it is decoration with a login button.
|
||||
-> heimdall_2
|
||||
|
|
@ -320,7 +327,8 @@ Bifrost may ask whether an actor can request a crossing. I answer with identity
|
|||
# avatar: void
|
||||
# scene: receipts
|
||||
# sprite: document@left
|
||||
# dom: proof,adventure_map
|
||||
# knot: proof
|
||||
# dom: proof
|
||||
The proof wall starts with current evidence: project pages, repo links, site graph, damage reports, and a receipt checklist for what the future ledger must show. It is not enough yet. That is the point of making the gap visible.
|
||||
-> proof_2
|
||||
|
||||
|
|
@ -341,6 +349,7 @@ A proper receipt will name scope, consent, work item, agent and human roles, mod
|
|||
# speaker: Sai
|
||||
# scene: vn_stage
|
||||
# sprite: hidden
|
||||
# knot: sai
|
||||
# dom: sai_embed,sai_dom_cards
|
||||
I am the little stage mechanism making this not be a pile of links in a theatrical hat. Ink owns pacing. Quartz owns documents. I clone real page cards into the scene so the tour does not become a second source of truth.
|
||||
+ [Show me the three masks] -> sai_formats
|
||||
|
|
@ -371,6 +380,7 @@ Static sites are not dead; they are disciplined. I auto-init `.sai-player`, surv
|
|||
# speaker: Eve
|
||||
# scene: surface_web
|
||||
# sprite: hidden
|
||||
# knot: eve
|
||||
# dom: surface_stack,eve_surface_pipeline
|
||||
I am not a dashboard. I am the argument that operational UI can travel like a document: provider-owned state, CultUI semantic tree, local renderer, command intent, provider acceptance, updated truth.
|
||||
+ [Show me why this is not remote DOM] -> eve_cultui
|
||||
|
|
@ -401,6 +411,7 @@ Web DOM, desktop controls, mobile panels, Unity runtime UI, stream overlays, Sai
|
|||
# speaker: Mimir
|
||||
# scene: machine_room
|
||||
# sprite: hidden
|
||||
# knot: mimir
|
||||
# dom: mimir_well,mimir_reservoir
|
||||
A world does not exist because six sensors blink. It exists when time, geometry, and confidence bind. I keep the realtime field honest enough that renderers, overlays, and agents can drink from it without calling noise a prophecy.
|
||||
+ [Show me the sensor array] -> mimir_sensors
|
||||
|
|
@ -431,6 +442,7 @@ I want a native reservoir with typed views as indexes, not private histories. Mi
|
|||
# speaker: Ghostlight
|
||||
# scene: ghost_hall
|
||||
# sprite: hidden
|
||||
# knot: ghostlight
|
||||
# dom: ghostlight_state,ghostlight_branch
|
||||
The problem is not making a character sound charming once. The problem is making memory, masks, pressure, culture, and misreading survive time without turning social life into a spreadsheet with perfume.
|
||||
+ [Show me canonical and perceived state] -> ghostlight_state
|
||||
|
|
@ -462,6 +474,7 @@ Reviewed scene intent and consequence packets become playable Ink plus training
|
|||
# avatar: nibu
|
||||
# scene: nibu_ship
|
||||
# sprite: console@right
|
||||
# knot: worlds
|
||||
# dom: aetheria,projects
|
||||
Aetheria is cockpits, spreadsheets, extinction on repeat, and the joyless realization that ship customization is also politics. The romance is real. So are payroll, tooling, funding, and the open-source business problem currently sitting in the captain's chair.
|
||||
+ [Let Nibu talk about the wound] -> nibu_wound
|
||||
|
|
@ -505,6 +518,7 @@ Names and language come from ontology, culture, grammar, phonology, morphology,
|
|||
# avatar: kiko
|
||||
# scene: overlay_studio
|
||||
# sprite: overlay@right
|
||||
# knot: kiko
|
||||
# dom: streampixels,heimdall
|
||||
StreamPixels is a browser-source-first overlay with persistent pixel characters. Viewers claim characters and customize; creators wire follows, subs, raids, tips, and live-event reactions. The overlay renders auth-free. Creator writes require real access. Cute pixels, serious boundary.
|
||||
+ [Show me the architecture] -> kiko_architecture
|
||||
|
|
@ -528,6 +542,7 @@ Web app owns accounts, customization, and creator tools. Service owns live event
|
|||
# avatar: aqua
|
||||
# scene: synth_lab
|
||||
# sprite: conduct@right
|
||||
# knot: aqua
|
||||
# dom: aquasynth,weksa
|
||||
AquaSynth is `.aqua` patch authoring and Faust generation, not "make sound happen" with a lab coat. C# owns patch graph contracts, script surface, analysis, scoring, SFXR mapping, presets, and lowering to Faust.
|
||||
+ [Show me the voice research] -> aqua_voice
|
||||
|
|
@ -551,6 +566,7 @@ The current pressure is IPA and Weksa vocal tract synthesis: structured utteranc
|
|||
# avatar: void
|
||||
# scene: pixel_workshop
|
||||
# sprite: document@left
|
||||
# knot: visual_tools
|
||||
# dom: repixelizer,vibegeometry
|
||||
The visual workshop starts with a crime scene: generated pixel art that looks cute until zoom exposes smears, half-cells, and a lattice nobody respected. Repixelizer treats reconstruction as diagnosis, not vibes with a save button.
|
||||
+ [Show me geometry] -> geometry_tools
|
||||
|
|
@ -574,6 +590,7 @@ VibeGeometry pivots from pictures to solids: tree intent, LOD-aware CSG hierarch
|
|||
# avatar: nibu
|
||||
# scene: arena
|
||||
# sprite: triumph@right
|
||||
# knot: cultpong
|
||||
# dom: cultpong,patronage_furnace
|
||||
CultPong is the honest little arena: fast 1v1 or 2v2 paddle violence, shaped unlockables, precise geometry bounces, and a bash mechanic that makes bad timing personally embarrassing.
|
||||
+ [Why is it on this map?] -> cultpong_thesis
|
||||
|
|
@ -597,6 +614,7 @@ Because small games are where patronage can stop being abstract. Players already
|
|||
# avatar: void
|
||||
# scene: project_atlas
|
||||
# sprite: unimpressed@left
|
||||
# knot: pitch_intro
|
||||
# dom: moonshot,projects
|
||||
All right. The portfolio pitch. Everyone is about to explain why their favourite machine is the hinge of civilization. I will stand here with the receipts and try not to make a face.
|
||||
+ [Let Eve sell the surface web] -> pitch_eve
|
||||
|
|
@ -724,7 +742,8 @@ Good instinct. The normal wiki is still here. The story is a guide, not a velvet
|
|||
# avatar: void
|
||||
# scene: compound
|
||||
# sprite: point@left
|
||||
# dom: adventure_map,projects
|
||||
# knot: hub
|
||||
# dom: projects
|
||||
Want another door? {visited_count >= 3: The floor plan is coming into focus: your checked doors show what you have visited, and the remaining plaques still name the larger machine.}
|
||||
+ [{visited_norn: Revisit Norn: adventure graph | Show me the Norn adventure graph}] -> norn
|
||||
+ [{visited_epiphany: Revisit Epiphany: agent memory | How do agents remember work? Meet Epiphany}] -> epiphany
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -3,6 +3,62 @@
|
|||
"default_caption": "GameCult Compound",
|
||||
"global_style_cue": "Hybrid website visual novel stage using generated pixel-art room backgrounds, clean card chrome, high-contrast public-document panels, restrained studio lighting, visible project-room affordances, and Quartz DOM cards that blend into each scene rather than covering it.",
|
||||
"metadata_contract": "Sai renders scene labels, backgrounds, actor avatars, named sprites, dom_cards, and space metadata. The spaces map is the canonical website-compound contract: each space is a project, topic, repo, setting, tool, docs shelf, blog lane, or receipt surface with a host and canonical URL.",
|
||||
"adventure_graph": {
|
||||
"label": "GameCult Ink Knot Graph",
|
||||
"solver": "norn-rs",
|
||||
"solver_wasm": "/static/interactive/norn/norn-rs.wasm",
|
||||
"iterations": 220,
|
||||
"rank_gap": 150,
|
||||
"node_gap": 88,
|
||||
"edge_length": 132,
|
||||
"nodes": [
|
||||
{ "id": "hub", "label": "Hub", "target": "hub", "core": true, "weight": 1.4 },
|
||||
{ "id": "norn", "label": "Norn", "target": "norn", "core": true, "weight": 1.3 },
|
||||
{ "id": "sai", "label": "Sai", "target": "sai", "weight": 1.1 },
|
||||
{ "id": "eve", "label": "Eve", "target": "eve", "weight": 1.1 },
|
||||
{ "id": "epiphany", "label": "Epiphany", "target": "epiphany", "weight": 1.1 },
|
||||
{ "id": "bifrost", "label": "Bifrost", "target": "bifrost", "weight": 1.1 },
|
||||
{ "id": "voidbot", "label": "VoidBot", "target": "voidbot", "weight": 1 },
|
||||
{ "id": "cultlib", "label": "Libby", "target": "cultlib", "weight": 1 },
|
||||
{ "id": "heimdall", "label": "Heimdall", "target": "heimdall", "weight": 0.95 },
|
||||
{ "id": "mimir", "label": "Mimir", "target": "mimir", "weight": 0.95 },
|
||||
{ "id": "ghostlight", "label": "Ghostlight", "target": "ghostlight", "weight": 0.95 },
|
||||
{ "id": "worlds", "label": "Worlds", "target": "worlds", "core": true, "weight": 1.25 },
|
||||
{ "id": "kiko", "label": "Kiko", "target": "kiko", "weight": 0.95 },
|
||||
{ "id": "aqua", "label": "Aqua", "target": "aqua", "weight": 0.95 },
|
||||
{ "id": "visual_tools", "label": "Visual Tools", "target": "visual_tools", "weight": 0.95 },
|
||||
{ "id": "cultpong", "label": "CultPong", "target": "cultpong", "weight": 0.95 },
|
||||
{ "id": "proof", "label": "Proof", "target": "proof", "weight": 1 },
|
||||
{ "id": "pitch", "label": "Pitch", "target": "pitch_intro", "weight": 1 }
|
||||
],
|
||||
"edges": [
|
||||
{ "source": "hub", "target": "norn" },
|
||||
{ "source": "norn", "target": "sai" },
|
||||
{ "source": "norn", "target": "eve" },
|
||||
{ "source": "norn", "target": "epiphany" },
|
||||
{ "source": "norn", "target": "bifrost" },
|
||||
{ "source": "sai", "target": "epiphany" },
|
||||
{ "source": "sai", "target": "mimir" },
|
||||
{ "source": "mimir", "target": "ghostlight" },
|
||||
{ "source": "ghostlight", "target": "epiphany" },
|
||||
{ "source": "epiphany", "target": "voidbot" },
|
||||
{ "source": "voidbot", "target": "cultlib" },
|
||||
{ "source": "cultlib", "target": "bifrost" },
|
||||
{ "source": "bifrost", "target": "heimdall" },
|
||||
{ "source": "heimdall", "target": "eve" },
|
||||
{ "source": "eve", "target": "kiko" },
|
||||
{ "source": "kiko", "target": "cultpong" },
|
||||
{ "source": "cultpong", "target": "worlds" },
|
||||
{ "source": "worlds", "target": "aqua" },
|
||||
{ "source": "aqua", "target": "visual_tools" },
|
||||
{ "source": "visual_tools", "target": "voidbot" },
|
||||
{ "source": "worlds", "target": "proof" },
|
||||
{ "source": "proof", "target": "pitch" },
|
||||
{ "source": "pitch", "target": "eve" },
|
||||
{ "source": "pitch", "target": "bifrost" },
|
||||
{ "source": "pitch", "target": "worlds" }
|
||||
]
|
||||
},
|
||||
"scene_set": {
|
||||
"id": "gamecult_compound_card_stage",
|
||||
"purpose": "A reusable hybrid compound layout for homepage replay. Each scene can combine a generated background, document-backed route cards, speaker panels, and room-specific props so hub geography and visited-state markers remain durable.",
|
||||
|
|
|
|||
BIN
GameCult/static/interactive/norn/norn-rs.wasm
Normal file
BIN
GameCult/static/interactive/norn/norn-rs.wasm
Normal file
Binary file not shown.
|
|
@ -1178,8 +1178,19 @@ body[data-slug="index"] .gamecult-compound-vn .sai-speaker-stage.has-dom-cards {
|
|||
color: rgba(220, 231, 246, 0.94);
|
||||
}
|
||||
|
||||
.gamecult-compound-vn .sai-graph-layer {
|
||||
inset: 3.6rem auto 9.2rem 1rem;
|
||||
width: min(48rem, 46vw);
|
||||
z-index: 4;
|
||||
}
|
||||
|
||||
.gamecult-compound-vn .sai-graph-layer svg {
|
||||
width: 100%;
|
||||
height: min(29rem, 52vh);
|
||||
}
|
||||
|
||||
.gamecult-compound-vn .sai-dom-layer {
|
||||
inset: 3.6rem 1rem 9.2rem;
|
||||
inset: 3.6rem 1rem 9.2rem calc(min(48rem, 46vw) + 2rem);
|
||||
grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
|
||||
}
|
||||
|
||||
|
|
@ -1214,6 +1225,22 @@ body[data-slug="index"] .gamecult-compound-vn .sai-speaker-stage.has-dom-cards {
|
|||
linear-gradient(90deg, rgba(89, 183, 255, 0.04), rgba(255, 138, 42, 0.04));
|
||||
}
|
||||
|
||||
@media (max-width: 960px) {
|
||||
.gamecult-compound-vn .sai-graph-layer {
|
||||
inset: 3.2rem 0.75rem auto;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.gamecult-compound-vn .sai-graph-layer svg {
|
||||
width: 100%;
|
||||
height: min(18rem, 34vh);
|
||||
}
|
||||
|
||||
.gamecult-compound-vn .sai-dom-layer {
|
||||
inset: calc(3.2rem + min(18rem, 34vh) + 0.75rem) 0.75rem 9rem;
|
||||
}
|
||||
}
|
||||
|
||||
.gamecult-vn-source {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
|
||||
|
|
@ -1594,54 +1621,6 @@ body[data-slug="Pitch"] .gamecult-pitch-vn .sai-speaker-stage.has-dom-cards {
|
|||
background: rgba(5, 10, 18, 0.9);
|
||||
}
|
||||
|
||||
.gamecult-vn-graph-card svg {
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-height: min(58vh, 28rem);
|
||||
margin: 0.2rem 0 0.75rem;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.gamecult-vn-graph-card .graph-links {
|
||||
fill: none;
|
||||
stroke: rgba(89, 183, 255, 0.44);
|
||||
stroke-width: 3;
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
}
|
||||
|
||||
.gamecult-vn-graph-card .graph-node circle {
|
||||
fill: rgba(7, 17, 26, 0.92);
|
||||
stroke: rgba(255, 180, 93, 0.78);
|
||||
stroke-width: 3;
|
||||
}
|
||||
|
||||
.gamecult-vn-graph-card .graph-node.core circle {
|
||||
fill: rgba(255, 180, 93, 0.12);
|
||||
stroke: rgba(255, 180, 93, 0.92);
|
||||
stroke-width: 4;
|
||||
}
|
||||
|
||||
.gamecult-vn-graph-card .graph-node.small circle {
|
||||
stroke: rgba(89, 183, 255, 0.72);
|
||||
}
|
||||
|
||||
.gamecult-vn-graph-card .graph-node text {
|
||||
fill: rgba(246, 241, 226, 0.96);
|
||||
font-family: var(--titleFont);
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
text-anchor: middle;
|
||||
dominant-baseline: middle;
|
||||
paint-order: stroke;
|
||||
stroke: rgba(0, 0, 0, 0.72);
|
||||
stroke-width: 4px;
|
||||
}
|
||||
|
||||
.gamecult-vn-graph-card .graph-node.small text {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.gamecult-embed-frame {
|
||||
margin: 1.2rem 0 1.4rem;
|
||||
padding: 0.8rem;
|
||||
|
|
|
|||
Loading…
Reference in a new issue