artifacts/standard-named
Attention-Weighted Block Persistence (Dev-Forward Spec)
artifacts/standard-named/20260625__ATTENTION__APPLICATION__BLOCK-PERSISTENCE__v1__attention-weighted-block-persistence-dev-spec-next-steps.mdRendered from markdown source. Open raw source on GitHub.
Attention-Weighted Block Persistence (Dev-Forward Spec)
You are implementing a block persistence system where player attention is the resource that keeps player-made blocks from decaying.
Core invariant
Player-altered blocks only persist while they are being collectively attended to by active players. Server uptime alone does nothing.
---
1) The Mechanic (Direct, Implementable)
1.1 Block State Model (minimal)
Only player-altered blocks carry metadata.
BlockState {
intrinsic_mass // effort-to-obtain proxy
attention_mass // accumulated attention
last_updated_at // last decay tick time
}
Storage note: keep this sparse (only for placed/modified blocks), not for seed blocks.
---
1.2 Attention Accumulation (“Seen” Events)
A block gains attention when it is seen.
Seen Event (simple first pass)
Fire a Seen Event if:
- A player is online
- The block is in a loaded chunk
- The player is within radius R (e.g., 16–32 blocks)
Rate limit:
- At most once per block per player every N seconds (e.g., 5s)
Attention gain
attention_mass += seen_value
Start with:
seen_value = 1
(You can later scale by player count, LoS, rarity, etc.)
---
1.3 Intrinsic Mass (labor encoding)
Intrinsic mass is an effort-to-acquire proxy, not market value.
Example mapping:
| Block | intrinsic_mass | |---|---:| | Dirt | 1 | | Cobblestone | 2 | | Stone brick | 3 | | Iron block | 8 | | Diamond block | 50 |
This is the foundation of “diamond anchors stabilize builds.”
---
1.4 Decay (half-life)
Decay only runs while ≥ 1 player online.
Every decay tick (e.g., every 10–30 seconds):
effective_mass = intrinsic_mass + attention_mass
decay_amount = decay_constant / effective_mass
attention_mass -= decay_amount * delta_time
When:
attention_mass <= 0
The block decays.
---
1.5 Decay Outcome (choose one)
Option A — Revert (fastest)
- Block reverts to the original seed-generated block
Option B — Metabolize (recommended)
- Block breaks into ingredients
- Ingredients inherit persistence based on acquisition effort
Example concept:
item_persistence = mining_time * tool_factor
Dropped items themselves can decay if ignored.
---
1.6 Attention Leakage (second layer, optional)
Blocks share attention with adjacent player-altered blocks.
At decay time:
effective_mass =
block.mass +
Σ(neighbor.mass × leakage_factor)
Leakage rules (start simple):
- Only through player-placed adjacency
- Distance-1 only (no graph traversals yet)
- leakage_factor ≈ 0.05–0.15
Result:
- One high-mass anchor can stabilize a whole build
- Isolated builds rot naturally
---
1.7 Player Power Limiting (anti-hoard)
Don’t limit building directly—limit how much attention a player can inject.
Option 1 — Distance from Spawn (simplest)
attention_given = base / (1 + distance_from_spawn)
Option 2 — Bed-Relative Load
attention_given ∝ 1 / (# blocks placed since last bed set)
Both discourage infinite empire building.
---
2) What This Buys You (System Effects)
- World self-prunes abandoned builds
- Cities persist, noise disappears
- Ruins emerge naturally
- Grief heals without rollback
- Storage bloat drops over time
- “Soft governance” without admin rules
---
3) Implementation Strategy (Minimal → Rich)
Suggested architecture
- Store metadata in chunk-attached storage or a sparse map keyed by BlockPos
- Run decay in batches (not per-block per-tick)
- Tick interval: 10–30 seconds
- Keep Seen events rate-limited and coarse for performance
---
4) Next-Step Options (Pick One)
Option A — Minimal Working Prototype (fastest insight)
Goal: prove the loop works.
Implement:
- Seen events
- Intrinsic mass
- Attention decay
- Revert-on-decay
Ignore for now:
- Leakage
- Ingredient persistence
- Player power limits
Deliverable:
- Test server
- Logging: block lifetime histograms
---
Option B — Leakage-First Prototype
Goal: test the “anchor stabilizes structure” intuition.
Implement:
- Everything in Option A
- Adjacency leakage
- Visual decay cues (cracks/shimmer/ghosting)
Deliverable:
- Side-by-side builds with and without anchors
---
Option C — Paper-Track Prototype
Goal: research-grade evaluation.
Implement:
- Core mechanics
- Metrics logging:
- block half-life distribution
- chunk modification density over time
- grief recovery time
- Two conditions:
- vanilla
- attention-based
Deliverable:
- Dataset + graphs
- Reproducible config
---
Option D — Design-Forward Alpha
Goal: make it feel good.
Implement:
- Visual/audio feedback for decay
- Item ghosts / fading ruins
- Lore hooks (“the world remembers what is held”)
Deliverable:
- Playtest-ready server
- Player feedback
---
5) Recommended Path
Start with Option A, but structure the code so leakage slots in cleanly.
The moment you see a build slowly un-holding itself when players stop visiting, you’ll know exactly what to tune next.
---
Fabric vs Forge (quick take)
Fabric
- Pros: lightweight, fast iteration, modern ecosystem, great for performance-sensitive server mods, tends to be cleaner to maintain.
- Cons: some mod compatibility expectations differ from Forge; certain APIs/solutions may require extra libraries.
- Choose Fabric if: you want a tight custom mechanic, minimal overhead, and you’re comfortable living in a more “developer-first” ecosystem.
Forge / NeoForge
- Pros: huge modding ecosystem, lots of examples, broad compatibility with larger modpacks; more batteries-included patterns.
- Cons: heavier, more boilerplate, sometimes slower iteration; version churn can be more painful.
- Choose Forge/NeoForge if: you want maximum compatibility with existing modpacks and you expect players to combine your mechanic with many other heavy mods.
Default recommendation
If this is primarily a server-side world-physics mechanic you want to tune aggressively: Fabric. If your primary goal is modpack adoption and broad compatibility: Forge/NeoForge.