latticesql 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -804,6 +804,16 @@ await db.seed({
804
804
  });
805
805
  ```
806
806
 
807
+ A junction link whose target row doesn't resolve is **never silently dropped**. `SeedResult.unresolvedLinks` lists every such link (source record, field, target name, junction). Pass `onUnresolvedLink: 'throw'` to abort with a `SeedReconciliationError` instead — for pipelines that must never leave a record citing a relationship that has no link in the graph:
808
+
809
+ ```typescript
810
+ const result = await db.seed({ ...config, onUnresolvedLink: 'collect' });
811
+ if (result.unresolvedLinks.length) {
812
+ // create the missing targets, then re-seed
813
+ console.warn('unresolved links:', result.unresolvedLinks);
814
+ }
815
+ ```
816
+
807
817
  ### `buildReport()` (v0.14+)
808
818
 
809
819
  ```typescript
@@ -2091,6 +2101,8 @@ The convergence means you don't need to duplicate entity-context definitions in
2091
2101
 
2092
2102
  **Dashboard renders every entity (v1.13.3+).** Previously the dashboard cards filtered through a hardcoded entity list (`meetings`, `people`, `messages`, `projects`, `repositories`, `files`). Installs whose YAML declared different names saw a blank dashboard. Now every first-class entity gets a card; the hardcoded list survives as an ordering preference only.
2093
2103
 
2104
+ **Approximate row counts on Postgres (v1.14.1+).** The dashboard / entity-list view reads row counts from `pg_class.reltuples` (the planner statistic maintained by `ANALYZE` / autovacuum) so that a single query covers every table. Older versions issued one `COUNT(*)` per table in parallel, which exhausted small connection pools (e.g. a 95-table database against Supabase's 15-slot session pooler). The trade is that list-view counts are approximate and include soft-deleted rows for tables that have a `deleted_at` column; per-table drill-in still shows exact filtered counts. SQLite-backed installs are unaffected and continue to show exact, soft-delete-aware counts (no pool to exhaust).
2105
+
2094
2106
  **Views**
2095
2107
 
2096
2108
  - **Dashboard** (`#/`) — one card per first-class entity with live row counts.
@@ -2236,7 +2248,15 @@ lattice teams join \
2236
2248
 
2237
2249
  The cloud rejects redemption if the caller's claimed email doesn't match the invitation's `invitee_email` (case-insensitive). Sharing an invite token in a public channel is therefore safe — only the addressee can redeem it.
2238
2250
 
2239
- **Other subcommands** (`lattice teams help` for the full list): `list`, `members`, `leave`, `destroy`, `share`, `unshare`, `shared`, `sync`, `link`, `unlink`, `pull`, `push`, `status`.
2251
+ **Other subcommands** (`lattice teams help` for the full list): `list`, `members`, `leave`, `destroy`, `share`, `unshare`, `shared`, `sync`, `link`, `unlink`, `pull`, `push`, `status`, `dlq`.
2252
+
2253
+ **Dead-letter queue (v1.15+).** A pulled change envelope that fails to apply (e.g. it arrived before the row/table it depends on), and any non-owner-overwrite divergence notice, lands in `__lattice_team_dlq`. Inspect and recover it instead of losing it behind the pull cursor:
2254
+
2255
+ ```bash
2256
+ lattice teams dlq list --team <name> # show entries (op, target, error)
2257
+ lattice teams dlq retry --team <name> [--id <id>] # replay; a late dependency now applies cleanly
2258
+ lattice teams dlq purge --team <name> [--id <id>] # discard without applying
2259
+ ```
2240
2260
 
2241
2261
  **Per-table ownership + opt-in sharing (v1.14+).** Team members share one physical Postgres, so visibility is enforced at the app layer via a `__lattice_object_owners` table: each table records its creator, and a user sees only the tables they own plus tables explicitly shared to the team. The native `files`/`secrets` objects are owned by the database creator and private by default. Sharing is an explicit, owner-only action (not a side effect of creating a table). The filter gates API access, not just the display.
2242
2262