What's the issue with this running script?

local context = game:GetService("ContextActionService")
local runbind = "RunBind"
local Player = game.Players.LocalPlayer
local Character = workspace:WaitForChild(Player.Name)
local Humanoid = Character:WaitForChild('Humanoid')

local RunAnimation = Instance.new('Animation')
RunAnimation.AnimationId = 'rbxassetid://9980814558'
RAnimation = Humanoid:LoadAnimation(RunAnimation)
RAnimation:Stop()	

Running = workspace.Running.Value

function Handler(BindName, InputState)
	if InputState == Enum.UserInputState.Begin and BindName == runbind and Humanoid.WalkSpeed == 16 and Running == false or Humanoid.MoveDirection.Magnitude > 0 then
		Running = true
		Humanoid.WalkSpeed = 25
	elseif InputState == Enum.UserInputState.End and BindName == runbind and Humanoid.WalkSpeed == 25 and Running == true or Humanoid.MoveDirection.Magnitude == 0
	then
		Running = false
		if RAnimation.IsPlaying then
			RAnimation:Stop()
		end
		Humanoid.WalkSpeed = 16
	end
end

if Humanoid.MoveDirection.Magnitude > 0 then
	if Humanoid.WalkSpeed == 25 and not RAnimation.IsPlaying then
		RAnimation:Play()
	else
		if Humanoid.WalkSpeed == 16 and RAnimation.IsPlaying or Humanoid.MoveDirection.Magnitude == 0 then
			RAnimation:Stop()
		end
	end

end

context:BindAction(runbind , Handler, true, Enum.KeyCode.LeftShift)
context:SetPosition(runbind, UDim2.new(.5, 0, .3, 0))
local button = context:GetButton(runbind)
button.Size = UDim2.new(.3, 0, .4, 0)
context:SetTitle(runbind, "Run")

value doesn’t change when holding shift.

the variable Running will only change for this script, you are making a copy of the Running.Value where you probably want a reference. Try changing your Running = true to workspace.Running.Value = true

As well the if move direction magnitude check will only run when the script starts, it might be worth it to put that as part of the context action.

How exactly? Characterssssssssss

Variables are created as either a copy or a reference, base types (number, string, boolean, Vectors) are copied where instances and tables are referenced. A reference can change elsewhere but a copy is just that, a copy which can be changed on it’s own without effecting the original.

-- base type copy
local old_number: number = 100
local new_number: number = old_number
print(old_number, new_number) -- 100, 100

-- changing the new_number keeps the old
new_number = 50
print(old_number, new_number) -- 100, 50


-- table type reference
local old_table: {number} = {100, 80, 95}
local new_table: {number} = old_table
print(old_table[1], new_table[1]) -- 100, 100

-- changing the new table also changes the old
new_table[1] = 50
print(old_table[1], new_table[1]) -- 50, 50

Your script is creating a variable copy here since you are getting the workspace.Running.Value which is a base type of boolean.

Running = workspace.Running.Value

To get a reference instead you could declare your variable without the .Value or just use workspace.Running.Value elsewhere in the code.

function Handler(BindName, InputState)
	if InputState == Enum.UserInputState.Begin and BindName == runbind and Humanoid.WalkSpeed == 16 and workspace.Running.Value == false or Humanoid.MoveDirection.Magnitude > 0 then
		workspace.Running.Value = true
		Humanoid.WalkSpeed = 25
	elseif InputState == Enum.UserInputState.End and BindName == runbind and Humanoid.WalkSpeed == 25 and workspace.Running.Value == true or Humanoid.MoveDirection.Magnitude == 0
	then
		workspace.Running.Value = false
		if RAnimation.IsPlaying then
			RAnimation:Stop()
		end
		Humanoid.WalkSpeed = 16
	end
end