# Development database write smoke

This executable is deliberately separate from the read-only `DbSmoke` tool. It
does not load database configuration or make a database call unless the exact
write acknowledgement is present:

```powershell
dotnet run --project tools/MBN_STOCK_WEBVIEW.DbWriteSmoke/MBN_STOCK_WEBVIEW.DbWriteSmoke.csproj -- `
  --i-understand-this-writes-development-database
```

Use `--configuration <path>` only when the normal LocalAppData configuration is
not the intended development configuration. Credentials, SQL, generated
identities, and database values are never printed.

The plan covers every migrated database writer:

- all four Oracle GraphE `INPUT_*` screens;
- Oracle AList/PList definition creation and item replacement;
- ThemeA KRX (Oracle) and NXT (MariaDB) creation;
- EList expert creation (Oracle).

Each scenario uses a legacy-column-safe 20-character
`MBW<UTC-date><40-bit nonce><scenario>` name,
proves that name is absent, performs each production-service mutation once,
reads the row back through the production read service, deletes it in `finally`,
and verifies absence. Numeric legacy keys cannot contain the prefix, so their
production next-code service supplies the numeric key and the conditional insert
still rejects a concurrent collision without overwriting an existing row. A
bound, read-only child-row preflight also rejects keys that have legacy orphaned
`PLAY_LIST`, `SB_ITEM`, or `RECOMMEND_LIST` rows, so cleanup cannot delete an
older row.

Both read and write retries are disabled. If a mutation outcome is unknown, the
tool stops immediately and issues no retry, cleanup mutation, or later scenario.
Its redacted output then reports that the uniquely prefixed row may require
manual inspection.

If a known-committed manual smoke row could not be parsed or deleted, reconcile
only the tool-owned current-UTC-date namespace with:

```powershell
dotnet run --project tools/MBN_STOCK_WEBVIEW.DbWriteSmoke/MBN_STOCK_WEBVIEW.DbWriteSmoke.csproj -- `
  --reconcile-known-owned-manual-residue `
  --i-understand-this-writes-development-database
```

The recovery refuses a truncated or non-singular per-table match and never
retries a delete.
