vernac / architecture, expressed.
Browse documentation

Vernac consolidation status

Status: 0.4.0 release baseline; next development version 0.5.0-SNAPSHOT. The 0.4.0 checklist and release notes retain their release context. Source versions now advance separately from the published 0.4.0 language/API baseline; no additional language features are implied by this bump.

Reviewed and implemented

Area Current scope
Namespaces and imports Project-wide discovery, multi-file resolution, qualified names and namespace-derived Java packages
Names and Unicode Shared default-name rules, explicit roles, collisions and Unicode-aware diagnostics and positions
IDs and value objects Factories, validation, equality, getters, approved scalar types, optional fields and nullability contracts
Enum values Java enums, domain behavior and name checks; persistence codes stay outside the domain
Domain collections Explicit lists and sets, immutable collection structure, documented equality/duplicate operations and entity-ID access
Behavior and validation Inline Java or external implementation, delegated access through self, read/modify interfaces and validation delegates
Entities and aggregates Identity, create/reconstitute, containment rules, factories and technical persistence state
Generated sources Manifest-owned Java output and orphan cleanup; class files and JARs remain build-tool responsibilities
IntelliJ/LSP Project/file/namespace creation, Maven import, project diagnostics, completion, navigation and embedded Java support
PostgreSQL mapping Namespace-safe quoted names, recursive flattening, optional presence, scalar components and shared entity graphs
JDBC repositories Explicit repository declaration, byId/save/delete, declarative comparisons and ordering, complete graph loads, list order, reachability cleanup and optimistic locking
Usecases Named application operations, REQUIRED transactions, explicit results and external implementations
Domain services Named methods, injected dependencies through self, per-operation preconditions and external implementations
Events Immutable occurrences, shared EventId, validation, synchronous listeners, relational recording, deferred delivery and workers
HTTP inbound adapters Typed path/query/header/body input, usecase invocation, shared mappings including explicit Result sources, ordered declarative endpoint/adapter error policies, typed rejection and integration selectors, safe defaults
Outbound ports and ACL Java adapters, DTO/PATCH semantics, mappings, REST bindings, typed error rules and local HTTP walkthrough
Schema tooling Versioned source snapshots, initial/next migration candidates, explicit transformations, risk gates and Flyway replay checks

Reviewed areas have contracts and automated tests; depth and integration coverage differ. The standalone persistence demo has also completed a real PostgreSQL run and a subsequent Flyway migration in the developer’s environment. This is useful evidence, not exhaustive concurrency, platform, historical-data or deployment verification.

Deliberate boundaries

First 0.4.0 increment: multiple collections

Implemented: comma-separated lists/sets per ID, VO, enum, entity or aggregate. Each name is independently optional, each behavior has its own receiver/imports, and duplicate derived names fail. Query return types select their actual collection. Compiler resolution, generation, Java projection, Java-to-Vernac navigation and LSP completion/navigation share the complete set of declarations. Pagination now includes offset/counted and cursor JDBC queries; Result/HTTP integration is now implemented.

Next work

The 0.3.0 consolidation removes the abandoned single-file analyzer/generation path, legacy domain generator modes, implicit type guessing and per-type package syntax. Single-file convenience APIs and project compilation now share resolution and generation; schema and repository generation consume the same resolved model. Tests that asserted obsolete public setters or SQL constants on domain classes now exercise the reviewed access-view API and separate schema model instead. Their lifecycle, naming, identity and flattening coverage is retained.

Migration exercise and constraint cleanup

Migration versions use UTC yyyyMMddHHmmssSSS. For example, 20261009171331551 means 2026-10-09 at 17:13:31.551 UTC. Ordering is chronological; the number is not an epoch timestamp. The committed initial example version is a fixed baseline identifier.

An optional single-column wrapper needs neither an absence check nor a shape check when that same column alone witnesses presence. Such checks would be tautologies. The generator omits these specific cases, including nested single-column wrappers. It retains outer-owner guards, multi-component scalar checks, presence markers, enum-code checks and range checks. This is a narrow structural simplification, not a general SQL expression optimizer.

Existing migration files and snapshots are not rewritten. If an existing model’s redundant constraints disappear from the target schema, the next migration candidate can drop them normally. Review that candidate like any other migration.

Git rollback does not roll back Flyway or the database. After reverting the tutorial V2 files, the database still contains V2. Restore matching source history or deliberately reset only the disposable demo database before repeating a fresh-baseline exercise.

Declarative repository query increment

The initial query implementation includes exact scalar equality/inequality, range comparisons for ordered types, root metadata, Optional cardinality checks, batched graph loading and LSP field/parameter support. See the query contract. Real PostgreSQL acceptance remains an explicit opt-in test step; local generated-Java compilation alone is not proof of database semantics. Literal text searches and LIKE predicates are implemented; alternative locale-aware sort orders remain deferred.

Pagination foundation

Implemented technical request values, three materialized result contracts, explicit named-list projection and sequential lazy query traversal. Generated list types have the DomainList marker, preserving their immutable structure and concrete identity. Runtime tests do not establish SQL snapshot/count/cursor behavior. See the remaining implementation sequence.

Offset repository increment

Implemented list-only offset query declarations with explicit id tie-breakers, count-free lookahead, single-statement matching-root count/page snapshots, full-graph reconstruction, root-version checks and configurable per-load size limits. The query interface supports one completed page or sequential lazy traversal inside the usecase transaction. Cursor SQL is now implemented by the following increment; paginated usecase Result/HTTP declarations are now implemented.

Cursor repository increment

Implemented required-key list queries with explicit id tie-breakers, exclusive keyset boundaries, decimal ordering-equivalence prefix comparisons, nanosecond components, query/filter/schema-bound encrypted/authenticated v1 cursors and configurable durable keys. The last returned root need not exist for continuation. Size/transaction/version checks remain shared with offset loading. Result/HTTP declarations are now implemented.

Completed application pages and HTTP

Implemented explicit offset/counted-offset/cursor result qualifiers, required named value-list projections, independent Result components and adapter-local page DTOs. Mappings preserve the variant/metadata and convert entries through existing ACL. Scoped codecs validate counts/windows without global Jackson changes. Invalid cursors have a safe 400/INVALID_CURSOR default. Tutorial/AI reference/FAQ, compiler diagnostics, LSP field navigation and the Dispatch paging endpoint are included. Request headers remain ordinary domain VOs; dynamic filters and backward cursor navigation are deferred.

Domain diagram tooling

Implemented for 0.4.0: one shared resolved declaration graph exports Mermaid, PlantUML, Markdown and versioned JSON per namespace. The IntelliJ action opens its Markdown view using existing preview support. See the tutorial and contract. Interactive exploration remains follow-up work.