chore(8.0): final pre-RC1 sweep — API consistency, named errors, orphans, zero-cast codebase

This commit is contained in:
David Snelling 2026-06-11 14:51:00 -07:00
parent 970e08c466
commit 1f7e365a4e
237 changed files with 1951 additions and 49413 deletions

View file

@ -1,7 +1,7 @@
/**
* Regression tests: metadata index cleanup after delete / deleteMany
* Regression tests: metadata index cleanup after remove / removeMany
*
* Bug report (wickworks): brain.deleteMany() was not removing metadata index
* Bug report (wickworks): brain.removeMany() was not removing metadata index
* entries for deleted entities. The same defect also existed in delete().
*
* Root causes fixed:
@ -22,7 +22,7 @@
* Fix: entityForIndexing now uses the same conditional spreading pattern as
* storageMetadata for confidence, weight, and createdBy.
*
* 3. result.successful updated inside transaction builder deleteMany() pushed
* 3. result.successful updated inside transaction builder removeMany() pushed
* ids to result.successful during the builder phase, before transaction.execute()
* ran. A transaction rollback would leave result.successful containing ids that
* were never actually deleted.
@ -39,7 +39,7 @@ const DIM = 384
const makeVec = (seed = 1) =>
new Float32Array(DIM).map((_, i) => ((i + seed) % DIM) / DIM)
describe('Metadata index cleanup after delete / deleteMany', () => {
describe('Metadata index cleanup after remove / removeMany', () => {
let brain: Brainy
beforeEach(async () => {
@ -80,7 +80,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
describe('delete()', () => {
it('removes entity from type index so find({ type }) returns 0', async () => {
const id = await addEntity({ type: 'product' })
await brain.delete(id)
await brain.remove(id)
const results = await brain.find({ type: 'product' as any })
expect(results).toHaveLength(0)
@ -90,7 +90,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
// Add one entity with service 'alpha', delete it.
// A ne:'beta' query should return 0, not the deleted entity.
const id = await addEntity({ service: 'alpha', type: 'thing' })
await brain.delete(id)
await brain.remove(id)
const results = await brain.find({ where: { service: { ne: 'beta' } } })
const ids = results.map(r => r.id)
@ -101,7 +101,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
// Entity added without a custom 'archivedAt' field.
// After deletion it must not appear in an exists:false query.
const id = await addEntity({ type: 'thing' })
await brain.delete(id)
await brain.remove(id)
const results = await brain.find({ where: { archivedAt: { exists: false } } })
const ids = results.map(r => r.id)
@ -110,10 +110,10 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
})
// ---------------------------------------------------------------------------
// deleteMany() — batch deletion
// removeMany() — batch deletion
// ---------------------------------------------------------------------------
describe('deleteMany()', () => {
describe('removeMany()', () => {
it('removes all entities from type index so find({ type }) returns 0', async () => {
const ids = await Promise.all([
addEntity({ type: 'concept' }),
@ -121,7 +121,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
addEntity({ type: 'concept' }),
])
await brain.deleteMany({ ids })
await brain.removeMany({ ids })
const results = await brain.find({ type: 'concept' as any, limit: 50 })
expect(results).toHaveLength(0)
@ -140,7 +140,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
addEntity({ service: 'beta', type: 'thing' }),
])
await brain.deleteMany({ ids: alphaIds })
await brain.removeMany({ ids: alphaIds })
const results = await brain.find({ where: { service: { ne: 'beta' } } })
const resultIds = results.map(r => r.id)
@ -168,7 +168,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
// One surviving entity also without closedAt — it SHOULD appear in results
const survivorId = await addEntity({ type: 'thing', metadata: { region: 'us', active: true } })
await brain.deleteMany({ ids: deletedIds })
await brain.removeMany({ ids: deletedIds })
const results = await brain.find({ where: { closedAt: { exists: false } } })
const resultIds = results.map(r => r.id)
@ -189,7 +189,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
addEntity({ type: 'thing' }),
])
const result = await brain.deleteMany({ ids })
const result = await brain.removeMany({ ids })
// All should succeed — verify successful list is correct
expect(result.successful).toHaveLength(ids.length)
@ -206,7 +206,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
})
it('handles empty ids array gracefully', async () => {
const result = await brain.deleteMany({ ids: [] })
const result = await brain.removeMany({ ids: [] })
expect(result.successful).toHaveLength(0)
expect(result.failed).toHaveLength(0)
})
@ -217,7 +217,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
Array.from({ length: 25 }, (_, i) => addEntity({ type: 'document', metadata: { i } }))
)
const result = await brain.deleteMany({ ids })
const result = await brain.removeMany({ ids })
expect(result.successful).toHaveLength(25)
expect(result.failed).toHaveLength(0)
@ -267,7 +267,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
// After deletion the confidence/__NULL__ and weight/__NULL__ bitmap entries
// (if any were created) must not be surfaced through any query.
const id = await addEntity({ type: 'thing' })
await brain.delete(id)
await brain.remove(id)
// Entity must not appear in any confidence query
const existsTrue = await brain.find({ where: { confidence: { exists: true } } })
@ -282,7 +282,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
// Survivors are unaffected
// ---------------------------------------------------------------------------
describe('partial deleteMany does not affect surviving entities', () => {
describe('partial removeMany does not affect surviving entities', () => {
it('surviving entities remain queryable after deleting others of the same type', async () => {
const toDelete = await Promise.all([
addEntity({ type: 'collection', metadata: { group: 'a' } }),
@ -294,7 +294,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
addEntity({ type: 'collection', metadata: { group: 'b' } }),
])
await brain.deleteMany({ ids: toDelete })
await brain.removeMany({ ids: toDelete })
const results = await brain.find({ type: 'collection' as any, limit: 50 })
const resultIds = results.map(r => r.id)
@ -315,7 +315,7 @@ describe('Metadata index cleanup after delete / deleteMany', () => {
const b = await addEntity({ type: 'task', service: 'svc' })
const c = await addEntity({ type: 'task', service: 'svc' })
await brain.delete(a)
await brain.remove(a)
const results = await brain.find({ type: 'task' as any, limit: 50 })
const ids = results.map(r => r.id)

View file

@ -60,7 +60,7 @@ describe('v5.7.0 Deadlock Regression', () => {
const start = Date.now()
// Force GraphAdjacencyIndex usage by querying relationships
const relations = await brain.getRelations({ from: entities[0] })
const relations = await brain.related({ from: entities[0] })
const elapsed = Date.now() - start
@ -123,7 +123,7 @@ describe('v5.7.0 Deadlock Regression', () => {
const start = Date.now()
// This would trigger initialization if not already done
const relations = await brain.getRelations({ from: entity1 })
const relations = await brain.related({ from: entity1 })
const elapsed = Date.now() - start