Tags

Tags give the ability to mark specific points in history as being important
  • v4.1.3

    v4.1.3 — typed numeric filter literals
    
    Every numeric literal in generated filter tests now carries its type. The
    int/int32/int64 arm used to emit a bare 1, which converts inside the predicate
    call but stays int inside []any{...} — so the byte-equal suite failed on a plain
    BIGINT column of the user entity. Regenerating rewrites those literals only.
    
  • v4.1.2

    v4.1.2 — basic-kind filter literals
    
    buildScalarArgLiteral no longer emits the struct-shaped <type>{} fallback for a
    column whose Go field is a basic kind outside int/int32/int64. A SMALLINT column
    typed as int16 used to produce StakeEq(int16{}) in filters.gen_test.go, which is
    not valid Go; the same was reachable for int8, uint* and float32/float64.
    
    Regenerating rewrites only those literals. Value objects unaffected.
    
  • v4.1.1

    v4.1.1 — /v4 semantic import path
    
    go.mod declares module git.appkode.ru/pub/go/po/v4, so the v4 line is finally
    resolvable as a dependency (v4.0.0/v4.1.0 were not: a v4 tag behind an
    unsuffixed path is rejected by the module resolver). Generated code imports
    .../po/v4/pkg/{failure,txx}; CLI installs from .../po/v4/cmd/po.
    
    No emitted SQL, method signature or diagnostic code changes. See MIGRATION.md
    (v4.1.0 -> v4.1.1).
    
  • v4.1.0

    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.
    
  • v4.0.0

    v4.0.0 — Schema-Metadata Emission (po's first major bump) — phases 229–231
    
    Ships po's first ALWAYS-ON new generated artifacts, so that adjacent
    hand-written sqlx references schema names through Go identifiers instead of
    string literals — and therefore fails to compile when a column is renamed or
    dropped. po gains no analytics; this only removes the brittleness of string
    literals in the raw SQL coexisting on the same *sqlx.DB.
    
    Two new unconditional files:
      - <persistence-dir>/00_meta_types.gen.go — the 34-field wire contract:
        TableMeta (7) / ColumnMeta (9) / FK (7) / Index (11)
      - <persistence-dir>/<entity>/meta.gen.go — var Meta + var Columns
    
    Why a MAJOR bump: the default generated output changes for every existing po
    user. Emission is gated by nothing — no flag, no po: directive — because
    opt-in metadata rots stale, and false metadata is worse than absent metadata.
    
    BREAKING: seven identifiers are now emitted with no opt-out. Root persistence
    package: TableMeta, ColumnMeta, FK, Index (FK and Index are the high-collision
    names). Each entity package: Meta, Columns, metaColumns. A pre-existing
    hand-written declaration of any of them becomes 'redeclared in this block' on
    the next po generate; the remedy is to rename your own symbol.
    
    The guarantee is name-sync ONLY — SQL correctness is not checked, and
    Meta.ForeignKeys' map keys are runtime strings that give no compile-time
    safety. Only the Columns namespace-struct does.
    
    Contract: ADR-0024 (docs/adr/0024-schema-metadata-wire-contract.md), LOCKED.
    Migration: MIGRATION.md, section v3.24.0 -> v4.0.0.
    
    Gates: all green — make check (incl. cover-check), check-integration, vuln,
    lint at the golangci zero-issue baseline; ratchet 117/62/22/40/5 held
    down-only; 0 net-new runtime deps (the x/text 0.38.0 -> 0.39.0 bump closing
    GO-2026-5970 is a patch bump of an existing indirect dep).
    
    Additive non-regression proven by a two-generate comparison across the version
    boundary: 260 -> 293 files, 33 new, 0 removed, 0 content diffs in any
    pre-existing generated file.
    
  • v3.24.0

    v3.24.0 — Holistic Review VII & ext-* Tail Closure
    
    Phases 222–228. 8-axis review (0 High/Critical) → 14-item fix-set (224); ADR-0023 ext-* grammar freeze + UX-03 hint (225); po:projection_cols multi-column projection struct — po's first ad-hoc named struct, allKinds 27→28 (226); po:sum_join LEFT JOIN roll-up — the codebase's first GROUP BY, allKinds 28→29 (227); freeze (228). CORR-01 (po:read+aggregate reject) consistent across all 4 kinds. Additive/opt-in/byte-equal-when-absent; single authorised break API-01. Ratchet 117/62/22/40/5 held; 0 net-new deps; all gates green.
    
  • v3.23.0

    v3.23.0 — Real-World Applicability VIII (Repository-Layer Coverage & Raw-SQL Boundary)
    
    Six opt-in po:-directive method-kinds (ext-include-deleted, ext-for-update, ext-skip-locked,
    ext-sum-aggregation, ext-projection, ext-join-filter); ADR-0022. Additive/opt-in — existing
    schemas regenerate byte-identically (proven on well-be vs v3.22.0). Raw-SQL hatch DEFERred.
    Census: po owns 213/380 today, +46 addressable, 121 hand-SQL. Ratchet 117/62/22/40/5 held; 0 net-new deps.
    Phases 218-221.
    
  • v3.22.0

    v3.22.0 — Holistic Review & Diagnostic-Sink Convergence
    
    Sixth review-driven milestone (phases 212-217). Fresh 8-axis holistic review at HEAD d5902a3f → bound fix-set.
    
    ⚠️ Breaking:
    - demoted With<Edge> no longer accepts sub-includes (compile-error, was silent runtime no-op) [FUT-API-02]
    - period-overlap finder renamed ListManyBy…AndPeriodOverlap → FindManyBy… [API-02]
    
    Added:
    - --emit-interface opt-in Repository interface (MethodCtxs-only, sqlc emit_interface analog)
    - <Method>DebugSQL() inlined-SQL accessors on all 20 kinds (injection-safe, debug-only, never-logged)
    - DiagnosticSink io.Writer injectable diagnostic sink (ADR-0021, replaces 78+ hardcoded os.Stderr)
    - SQLLogger post-exec Duration/RowsAffected/Err + slog.Enabled() gate
    
    Fixed:
    - 2 Critical DebugSQL nil-pointer panics (CR-01 debugSQLLiteral typed-nil, CR-02 sqlx.In Valuer fast-path)
    - period-overlap empty-slice guard (CORR-01); FK-cycle exit-1 ERROR+message+hint (UX-03); impact --format subcommand name (UX-01)
    
    Changed:
    - JOIN ListWith parent-PK dedup O(N²)→O(N) (PERF-01)
    - complexity ratchet 135/62/22/41/5 → 117/62/22/40/5
    
    Removed: dead CheckBanner + skipped banner tests.
    
    All gates green: make check + check-integration + vuln + rc-acceptance step-8 byte-equal; 0 net-new deps.
    
  • v3.21.0

    v3.21.0 — Real-World Applicability VII (Developer-Experience Audit)
    
    Seventh real-world milestone, discovery-first DX audit (phases 208-211).
    Honest near-empty grounding: 11 findings, 0 High/Critical, 2/11 po-actionable.
    Shipped: opt-in SQLLogger decorator (ADR-0020, --sql-logger=slog, logs SQL text
    only never args, stdlib slog, 0 net-new deps) + README SQL-visibility doc.
    Additive/opt-in; existing schemas regenerate byte-identically.
    Gates: check + check-integration + vuln + rc-acceptance step-8 (byte-equal) green;
    cover 90.7%; ratchet 135/62/22/41/5 held; code-review CLEAN.
    
  • v3.20.0

    v3.20.0 — Real-World Applicability VI (Runtime Correctness & Coverage)
    
    Phases 203–207. Discovery-first (ground → synthesize → fix → freeze).
    - GND320-A01 (Track A): NOT-NULL geography round-trip proof (regions.location-shaped); no generator change.
    - GND320-B02 (Track B): new generic find_many_by_fk_and_period_overlap method-kind, triggered by the first table-level po: directive (po:period_overlap). Opt-in/additive.
    0 net-new deps; ratchet 135/62/22/41/5 held; make check + check-integration + vuln + rc-acceptance(step-8 byte-equal) green.
    
  • v3.19.0

    v3.19.0 — Holistic Review & Integration-Test Hygiene
    
    Fifth review-driven milestone (phases 196–202); first non-feature after the
    v3.14–v3.18 real-world feature run. Full 8-axis holistic review (0 Crit / 1 High
    / 11 Med / 13 Low) → High + value-cluster fix-set; deferred -tags integration
    backlog drained; canonical make check-integration DoD gate stood up.
    
    Headline fixes: generate --emit-joins no longer exits 0 on non-compiling codegen
    (UX-01); VALUE_OBJECT_MISSING_SCAN_VALUE names the method; partial-geo-directive
    GEO_AUTO_WRAP_SUPPRESSED INFO; internal planning tokens stripped from generated
    exported doc-comments + panic strings; README/feature-matrix document v3.14–v3.18;
    t.Skip-fakes-green test-hygiene fixes.
    
    Regen-stable; ratchet 135/62/22/41/5 held; make lint 0; make vuln clean; 0 net-new deps.
    
  • v3.18.0

    v3.18.0 — Real-World Applicability V (Test-Codegen Constructor Derivation & Non-Persistent-Entity Ergonomics)
    
  • v3.17.0

    po v3.17.0 — Real-World Applicability IV (Scalar-VO Test Codegen Correctness & Geography Auto-Wrap)
    
    Track A: fixes non-compiling generated filter tests for primitive-backed scalar
    value-objects (buildScalarArgLiteral / buildInArgLiteral / emitter zeroValueLiteral;
    full numeric family incl. complex/uintptr). Track B: typemap-gated, default-on
    geography auto-wrap (ST_AsGeoJSON / ST_GeogFromText) with column-level precedence
    and a po:read=raw opt-out. Proven on the example (live-PG round-trip) and on the
    real well-be project (compiles as-is, go vet clean, geo auto-wrapped).
    
    9/9 requirements; example byte-equal except two sanctioned additive fixtures;
    0 net-new deps; ratchet held; golangci 0; vuln clean.
    
  • v1.17.0

    po v1.17.0 (tag ref restored 2026-07-02; SHA ba42fb0 from milestone records)
    
  • v1.16.0

    po v1.16.0 (tag ref restored 2026-07-02; SHA from repo records — was on b970f49)
    
  • v2.0.0

    po v2.0.0 (tag ref restored 2026-07-02 after accidental fetch --prune-tags deletion; SHA from milestone records)
    
  • v3.0.0

    po v3.0.0 (tag ref restored 2026-07-02 after accidental fetch --prune-tags deletion; SHA from milestone records)
    
  • v3.1.0

    po v3.1.0 (tag ref restored 2026-07-02 after accidental fetch --prune-tags deletion; SHA from milestone records)
    
  • v3.2.0

    po v3.2.0 (tag ref restored 2026-07-02 after accidental fetch --prune-tags deletion; SHA from milestone records)
    
  • v3.2.1

    po v3.2.1 (tag ref restored 2026-07-02 after accidental fetch --prune-tags deletion; SHA from milestone records)