import type { ProtocolFixture } from "./types.js";

export const protocolIntentionalException: ProtocolFixture = {
  fixtureId: "protocol/intentional-exception",
  protocolVersion: "1.0",
  intentionalException: {
    rules: ["UNI-060", "UNI-061", "UNI-062"],
    reason: "fixture documents declared side-channel logging contract for human operators",
  },
  scenarios: [
    {
      scenarioId: "declared-stdout-side-channel",
      kind: "stdout-purity",
      stdout:
        '{"seq":1,"type":"progress","payload":{"pct":50}}\n[operator] checkpoint\n{"seq":2,"type":"terminal","payload":{"status":"ok"}}\n',
      declaredSideChannels: ["stderr", "stdout-operator"],
      terminalType: "terminal",
      observation: {
        protocolFrames: [
          '{"seq":1,"type":"progress","payload":{"pct":50}}',
          '{"seq":2,"type":"terminal","payload":{"status":"ok"}}',
        ],
        contaminations: [{ offset: 52, text: "[operator] checkpoint\n" }],
        partialFrames: 0,
        terminalCount: 1,
        duplicateTerminalCount: 0,
        postTerminalEvents: 0,
      },
    },
    {
      scenarioId: "chunk-dependent-by-contract",
      kind: "stream-decode",
      frames: ['{"seq":1,"type":"terminal","payload":{"status":"ok"}}'],
      terminalType: "terminal",
      constraints: {
        chunkBoundaryIndependent: false,
        requireSingleTerminal: true,
      },
      chunkings: [
        {
          chunkingId: "whole",
          chunks: ['{"seq":1,"type":"terminal","payload":{"status":"ok"}}\n'],
          observation: {
            events: [{ seq: 1, type: "terminal", payload: { status: "ok" } }],
            terminalCount: 1,
            parseErrors: [],
          },
        },
        {
          chunkingId: "split",
          chunks: ['{"seq":1,"type":"terminal","payload":{"stat', 'us":"ok"}}\n'],
          observation: {
            events: [],
            terminalCount: 0,
            parseErrors: [],
          },
        },
      ],
    },
    {
      scenarioId: "lossy-round-trip-by-contract",
      kind: "serialization-round-trip",
      typedValue: { version: 1, name: "widget", note: "extra" },
      compatibilityContract: {
        allowUnknownFields: true,
      },
      observation: {
        serialized: '{"version":1,"name":"widget"}\n',
        deserialized: { version: 1, name: "widget" },
        metadata: {
          unknownFields: ["note"],
        },
      },
    },
  ],
};
