---
title: "MGS3032: an unordered share of one claimable file"
description: Fires when a job is forked with a write path that names the same single literal file, with a diff driver, as another live job's write path in a different checkout, and neither job is ordered against the other by parent, child, or depends_on. The fork is refused; claim a declaration, add --depends-on, or fold the work into the holder.
tags: [MGS3032, jobs, leases, write paths, fork, agents, claims, depends_on]
---

# MGS3032: an unordered share of one claimable file

`magus job fork`, the `client` tool (`magus\job.put`) and a magusfile's `magus\job.put` refused a job because
one of its write paths and another live job's write path, held in a different
checkout, name the same file, and nothing orders the two jobs against each other:

```text
[MGS3032] job: wave/b declares "magusfile.buzz", and wave/a (running, updated
  4m3s ago) already holds "magusfile.buzz". Both are live and neither is the
  other's parent, child, or depends_on partner, so magusfile.buzz has one
  owner unless the rows say otherwise. wave/a has touched none yet in it so
  far. Claim `magusfile.buzz#<declaration>` on both rows, add `--depends-on
  wave/a` to wave/b, or fold wave/b into wave/a
```

Nothing was written to the job store.

## Why

A whole-file write path claims the whole file, and two whole-file leases on
one file both read "mine wins": neither is ever refused, which is what makes
the whole-file spelling look free. It is not free once the file is genuinely
shared between two agents working at once, and the plan has three ways to say
so: a declaration claim, a `depends_on` edge, or one job instead of two. This
refusal is the fork-time cost that makes naming one of those the cheaper
choice. It fires only when magus can prove the fact: the two write paths name
one literal file (no glob, no directory, no project root), that file has a
diff driver so a declaration claim on it could actually be graded, and
neither row's parent chain nor `depends_on` already sequences the pair.

## What is refused

- **Two whole-file entries on one file**, held live in two different
  checkouts, with neither job the other's parent, child, or `depends_on`
  predecessor.
- **A whole-file entry against a claim on that file**: `run.go` here and
  `run.go#executeStages` there still collide, since the whole-file entry
  covers every declaration.

## What is not refused

- **A glob, a directory, or a project root.** Only a single literal file is
  judged here; the overlap report and
  [MGS3018](MGS3018.md) cover the rest.
- **A file with no diff driver** (`.txt`, `.json`, `.yaml` unless you have
  registered one). Nothing can grade a declaration of it, so the pair is
  recorded, not refused; `depends_on` is the only move.
- **Two claims on different declarations of one file** (`run.go#A` and
  `run.go#B`): that is exactly what a claim is for.
- **A pair already ordered**: a parent and its child, or two jobs joined by
  `depends_on`, directly or through any number of hops, in either direction.
- **Two rows held in the same checkout, or a row not yet taken into one**
  (`CheckoutRoot` empty). That is what
  [`RefuseSharedCheckout`](../../../guides/integrations/agents/leases.md) and
  `write_proof: overlapping` already watch; sharing a file there stays an
  advisory the orchestrator that declared both rows can act on.
- **A holder blocked on `depends_on`.** A blocked row owns none of its write
  paths yet, so it cannot collide today; the fork that unblocks it runs this
  same check again, against whatever holds the file then.
- **A holder whose job has exited.** Its holder returned, so its editing is
  over; the row stays until `job wait` grades it or its work lands on the
  base, but it holds no file against a new fork.

## What to do

Claim a declaration on both rows, so the two jobs partition the file instead
of racing on it:

```sh
magus job fork wave/a --write-paths magusfile.buzz#lint_rules
magus job fork wave/b --write-paths magusfile.buzz#lint
```

Or sequence them:

```sh
magus job fork wave/b --write-paths magusfile.buzz --depends-on wave/a
```

Or fold the work into the job that already holds the file.

## See also

- [Leases](../../../guides/integrations/agents/leases.md): write paths, claims, and what the guard enforces.
- [MGS3031](MGS3031.md): a declaration claim nothing can grade.
- [MGS3018](MGS3018.md): a directory as a job write path.
