genesis-stack 1.4.6 → 1.4.8

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
@@ -33,7 +33,8 @@ executes catalog code. Framework pieces such as JSKIT and Vue link to their
33
33
  authoritative documentation in ordinary Stack guidance. Each piece's
34
34
  "Sanity checks with <stack>" guidance says how to apply Genesis's
35
35
  stack-neutral sanity checks with that stack's own tools, such as its strict
36
- loading mode, query-count assertion and parallel test runner; it names a
36
+ loading mode, query-count assertion, query-side filters and parallel test
37
+ runner; it names a
37
38
  framework default only where official documentation confirms it.
38
39
 
39
40
  Genesis still supports optional Agent Skills generically. A Stack piece from
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genesis-stack",
3
- "version": "1.4.6",
3
+ "version": "1.4.8",
4
4
  "description": "The optional curated technology Stack catalog for Genesis projects.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -111,6 +111,9 @@ https://docs.djangoproject.com/
111
111
  rows.
112
112
  - `assertNumQueries` asserts a given number. Use it to compare a few rows
113
113
  with a realistic number, never as a fixed ceiling.
114
+ - Narrow on the queryset (`filter()`, `exclude()`, `exists()`, `count()`, a
115
+ slice taken before it is evaluated), never in Python: a comprehension or
116
+ loop over fetched rows, `len()` or `if queryset:` loads every row.
114
117
  - Django runs tests one at a time unless asked: run
115
118
  `manage.py test --parallel auto`, which clones the test database once per
116
119
  process, so the database user needs permission to create databases. Add
@@ -82,3 +82,11 @@ JSKIT MySQL runtime, live-schema CRUD generation, and persistence conventions.
82
82
  error translation at one established persistence boundary.
83
83
  - Never compete with or rewrite a generator-owned baseline migration. Preserve
84
84
  retained migration history and data semantics.
85
+
86
+ ## Data pass
87
+
88
+ - Apply the MySQL part of JSKIT's data pass page at
89
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-pass#mysql`:
90
+ one schema change per migration because MySQL DDL commits as it goes, online
91
+ index changes that fail rather than lock (`ALGORITHM=INPLACE, LOCK=NONE`),
92
+ and `EXPLAIN ANALYZE` on the test database at realistic size.
@@ -78,3 +78,11 @@ JSKIT PostgreSQL runtime, live-schema CRUD generation, and persistence conventio
78
78
  error translation at one established persistence boundary.
79
79
  - Never compete with or rewrite a generator-owned baseline migration. Preserve
80
80
  retained migration history and data semantics.
81
+
82
+ ## Data pass
83
+
84
+ - Apply the PostgreSQL part of JSKIT's data pass page at
85
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-pass#postgresql`:
86
+ concurrent index builds in a migration without a transaction, constraints
87
+ added `NOT VALID` and validated afterwards on large tables, and
88
+ `EXPLAIN (ANALYZE, BUFFERS)` on the test database at realistic size.
@@ -93,7 +93,11 @@ https://mobily-enterprises.github.io/jskit-ai/
93
93
  describes; list, batch and write paths compare their query counts at
94
94
  realistic sizes, as
95
95
  `https://mobily-enterprises.github.io/jskit-ai/guide/framework/typed-features#query-counts-at-realistic-sizes`
96
- describes.
96
+ describes. A read narrows in its query, with the filters the resource's
97
+ `searchSchema` maps (a field, an id list, `q`), never with `filter`, `find`
98
+ or `slice` on rows a query returned; a list's Search box and a lookup field's
99
+ autocomplete send `q` to the server, which narrows only where that resource
100
+ maps `searchSchema.q`.
97
101
 
98
102
  - When application integrations are requested or `integrations.json` exists,
99
103
  treat that file as the application-owned configuration used by both editor
@@ -322,6 +326,42 @@ https://mobily-enterprises.github.io/jskit-ai/
322
326
  - The checks cannot see layout, spacing or contrast; look at every screenshot
323
327
  for those.
324
328
 
329
+ ## Identity pass
330
+
331
+ - Read JSKIT's visual identity page at
332
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/visual-identity`
333
+ and its Material 3 rules at
334
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/material-3`
335
+ completely. The identity lives where that page puts it: the seed and a
336
+ named colour per content kind in `src/theme/index.js`, every content colour
337
+ in `src/theme/palettes.js`, the cover and empty-state art in
338
+ `src/components/art/`, the logo with `favicon.svg`, the startup shell in
339
+ `index.html`, and sign-in in the auth surface's `AppBrand.vue`.
340
+ - Run `npx jskit check m3` until it reports nothing and `npx jskit check`
341
+ until it passes, then take the screenshots as JSKIT's UI pass method shows.
342
+
343
+ ## Quality pass
344
+
345
+ - Read JSKIT's quality pass page at
346
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/quality-pass`
347
+ completely: where loading, empty, error and refused states live in a JSKIT
348
+ app, how each refusal carries its own code to `useJskitText()`'s
349
+ `serverMessage()`, and how Playwright forces each state.
350
+ - Run `npm run verify` and the focused Vitest and Playwright tests of the
351
+ affected screens.
352
+
353
+ ## Data pass
354
+
355
+ - Read JSKIT's data pass page at
356
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-pass`
357
+ and its data access guide at
358
+ `https://mobily-enterprises.github.io/jskit-ai/guide/framework/data-access`
359
+ completely: the table resource is each table's one owner, Knex migrations
360
+ carry constraints and indexes, and `expectFlatQueries()` compares a path's
361
+ queries at a few rows and at a realistic number on `TEST_DB_NAME`.
362
+ - Leave `npm run lint` (which reports narrowing in code) and `npx jskit check`
363
+ without findings.
364
+
325
365
  ## Verification
326
366
 
327
367
  - Verify `application`: `npm` `run` `verify`
@@ -104,6 +104,10 @@ conventions. Authoritative framework documentation: https://laravel.com/docs/
104
104
  - `get()` and `all()` return every row. `paginate()` returns one page, with
105
105
  `total` and `next_page_url` in its JSON, and never stands for every row.
106
106
  Batches iterate with `chunkById()` or `lazyById()`.
107
+ - Narrow in the query builder (`where`, local scopes, `whereHas`,
108
+ `exists()`, `count()`), never with a Collection's `filter()`, `where()` or
109
+ `first()` on fetched rows: `$post->comments()->where(...)` is a query,
110
+ while `$post->comments->where(...)` loads every comment and filters in PHP.
107
111
  - Laravel runs tests one at a time in one process. Add `brianium/paratest`
108
112
  as a development dependency and run `php artisan test --parallel`: each
109
113
  process gets its own `<database>_test_<token>` database, which Laravel
@@ -73,6 +73,9 @@ Node.js package, command, module, dependency, and test conventions.
73
73
  `maxFailures` defaults to 0, no cap: set a low cap only on a diagnosis run.
74
74
  - Count a list's queries at a few rows and at a realistic number through the
75
75
  database client's query event or log.
76
+ - Narrow in the database client's query (its `where`, `limit` and count),
77
+ never with an array's `filter`, `find`, `some` or `slice` on rows already
78
+ read.
76
79
 
77
80
  ## Adoption
78
81
 
@@ -132,6 +132,9 @@ Authoritative framework documentation: https://guides.rubyonrails.org/
132
132
  with a realistic number, never as a fixed ceiling.
133
133
  - `Model.all` has no `LIMIT`; batches iterate with `find_each`, 1,000 rows at
134
134
  a time.
135
+ - Narrow on the relation (`where`, scopes, `limit`, `exists?`, `count`),
136
+ never on loaded records: `length` and the block forms of `select`, `find`
137
+ and `any?` load every record and work in Ruby.
135
138
  - Keep the generated `parallelize(workers: :number_of_processors)` in
136
139
  `test/test_helper.rb`. Rails parallelizes from 50 tests up and creates a
137
140
  database for each worker, so the database user needs permission to create
@@ -102,7 +102,9 @@ https://docs.spring.io/spring-boot/
102
102
  and the persistence layer's own tools, as their official documentation
103
103
  describes them: count a list's statements at a few rows and at a realistic
104
104
  number, run test classes in parallel with a database each, and prepare test
105
- databases without replaying every migration per test class.
105
+ databases without replaying every migration per test class. Narrow in the
106
+ repository query (a derived `findBy`, `existsBy` or `countBy` method,
107
+ `@Query`, a `Specification`), never with a stream `filter` over `findAll()`.
106
108
 
107
109
  ## Adoption
108
110
 
@@ -45,6 +45,10 @@ conventions. Authoritative framework documentation: https://vuejs.org/
45
45
  production build has no such check, so repeat the changes there and look
46
46
  for a frozen tab or blank region. Count the DOM nodes a long list renders
47
47
  with realistic data.
48
+ - A picker, lookup or autocomplete over stored records sends the typed search
49
+ to the server and shows what it returns, never a loaded list filtered in a
50
+ `computed`. Vuetify's `v-autocomplete` filters only the items it holds:
51
+ give it `no-filter` and load its items on `update:search`.
48
52
 
49
53
  ### Reactive state hydration
50
54