skills/ue-gas-debugger/SKILL.md
Debug GAS (Gameplay Ability System) issues including ability activation failures, tag queries, attribute modifications, and effect application. Use when troubleshooting ability bugs, investigating GAS state, or tracing gameplay effect flow. Triggers on "GAS debug", "ability not activating", "gameplay tag issue", "attribute problem", "effect not applying", "ability system debug".
npx skillsauth add sipherxyz/universal-ue-skills ue-gas-debuggerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Debug Gameplay Ability System issues with systematic analysis and tracing.
Checklist:
## Activation Failure Diagnosis
### 1. Ability Granted?
Check: `AbilitySystemComponent->GetActivatableAbilities()`
- [ ] Ability class is in the list
- [ ] Ability spec handle is valid
### 2. Can Activate?
Check: `Ability->CanActivateAbility()`
- [ ] Cooldown not active (check cooldown tag)
- [ ] Cost can be paid (check resource attributes)
- [ ] No blocking tags present
- [ ] Required tags present
### 3. Tag Analysis
```cpp
// Current tags on ASC
FGameplayTagContainer OwnedTags;
ASC->GetOwnedGameplayTags(OwnedTags);
// Ability's blocking tags
FGameplayTagContainer BlockingTags = Ability->ActivationBlockedTags;
// Check intersection
if (OwnedTags.HasAny(BlockingTags)) {
// Blocked by tags
}
**Debug Commands:**
Log LogAbilitySystem VeryVerbose Log LogGameplayEffects VeryVerbose
ShowDebug AbilitySystem AbilitySystem.Debug.NextCategory AbilitySystem.Debug.NextTarget
### 2. Gameplay Effect Not Applying
**Checklist:**
```markdown
## Effect Application Failure
### 1. Application Attempt
```cpp
// Verify ApplyGameplayEffect is called
FGameplayEffectSpecHandle SpecHandle = ASC->MakeOutgoingSpec(EffectClass, Level, Context);
if (SpecHandle.IsValid()) {
FActiveGameplayEffectHandle ActiveHandle = ASC->ApplyGameplayEffectSpecToSelf(*SpecHandle.Data.Get());
// Check ActiveHandle validity
}
// Check ApplicationTagRequirements
FGameplayTagContainer TargetTags;
Target->GetOwnedGameplayTags(TargetTags);
// RequireTags - target must have ALL
// IgnoreTags - target must have NONE
// Check for immunity tags
if (ASC->HasMatchingGameplayTag(ImmunityTag)) {
// Effect blocked by immunity
}
### 3. Attribute Not Changing
**Checklist:**
```markdown
## Attribute Modification Failure
### 1. Attribute Exists
```cpp
// Verify attribute is replicated/valid
if (AttributeSet->GetHealthAttribute().IsValid()) {
float CurrentValue = AttributeSet->GetHealth();
}
// Check active modifiers
TArray<FActiveGameplayEffectHandle> ActiveEffects;
ASC->GetActiveEffectsWithAllTags(EffectTags, ActiveEffects);
for (auto& Handle : ActiveEffects) {
// Inspect modifiers
const FActiveGameplayEffect* AGE = ASC->GetActiveGameplayEffect(Handle);
}
// Check PreAttributeChange / PostGameplayEffectExecute
// Values may be clamped to valid range
void UMyAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue)
{
if (Attribute == GetHealthAttribute()) {
NewValue = FMath::Clamp(NewValue, 0.f, GetMaxHealth());
}
}
### 4. Tag Mismatch Issues
**Diagnosis:**
```cpp
// Dump all tags on an actor
void DebugDumpTags(UAbilitySystemComponent* ASC)
{
FGameplayTagContainer AllTags;
ASC->GetOwnedGameplayTags(AllTags);
for (const FGameplayTag& Tag : AllTags) {
UE_LOG(LogTemp, Log, TEXT("Tag: %s"), *Tag.ToString());
}
}
// Check specific tag query
FGameplayTagQuery Query = FGameplayTagQuery::MakeQuery_MatchAllTags(RequiredTags);
bool bMatches = Query.Matches(OwnedTags);
// In DefaultEngine.ini or runtime
[Core.Log]
LogAbilitySystem=VeryVerbose
LogGameplayEffects=VeryVerbose
LogGameplayTags=Verbose
// Add to USipherAbilitySystemComponent
void USipherAbilitySystemComponent::DebugLogAbilityActivation(const UGameplayAbility* Ability, bool bSuccess)
{
#if !UE_BUILD_SHIPPING
if (bSuccess) {
UE_LOG(LogSipherGAS, Log, TEXT("[%s] Ability ACTIVATED: %s"),
*GetOwner()->GetName(), *Ability->GetName());
} else {
FGameplayTagContainer BlockingTags;
// ... gather blocking info
UE_LOG(LogSipherGAS, Warning, TEXT("[%s] Ability BLOCKED: %s - Tags: %s"),
*GetOwner()->GetName(), *Ability->GetName(), *BlockingTags.ToString());
}
#endif
}
Displays:
Navigate with:
AbilitySystem.Debug.NextCategory - Cycle categoriesAbilitySystem.Debug.NextTarget - Cycle targets// Enable in editor
' (apostrophe) key → GAS category
// Shows:
- Ability status
- Effect timers
- Tag state
- Attribute bars
## Ability Activation Trace: {AbilityName}
### Request
- Timestamp: {Time}
- Source: {Actor}
- Trigger: {Input/Event/Passive}
### Pre-Activation State
- Cooldown Active: {Yes/No} ({Remaining}s)
- Cost Available: {Yes/No} ({Current}/{Required})
- Blocking Tags: {TagList}
- Required Tags: {TagList}
### Result
- Activated: {Yes/No}
- Failure Reason: {Reason}
### Post-Activation State
- Tags Granted: {TagList}
- Effects Applied: {EffectList}
## Effect Application Trace: {EffectName}
### Request
- Timestamp: {Time}
- Source: {Actor}
- Target: {Actor}
- Level: {N}
### Pre-Application State
- Target Tags: {TagList}
- Existing Stacks: {N}
- Immunity Tags: {TagList}
### Modifiers Calculated
| Attribute | Operation | Base | Final |
|-----------|-----------|------|-------|
| {Attr} | {Op} | {N} | {N} |
### Result
- Applied: {Yes/No}
- Handle: {Handle}
- Failure Reason: {Reason}
// Remove blocking tags on respawn
void ASipherCharacter::Respawn()
{
AbilitySystemComponent->RemoveLooseGameplayTag(FGameplayTag::RequestGameplayTag("State.Dead"));
AbilitySystemComponent->RemoveActiveEffectsWithGrantedTags(DeathEffectTags);
}
// Ensure stacking is configured
StackingType = EGameplayEffectStackingType::AggregateBySource;
StackLimitCount = 5; // Must be > 1 for stacking
// Check for missing max attribute initialization
void UMyAttributeSet::InitFromMetaDataTable(const UDataTable* DataTable)
{
// Initialize max values BEFORE current values
MaxHealth = InitialMaxHealth;
Health = MaxHealth; // Now clamping works correctly
}
Check these common issues:
FSipherAbilitySpecQueueItem data not passed correctlydevelopment
This skill should be used when implementing features in isolation using git worktrees. Triggers on "create worktree", "isolated workspace", "parallel development", or when starting implementation that should not affect main workspace.
testing
Manage VFX team issues on GitHub Projects - timeline scheduling, status updates, member commit checks, bulk assign. Use when managing VFX team project board, adding issues to timeline, checking member progress, or bulk-updating issue fields.
tools
Generate C++ validation rules from JSON definitions. Use when team updates ValidationRules.json or asks to add/modify validation rules.
development
Check codebase for Microsoft Xbox XR (Xbox Requirements) compliance issues. Scans for account picker, cloud saves, achievements, Quick Resume, and Xbox certification requirements. Use before console submission or when preparing for Microsoft certification. Triggers on "XR", "Xbox certification", "Microsoft compliance", "Xbox cert", "Xbox requirements", "GDK compliance".