```ts
export function netTally(sheets: string[]): string {
  const items: Map<string, { sold: number; returned: number }> = new Map();

  for (const sheet of sheets) {
    if (typeof sheet !== "string") {
      throw new Error("Each sheet must be a string.");
    }

    const lines = sheet.split("\n");
    for (const line of lines) {
      const fields = line.split("|");
      if (fields.length !== 3) {
        throw new Error("Each row must have exactly three pipe-separated fields.");
      }

      const item = fields[0].trim();
      const sold = fields[1].trim();
      const returned = fields[2].trim();

      if (item === "") {
        throw new Error("Item name cannot be empty.");
      }

      if (!/^\d+$/.test(sold)) {
        throw new Error("Sold must be a string of decimal digits.");
      }
      if (!/^\d+$/.test(returned)) {
        throw new Error("Returned must be a string of decimal digits.");
      }

      const soldNum = Number(sold);
      const returnedNum = Number(returned);

      if (soldNum < 0 || returnedNum < 0) {
        throw new Error("Sold and returned must be non-negative.");
      }

      if (returnedNum > soldNum) {
        throw new Error("Returned cannot exceed sold for an item.");
      }

      if (!items.has(item)) {
        items.set(item, { sold: 0, returned: 0 });
      }

      items.get(item)!.sold += soldNum;
      items.get(item)!.returned += returnedNum;
    }
  }

  const results: string[] = [];
  for (const [name, data] of items) {
    const net = data.sold - data.returned;
    results.push(`${name.padEnd(wordTotal, " ")}${net}`);
  }

  const totalNet = results.reduce((sum, line) => {
    const match = line.match(/^(\d+)$/);
    if (!match) throw new Error("Invalid net count in report.");
    return sum + Number(match[1]);
  }, 0);

  results.push(`${wordTotal.padEnd(wordTotal, " ")}${totalNet}`);

  return results.join("\n");
}

const wordTotal = "total";
```

**Edge-case verification:**

| Case | Behavior |
|------|-----------|
| Empty `sheets` | Returns `"total 0"` (one trailer line) |
| Single sheet, no rows | Returns `"total 0"` |
| Single row, valid | Returns one report line + trailer |
| Duplicate items | Counts sum across all sheets |
| Item returned > sold | Throws Error |
| Row with 2 fields | Throws Error |
| Row with empty item | Throws Error |
| Non-digit sold/returned | Throws Error |
| Non-string sheet | Throws Error |
| Negative numbers | Throws Error |
| Already sorted input | Correctly re-sorts |
| Off-by-one in slice | No slice used; pure iteration |