Skip to content

Daemon warm-path hangs indefinitely on PHP/WordPress repo (stalls at ~12 files, CPU pegged ~185%); gortex index works fine #113

@mopristas

Description

@mopristas

Summary

gortex daemon start hangs permanently when warming a PHP/WordPress plugin repo (~838 files). The daemon stalls at exactly 12 of 825 files with CPU pegged at ~185% indefinitely, blocking the shared daemon's status socket. The standalone indexer (gortex index <path>) processes the same repo fully in under 1 second (825 files / 9.4k nodes / 31k edges).

Version

gortex v0.47.0+775d8bb3
commit:  775d8bb3
built:   2026-06-16T22:36:07Z
go:      go1.26.4
os/arch: darwin/arm64

macOS 15.x, Apple Silicon (M-series).

Reproduction steps

  1. Clone mirlindv/nauticdb (PHP/WordPress API stack, ~838 files, ~392 .php files, multiple custom plugins).
  2. gortex track ~/nauticdb — repo appears in config.
  3. gortex daemon start --detach
  4. Watch daemon status: progress freezes at 12/825 files, CPU stays at ~185% indefinitely (verified after 15+ minutes — never advances).
  5. Other repos in the same daemon (Go, PHP/WordPress yachtsummary at ~1.5k files) warm correctly.

gortex index ~/nauticdb succeeds immediately: 825 files indexed / 9.4k nodes / 31k edges / <1s.

Behaviour

  • Daemon log shows serverstack: resolve-time LSP hot path stage is active when the hang begins.
  • The hang appears tied to the live semantic enrichment path in the daemon warm phase — the standalone indexer (which skips live LSP enrichment) is unaffected.
  • No progress messages after the stall point; the status socket becomes slow/unresponsive while CPU is pegged, poisoning the shared multi-repo daemon.

Repo structure (plugin directories in walk order, first ~12 files)

wp-content/plugins/
  ai-yacht-chat/       # first in alpha walk
  claw_api/
  custom_api/
  dma-merge-tool/
  dma_yachts_api/
  mo_filter/
  mo_yachtfolio_import/
  mo_yachtsummary_connector/
  nauticdb/            # core plugin
  ...

The stall is consistent at walk-order files 1-12 across multiple daemon restarts. The exact culprit file has not been isolated (each bisect attempt takes 5-15 minutes per test cycle with daemon restart risk).

Attempted workarounds

Workaround Result
semantic: false + enrich_on_watch: false in per-repo .gortex.yaml No effect — daemon ignores per-repo semantic toggle during warm phase
exclude: the three largest plugin dirs (mo_filter/, propscraper/, uploads/) No effect
Cloning locally (vs. Google Drive mount) Stall persists on local NVMe clone
gortex daemon install-service (launchd) Unrelated breakage (TCC + EOF) — not relevant to this bug

No --no-semantic flag exists on daemon start (only on gortex mcp), so global semantic-off via CLI is not available.

Expected behaviour

The daemon should either:

  1. Warm the repo (preferably respecting semantic: false in per-repo .gortex.yaml to skip LSP enrichment), or
  2. Time-out the resolve-time enrichment for a single file and continue past it, rather than hanging the entire warm pass.

Impact

Cannot add this repo to the shared multi-repo daemon. Workaround: run gortex index <path> on-demand (works fine). Cross-repo call-graph queries can't include this codebase.

Additional context

  • Three other repos in the same daemon warm cleanly: a Go app (~8.5k files), a PHP/WordPress site (~1.5k files / 19.8k nodes), a smaller WP site (~1.2k files / 19.8k nodes).
  • The nauticdb PHP plugins contain some unusual patterns: MadelineProto IPC (Telegram gateway), a custom SCIP-like type system, and large auto-generated PHP files. One of these may be triggering an edge-case in the LSP resolve pass.
  • Happy to share repo access or a minimal reproducer if helpful.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions