Fixes gt-e5o: When a rig has its own mayor/ directory, workspace
detection now continues searching upward for primary markers.
Changes:
- Add AlternativePrimaryMarker (mayor/config.json) to distinguish
town-level mayor from rig-level mayor clones
- Continue searching after finding secondary marker (mayor/) to
prefer primary matches higher in the tree
- Return the first secondary match only if no primary is found
This fixes role detection for polecats/refinery/witness when running
from within a rig that has its own mayor/ clone.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Detection:
- Find() walks up from given directory looking for markers
- Primary marker: config/town.json
- Secondary marker: mayor/ directory
- Follows symlinks using filepath.EvalSymlinks
Functions:
- Find, FindOrError: from given directory
- FindFromCwd, FindFromCwdOrError: from current directory
- IsWorkspace: check if directory is workspace root
Closes gt-f9x.2
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>