Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6b74e65
feat: typed columns — ColumnTypeSupport protocol and model-layer reso…
vistart Oct 9, 2026
6982537
refactor(base): field-fact accessors on DDLSource, selection on Field…
vistart Oct 9, 2026
dd33c00
fix(tests): register ColumnTypeSupport in the protocol conformance su…
vistart Oct 9, 2026
7dc0327
ci: move the experimental Python 3.15 track to 3.15.0-rc.3
vistart Oct 9, 2026
94af49d
deps: pin pydantic 2.12.2 / pydantic-core 2.41.4 on Python 3.13 (incl…
vistart Oct 9, 2026
3b269d9
refactor(expression): split StringToIntegerMixin out of the string va…
vistart Oct 9, 2026
c5fac54
feat(expression): gate temporal arithmetic by operand with TemporalAr…
vistart Oct 9, 2026
9e3261f
fix(ddl): refuse unknown field names in every DDL-source accessor
vistart Oct 9, 2026
fc65d75
feat(expression): keep the boolean value type through its connectives
vistart Oct 9, 2026
94b1e5c
fix(expression): store BooleanLogicExpression's operands under the pa…
vistart Oct 9, 2026
bc4fa80
feat(expression): settle the boundary and comparison contracts the su…
vistart Oct 9, 2026
94d0fa3
fix(expression): export DistinctFromPredicate in the expression packa…
vistart Oct 9, 2026
6949c0a
fix(sqlite): repair the undefined dialect in ADD CONSTRAINT CHECK test
vistart Oct 9, 2026
f5532c3
feat(expression): render TRIM through its own node and dialect hook
vistart Oct 9, 2026
1b60ead
test(core): enumerate only the dialects this repository owns
vistart Oct 9, 2026
306048e
feat(sqlite): spell the string and numeric operations SQLite lacks
vistart Oct 9, 2026
8c4dcb0
refactor(expression): P2 - bare Column is a reference; TimestampColum…
vistart Oct 10, 2026
0849e8c
fix(relation): build the FK predicate explicitly in the query methods
vistart Oct 10, 2026
0e2510c
feat(dialect): enforce the recorded function version floors at render…
vistart Oct 10, 2026
ae4dd95
refactor(dialect): retire the core supports_data_type_* probe family
vistart Oct 10, 2026
993a3a8
fix(sqlite): the JSON1 functions carry no version floor
vistart Oct 11, 2026
f6688da
refactor(protocol): DateTimeSupport is renamed TimestampSupport
vistart Oct 11, 2026
258f188
refactor: annotate the format_* expr parameters with their concrete t…
vistart Oct 11, 2026
8d0d3a4
ci: Python 3.15 is a required leg, not an experimental one
vistart Oct 11, 2026
6d07059
ci: benchmark the newest supported interpreter, and pair Pydantic per…
vistart Oct 11, 2026
b983f44
ci: mark the Python 3.15 free-threaded check with the `3.15t` suffix
vistart Oct 11, 2026
f7f0d7b
docs: sync the Python support matrix with 3.15 released and 3.10 EOL
vistart Oct 11, 2026
1de47d0
chore: add changelog fragment for PR #126
vistart Oct 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
246 changes: 0 additions & 246 deletions .claude/plan-2026-09-14/formatter-signature-normalization.md

This file was deleted.

27 changes: 27 additions & 0 deletions .claude/rules/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Rules

How this codebase is built, and what has been tried and rejected. Each file
stands alone; read the one that concerns the change in front of you.

| Rule | Covers |
|---|---|
| [expression-direction.md](expression-direction.md) | `expr -> format` and why the reverse direction is where injection and unreviewable inference live. What a factory signature may accept. |
| [column-and-result-types.md](column-and-result-types.md) | Designing column classes; the core / backend / user layering; stating a result type the source cannot settle, and why it is a mixin rather than a keyword. |
| [operation-contracts.md](operation-contracts.md) | What each operation promises once the ten-backend survey measured it: the string boundary refusals, the rendering-name contracts, the temporal result types, the value-layer echo, and where version gates refuse. |
| [static-analysis.md](static-analysis.md) | Making a checker actually check: `py.typed`, a configuration that loads, and the defects that opt out of checking silently. |
| [anti-patterns.md](anti-patterns.md) | The catalogue, with what each one cost. Read this before adding a runtime lookup, a coercion helper, or a `__getattr__`. |

Two rules decide most of the rest:

1. **Information flows one way**, from a typed object to SQL text. A formatter
needs an expression to have anything to format, so nothing may manufacture
the expression it is about to render.
2. **A backend is entirely static.** An IDE and a type checker give a definite
answer. Nothing is worked out at run time, and nothing is left for the
caller to assert in a form a checker cannot read.

A third applies to the checks themselves, and it is the one most often skipped:
**a check that was not run cannot have passed.** The defects CI found in one
afternoon — four version gates that could not say no, an argument inserted into
the wrong call — were all in files that had been edited and not tested. Run the
directory.
Loading
Loading