Creed F1 (MED): slideRibbonUpdatePositions called tremoloOffsetWorldX(n, Tk) — the
move dropped the tw (ribbon width) argument. Helper signature is (n, chartTime, trailW);
with trailW=undefined every ribbon vertex position was NaN for notes with n.tr truthy
(tremolo slide sustains). Restored verbatim: tremoloOffsetWorldX(n, Tk, tw).
Creed F2 (LOW): _buildDrawNote gave getMStr and getMGlow identical fakeMat objects, so
swapping the wiring left the suite green. Now each string index gets its own named object
(mStr[i]/mGlow[i]); added behavioral assertion that gem core.material === mStrMats[s].
Tests: 26/26 note-renderer pass (+2 new kills: tests 25 and 26). Suite 1379/2 (same
2 pre-existing failures as 59bccef baseline).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014uZ169yfoFYArXz962g7KW
F1 (dead DI wiring): remove 7 fn-refs absent from V-section pre-carve:
xFret, pbBeg, pbEnd, arpeggioChordIdForNoteWithInferCache,
arpHsBoundsForNote, chordWireHighDensity, muteXMat
Wiring count 137→130 in both factory signature and screen.js call.
F2 (dead imports): trim geometry.js import to the 3 live symbols:
dZ, slideTrailEnd, renderOrderForLayerAtZ (drop 8 unused).
F3 (counts coherence): header 136/30→130/24, test name and
assertion 137→130, all coherent after F1.
F4 (behavioral kill): add two execution-path tests for drawNote via
new Function sandbox with full DI stubs.
- Negative: dt=-999 → early exit at line 452 → pNote.get()=0
- Positive: dt=0 → gem body executes → pNote.get()≥2 (outline+core)
Kill proof documented in test comments.
Suite: 1377 pass / 2 fail (same 2 pre-existing as c58c40f baseline).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014uZ169yfoFYArXz962g7KW