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.