138 lines
4.4 KiB
TypeScript
138 lines
4.4 KiB
TypeScript
import { expect, it } from "vitest";
|
|
|
|
import {
|
|
FUNCTION_COMPARISON_EVIDENCE,
|
|
INVESTIGATION_EXAMPLES,
|
|
PROCESS_COMPARISON_EVIDENCE,
|
|
} from "../contracts/investigationExamples.js";
|
|
import {
|
|
createResidualUnknown,
|
|
recordUnknownInputSchema,
|
|
residualUnknownSchema,
|
|
updateResidualUnknown,
|
|
updateUnknownInputSchema,
|
|
} from "./residualUnknown.js";
|
|
import {
|
|
correlateStaticAndRuntime,
|
|
staticRuntimeCorrelationInputSchema,
|
|
staticRuntimeCorrelationResultSchema,
|
|
} from "./staticRuntimeCorrelation.js";
|
|
|
|
const evidenceId = (index: number): string =>
|
|
`ev_${index.toString(16).padStart(64, "0")}`;
|
|
|
|
const unknownId = (index: number): string =>
|
|
`unk_${index.toString(16).padStart(64, "0")}`;
|
|
|
|
it("accepts complete residual unknown evidence, probe, and relationship lists", () => {
|
|
const supportingEvidence = Array.from({ length: 101 }, (_, i) =>
|
|
evidenceId(i + 1),
|
|
);
|
|
const contradictingEvidence = Array.from({ length: 101 }, (_, i) =>
|
|
evidenceId(i + 102),
|
|
);
|
|
const relationships = Array.from({ length: 101 }, (_, i) => ({
|
|
type: "related-to" as const,
|
|
unknown_id: unknownId(i + 1),
|
|
}));
|
|
const recommendedProbes = Array.from({ length: 21 }, (_, i) => ({
|
|
operation: `inspect_${i}`,
|
|
rationale: `Inspect evidence path ${i}.`,
|
|
}));
|
|
const recordInput = recordUnknownInputSchema.parse({
|
|
question: "Does this behavior depend on an external service?",
|
|
severity: "medium",
|
|
domain: "protocol",
|
|
supporting_evidence_ids: supportingEvidence,
|
|
contradicting_evidence_ids: contradictingEvidence,
|
|
required_authority: "controlled-replay",
|
|
required_confidence: "observed",
|
|
required_environment: null,
|
|
recommended_probes: recommendedProbes,
|
|
relationships,
|
|
});
|
|
const created = createResidualUnknown(recordInput, evidenceId(500), null);
|
|
|
|
expect(created.supporting_evidence_ids).toHaveLength(101);
|
|
expect(created.contradicting_evidence_ids).toHaveLength(101);
|
|
expect(created.recommended_probes).toHaveLength(21);
|
|
expect(created.relationships).toHaveLength(101);
|
|
|
|
const updateInput = updateUnknownInputSchema.parse({
|
|
unknown_id: created.unknown_id,
|
|
expected_revision: created.revision,
|
|
status: "investigating",
|
|
severity: created.severity,
|
|
supporting_evidence_ids: supportingEvidence,
|
|
contradicting_evidence_ids: contradictingEvidence,
|
|
required_authority: created.required_authority,
|
|
required_confidence: created.required_confidence,
|
|
required_environment: created.required_environment,
|
|
recommended_probes: recommendedProbes,
|
|
relationships,
|
|
resolution: null,
|
|
});
|
|
const updated = updateResidualUnknown(created, updateInput, evidenceId(501));
|
|
|
|
expect(residualUnknownSchema.parse(updated)).toMatchObject({
|
|
revision: 2,
|
|
mutation_evidence_ids: [evidenceId(500), evidenceId(501)],
|
|
supporting_evidence_ids: supportingEvidence,
|
|
contradicting_evidence_ids: contradictingEvidence,
|
|
recommended_probes: recommendedProbes,
|
|
relationships,
|
|
});
|
|
expect(() =>
|
|
recordUnknownInputSchema.parse({
|
|
...recordInput,
|
|
supporting_evidence_ids: ["not-an-evidence-id"],
|
|
}),
|
|
).toThrow();
|
|
});
|
|
|
|
it("correlates every supplied mapping and accepts complete comparison lists", () => {
|
|
const [mapping] =
|
|
INVESTIGATION_EXAMPLES.correlate_static_and_runtime.mappings;
|
|
if (mapping === undefined) throw new Error("missing correlation example");
|
|
const mappings = Array.from({ length: 501 }, (_, i) => ({
|
|
...mapping,
|
|
hypothesis: {
|
|
...mapping.hypothesis,
|
|
statement: `Hypothesis ${i} ${"x".repeat(600)}`,
|
|
},
|
|
}));
|
|
const input = {
|
|
static_comparisons: Array.from(
|
|
{ length: 101 },
|
|
() => FUNCTION_COMPARISON_EVIDENCE,
|
|
),
|
|
runtime_comparisons: Array.from(
|
|
{ length: 101 },
|
|
() => PROCESS_COMPARISON_EVIDENCE,
|
|
),
|
|
mappings,
|
|
};
|
|
|
|
expect(
|
|
staticRuntimeCorrelationInputSchema.parse(input).mappings,
|
|
).toHaveLength(501);
|
|
expect(
|
|
staticRuntimeCorrelationInputSchema.parse(input).mappings[0]?.hypothesis
|
|
.statement.length,
|
|
).toBeGreaterThan(500);
|
|
const fullInput = {
|
|
...input,
|
|
static_comparisons: [FUNCTION_COMPARISON_EVIDENCE],
|
|
runtime_comparisons: [PROCESS_COMPARISON_EVIDENCE],
|
|
};
|
|
const result = correlateStaticAndRuntime(fullInput);
|
|
expect(result.correlations.items).toHaveLength(501);
|
|
|
|
expect(
|
|
staticRuntimeCorrelationResultSchema.parse({
|
|
...result,
|
|
evidence_links: Array.from({ length: 20_101 }, (_, i) => evidenceId(i)),
|
|
}).evidence_links,
|
|
).toHaveLength(20_101);
|
|
});
|