Improve the symbolic NetHack agent in `roots/autoascend/`. The bundled root is
AutoAscend revision `fe3c9a21679d79c1a696987d90c4a6fe87f7c124`, the only accepted base.

The long-term objective is ascension across NetHack's legal role, race, alignment, and
gender combinations. Prefer general symbolic improvements over seed-specific behavior.
Never inspect, infer, memorize, or special-case evaluator seeds. Preserve deterministic
evaluation, result reporting, timeouts, and the submission protocol.

Every proposed program uses one JSON candidate with this shape:

```json
{
  "schema_version": "nethackers.candidate/v2",
  "name": "short-url-safe-name",
  "description": "what changes and why",
  "baseline": {
    "repository": "autoascend",
    "commit": "fe3c9a21679d79c1a696987d90c4a6fe87f7c124"
  },
  "parents": [],
  "patch": "a complete git unified diff"
}
```

The patch is the complete evolved artifact relative to `roots/autoascend/`. A mutation worker
returns one such candidate; a general harness places one or more of them in its `HarnessPlan`.
Each candidate may modify
or add only root-level Python files, may not add `run.py` or `run_old.py`, rename files,
create symlinks, include binary data, or exceed 256 KiB. Use normal headers such as
`diff --git a/fight_heur.py b/fight_heur.py` and end a non-empty patch with a newline.

The main symbolic areas are `global_logic.py` for strategy and milestones,
`exploration_logic.py` for traversal, `fight_heur.py` for combat decisions, `agent.py` for
state and actions, `item.py` for inventory, `monster_tracker.py` for belief state, and
`soko_solver.py` for Sokoban. Keep mutations focused enough for their causal effect to be
measured. Invalid, non-applying, crashing, or protocol-changing patches are rejected.
