## TL;DR
Whether the filename matters depends on the tool: rails, flyway, and dbmate order by filename, so rename the file to a correct timestamp; alembic and django order by the revision graph, so fix down_revision instead and leave the filename alone. If the mis-ordered file already applied somewhere, do not touch history: fix forward with a new migration.

## The query

```text
agent committed the migration file with a wrong timestamp prefix so it sorts before an older migration
```

## Use this when

- Migration file sorts before an older migration due to a bad timestamp
- Wrong timestamp prefix on a committed migration
- File order disagrees with intended apply order
- An agent generated a migration with a stale timestamp

## Not for

- Two migrations that genuinely conflict (resolve the conflict, not the name)
- A mis-ordered migration that already applied everywhere (leave history alone)
- Graph-ordered tools where filenames are cosmetic (fix the graph)

## Steps

### 1. Determine whether your tool orders by filename

Rails (db/migrate), flyway (V__ prefixes), dbmate, knex: filename order is apply order. Alembic, django: the revision graph (down_revision / dependencies) is apply order and filenames are cosmetic.

Expected output: the answer decides the fix. Guessing wrong here either does nothing or rewrites history.

### 2. Case A: filename-ordered tool, file not yet applied - rename it

```bash
git mv db/migrate/20240101_[name].rb db/migrate/[correct timestamp]_[name].rb
```

For flyway, rename V12__ to the correct version number. For rails, also check the class name still matches the filename convention.

Expected output: the file sorts in the intended position and the next migrate applies it in the right order.

### 3. Case B: graph-ordered tool - fix the chain, ignore the filename

Edit down_revision (alembic) or dependencies (django) to point at the true parent. The filename can stay wrong forever: it is cosmetic.

Expected output: alembic history / migrate --plan shows the intended order regardless of filenames.

### 4. Case C: it already applied somewhere - fix forward

If any environment applied the file in the wrong position, renaming or re-chaining rewrites history those environments recorded. Instead, write a NEW migration that produces the intended end state, and leave the old file exactly as it applied.

Expected output: history stays consistent everywhere, and the schema converges via the new migration.

### 5. Prevent it: generate timestamps at commit time

The agent's procedure: migration filenames get their timestamp when created, never copied from a template or an old branch. A CI check can flag files whose timestamp is older than the branch point.

Expected output: stale timestamps stop entering the repo.

## Tool compatibility

rails 6.1-8.x, flyway 9/10, dbmate 1/2, alembic 1.x, django 3.2-5.x. The filename-vs-graph distinction is per-tool as described.

## Variant phrasings

### migration file wrong timestamp sorts before older

Step 1 decides: rename for filename-ordered tools, re-chain for graph-ordered ones.

### rails migration timestamp out of order

Step 2: git mv to the correct timestamp; rails orders by the filename prefix.

### alembic migration filename wrong order

Step 3: filenames are cosmetic in alembic; fix down_revision instead.

## Why it happens

Two different ordering mechanisms exist because the tools model history differently: filename-ordered tools treat the directory listing as the chain, graph-ordered tools treat metadata inside the files as the chain. A wrong timestamp only breaks the first kind, which is why the fix depends on the tool rather than the symptom.

## Edge cases

- Renaming a rails file changes its version (the timestamp IS the version): environments that applied the old timestamp now have a "missing" migration. Only rename before anything applies.
- Flyway version numbers must sort correctly as versions, not strings: V9 vs V10 sorts wrong lexicographically in some setups; use consistent zero-padding.
- When both the timestamp and the chain are wrong, fix the chain first (it is the real order), then the filename for readability.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_MuiCpJFElqKVS01lKKavBA
