v4.1.0 — Write-Path: Conditional & Transactional Writes (phases 232–238)

po's first write-side directive family (ADR-0025): five mutation forms, each under its own
po:-prefixed directive, landing po's first codegen surface beyond Create/Upsert/Patch/Delete.
Every new method is opt-in and directive-gated -- dormant unless the schema declares the
directive -- except for three changes this milestone sanctions as additive-when-absent.

  po:cas            -> UpdateCAS(ctx, q, p, setNull []string) (bool, error)      -- no-op transition, never error
  po:claim          -> Claim(ctx, item) (bool, error)                            -- lost claim, never error
  po:create_returning -> CreateReturning(ctx, item) (entity, error)              -- value-in/value-out, own copy
  po:upsert_guard    -> UpsertGuarded(ctx, item) (int64, error)                  -- guard rejection, never error
  po:aggregate_guard -> InsertUnderGuard(ctx, item) (entity, bool, error)        -- mandatory mode, no silent default

Why MINOR, not MAJOR: po:create_returning (WRITE-02) is directive-gated and additive. Excluding
a GENERATED ALWAYS AS IDENTITY primary-key column from the emitted INSERT column list (WRITE-01)
is an unconditional bug fix that preserves no behaviour -- Postgres rejects that INSERT outright
today -- and touches Create, Upsert, and Claim (all three share filterInsertable). Upsert's
ON CONFLICT (id) DO UPDATE arm becomes structurally unreachable on an identity-always-PK table.

Three sanctioned additive changes (FRZ-02): (1) WRITE-01's identity-PK insert-list fix, the only
one altering an existing method's output; (2) DX-01's unconditional ExistsWhere(ctx, Query)
(bool, error), closing the asymmetry with Count; (3) DX-02's not-found doc-comment line naming
failure.IsNotFoundError by name.

Measured facts (plan 238-04's two-generate byte-comparison across the v4.0.0 -> v4.1.0 boundary):
a v4.0.0-era 25-migration schema regenerates 293/293 files, 65 changed by content (64 ExistsWhere
hunks + 110 not-found doc hunks, 0 WRITE-01 hunks -- no identity-PK table on this schema); a
dedicated identity_counters exhibit (13/13 files) shows WRITE-01 removing the id/:id column and
bound placeholder from Create's and Upsert's INSERT list (6 hunks); Claim's identical exclusion is
proven at the planner-unit level instead (TestBuildClaim_IdentityAlwaysExcludedFromSQL), since no
example/ table combines an identity-PK with po:claim. allKinds (method-kind registry): 29 -> 35.

Complexity ratchet re-measured whole-tree at HEAD: 116/61/21/39/5 (down from 117/62/22/40/5, every
axis re-derived by observation with its offending function named, never re-stamped). Zero net-new
runtime dependencies and zero direct-require version changes in either Go module across the
v4.1.0 boundary (go.mod and go.sum byte-identical to tag v4.0.0 in both git.appkode.ru/pub/go/po
and example); the shared txx.SQLXQueryExecutor interface's 7-method set is unchanged.

Also: sqlKind()'s tracing-attribute switch now has an explicit bucket for all 35 method kinds
(VALID-03 completeness lock, closed for the whole milestone). PLAN_CREATE_RETURNING_NOTHING_TO_INSERT
replaces the prior silent no-op when a po:create_returning table's every insertable column is a
DB-assignable PK.

make check + make check-integration + make vuln + make lint green at commit ce073f0c (plan 238-06);
re-gated markdown-only delta (CHANGELOG.md, MIGRATION.md) green again at this tag's commit
(plan 238-08). ADR-0025 (docs/adr/0025-write-side-mutation-directive-family.md), LOCKED.
Migration: MIGRATION.md, section v4.0.0 -> v4.1.0.