TODO: soft-deletion
- GetXyzByID should include `ErrItemIsDeleted` if item is soft-deleted

IDEA: migrations-table
- Store migrations in a table.  This makes the schema more self-documenting.
- Possible schema: name, sql_up, sql_down, hash (computed from those fields plus previous migration hash)
    - or just rowid instead of hash?  Migration sequence should be immutable after publishing, so there should never be "conflicts"

TODO: language-server-for-TODO.txt

TODO: auto-migration-checker
- Use `pkg/schema` to test whether a base schema plus a migration equals a new schema

TODO: codegen SaveXyz update path doesn't check foreign keys
- Insert path has FK error handling, but the update path wraps everything in Must
- An update that violates an FK constraint will panic instead of returning an error

TODO: generated test file inclues global test DB setup, which is wrong

TODO: join-tables
- handle codegen for without rowid tables properly
- add "get all X for Y"
- Example: `chat_pinned_messages`

TODO: consider CreateDB and CreateMemoryDB

TODO: generate tests for the remaining CRUD, try to hit ~100% default test coverage

TODO: test reporter
- coverage: https://x.com/wispem_wantex/status/2009799380648505563
    - Jest shows for each file: % of lines, functions, branches and statements covered
    - Go reporter should show:
        - group coverage stats by either function, file or package
        - count by statements, branches or functions
        - Show both raw count and percentage
        - list which lines / branches / functions were missed
        - pretty (terminal) format or JSON format

TODO: foreign key to compound-FK table
    - sample: booru_post_tag_votes

TODO: crap score

TODO: MakeSaveItem() fixture factory

TODO: better schema parsing with less weird views
- omp --resume 01a0ef0b-9452-7000-a63a-6d5cabf07646

TODO: sqlite row-level locking
- https://chatgpt.com/c/6ace6870-bf10-83e8-8e0c-98569ae9303f

TODO: `ops/gas_init_test.sh` "gas generate item_to_item --test"
