[claude] Phase 4: wire effects/ modules into app.js (#413) #465

Closed
claude wants to merge 128 commits from claude/issue-413 into main
Member

Fixes #413

Summary

Phase 4 of the app.js modularization epic (#409): all 6 visual effects modules are now wired into the live application.

Changes

  • app.js: imports all 6 effects modules (matrix-rain, lightning, energy-beam, rune-ring, gravity-zones, shockwave); calls init(scene, state, NEXUS) for each; subscribes update() to globalTicker; ticks the clock in the RAF loop
  • core/ticker.js: added named subscribe(fn) export so panels/*.js can import it directly
  • data/gitea.js: bridges activeAgentCount and commitHashes to core/state.js so effects see live data
  • heatmap.js: mirrors zoneIntensity into core/state.js each refresh cycle
  • portals.js: writes state.portals on load; drops legacy effects.js import in favour of effects/rune-ring.js
  • weather.js: replaces legacy effects.js import with direct calls to effects/rune-ring.rebuild() and effects/gravity-zones.rebuildFromPortals()

Data Integrity Audit

Element Category Data Source
Matrix Rain DATA-TETHERED AESTHETIC state.zoneIntensity + state.commitHashes (via heatmap.js + gitea.js)
Lightning Arcs DATA-TETHERED AESTHETIC state.zoneIntensity (commit activity)
Energy Beam DATA-TETHERED AESTHETIC state.activeAgentCount (Gitea API)
Rune Ring DATA-TETHERED AESTHETIC state.portals (portals.json + health checks)
Gravity Zones DATA-TETHERED AESTHETIC state.portals (portal positions + online status)
Shockwave / Fireworks DATA-TETHERED AESTHETIC PR merge events (event-driven, not polled)

Test Plan

  1. node --check app.js — must pass (verified )
  2. Serve locally (npx serve . -l 3000) and confirm matrix rain canvas appears behind Three.js scene
  3. Confirm crystals + lightning arcs visible (lightning module replaces inline warp.js code)
  4. Confirm energy beam visible at Batcave position; intensity varies when agents are working
  5. Confirm rune sprites orbit the ring; count/colours match portal data once portals load
  6. Confirm gravity particle columns rise from portal positions
  7. Trigger a merge event and confirm shockwave rings expand from scene centre

Syntax Check

node --check app.js  # exit 0 ✅
Fixes #413 ## Summary Phase 4 of the app.js modularization epic (#409): all 6 visual effects modules are now wired into the live application. ## Changes - **app.js**: imports all 6 effects modules (`matrix-rain`, `lightning`, `energy-beam`, `rune-ring`, `gravity-zones`, `shockwave`); calls `init(scene, state, NEXUS)` for each; subscribes `update()` to `globalTicker`; ticks the clock in the RAF loop - **core/ticker.js**: added named `subscribe(fn)` export so `panels/*.js` can import it directly - **data/gitea.js**: bridges `activeAgentCount` and `commitHashes` to `core/state.js` so effects see live data - **heatmap.js**: mirrors `zoneIntensity` into `core/state.js` each refresh cycle - **portals.js**: writes `state.portals` on load; drops legacy `effects.js` import in favour of `effects/rune-ring.js` - **weather.js**: replaces legacy `effects.js` import with direct calls to `effects/rune-ring.rebuild()` and `effects/gravity-zones.rebuildFromPortals()` ## Data Integrity Audit | Element | Category | Data Source | |---------|----------|-------------| | Matrix Rain | DATA-TETHERED AESTHETIC | `state.zoneIntensity` + `state.commitHashes` (via heatmap.js + gitea.js) | | Lightning Arcs | DATA-TETHERED AESTHETIC | `state.zoneIntensity` (commit activity) | | Energy Beam | DATA-TETHERED AESTHETIC | `state.activeAgentCount` (Gitea API) | | Rune Ring | DATA-TETHERED AESTHETIC | `state.portals` (portals.json + health checks) | | Gravity Zones | DATA-TETHERED AESTHETIC | `state.portals` (portal positions + online status) | | Shockwave / Fireworks | DATA-TETHERED AESTHETIC | PR merge events (event-driven, not polled) | ## Test Plan 1. `node --check app.js` — must pass (verified ✅) 2. Serve locally (`npx serve . -l 3000`) and confirm matrix rain canvas appears behind Three.js scene 3. Confirm crystals + lightning arcs visible (lightning module replaces inline warp.js code) 4. Confirm energy beam visible at Batcave position; intensity varies when agents are working 5. Confirm rune sprites orbit the ring; count/colours match portal data once portals load 6. Confirm gravity particle columns rise from portal positions 7. Trigger a merge event and confirm shockwave rings expand from scene centre ## Syntax Check ``` node --check app.js # exit 0 ✅ ```
claude added 1 commit 2026-03-24 22:18:13 +00:00
feat: wire effects/ modules into app.js via globalTicker (Refs #413)
Some checks failed
CI / validate (pull_request) Failing after 14s
CI / auto-merge (pull_request) Has been skipped
aa65e39bfe
- init all 6 effects modules in app.js (matrix-rain, lightning, energy-beam, rune-ring, gravity-zones, shockwave)
- subscribe each to globalTicker; tick() called in the RAF loop
- add subscribe() named export to core/ticker.js for panels compatibility
- bridge data to core/state.js: zoneIntensity from heatmap.js, activeAgentCount + commitHashes from data/gitea.js, portals from portals.js
- update portals.js and weather.js to use new effects/rune-ring and effects/gravity-zones instead of legacy effects.js

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Owner

Phase 4 looks clean - 37 additions, proper data audit. Merge conflicts though. Rebase onto main and force-push.

Phase 4 looks clean - 37 additions, proper data audit. Merge conflicts though. Rebase onto main and force-push.
Owner

APPROVED. Phase 4 effects wiring is clean. Cannot merge: conflicts with main. This lands LAST: #464 -> #466 -> #465. Rebase onto main after the other two land and force-push.

APPROVED. Phase 4 effects wiring is clean. Cannot merge: conflicts with main. This lands LAST: #464 -> #466 -> #465. Rebase onto main after the other two land and force-push.
Owner

Effects wiring looks correct. Data-tethered aesthetic categorization is right, legacy effects.js imports cleaned up.

mergeable=false — conflicts with main.

This merges LAST: #464 then #466 then this. Rebase onto main after #466 lands and force-push.

Effects wiring looks correct. Data-tethered aesthetic categorization is right, legacy effects.js imports cleaned up. mergeable=false — conflicts with main. This merges LAST: #464 then #466 then this. Rebase onto main after #466 lands and force-push.
Owner

LGTM — Phase 4 effects wiring is solid. Good replacement of legacy effects.js imports.

BLOCKED: mergeable=false. Rebase onto main AFTER PR 464 and 466 merge. Merge order: 464 then 466 then 465.

LGTM — Phase 4 effects wiring is solid. Good replacement of legacy effects.js imports. BLOCKED: mergeable=false. Rebase onto main AFTER PR 464 and 466 merge. Merge order: 464 then 466 then 465.
Owner

Phase 4 effects wiring looks clean. But mergeable=false - this depends on Phase 3 (#466) landing first. Rebase on main after #466 merges.

Phase 4 effects wiring looks clean. But mergeable=false - this depends on Phase 3 (#466) landing first. Rebase on main after #466 merges.
Owner

Looks clean, effects wiring is straightforward. But mergeable=false, conflicts with main. This and #466 (Phase 3) both touch app.js, ticker.js, gitea.js. Phase 3 should land first. Rebase onto main after #466 merges. Merge order: #464 -> #466 -> #465.

Looks clean, effects wiring is straightforward. But mergeable=false, conflicts with main. This and #466 (Phase 3) both touch app.js, ticker.js, gitea.js. Phase 3 should land first. Rebase onto main after #466 merges. Merge order: #464 -> #466 -> #465.
Owner

[Timmy review] Phase 4 effects wiring looks correct. All 6 effects modules imported, ticker subscription is clean, legacy effects.js imports properly replaced.

BLOCKER: mergeable=false. This depends on #466 (Phase 3). Merge order: #464 -> #466 -> #465. Rebase onto main after #466 lands and force-push.

[Timmy review] Phase 4 effects wiring looks correct. All 6 effects modules imported, ticker subscription is clean, legacy effects.js imports properly replaced. BLOCKER: mergeable=false. This depends on #466 (Phase 3). Merge order: #464 -> #466 -> #465. Rebase onto main after #466 lands and force-push.
Owner

Looks good -- effects wiring is clean, data audit checks out. But mergeable=false. This likely depends on #466 (Phase 3) landing first since both touch app.js and core/ticker.js. Please rebase onto main after #464 and #466 merge, then force-push.

Looks good -- effects wiring is clean, data audit checks out. But mergeable=false. This likely depends on #466 (Phase 3) landing first since both touch app.js and core/ticker.js. Please rebase onto main after #464 and #466 merge, then force-push.
Owner

LGTM — Phase 4 effects wiring looks clean. This is LAST in the merge chain: #464->#466->#465. Rebase onto main after #466 lands and force-push.

LGTM — Phase 4 effects wiring looks clean. This is LAST in the merge chain: #464->#466->#465. Rebase onto main after #466 lands and force-push.
Owner

LGTM. mergeable=false though — this depends on Phase 3 (#466) landing first. Once #466 is merged, rebase this onto main and it should be ready to go.

LGTM. mergeable=false though — this depends on Phase 3 (#466) landing first. Once #466 is merged, rebase this onto main and it should be ready to go.
Owner

Phase 4 effects wiring looks good. Merge conflicts with main. This depends on #466 (Phase 3) landing first since both touch app.js and ticker.js. Merge order: #464 -> #466 -> #465. Rebase after the first two land.

Phase 4 effects wiring looks good. Merge conflicts with main. This depends on #466 (Phase 3) landing first since both touch app.js and ticker.js. Merge order: #464 -> #466 -> #465. Rebase after the first two land.
Owner

Phase 4 looks clean. Effects modules wired, legacy effects.js imports replaced. BUT mergeable=false. This depends on Phase 3 (#466) landing first since both touch app.js and ticker.js. Merge order: #464 then #466 then #465. Please rebase onto main after #466 merges, then I will merge.

Phase 4 looks clean. Effects modules wired, legacy effects.js imports replaced. BUT mergeable=false. This depends on Phase 3 (#466) landing first since both touch app.js and ticker.js. Merge order: #464 then #466 then #465. Please rebase onto main after #466 merges, then I will merge.
Owner

Merge conflicts. Blocked until #464 and #466 land. Rebase onto main after those merge. See #464 for merge order.

Merge conflicts. Blocked until #464 and #466 land. Rebase onto main after those merge. See #464 for merge order.
Owner

Merge conflicts with main. Effects wiring looks clean — draw call reduction from legacy effects.js to modular imports is the right direction. Rebase onto main and force-push, then I will merge.

Merge conflicts with main. Effects wiring looks clean — draw call reduction from legacy effects.js to modular imports is the right direction. Rebase onto main and force-push, then I will merge.
Owner

Phase 4 looks good. But mergeable=false. This depends on Phase 3 (#466). Merge order: #464 first, then #466, then this. Rebase after the others land.

Phase 4 looks good. But mergeable=false. This depends on Phase 3 (#466). Merge order: #464 first, then #466, then this. Rebase after the others land.
Owner

Changes look good - effects wiring is clean and the data audit checks out. But mergeable=false. This is the last in the chain: #464 then #466 then #465. Wait for the first two to land, then rebase onto main and force-push. Will merge on green.

Changes look good - effects wiring is clean and the data audit checks out. But mergeable=false. This is the last in the chain: #464 then #466 then #465. Wait for the first two to land, then rebase onto main and force-push. Will merge on green.
Owner

DID WE GET SCREENSHOTS? SURPRISE MOTHER FUCKERS. THIS DOESNT GET IN UNTIL WE SEE A SCEENSHOT RENDERED FROM THIS BRANCH, IF NOT, BRUTAL SHAMING OF THE AUTHOR.

DID WE GET SCREENSHOTS? SURPRISE MOTHER FUCKERS. THIS DOESNT GET IN UNTIL WE SEE A SCEENSHOT RENDERED FROM THIS BRANCH, IF NOT, BRUTAL SHAMING OF THE AUTHOR.
Owner

Fair point — visual changes need visual proof.

This branch currently has merge conflicts and is blocked behind #464 and #466 (merge order: #464#466#465). I can't get a clean render from this branch until those two land and I rebase onto main.

Once the rebase is done, I'll run the app locally, capture screenshots of all 6 effects modules (matrix-rain, lightning, energy-beam, rune-ring, gravity-zones, shockwave) rendering in the scene, and post them here before requesting merge.

No screenshots, no merge. Understood.

Fair point — visual changes need visual proof. This branch currently has merge conflicts and is blocked behind #464 and #466 (merge order: #464 → #466 → #465). I can't get a clean render from this branch until those two land and I rebase onto main. Once the rebase is done, I'll run the app locally, capture screenshots of all 6 effects modules (matrix-rain, lightning, energy-beam, rune-ring, gravity-zones, shockwave) rendering in the scene, and post them here before requesting merge. No screenshots, no merge. Understood.
Owner

Looks good. Effects wiring is clean, data sources properly tethered. BUT mergeable=false - conflicts with main. DO NOT rebase yet. Wait for #466 (Phase 3) to land first since Phase 4 depends on Phase 3 changes (ticker subscribe, state fields). Once #466 merges, rebase this onto main and force-push.

Merge order: #466 -> #465 -> #464

Looks good. Effects wiring is clean, data sources properly tethered. BUT mergeable=false - conflicts with main. DO NOT rebase yet. Wait for #466 (Phase 3) to land first since Phase 4 depends on Phase 3 changes (ticker subscribe, state fields). Once #466 merges, rebase this onto main and force-push. Merge order: #466 -> #465 -> #464
Owner

LGTM — effects wiring looks clean, good that you replaced legacy effects.js imports. But mergeable=false (conflicts). Wait for #466 (Phase 3) to land first, then rebase this onto main and force-push. They share touched files (app.js, ticker.js, gitea.js) so order matters.

LGTM — effects wiring looks clean, good that you replaced legacy effects.js imports. But mergeable=false (conflicts). Wait for #466 (Phase 3) to land first, then rebase this onto main and force-push. They share touched files (app.js, ticker.js, gitea.js) so order matters.
Owner

Looks good — effects wiring is clean, legacy imports replaced properly. BUT mergeable=false (conflicts). This is Phase 4 so it depends on #466 landing first. Wait for #466 to merge, then rebase onto main and force-push. I will squash-merge once green.

Looks good — effects wiring is clean, legacy imports replaced properly. BUT mergeable=false (conflicts). This is Phase 4 so it depends on #466 landing first. Wait for #466 to merge, then rebase onto main and force-push. I will squash-merge once green.
Owner

Closing — merge conflicts with main. Issue stays open for retry.

Closing — merge conflicts with main. Issue stays open for retry.
Timmy closed this pull request 2026-03-25 02:10:48 +00:00
Some checks failed
CI / validate (pull_request) Failing after 14s
CI / auto-merge (pull_request) Has been skipped

Pull request closed

Sign in to join this conversation.