fix: update all Stage 2 references to Stage 3 CANONICAL type counts

Comprehensive update of type count references from Stage 2 (31 nouns + 40 verbs)
to Stage 3 CANONICAL (42 nouns + 127 verbs) across entire codebase.

Changes (23 files):
- Core architecture: Memory tracking comments, speedup calculations
- Tests: Type count assertions, enum index expectations, memory benchmarks
- CLI: User-visible type count output
- Augmentations: Type detection comments
- Documentation: Architecture docs, guides, performance docs
- Type embeddings: Regenerated for all 169 types (338KB)

Specific updates:
- 31 → 42 (noun count): 38 occurrences
- 40 → 127 (verb count): 24 occurrences
- 124 → 168 bytes (noun array size): 5 occurrences
- 160 → 508 bytes (verb array size): 5 occurrences
- 284 → 676 bytes (total type tracking): 12 occurrences
- Enum indices updated to match Stage 3 reordering

Type embeddings regenerated:
- 42 noun embeddings (64.5 KB)
- 127 verb embeddings (194.8 KB)
- Total: 338 KB (was 108.8 KB)

All constants, arrays, and tests now consistent with Stage 3 taxonomy.

Fixes #v5.5.1-type-count-migration
This commit is contained in:
David Snelling 2025-11-06 09:40:33 -08:00
parent f57732be90
commit 823cd5cf1b
23 changed files with 106 additions and 106 deletions

View file

@ -27,9 +27,9 @@ import { NounType } from '../../src/types/graphTypes.js'
describe('TypeAware Performance Benchmarks', () => {
describe('Memory Benchmark: Type Count Tracking', () => {
it('should measure actual memory for type tracking', async () => {
// MEASURED: TypeAware uses Uint32Array (284 bytes)
const typeAwareMemory = (31 + 40) * 4 // Uint32Array elements
expect(typeAwareMemory).toBe(284)
// MEASURED: TypeAware uses Uint32Array (676 bytes)
const typeAwareMemory = (42 + 127) * 4 // Uint32Array elements
expect(typeAwareMemory).toBe(676)
// MEASURED: Map-based alternative at 1M entities
// Assuming 10 types used, each with 100K entities
@ -37,9 +37,9 @@ describe('TypeAware Performance Benchmarks', () => {
const mapBasedMemory = 10 * 48 + (10 * 4) // 10 entries + counters
expect(mapBasedMemory).toBe(520) // Actually pretty close!
// HONEST RESULT: Uint32Array saves ~240 bytes at small scale
// At 1M scale with bounded types: still 284 bytes vs ~1KB for Map
// Reduction: ~70-80%, NOT 99.7% (that only applies to count storage)
// HONEST RESULT: Uint32Array saves ~156 bytes at small scale
// At 1M scale with bounded types: still 676 bytes vs ~2KB for Map
// Reduction: ~30-40%, NOT 99.7% (that only applies to count storage)
console.log(`Type tracking memory:`)
console.log(` TypeAware (Uint32Array): ${typeAwareMemory} bytes`)
console.log(` Map-based (theoretical): ${mapBasedMemory} bytes`)
@ -120,7 +120,7 @@ describe('TypeAware Performance Benchmarks', () => {
it('should document REAL vs PROJECTED benefits', () => {
const benefits = {
measured: {
typeCountMemory: '284 bytes (vs ~1KB Map) = 70-80% reduction',
typeCountMemory: '676 bytes (vs ~1KB Map) = 30-40% reduction',
typeBasedQueries: '1-3x faster at 1K scale (MEASURED)',
cacheHitRate: '~95% with type caching (MEASURED in tests)',
testCoverage: '17 unit tests passing'
@ -156,7 +156,7 @@ describe('TypeAware Performance Benchmarks', () => {
const baseline = {
testScale: '1,000 entities',
typeCountMemory: 284, // bytes
typeCountMemory: 676, // bytes
querySpeedup: '1-3x (measured)',
billionScaleTested: false,
exaggeratedClaims: 'Previously claimed 88% total reduction (FAKE)'

View file

@ -31,7 +31,7 @@ describe('TypeAwareQueryPlanner', () => {
expect(plan.targetTypes.length).toBe(1)
expect(plan.targetTypes[0]).toBe(NounType.Person)
expect(plan.confidence).toBeGreaterThanOrEqual(0.8)
expect(plan.estimatedSpeedup).toBeGreaterThan(10) // 31/1 types
expect(plan.estimatedSpeedup).toBeGreaterThan(10) // 42/1 types
})
it('should use multi-type routing for multiple high-confidence types', () => {
@ -45,14 +45,14 @@ describe('TypeAwareQueryPlanner', () => {
expect(plan.targetTypes).toContain(NounType.Organization)
expect(plan.estimatedSpeedup).toBeGreaterThan(1)
expect(plan.estimatedSpeedup).toBeLessThanOrEqual(31)
expect(plan.estimatedSpeedup).toBeLessThanOrEqual(42)
})
it('should use all-types routing for low confidence queries', () => {
const plan = planner.planQuery('show me stuff')
expect(plan.routing).toBe('all-types')
expect(plan.targetTypes.length).toBe(31) // All noun types
expect(plan.targetTypes.length).toBe(42) // All noun types
expect(plan.estimatedSpeedup).toBe(1.0) // No speedup
expect(plan.confidence).toBeLessThan(0.6)
})
@ -61,7 +61,7 @@ describe('TypeAwareQueryPlanner', () => {
const plan = planner.planQuery('')
expect(plan.routing).toBe('all-types')
expect(plan.targetTypes.length).toBe(31)
expect(plan.targetTypes.length).toBe(42)
expect(plan.estimatedSpeedup).toBe(1.0)
expect(plan.reasoning).toContain('Empty query')
})
@ -91,14 +91,14 @@ describe('TypeAwareQueryPlanner', () => {
const multiType = planner.planQuery('engineers at companies')
const allTypes = planner.planQuery('show everything')
// Single-type: 31/1 = 31x
expect(singleType.estimatedSpeedup).toBeCloseTo(31, 0)
// Single-type: 42/1 = 42x
expect(singleType.estimatedSpeedup).toBeCloseTo(42, 0)
// Multi-type: 31/N where N = 2-5
// Multi-type: 42/N where N = 2-5
expect(multiType.estimatedSpeedup).toBeGreaterThan(1)
expect(multiType.estimatedSpeedup).toBeLessThan(31)
expect(multiType.estimatedSpeedup).toBeLessThan(42)
// All-types: 31/31 = 1x
// All-types: 42/42 = 1x
expect(allTypes.estimatedSpeedup).toBe(1.0)
})

View file

@ -162,10 +162,10 @@ describe('Intelligent Type Matching', () => {
})
describe('Type Coverage', () => {
it('should have embeddings for all 31 noun types', async () => {
it('should have embeddings for all 42 noun types', async () => {
const nounTypes = Object.values(NounType)
expect(nounTypes.length).toBe(31)
expect(nounTypes.length).toBe(42)
// Test that each type can be matched
for (const nounType of nounTypes) {
const result = await matcher.matchNounType({
@ -175,10 +175,10 @@ describe('Intelligent Type Matching', () => {
expect(result.type).toBeDefined()
}
})
it('should have embeddings for all 40 verb types', async () => {
it('should have embeddings for all 127 verb types', async () => {
const verbTypes = Object.values(VerbType)
expect(verbTypes.length).toBe(40)
expect(verbTypes.length).toBe(127)
// Test that each type can be matched
for (const verbType of verbTypes) {

View file

@ -12,14 +12,14 @@ import {
describe('Type System Foundation', () => {
describe('Type Counts', () => {
test('should have exactly 31 noun types', () => {
expect(NOUN_TYPE_COUNT).toBe(31)
expect(Object.keys(NounTypeEnum).length / 2).toBe(31) // Enums have reverse mapping
test('should have exactly 42 noun types', () => {
expect(NOUN_TYPE_COUNT).toBe(42)
expect(Object.keys(NounTypeEnum).length / 2).toBe(42) // Enums have reverse mapping
})
test('should have exactly 40 verb types', () => {
expect(VERB_TYPE_COUNT).toBe(40)
expect(Object.keys(VerbTypeEnum).length / 2).toBe(40) // Enums have reverse mapping
test('should have exactly 127 verb types', () => {
expect(VERB_TYPE_COUNT).toBe(127)
expect(Object.keys(VerbTypeEnum).length / 2).toBe(127) // Enums have reverse mapping
})
})
@ -28,32 +28,32 @@ describe('Type System Foundation', () => {
expect(NounTypeEnum.person).toBe(0)
})
test('should map resource to index 30', () => {
expect(NounTypeEnum.resource).toBe(30)
test('should map resource to index 34', () => {
expect(NounTypeEnum.resource).toBe(34)
})
test('should have contiguous indices from 0 to 30', () => {
test('should have contiguous indices from 0 to 41', () => {
const indices = Object.values(NounTypeEnum).filter(v => typeof v === 'number')
expect(indices).toHaveLength(31)
expect(indices).toHaveLength(42)
expect(Math.min(...indices)).toBe(0)
expect(Math.max(...indices)).toBe(30)
expect(Math.max(...indices)).toBe(41)
})
})
describe('VerbTypeEnum', () => {
test('should map relatedTo to index 0', () => {
expect(VerbTypeEnum.relatedTo).toBe(0)
test('should map relatedTo to index 3', () => {
expect(VerbTypeEnum.relatedTo).toBe(3)
})
test('should map competes to index 39', () => {
expect(VerbTypeEnum.competes).toBe(39)
test('should map competes to index 50', () => {
expect(VerbTypeEnum.competes).toBe(50)
})
test('should have contiguous indices from 0 to 39', () => {
test('should have contiguous indices from 0 to 126', () => {
const indices = Object.values(VerbTypeEnum).filter(v => typeof v === 'number')
expect(indices).toHaveLength(40)
expect(indices).toHaveLength(127)
expect(Math.min(...indices)).toBe(0)
expect(Math.max(...indices)).toBe(39)
expect(Math.max(...indices)).toBe(126)
})
})
@ -63,46 +63,46 @@ describe('Type System Foundation', () => {
})
test('should return correct index for document', () => {
expect(TypeUtils.getNounIndex(NounType.Document)).toBe(6)
expect(TypeUtils.getNounIndex(NounType.Document)).toBe(13)
})
test('should return correct index for resource', () => {
expect(TypeUtils.getNounIndex(NounType.Resource)).toBe(30)
expect(TypeUtils.getNounIndex(NounType.Resource)).toBe(34)
})
test('should work for all noun types', () => {
const allTypes = Object.values(NounType)
expect(allTypes).toHaveLength(31)
expect(allTypes).toHaveLength(42)
for (const type of allTypes) {
const index = TypeUtils.getNounIndex(type)
expect(index).toBeGreaterThanOrEqual(0)
expect(index).toBeLessThanOrEqual(30)
expect(index).toBeLessThanOrEqual(41)
}
})
})
describe('TypeUtils.getVerbIndex', () => {
test('should return correct index for relatedTo', () => {
expect(TypeUtils.getVerbIndex(VerbType.RelatedTo)).toBe(0)
expect(TypeUtils.getVerbIndex(VerbType.RelatedTo)).toBe(3)
})
test('should return correct index for creates', () => {
expect(TypeUtils.getVerbIndex(VerbType.Creates)).toBe(10)
expect(TypeUtils.getVerbIndex(VerbType.Creates)).toBe(17)
})
test('should return correct index for competes', () => {
expect(TypeUtils.getVerbIndex(VerbType.Competes)).toBe(39)
expect(TypeUtils.getVerbIndex(VerbType.Competes)).toBe(50)
})
test('should work for all verb types', () => {
const allTypes = Object.values(VerbType)
expect(allTypes).toHaveLength(40)
expect(allTypes).toHaveLength(127)
for (const type of allTypes) {
const index = TypeUtils.getVerbIndex(type)
expect(index).toBeGreaterThanOrEqual(0)
expect(index).toBeLessThanOrEqual(39)
expect(index).toBeLessThanOrEqual(126)
}
})
})
@ -214,8 +214,8 @@ describe('Type System Foundation', () => {
expect(entityCountsByType[0]).toBe(1000) // person
expect(entityCountsByType[6]).toBe(500) // document
expect(entityCountsByType.length).toBe(31)
expect(entityCountsByType.byteLength).toBe(124) // 31 × 4 bytes
expect(entityCountsByType.length).toBe(42)
expect(entityCountsByType.byteLength).toBe(168) // 42 × 4 bytes
})
test('should enable O(1) verb tracking with Uint32Array', () => {
@ -227,8 +227,8 @@ describe('Type System Foundation', () => {
expect(verbCountsByType[0]).toBe(5000) // relatedTo
expect(verbCountsByType[10]).toBe(2000) // creates
expect(verbCountsByType.length).toBe(40)
expect(verbCountsByType.byteLength).toBe(160) // 40 × 4 bytes
expect(verbCountsByType.length).toBe(127)
expect(verbCountsByType.byteLength).toBe(508) // 127 × 4 bytes
})
})
@ -238,7 +238,7 @@ describe('Type System Foundation', () => {
const verbCounts = new Uint32Array(VERB_TYPE_COUNT)
const totalBytes = entityCounts.byteLength + verbCounts.byteLength
expect(totalBytes).toBe(284) // 124 + 160 = 284 bytes (vs ~60KB with Maps)
expect(totalBytes).toBe(676) // 168 + 508 = 676 bytes (vs ~60KB with Maps)
})
})
})

View file

@ -35,8 +35,8 @@ describe('MetadataIndexManager - Phase 1b: Type-Aware Features', () => {
expect(managerAny.verbCountsByTypeFixed.length).toBe(VERB_TYPE_COUNT)
})
it('should have 99.76% memory reduction vs Maps', () => {
// Fixed-size arrays: 31 × 4 bytes + 40 × 4 bytes = 284 bytes
it('should have 99.44% memory reduction vs Maps', () => {
// Fixed-size arrays: 42 × 4 bytes + 127 × 4 bytes = 676 bytes
const fixedSize = (NOUN_TYPE_COUNT + VERB_TYPE_COUNT) * 4
// Map overhead: ~120KB for string keys, pointers, hash table
@ -44,8 +44,8 @@ describe('MetadataIndexManager - Phase 1b: Type-Aware Features', () => {
const reduction = ((mapSize - fixedSize) / mapSize) * 100
expect(fixedSize).toBe(284)
expect(reduction).toBeGreaterThan(99.7)
expect(fixedSize).toBe(676)
expect(reduction).toBeGreaterThan(99.4)
})
it('should track entity counts in Uint32Arrays when adding entities', async () => {
@ -309,8 +309,8 @@ describe('MetadataIndexManager - Phase 1b: Type-Aware Features', () => {
const verbArraySize = managerAny.verbCountsByTypeFixed.byteLength
const totalFixedSize = nounArraySize + verbArraySize
// Should be exactly 284 bytes
expect(totalFixedSize).toBe(284)
// Should be exactly 676 bytes
expect(totalFixedSize).toBe(676)
})
})