✅ VISUAL_DETERMINISM.md — SolumView (Canonical)
🌍 Zipvilization is the whole.
🧩 SolumWorld defines the world-state + rules.
👁️ SolumView is the single canonical renderer that turns SolumWorld state into visuals.
This document defines Visual Determinism:
Given the same inputs, SolumView must produce the exact same outputs (pixel-perfect, rule-perfect), across machines, across time, and across implementations.
1) What is Visual Determinism?
Visual Determinism is the guarantee that:
- Same SolumWorld state + same SolumView rules + same seeds
➜ produces the same rendered world.
This is not a “nice-to-have”.
This is the basis of:
- Trust (no hidden manipulation)
- Reproducibility (auditable outputs)
- Canon (the repo is the truth)
- Multi-client compatibility (web / desktop / future engines)
2) Why it matters in Zipvilization
Zipvilization relies on a strong principle:
If a rule is not written, it does not exist.
If a visual cannot be reproduced, it is not canonical.
Visual determinism ensures that:
- the world cannot be “silently reinterpreted”
- the same wallet always “sees the same land”
- evolution replay is provable and consistent
- community tools can verify outputs independently
3) Scope: what MUST be deterministic
SolumView must be deterministic for:
A) Global view outputs
- world overview tiles
- zoomed parcels
- chunk renderings
- UI state representation (minimap overlays, tags)
B) Wallet Mode outputs
Wallet Mode must be deterministic in BOTH directions:
- Connected wallet view (my land)
- Any wallet view (lookup/search)
A wallet lookup must render the same land for everyone.
C) Evolution Mode outputs
If you replay from “Moment 0” to “Now”, outputs must match:
- same state history
- same transition rules
- same seeds per time-step
- same rendering pipeline
- same hash checks
4) What can be allowed to vary (and how)
The only variability allowed is:
A) Non-canonical presentation layer
Example:
- CSS layout differences
- viewport scaling on different screens
- UI skin (as long as canonical pixels are unchanged)
B) Deterministic randomness
Randomness is allowed ONLY if:
- it is seeded deterministically
- seed sources are explicit
- seed is logged / derivable / hashable
There is no free randomness in Zipvilization.
5) Canonical Inputs
SolumView takes canonical inputs from:
A) SolumWorld State
From SolumWorld docs (state/ + state model):
- parcel ownership
- world grid / tile data
- structures & upgrades
- resource distribution
- temporal markers (epoch / tick / phase)
B) Render Rules
From SolumView docs:
- ZOOM_MAPPING.md
- ICONS_CONTRACT.md
- UI_CONTRACT.md
- PIPELINE_CANON.md
C) Seeds
Seeds must be derived ONLY from canonical sources such as:
- world seed
- parcel id / coordinate
- epoch / tick index
- wallet address (if explicitly required)
- deterministic salt constants defined in docs
If a seed is used, its derivation must be documented.
6) Canonical Outputs
SolumView produces:
A) Rendered tiles / frames
- chunk images
- parcel images
- map images by zoom
B) Render metadata
A deterministic build must output metadata including:
- input hash
- rule version / commit reference
- seed(s) used
- output hash(es)
This makes every image auditable.
7) Required Determinism Guarantees
A deterministic implementation must guarantee:
✅ Pixel determinism
Rendered pixels must match exactly. No floating non-determinism. No GPU “approx”.
✅ Rule determinism
Rules must be applied in the same order:
- same prioritization
- same collision resolution
- same icon placement order
- same UI overlay order
✅ Ordering determinism
Whenever something is “iterated”:
- sort keys must be defined
- tie-breaking rules must be defined
- iteration must not rely on map ordering
✅ Version determinism
Outputs must declare:
- which docs version they follow (commit)
- which icon contract version
- which zoom mapping version
8) The Determinism Contract
SolumView determinism is enforced by 3 layers:
Layer 1 — Canonical Docs
This repo is the contract:
- If it’s not written, it’s not a rule.
- If it’s written, it must be reproducible.
Layer 2 — Hashing & Verification
Every canonical output should be verifiable with:
- hash(input)
- hash(output)
- hash(ruleset)
Layer 3 — Independent Reproduction
A third party must be able to:
- take the same state snapshot
- apply the same docs rules
- reproduce the same output
9) Deterministic Pipeline (high-level)
SolumView pipeline MUST follow a stable sequence:
- Load canonical state snapshot (SolumWorld)
- Resolve zoom level via ZOOM_MAPPING.md
- Generate deterministic seeds (documented)
- Build tile/chunk layout deterministically
- Place icons deterministically (ICONS_CONTRACT.md)
- Apply UI overlays deterministically (UI_CONTRACT.md)
- Export outputs + metadata hashes
This sequence must not change silently. If it changes, it requires a documented update + version bump.
10) Wallet Mode: determinism rules
Wallet Mode introduces a critical trust surface:
the user must see the same parcel for the same wallet everywhere.
Wallet Mode MUST define:
- wallet lookup input (address)
- canonical parcel resolution method (from SolumWorld)
- zoom selection logic (same across clients)
- deterministic viewport framing rules
Wallet Mode must never:
- “pretty frame” in a non-deterministic way
- apply camera smoothing that changes outputs
- reorder icons based on device resolution
11) Evolution Mode: determinism rules
Evolution Mode is a deterministic replay:
Must be defined by:
- the canonical state history format
- state transitions (SolumWorld state docs)
- deterministic “tick” logic
- deterministic seeds per tick
Must output:
- per-tick hashes
- per-frame hashes (optional)
- a final summary hash that can be verified independently
12) Anti-drift rules (critical)
To prevent “visual drift”:
- No unversioned changes to icon meanings
- No silent changes in zoom thresholds
- No undocumented changes in seed derivation
- No “art tweaks” that change canonical pixels without update + version reference
13) Minimal Audit Checklist (10/10 standard)
A SolumView build is deterministic if:
- Same input snapshot renders identical outputs on 2 machines
- Hash(input) is logged
- Hash(output) is logged
- Seed derivation is documented
- Icon placement order is deterministic
- Zoom mapping is deterministic
- Wallet mode outputs are reproducible
- Evolution replay produces stable tick hashes
- Version/commit references are included in metadata
- A third party can reproduce the build with no “hidden steps”
14) Canon statement
SolumView determinism is not negotiable.
If a client cannot produce deterministic outputs:
- it is not canonical,
- it is a viewer only,
- and it cannot be used as a source of truth.
✅ Zipvilization canon = reproducible state + reproducible rendering.