Spot the bug - #133: Dungeon Quest Runner

Why does my dungeon quest runner always declare total victory?

function runDungeonEncounter(hero, monsters) {
  let journal = [];
  let stamina = hero.baseStamina;

  function processBattlePhase(turnIndex) {
    if (turnIndex >= monsters.length) {
      return { cleared: true, rating: 'S-Rank' };
    }

    const foe = monsters[turnIndex];
    journal.push(`Facing ${foe.name} on floor ${turnIndex + 1}`);

    try {
      if (foe.trapPower > stamina) {
        throw new Error(`Exhausted by ${foe.name}'s trap!`);
      }
      stamina -= foe.trapPower;
      
      if (hero.attackPower < foe.defense) {
        throw new RangeError(`Blocked by armor of ${foe.name}!`);
      }
      journal.push(`Defeated ${foe.name}!`);
      return processBattlePhase(turnIndex + 1);
    } catch (err) {
      journal.push(`Defeat logged: ${err.message}`);
      throw err;
    } finally {
      journal.push(`Wrapping turn ${turnIndex + 1}`);
      return { cleared: true, rating: 'F-Rank', journal };
    }
  }

  try {
    return processBattlePhase(0);
  } catch (err) {
    return { cleared: false, reason: err.message, journal };
  }
}

Reply with what is broken and how you would fix it.