Some checks failed
lakehouse/auditor 9 blocking issues: todo!() macro call in tests/real-world/scrum_master_pipeline.ts
Phase 0 — docs/recon/local-distillation-recon.md
Inventories the 23 KB JSONL streams + 20 vector corpora + auditor's
kb_index.ts as substrate for the now.md distillation pipeline. Maps
spec modules to existing producers, identifies real gaps, lists 9
schemas to formalize. ZERO implementation in recon — gating doc only.
Phase 1 — auditor/schemas/distillation/
9 schemas + foundation types + 48 tests passing in 502ms:
types.ts shared validators + canonicalSha256
evidence_record.ts EVIDENCE_SCHEMA_VERSION=1, ModelRole enum
scored_run.ts 4 categories pinned, anchor_grounding ∈ [0,1]
receipt.ts git_sha 40-char, sha256 file refs, validation_pass:bool
playbook.ts non-empty source_run_ids + acceptance_criteria
scratchpad_summary.ts validation_status enum, hash sha256
model_ledger.ts success_rate ∈ [0,1], sample_count ≥ 1
rag_sample.ts success_score ∈ {accepted, partially_accepted}
sft_sample.ts quality_score MUST be 'accepted' (no leak)
preference_sample.ts chosen != rejected, source_run_ids must differ
evidence_record.test.ts 10 tests, JSON-fixture round-trip
schemas.test.ts 30 tests, inline fixtures
realdata.test.ts 8 tests, real-JSONL probe
Real-data validation probe (one of the 3 notables from recon):
46 rows across 7 sources, 100% pass. distilled_facts/procedures alive.
Report at data/_kb/realdata_validation_report.md (also written by the
test). Confirms schema fits existing producers without migration.
Phase 2 scaffold — scripts/distillation/transforms.ts
Promoted PROBES from realdata.test.ts into a real TRANSFORMS array
covering 12 source streams (8 Tier 1 validated + 4 Tier 2 from
recon's untested-streams list). Pure functions: no I/O, no model
calls, no clock reads. Caller supplies recorded_at + sig_hash so
materializer is deterministic by construction.
Spec non-negotiables enforced at schema layer (defense in depth):
- provenance{source_file, sig_hash, recorded_at} required everywhere
- schema_version mismatch hard-rejects (forward-compat gate)
- SFT no-leak: validateSftSample REJECTS partially_accepted, rejected,
needs_human_review — three explicit tests
- Every score has WHY (reasons non-empty)
- Every playbook traces to source (source_run_ids non-empty)
- Every preference has WHY (reason non-empty)
- Receipts substantive (git_sha 40-char, sha256 64-char, validation_pass:bool)
Branch carries uncommitted auditor rebuild work (mode.rs + modes.toml
+ inference.ts + static.ts) blocked on upstream Ollama Cloud kimi-k2
500 ISE; held pending recon-driven design decisions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
117 lines
4.5 KiB
TypeScript
117 lines
4.5 KiB
TypeScript
// EvidenceRecord schema tests.
|
|
//
|
|
// Two positive fixtures (one per real-source prototype: distilled_facts
|
|
// + contract_analyses) and three negative fixtures pinning the
|
|
// non-negotiable invariants the spec demands:
|
|
// - every record must trace to a source (provenance)
|
|
// - schema_version must match — silent v1/v2 drift is the worst kind
|
|
// - required identity fields (run_id) cannot be missing
|
|
//
|
|
// Run with: bun test auditor/schemas/distillation/evidence_record.test.ts
|
|
|
|
import { test, expect } from "bun:test";
|
|
import { readFileSync } from "node:fs";
|
|
import { resolve } from "node:path";
|
|
|
|
import { validateEvidenceRecord, EVIDENCE_SCHEMA_VERSION } from "./evidence_record";
|
|
|
|
const FIXTURE_DIR = resolve(import.meta.dir, "fixtures");
|
|
|
|
function loadFixture(name: string): unknown {
|
|
return JSON.parse(readFileSync(resolve(FIXTURE_DIR, name), "utf8"));
|
|
}
|
|
|
|
test("EVIDENCE_SCHEMA_VERSION is 1 — bump deliberately, never silently", () => {
|
|
expect(EVIDENCE_SCHEMA_VERSION).toBe(1);
|
|
});
|
|
|
|
test("positive: distilled_fact materialized record validates", () => {
|
|
const r = validateEvidenceRecord(loadFixture("evidence_positive_distilled_fact.json"));
|
|
if (!r.valid) console.error("unexpected errors:", r.errors);
|
|
expect(r.valid).toBe(true);
|
|
if (r.valid) {
|
|
expect(r.value.run_id).toBe("cae21289");
|
|
expect(r.value.model_role).toBe("extractor");
|
|
expect(r.value.provenance.source_file).toBe("data/_kb/distilled_facts.jsonl");
|
|
}
|
|
});
|
|
|
|
test("positive: contract_analysis materialized record validates with retrieval + observer fields", () => {
|
|
const r = validateEvidenceRecord(loadFixture("evidence_positive_contract_analysis.json"));
|
|
if (!r.valid) console.error("unexpected errors:", r.errors);
|
|
expect(r.valid).toBe(true);
|
|
if (r.valid) {
|
|
expect(r.value.observer_verdict).toBe("reject");
|
|
expect(r.value.observer_confidence).toBe(95);
|
|
expect(r.value.retrieved_context?.matrix_corpora?.length).toBe(4);
|
|
expect(r.value.failure_markers).toContain("observer_rejected");
|
|
}
|
|
});
|
|
|
|
test("negative: missing run_id is rejected with a specific error", () => {
|
|
const r = validateEvidenceRecord(loadFixture("evidence_negative_no_run_id.json"));
|
|
expect(r.valid).toBe(false);
|
|
if (!r.valid) {
|
|
expect(r.errors.some(e => e.includes("run_id"))).toBe(true);
|
|
}
|
|
});
|
|
|
|
test("negative: schema_version mismatch is rejected (silent v1/v2 drift guard)", () => {
|
|
const r = validateEvidenceRecord(loadFixture("evidence_negative_bad_schema_version.json"));
|
|
expect(r.valid).toBe(false);
|
|
if (!r.valid) {
|
|
expect(r.errors.some(e => e.includes("schema_version"))).toBe(true);
|
|
}
|
|
});
|
|
|
|
test("negative: bad provenance (non-sha256 sig_hash, non-ISO timestamp) is rejected", () => {
|
|
const r = validateEvidenceRecord(loadFixture("evidence_negative_bad_provenance.json"));
|
|
expect(r.valid).toBe(false);
|
|
if (!r.valid) {
|
|
// Must catch BOTH the sig_hash AND the recorded_at — comprehensive
|
|
// error reporting is part of the contract.
|
|
expect(r.errors.some(e => e.includes("sig_hash"))).toBe(true);
|
|
expect(r.errors.some(e => e.includes("recorded_at"))).toBe(true);
|
|
}
|
|
});
|
|
|
|
test("negative: non-object input is rejected with clear error", () => {
|
|
const r = validateEvidenceRecord("not an object");
|
|
expect(r.valid).toBe(false);
|
|
if (!r.valid) {
|
|
expect(r.errors[0]).toContain("expected object");
|
|
}
|
|
});
|
|
|
|
test("negative: human_override with invalid decision is rejected", () => {
|
|
const fixture = loadFixture("evidence_positive_distilled_fact.json") as Record<string, unknown>;
|
|
fixture.human_override = {
|
|
overrider: "test-user",
|
|
decision: "maybe", // invalid — must be accept|reject|needs_review
|
|
reason: "test",
|
|
overridden_at: "2026-04-26T22:30:00.000Z",
|
|
};
|
|
const r = validateEvidenceRecord(fixture);
|
|
expect(r.valid).toBe(false);
|
|
if (!r.valid) {
|
|
expect(r.errors.some(e => e.includes("human_override.decision"))).toBe(true);
|
|
}
|
|
});
|
|
|
|
test("positive: human_override = null is allowed (explicitly no override)", () => {
|
|
const fixture = loadFixture("evidence_positive_distilled_fact.json") as Record<string, unknown>;
|
|
fixture.human_override = null;
|
|
const r = validateEvidenceRecord(fixture);
|
|
expect(r.valid).toBe(true);
|
|
});
|
|
|
|
test("negative: observer_confidence outside [0, 100] is rejected", () => {
|
|
const fixture = loadFixture("evidence_positive_contract_analysis.json") as Record<string, unknown>;
|
|
fixture.observer_confidence = 150;
|
|
const r = validateEvidenceRecord(fixture);
|
|
expect(r.valid).toBe(false);
|
|
if (!r.valid) {
|
|
expect(r.errors.some(e => e.includes("observer_confidence"))).toBe(true);
|
|
}
|
|
});
|