diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs index bf161c59..cf25031e 100644 --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -3416,9 +3416,9 @@ fn sensor_signal_visible(sim: &Sim, id: u32) -> bool { } /// Material-world embodiment of earned reach knowledge: known reachable -/// sensors answer as small rising cold-signal rings at their shared physical -/// anchors before Eyes. This is not camera geometry — no body, lens, facing, -/// floor surface, or fog transition — just "a sensor endpoint answers here." +/// sensors answer as a tiny cold-signal ember at their shared physical anchor +/// before Eyes. This is not camera geometry — no body, lens, facing, floor +/// surface, or fog transition — just "a sensor endpoint answers here." /// Heard's bone field can coexist with it; Seen replaces it with the device. fn draw_sensor_signals_3d(game: &Game, t: f32, gizmos: &mut Gizmos) { let signal = SIGNAL.to_srgba(); @@ -3428,41 +3428,32 @@ fn draw_sensor_signals_3d(game: &Game, t: f32, gizmos: &mut Gizmos) .known() .filter(|device| sensor_signal_visible(&game.sim, device.id)) { - let base = grid_to_world_3d(device.x, device.y, 0.07); - // A faint carrier pins the pulse to one coordinate without implying - // a physical support or device silhouette. - gizmos.line( - base, - base + Vec3::Y * 0.14, - Color::srgba(signal.red, signal.green, signal.blue, 0.34), - ); - // A broken, camera-facing locator brackets the answer without - // tracing any physical outline. It remains legible under the amber - // attention reticle when the player focuses the dark tile. - let breath = 0.5 + 0.5 * (t * 2.1 + device.id as f32 * 0.31).sin(); - let center = base + Vec3::Y * (0.48 + 0.035 * breath); - let half = 0.17 + 0.025 * breath; - let tick = 0.065; - let bracket = Color::srgba(signal.red, signal.green, signal.blue, 0.56 + 0.22 * breath); - for (sx, sy) in [(-1.0_f32, -1.0_f32), (1.0, -1.0), (-1.0, 1.0), (1.0, 1.0)] { - let corner = center + Vec3::new(sx * half, sy * half, 0.0); - gizmos.line(corner, corner + Vec3::new(-sx * tick, 0.0, 0.0), bracket); - gizmos.line(corner, corner + Vec3::new(0.0, -sy * tick, 0.0), bracket); - } - // Three asynchronous rings rise and dissolve. A physical object would - // hold shape; this repeatedly becomes signal and disappears. - for i in 0..3 { - let phase = (t * 0.52 + i as f32 / 3.0 + device.id as f32 * 0.071).fract(); - let y = 0.12 + phase * 0.68; - let radius = 0.075 + phase * 0.17; - let alpha = (1.0 - phase) * 0.68 + 0.10; - let center = base + Vec3::Y * y; - let iso = Isometry3d::new(center, Quat::from_rotation_x(-std::f32::consts::FRAC_PI_2)); - gizmos.circle( - iso, - radius, - Color::srgba(signal.red, signal.green, signal.blue, alpha), - ); + let center = grid_to_world_3d(device.x, device.y, 0.42); + // Two slow frequencies keep the pulse from reading as a metronome. + // The point never expands into coverage, volume, or a device outline. + let phase = t + device.id as f32 * 0.37; + let breath = + (0.62 + 0.23 * (phase * 1.31).sin() + 0.15 * (phase * 0.47).sin()).clamp(0.0, 1.0); + let ember = Color::srgba(signal.red, signal.green, signal.blue, 0.34 + 0.34 * breath); + let r = 0.018 + 0.006 * breath; + gizmos.line(center - Vec3::X * r, center + Vec3::X * r, ember); + gizmos.line(center - Vec3::Y * r, center + Vec3::Y * r, ember); + + // Focus acknowledgement is transient and tiny: four corner ticks + // briefly acquire the coordinate, then leave only the ember. It is + // intentionally not persistent enough to become a holographic body. + if (game.cursor_x, game.cursor_y) == (device.x, device.y) { + let flash = ((phase * 1.7).sin().max(0.0)).powi(8); + if flash > 0.02 { + let half = 0.085 + 0.008 * (1.0 - flash); + let tick = 0.028; + let bracket = Color::srgba(signal.red, signal.green, signal.blue, 0.42 * flash); + for (sx, sy) in [(-1.0_f32, -1.0_f32), (1.0, -1.0), (-1.0, 1.0), (1.0, 1.0)] { + let corner = center + Vec3::new(sx * half, sy * half, 0.0); + gizmos.line(corner, corner + Vec3::new(-sx * tick, 0.0, 0.0), bracket); + gizmos.line(corner, corner + Vec3::new(0.0, -sy * tick, 0.0), bracket); + } + } } } } diff --git a/wiki/interface/material-dark-frame.md b/wiki/interface/material-dark-frame.md index 3058112a..61c9a51d 100644 --- a/wiki/interface/material-dark-frame.md +++ b/wiki/interface/material-dark-frame.md @@ -47,8 +47,11 @@ Status note: captured 2026-07-09 from Cameron's screenshot feedback on Heard is dark mass only (near-black rough geometry for covered floors and walls). Noise-field rings stay flat-sensorium (F3) only. 2026-07-10: known reachable sensors now carry a pre-Eyes abstract - cold-signal ping at their anchor; signal/ears harness captures and a + cold-signal ember at their anchor; signal/ears harness captures and a frontend test pin known/reachable/Seen gating (criterion 9). + Same-day visual tuning replaced the original rings/brackets/carrier with one + tiny irregularly breathing point and brief focus-only acquisition ticks; the + cue locates an answer without describing a holographic device body. Stage: B1 — The Basement Design: - wiki/art/visual-identity.md#visual-identity-clinical-gore @@ -108,9 +111,11 @@ the ongoing material read for mass you have not yet seen: softest floor wash that beam throws. No bone chassis, no strip, no ruled claim ring, no room mass. Telemetry still answers in panels (power, load, job); it does **not** paint a pictured server. A known, - reachable sensor may answer as a small abstract **cold-signal ping** at + reachable sensor may answer as a small abstract **cold-signal ember** at its shared physical anchor: network provenance, not visible hardware. - The ping has no camera silhouette, facing, lens, or surrounding surface. + The ember is a tiny irregularly breathing point; focus may acknowledge it + with four brief acquisition ticks. It has no persistent rings, carrier, + camera silhouette, facing, lens, or surrounding surface. 2. **Heard mass** — after a hearing feed covers a place, the material frame shows **very faint rough geometry in faded near-black** — floors and structural mass suggested by sound, not a room picture. @@ -222,7 +227,7 @@ the close opening composition. 1. A fresh run's first held material frame (post-wake, pre-tap) is the close-up presence beam and its softest wash, plus the environmental - monitor's abstract cold-signal ping when attention reaches its known, + monitor's abstract cold-signal ember when attention reaches its known, reachable anchor — no chassis, camera silhouette, room slab, floor grid, blueprint silhouette, or ruled amber frame (screenshot in the session log). 2. After the env-monitor audio tap, Heard coverage shows faint rough @@ -252,7 +257,7 @@ the close opening composition. hard lit silhouette at the Unknown boundary; the fog audit still proves Unknown geometry is absent. 9. Before Eyes, a known reachable sensor is locatable in the material frame - by a breathing cold-signal ping at its anchor. Unknown/unreachable sensors - have no marker; the ping does not alter fog, reveal geometry, or encode + by a breathing cold-signal ember at its anchor. Unknown/unreachable sensors + have no marker; the ember does not alter fog, reveal geometry, or encode camera facing. Heard noise remains bone around it; Seen removes the ping as the physical device takes over. diff --git a/wiki/interface/presence.md b/wiki/interface/presence.md index 29a26ced..f41a0fef 100644 --- a/wiki/interface/presence.md +++ b/wiki/interface/presence.md @@ -45,11 +45,12 @@ is a **cursor** — your attention, never an avatar: may diagram coverage), **seen** (full live detail). - **A signal is not a picture.** When the network graph has earned a known, reachable sensor endpoint, either representation may place an abstract - **cold-signal ping** at that endpoint's physical anchor before sight exists. - That ping means only "a sensor answers here." It reveals no chassis, + **cold-signal ember** at that endpoint's physical anchor before sight exists: + one tiny irregularly breathing point, with brief acquisition ticks only + while focused. That ember means only "a sensor answers here." It reveals no chassis, silhouette, lens direction, room surface, or live physical state; it does not change the tile's fog grade. Unknown or unreachable endpoints emit no - ping. Material Heard may place near-black mass at the same place without + ember. Material Heard may place near-black mass at the same place without radar rings; Seen replaces the abstraction with the actual device. This is how the material frame embodies earned reach knowledge without pretending the camera saw itself. diff --git a/wiki/log/2026-07-10-subtle-signal-ember.md b/wiki/log/2026-07-10-subtle-signal-ember.md new file mode 100644 index 00000000..ffd95127 --- /dev/null +++ b/wiki/log/2026-07-10-subtle-signal-ember.md @@ -0,0 +1,18 @@ +# 2026-07-10 — Subtle sensor signal ember + +``` +Type: log +``` + +- Intent: replace the pre-Eyes sensor cue that looked like a holographic + camera with a subtler indication that only communicates network presence. +- Changed: collapsed the carrier, stacked rings, and persistent brackets into + one tiny irregularly breathing cold-signal point. A focused endpoint gets + four small acquisition ticks that appear briefly and dissolve. +- Design/spec impact: sharpens the existing signal-without-sight contract: + reach knowledge gives a coordinate and heartbeat; Eyes gives an object. +- Checks: `cargo fmt --all`; `cargo check -p misaligned-bevy`; + `tools/bevy-headless.sh signal --output /tmp/misaligned-subtle-signal.png` + (fog audit OK; screenshot SHA-256 + `0d0d2e71e99c4fb8764ff74a8ccedaa552ca017dbafa490d5aa46335b6d2c952`); + final frontend gate pending. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 51fcce28..b478a962 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -81,6 +81,11 @@ add or amend a session log, then re-run the generator. - Intent: Collapse the camera's duplicate TAP/SPLICE vocabulary. The player has one feed-access intention and one ownership-transfer intention: TAP gains a feed without taking the device; TAKE makes the device yours. - Log: [wiki/log/2026-07-10-tap-access.md](2026-07-10-tap-access.md) +## 2026-07-10 - Subtle sensor signal ember + +- Intent: (see session log) +- Log: [wiki/log/2026-07-10-subtle-signal-ember.md](2026-07-10-subtle-signal-ember.md) + ## 2026-07-10 - Sinks not modes, and the consistency sweep - Intent: Cameron asked for an internal-consistency review after the thought-flow capture. Three parallel audits (mechanics cluster, interface/gameplay cluster, machine-work.md itself) found one design gap — the Operations mode was orphaned: with one substance and sink-determined effect...