- packages/domain: zod schemas for the 07-scenario object set with a schemaRegistry driving schema export, fixture generation, and Python module naming; decimal-string/sha256/curve primitives enforce the docs/11 §3.3 representation rules at the type layer - contracts/: 12 JSON Schemas (draft 2020-12), 12 golden fixtures, 3 invalid fixtures crafted to fail on both sides (float money, bad digest, missing concurrency version) - skills-py: generated pydantic models (committed, never hand-edited), regeneration script, mirror pytest using JSON-mode validation — dual-side contract tests agree on all 15 fixtures - packages/services: content-addressed immutable snapshot store (memory + fs, rejects floats), LedgerService v1 with optimistic concurrency and the P7 constraint cascade (monthly position bounds day-ahead bids; no-anchor bids rejected), quality-gate stub - cascade band shape is an OPEN-QUESTION A5 placeholder (pro-rata daily share ±band) — see ledger.ts checkCascade All green: tsc typecheck, 41 TS tests, 15 Python tests. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019u5SLNweVio6ozJX7yfxQr 🔮 View transcript: https://logs.lojong.info/s/e8u90k3t33w590r7b5y7yzqh
42 lines
1.5 KiB
TypeScript
42 lines
1.5 KiB
TypeScript
import { readdirSync, readFileSync } from 'node:fs'
|
|
import { fileURLToPath } from 'node:url'
|
|
import { describe, expect, it } from 'vitest'
|
|
import { schemaRegistry } from '../src/index.js'
|
|
|
|
const root = fileURLToPath(new URL('../../../contracts/', import.meta.url))
|
|
|
|
const casesIn = (dir: string): Array<[string, string, string]> => {
|
|
const out: Array<[string, string, string]> = []
|
|
for (const name of readdirSync(`${root}${dir}`)) {
|
|
for (const file of readdirSync(`${root}${dir}/${name}`)) {
|
|
out.push([name, file, `${root}${dir}/${name}/${file}`])
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
describe('golden fixtures validate against domain schemas', () => {
|
|
it.each(casesIn('fixtures'))('%s / %s', (name, _file, path) => {
|
|
const schema = schemaRegistry[name]
|
|
expect(schema, `no schema registered for fixture dir '${name}'`).toBeDefined()
|
|
const data = JSON.parse(readFileSync(path, 'utf8'))
|
|
const result = schema!.safeParse(data)
|
|
expect(result.success, JSON.stringify(result.error?.issues, null, 2)).toBe(true)
|
|
})
|
|
})
|
|
|
|
describe('invalid fixtures are rejected', () => {
|
|
it.each(casesIn('fixtures-invalid'))('%s / %s', (name, _file, path) => {
|
|
const schema = schemaRegistry[name]
|
|
expect(schema).toBeDefined()
|
|
const data = JSON.parse(readFileSync(path, 'utf8'))
|
|
expect(schema!.safeParse(data).success).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('every registered schema has at least one golden fixture', () => {
|
|
it.each(Object.keys(schemaRegistry))('%s', (name) => {
|
|
expect(readdirSync(`${root}fixtures/${name}`).length).toBeGreaterThan(0)
|
|
})
|
|
})
|