open-brainy/tests/unit/test-suite-coverage-guard.test.ts
David Snelling b11b5f7e68
Some checks failed
CI / Node 22 (push) Has been cancelled
CI / Node 24 (push) Has been cancelled
CI / Bun (latest) (push) Has been cancelled
feat(namespace)!: NO SPECIAL NAMES + storage fidelity — the ruled completion of the field-addressing law
The write side of the law, ruled 2026-08-03: data is either in main space
where developers can use anything, or it is in system.*.

- The reserved-name write door DIES: add/update/relate/updateRelation
  metadata bags accept EVERY name (confidence, type, id, data, level,
  content, ...) as ordinary user fields — indexed, filterable, sortable,
  aggregatable, identical to any other field. The remap/enforce/warn
  machinery, the reservedFieldPolicy config (now a typed init refusal),
  and the compile-time metadata key bans are all removed. The one write
  refusal left: keys spelled 'system.*' (namespace forgery), now enforced
  on all four write doors.
- STORED RECORDS GO NESTED (v2): engine fields top-level, the user bag
  nested verbatim under 'metadata', sealed by a format stamp — by-name
  storage discrimination is unsound once colliders are admitted. Legacy
  flat records stay readable forever through the shape-aware splitters
  (sound for them: the old door refused colliders). Time travel rides the
  same split (generation store snapshots whole records).
- Name-based index exclusions DIE: user frame indexes every name; the
  excludeFields/indexedFields knobs and their silent-[] holes are gone;
  bulk-payload protection is value-shape only, uniform across names.
- Consumer-sweep findings fixed in the same wave: per-type counts read
  the frozen 'system.type' column (addToIndex sort, affinity tracking,
  cold-count rehydration, VFS type bitmaps — legacy 'noun' fallback for
  pre-rebuild reads); resolveHiddenIds addresses 'system.visibility'
  (bare 'visibility' was a silent no-op under the law — VFS/system
  entities leaked into default reads).
- Fidelity fallout fixed in the owning layers: readEntityFieldAddress
  reads the bag first (colliders were absent-shadowed by its own guard)
  and never serves system addresses from the bag; blob history refs read
  the bag shape-aware; migration transforms now receive ONE normalized
  view (engine fields + nested bag) regardless of stored era, and stray
  flat-habit keys refuse with the fix in the message.
- THE REOPEN-COLLIDER CONFORMANCE CASE (required before any RC counts as
  gates-green): all ten collider names + plumbing names written as user
  fields, verified verbatim + queryable across live reads, flush+reopen,
  a forced epoch rebuild, and asOf time travel; relation mirror; forgery
  refusals; legacy flat-record compat. 8/8 green.

Gates: unit 1901/1901 (exit 0) · integration 758 (exit 0) · conformance
27/27 (exit 0) · consumer test sweep migrated (10 files).
2026-08-03 16:59:13 -07:00

80 lines
3.6 KiB
TypeScript

/**
* @module tests/unit/test-suite-coverage-guard
* @description Prevents a test file from silently falling outside EVERY vitest
* config (so it never runs and gives false coverage confidence — the exact drift
* that left ~27 test files un-run before 8.0). Every `*.test.ts` must either match
* a gate config (`tests/unit/**`, `tests/integration/**`, `*.unit.test.ts`,
* `*.integration.test.ts`) or be explicitly listed in MANUAL_ONLY below.
*/
import { describe, it, expect } from 'vitest'
import { readdirSync } from 'node:fs'
import { join, relative, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '../..')
const testsDir = join(repoRoot, 'tests')
function allTestFiles(dir: string, out: string[] = []): string[] {
for (const e of readdirSync(dir, { withFileTypes: true })) {
const p = join(dir, e.name)
if (e.isDirectory()) allTestFiles(p, out)
else if (e.isFile() && p.endsWith('.test.ts')) out.push(relative(repoRoot, p).split('\\').join('/'))
}
return out
}
/**
* Test files INTENTIONALLY excluded from the unit/integration gate: benchmarks,
* scale/perf measurements, package-size checks, and real-model-load checks. They
* are run manually (slow / need real resources), not in CI. Every entry is a
* conscious decision — a NEW orphan not listed here fails the guard below.
*/
const MANUAL_ONLY = new Set<string>([
// Conformance suites run as an explicit gate stage (both engines run them
// by direct invocation), never swept into the unit/integration configs.
'tests/conformance/collider-fidelity.test.ts',
'tests/api/performance-benchmarks.test.ts',
'tests/critical-neural-validation.test.ts',
'tests/critical-performance-benchmark.test.ts',
'tests/model-loading.test.ts',
'tests/package-size-breakdown.test.ts',
'tests/package-size-limit.test.ts',
'tests/performance/graph-scale-performance.test.ts',
'tests/performance/triple-intelligence-scale.test.ts',
'tests/performance/typeAware.bench.test.ts',
// Cross-engine field-addressing conformance suite: pinned bit-for-bit against
// the native accelerator's implementation of the SAME contract, and invoked
// directly (`npx vitest run tests/conformance/namespace-law.test.ts`), never
// swept into the unit/integration gates — a run against a branch where the
// resolver hasn't landed yet must SKIP loudly (see the file's own SELF-SKIP
// doc), not silently pass/fail as a side effect of which gate happened to
// pick it up.
'tests/conformance/namespace-law.test.ts'
])
function inGate(rel: string): boolean {
return (
rel.startsWith('tests/unit/') ||
rel.startsWith('tests/integration/') ||
rel.endsWith('.unit.test.ts') ||
rel.endsWith('.integration.test.ts')
)
}
describe('test-suite coverage guard', () => {
it('every *.test.ts runs in a gate config or is explicitly allowlisted as manual', () => {
const orphans = allTestFiles(testsDir).filter((f) => !inGate(f) && !MANUAL_ONLY.has(f))
expect(
orphans,
'These test files match NO vitest config and are not in MANUAL_ONLY — rename to ' +
'*.unit.test.ts / *.integration.test.ts (or move under tests/unit|integration), or add to ' +
`MANUAL_ONLY if they are benchmarks:\n${orphans.join('\n')}`
).toEqual([])
})
it('the manual allowlist has no stale entries (every listed file still exists)', () => {
const all = new Set(allTestFiles(testsDir))
const stale = [...MANUAL_ONLY].filter((f) => !all.has(f))
expect(stale, `MANUAL_ONLY lists files that no longer exist — remove them:\n${stale.join('\n')}`).toEqual([])
})
})