| import { describe, expect, it } from "vitest"; |
| import type { SkynetCausalEpisode } from "../causal-valence/episode-ledger.js"; |
| import { |
| encodeSkynetRuntimeTrajectoryFeatures, |
| type SkynetRuntimeTrajectorySample, |
| } from "../runtime-observer/trajectory-builder.js"; |
| import { |
| createSkynetCognitiveKernelState, |
| observeSkynetCognitiveKernelSample, |
| predictSkynetCognitiveKernelLabel, |
| replaySkynetCognitiveKernelState, |
| updateSkynetCognitiveKernelState, |
| } from "./min-kernel.js"; |
|
|
| function buildEpisode(params: { |
| id: string; |
| label: SkynetCausalEpisode["bootstrapLabel"]; |
| kind: "edit" | "delete" | "create" | "noop"; |
| status?: "ok" | "error" | "timeout"; |
| failureStreak?: number; |
| }): SkynetCausalEpisode { |
| return { |
| id: params.id, |
| sessionKey: "agent:openskynet:main", |
| recordedAt: Number(params.id.replace(/\D+/g, "")) || 1, |
| context: { |
| continuityFreshness: "fresh", |
| failureStreak: params.failureStreak ?? 0, |
| targetCount: 1, |
| validationIntensity: params.kind === "edit" ? 0.8 : 0.3, |
| }, |
| transition: { |
| operations: [{ path: `/tmp/${params.id}.ts`, kind: params.kind, isTarget: true }], |
| targetPaths: [`/tmp/${params.id}.ts`], |
| }, |
| outcome: { |
| status: params.status ?? (params.label === "damage" ? "error" : "ok"), |
| failureDomain: |
| params.label === "damage" |
| ? "cognitive" |
| : params.status === "timeout" |
| ? "environmental" |
| : "none", |
| failureClass: |
| params.label === "damage" |
| ? "validation_error" |
| : params.status === "timeout" |
| ? "provider_timeout" |
| : "none", |
| targetSatisfied: params.label !== "stall" && params.label !== "damage", |
| validationPassed: params.label !== "damage", |
| continuityDelta: params.label === "progress" || params.label === "relief" ? 0.7 : 0.05, |
| recoveryBurden: params.label === "frustration" ? 0.6 : 0.1, |
| collateralDamage: params.label === "damage" ? 0.8 : 0.05, |
| }, |
| bootstrapLabel: params.label, |
| }; |
| } |
|
|
| function buildSample( |
| id: string, |
| label: SkynetCausalEpisode["bootstrapLabel"], |
| kind: "edit" | "delete" | "create" | "noop", |
| historyLabels: SkynetCausalEpisode["bootstrapLabel"][] = [], |
| ): SkynetRuntimeTrajectorySample { |
| const historyEpisodes = historyLabels.map((historyLabel, index) => |
| buildEpisode({ |
| id: `${id}-history-${index}`, |
| label: historyLabel, |
| kind: historyLabel === "damage" ? "delete" : "edit", |
| failureStreak: historyLabel === "frustration" ? 2 : 0, |
| }), |
| ); |
| const currentEpisode = buildEpisode({ |
| id, |
| label, |
| kind, |
| failureStreak: label === "frustration" ? 2 : 0, |
| }); |
| return { |
| id, |
| sessionKey: "agent:openskynet:main", |
| recordedAt: currentEpisode.recordedAt, |
| lookbackCount: historyEpisodes.length, |
| historyEpisodes, |
| currentEpisode, |
| targetLabel: label, |
| }; |
| } |
|
|
| describe("skynet cognitive kernel", () => { |
| it("learns separable trajectory prototypes online", () => { |
| const progressSeed = buildSample("10", "progress", "edit", ["progress", "progress"]); |
| const damageSeed = buildSample("20", "damage", "delete", ["damage", "frustration"]); |
| const state0 = createSkynetCognitiveKernelState({ |
| featureDimensions: encodeSkynetRuntimeTrajectoryFeatures(progressSeed).length, |
| }); |
| const state1 = observeSkynetCognitiveKernelSample(state0, progressSeed); |
| const state2 = observeSkynetCognitiveKernelSample(state1, damageSeed); |
|
|
| const progressPrediction = predictSkynetCognitiveKernelLabel( |
| state2, |
| buildSample("30", "progress", "edit", ["progress", "relief"]), |
| ); |
| const damagePrediction = predictSkynetCognitiveKernelLabel( |
| state2, |
| buildSample("40", "damage", "delete", ["damage", "frustration"]), |
| ); |
|
|
| expect(progressPrediction.label).toBe("progress"); |
| expect(damagePrediction.label).toBe("damage"); |
| expect(progressPrediction.surprise).toBeLessThan(0.8); |
| }); |
|
|
| it("can replay state from a sample stream", () => { |
| const samples = [ |
| buildSample("10", "progress", "edit", ["progress"]), |
| buildSample("20", "damage", "delete", ["damage"]), |
| buildSample("30", "progress", "edit", ["progress", "relief"]), |
| ]; |
| const state = replaySkynetCognitiveKernelState({ samples }); |
| expect(state).not.toBeNull(); |
| expect(state?.observedCount).toBe(3); |
| expect(state?.prototypeCounts.progress).toBe(2); |
| }); |
|
|
| it("updates incrementally without double-counting seen samples", () => { |
| const samples = [ |
| buildSample("10", "progress", "edit", ["progress"]), |
| buildSample("20", "damage", "delete", ["damage"]), |
| ]; |
| const state0 = createSkynetCognitiveKernelState({ |
| featureDimensions: encodeSkynetRuntimeTrajectoryFeatures(samples[0]!).length, |
| }); |
| const first = updateSkynetCognitiveKernelState({ state: state0, samples }); |
| const second = updateSkynetCognitiveKernelState({ state: first.state, samples }); |
|
|
| expect(first.ingestedCount).toBe(2); |
| expect(first.skippedCount).toBe(0); |
| expect(second.ingestedCount).toBe(0); |
| expect(second.skippedCount).toBe(2); |
| expect(second.state.observedCount).toBe(2); |
| }); |
| }); |
|
|