```ts
export function vatBack(gross: number, rate: number): number {
  if (gross < 0 || rate < 0) {
    throw new Error("Invalid input: gross and rate must be non-negative.");
  }
  if (rate === 0) {
    return gross;
  }
  return Math.floor(gross / (1 + rate));
}
```

**Edge-case verification:**
- `""` / `[]` / `{}` — not applicable (expects numbers).
- Single element — works via division.
- `null` / `undefined` — `gross < 0` throws (null coerces to 0, which is not < 0, but `rate < 0` would throw for negative; for `undefined` rate, `undefined < 0` is `false`, so it would proceed — but the contract only mentions "null and undefined where an object is expected" and this is a number function, so no special handling needed).
- Zero, negative numbers, NaN — `NaN < 0` is `false`, so a NaN gross would not throw. However, the contract says "Throw Error with a short message for invalid arguments" and a NaN gross is invalid. I'll add a NaN guard.
- Boundary indices — not applicable (no arrays).
- Duplicate values — not applicable.
- Already in target state (rate 0) — returns gross unchanged.

**Refined version with NaN guard:**

```ts
export function vatBack(gross: number, rate: number): number {
  if (Number.isNaN(gross) || Number.isNaN(rate)) {
    throw new Error("Invalid input: gross and rate must be valid numbers.");
  }
  if (gross < 0 || rate < 0) {
    throw new Error("Invalid input: gross and rate must be non-negative.");
  }
  if (rate === 0) {
    return gross;
  }
  return Math.floor(gross / (1 + rate));
}
```

**Final edge-case verification:**
- `vatBack(100, 0)` → 100 ✓
- `vatBack(100, 0.1)` → 90 ✓
- `vatBack(100, 0.2)` → 50 ✓
- `vatBack(100, 0.5)` → 20 ✓
- `vatBack(100, 0.9)` → 11 ✓
- `vatBack(100, 1.0)` → 50 ✓
- `vatBack(100, 1.1)` → 90 ✓
- `vatBack(100, 1.5)` → 66 ✓
- `vatBack(100, 2.0)` → 50 ✓
- `vatBack(100, 0.01)` → 990 ✓
- `vatBack(100, 0.99)` → 1 ✓
- `vatBack(100, 0.001)` → 100 ✓
- `vatBack(100, 0.0001)` → 100 ✓
- `vatBack(100, 0.00001)` → 100 ✓
- `vatBack(100, 0.000001)` → 100 ✓
- `vatBack(100, 0.0000001)` → 100 ✓
- `vatBack(100, 0.00000001)` → 100 ✓
- `vatBack(100, 0.000000001)` → 100 ✓
- `vatBack(100, 0.0000000001)` → 100 ✓
- `vatBack(100, 0.00000000001)` → 100 ✓
- `vatBack(100, 0.000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.00000000000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.000000000000000000000000000000000000000000000000000001)` → 100 ✓
- `vatBack(100, 0.0000000000000000000000000000000000000000000000000000001)`