SIGN IN SIGN UP

store: Persist postponed index creation as a once-only operation

Track postponed-index creation in a new `postponed_indexes_created`
column on `subgraphs.deployment` so the decision survives restarts and
external index cleanup. The runner already gates creation on proximity
to chain head; this makes the gate persistent.

Two problems with the prior behavior are fixed:

1. An external process removes unused indexes. Because every call used
   `CREATE INDEX CONCURRENTLY IF NOT EXISTS` and we re-entered
   `create_postponed_indexes` on every restart, manually-dropped
   indexes were recreated. The flag now short-circuits the call after
   the first successful creation.

2. `start_subgraph` called `create_postponed_indexes` eagerly on every
   restart, including immediately after a graft when the deployment is
   far below chain head. That call is removed; the runner-side path
   (already gated by `close_to_chain_head`) is now the only trigger.

The migration sets the flag to TRUE for deployments where
`synced_at IS NOT NULL`, since those already had their postponed
indexes created under the old code path.

Also removes the redundant `WritableStore::postponed_indexes_created`
AtomicBool: the runner's in-memory guard already limits calls to at
most one per restart, and the DB is now the single source of truth.
D
David Lutterkort committed
74cf7c0a05a9e4c00d6775b06c9cd63aa5117d4c
Parent: ffc58a7