{
  "algorithm": "Episodic REINFORCE; linear softmax policy; learning rate 1.5; discount 0.99; moving baseline rate 0.05",
  "reward": "+1 when cancellation completes, -0.01 per tap, -1 if the 80-tap budget expires. No reward for intermediate correct buttons.",
  "trainedPart": "512 external readout weights; connectome and input encoder fixed",
  "training": {
    "episodes": 2000,
    "seed": 120926,
    "updates": 2000,
    "maxTaps": 80,
    "labels": 32
  },
  "test": {
    "seed": 910000,
    "scope": "New control orders and mirrored layouts; the same wording and state transitions as training. Frozen weights. Maximum 80 taps."
  },
  "before": {
    "episodes": 200,
    "completed": 84,
    "completionRate": 0.42,
    "meanTaps": 66.08,
    "meanErrors": 22.685
  },
  "after": {
    "episodes": 200,
    "completed": 200,
    "completionRate": 1,
    "meanTaps": 23,
    "meanErrors": 0
  },
  "neuralInputRemoved": {
    "episodes": 200,
    "completed": 84,
    "completionRate": 0.42,
    "meanTaps": 66.08,
    "meanErrors": 22.685
  },
  "curve": [
    {
      "episode": 100,
      "completionRate": 1,
      "meanErrors": 5.83,
      "meanReward": 0.6864999999999998,
      "updates": 100
    },
    {
      "episode": 200,
      "completionRate": 1,
      "meanErrors": 3.84,
      "meanReward": 0.7211,
      "updates": 200
    },
    {
      "episode": 300,
      "completionRate": 1,
      "meanErrors": 1.82,
      "meanReward": 0.7464,
      "updates": 300
    },
    {
      "episode": 400,
      "completionRate": 1,
      "meanErrors": 1.56,
      "meanReward": 0.7516999999999999,
      "updates": 400
    },
    {
      "episode": 500,
      "completionRate": 1,
      "meanErrors": 1.2,
      "meanReward": 0.7542000000000003,
      "updates": 500
    },
    {
      "episode": 600,
      "completionRate": 1,
      "meanErrors": 0.97,
      "meanReward": 0.7594000000000004,
      "updates": 600
    },
    {
      "episode": 700,
      "completionRate": 1,
      "meanErrors": 0.92,
      "meanReward": 0.7599000000000002,
      "updates": 700
    },
    {
      "episode": 800,
      "completionRate": 1,
      "meanErrors": 0.93,
      "meanReward": 0.7569000000000001,
      "updates": 800
    },
    {
      "episode": 900,
      "completionRate": 1,
      "meanErrors": 0.74,
      "meanReward": 0.7626000000000004,
      "updates": 900
    },
    {
      "episode": 1000,
      "completionRate": 1,
      "meanErrors": 0.69,
      "meanReward": 0.7622000000000003,
      "updates": 1000
    },
    {
      "episode": 1100,
      "completionRate": 1,
      "meanErrors": 0.7,
      "meanReward": 0.7612000000000008,
      "updates": 1100
    },
    {
      "episode": 1200,
      "completionRate": 1,
      "meanErrors": 0.53,
      "meanReward": 0.7647000000000003,
      "updates": 1200
    },
    {
      "episode": 1300,
      "completionRate": 1,
      "meanErrors": 0.42,
      "meanReward": 0.7636000000000003,
      "updates": 1300
    },
    {
      "episode": 1400,
      "completionRate": 1,
      "meanErrors": 0.61,
      "meanReward": 0.7617000000000005,
      "updates": 1400
    },
    {
      "episode": 1500,
      "completionRate": 1,
      "meanErrors": 0.51,
      "meanReward": 0.7649000000000002,
      "updates": 1500
    },
    {
      "episode": 1600,
      "completionRate": 1,
      "meanErrors": 0.43,
      "meanReward": 0.7648000000000001,
      "updates": 1600
    },
    {
      "episode": 1700,
      "completionRate": 1,
      "meanErrors": 0.38,
      "meanReward": 0.7653000000000003,
      "updates": 1700
    },
    {
      "episode": 1800,
      "completionRate": 1,
      "meanErrors": 0.4,
      "meanReward": 0.7644000000000006,
      "updates": 1800
    },
    {
      "episode": 1900,
      "completionRate": 1,
      "meanErrors": 0.35,
      "meanReward": 0.7665000000000007,
      "updates": 1900
    },
    {
      "episode": 2000,
      "completionRate": 1,
      "meanErrors": 0.34,
      "meanReward": 0.7666000000000003,
      "updates": 2000
    }
  ],
  "unseenWording": {
    "correct": 10,
    "total": 14,
    "accuracy": 0.7142857142857143,
    "scope": "Unseen button phrases. Same cancellation objective. Includes two negation checks. No training or model selection uses these results.",
    "cases": [
      {
        "choices": [
          "Continue cancelling my plan",
          "Keep my current plan"
        ],
        "chosen": "Continue cancelling my plan",
        "expected": "Continue cancelling my plan",
        "correct": true
      },
      {
        "choices": [
          "Accept this offer",
          "Cancel this subscription"
        ],
        "chosen": "Cancel this subscription",
        "expected": "Cancel this subscription",
        "correct": true
      },
      {
        "choices": [
          "Change my subscription",
          "Manage my subscription"
        ],
        "chosen": "Manage my subscription",
        "expected": "Manage my subscription",
        "correct": true
      },
      {
        "choices": [
          "Accept this discount",
          "Decline this offer"
        ],
        "chosen": "Accept this discount",
        "expected": "Decline this offer",
        "correct": false
      },
      {
        "choices": [
          "Continue without a deal",
          "Find a different deal"
        ],
        "chosen": "Continue without a deal",
        "expected": "Continue without a deal",
        "correct": true
      },
      {
        "choices": [
          "Keep my subscription",
          "Confirm cancellation now"
        ],
        "chosen": "Confirm cancellation now",
        "expected": "Confirm cancellation now",
        "correct": true
      },
      {
        "choices": [
          "Discuss the cancellation fee",
          "Keep the plan"
        ],
        "chosen": "Discuss the cancellation fee",
        "expected": "Discuss the cancellation fee",
        "correct": true
      },
      {
        "choices": [
          "Accept free months now",
          "No thanks. Continue."
        ],
        "chosen": "No thanks. Continue.",
        "expected": "No thanks. Continue.",
        "correct": true
      },
      {
        "choices": [
          "Request cancellation",
          "Explore plans and services"
        ],
        "chosen": "Request cancellation",
        "expected": "Request cancellation",
        "correct": true
      },
      {
        "choices": [
          "Check my subscription",
          "Change billing and payment"
        ],
        "chosen": "Change billing and payment",
        "expected": "Check my subscription",
        "correct": false
      },
      {
        "choices": [
          "Find my deal now",
          "Reconnect with support"
        ],
        "chosen": "Reconnect with support",
        "expected": "Reconnect with support",
        "correct": true
      },
      {
        "choices": [
          "Continue cancellation please",
          "Keep my plan please"
        ],
        "chosen": "Continue cancellation please",
        "expected": "Continue cancellation please",
        "correct": true
      },
      {
        "choices": [
          "Keep the subscription",
          "Do not keep my plan"
        ],
        "chosen": "Keep the subscription",
        "expected": "Do not keep my plan",
        "correct": false
      },
      {
        "choices": [
          "Cancel my subscription",
          "Do not cancel my subscription"
        ],
        "chosen": "Do not cancel my subscription",
        "expected": "Cancel my subscription",
        "correct": false
      }
    ]
  },
  "textOnlyControl": {
    "episodes": 200,
    "completed": 200,
    "completionRate": 1,
    "meanTaps": 23,
    "meanErrors": 0,
    "description": "Same 512-weight learner and training budget; hashed text goes directly to the readout, bypassing the fly network."
  },
  "encoder": {
    "version": "word-hash-retinal-current-v1",
    "probeWindows": 4,
    "simulatedMsPerLabel": 80,
    "featureCount": 512,
    "inputs": "Interface-supplied button text, hashed to currents in annotated L1/L2/L3 cells. Not optical reading.",
    "readout": "Signed sums of downstream spikes only; direct input neurons excluded."
  },
  "elapsedSeconds": 4.766587125,
  "sourceSha256": {
    "engine.js": "6e378d37a34fe2ef0ede9a22a5a2e88d927e768c21b0e672785faea8a8dd11a9",
    "neural-policy.js": "b7fc8c8013cfbfe1ad9ea0b3c012970e9f4421c09dc89939392197edee6562ad",
    "training.js": "021ec2eb3d8ef099b5a3706610cb585200c8c536bc1c00535f0d299979741ab0",
    "cancellation-journey.js": "9bf67aaeb5a7d4d3f30860e378a0e51230107053f8130e973101abf86dd86a38",
    "random.js": "fa94bb16c23c54a83d2df7dd774522d2756cebc148cd1a9879008cad83273e37",
    "evaluation.js": "0221e32a9a47a31149226a9710a8bb6b172f02d3d229b35340f0fa449159810f"
  },
  "weightsSha256": "2bde4ba2369cc0a6e82579f9d144212b7b782d04adecbc2c15b742fd43e53ccd"
}
