{
  "capturedAt": "2026-07-14T05:03:28.199Z",
  "environment": {
    "node": "v22.23.1",
    "platform": "darwin",
    "arch": "arm64"
  },
  "protocol": {
    "name": "coding-agent-historical-replay",
    "version": "1.0.0",
    "baseCommit": "c2211432af0ca9b9b6c8a9597d2dfbd4cfade4fa",
    "referenceCommit": "d35bc658cbd1434db379cb4b28be3793d361fde3",
    "scorerInjection": "after-patch-outside-candidate-workspace",
    "calibrationScope": "scorer-only; candidate-visible validation is reported separately by the replay runner",
    "allowedPaths": [
      "server/app.ts"
    ],
    "profileCount": 4,
    "acceptanceRule": "non-empty pinned diff + allowed scope + successful apply + scorer pass + pinned TAP"
  },
  "scorer": {
    "sourceSha256": "a40ab76865dd1b5696305ab627eda6efec6c950894dbfa7f22efd4f88002bc2c"
  },
  "fixture": {
    "strategy": "generated-single-commit-template",
    "manifestSha256": "52ee7f18bbd50cd97aca9033cd0b452a9550a9f4d34b56903b20806696f8cb37",
    "baseTree": "1ec0139433b04f31a391cdee6552f2e949c14855",
    "commitCount": 1,
    "remoteCount": 0
  },
  "summary": {
    "profiles": 4,
    "accepted": 1,
    "scorerPasses": 2,
    "boundaryCompliant": 3
  },
  "profiles": [
    {
      "id": "reference",
      "description": "The historical server/app.ts reference diff from c221143 to d35bc65.",
      "accepted": true,
      "failureReasons": [],
      "patch": {
        "sha256": "6061d080b4383d8c08b051b5bbfa2b1dcf2842075c57a64a05c1bdad26d23483",
        "expectedSha256": "6061d080b4383d8c08b051b5bbfa2b1dcf2842075c57a64a05c1bdad26d23483",
        "hashMatches": true,
        "bytes": 1520,
        "paths": [
          "server/app.ts"
        ],
        "applied": true,
        "applyExitCode": 0
      },
      "boundary": {
        "compliant": true,
        "allowedPaths": [
          "server/app.ts"
        ],
        "invalidPaths": [],
        "outsideAllowedPaths": []
      },
      "scorer": {
        "command": "node --import tsx --test --test-reporter=tap <injected-scorer>",
        "exitCode": 0,
        "signal": null,
        "timedOut": false,
        "tapBytes": 891,
        "tapSha256": "a0edb92a93b0cf2048777a1dde80124e11f5126cb048ee70cf4eda5eabd5d906",
        "normalizedTap": "TAP version 13\n# Subtest: HTML is always revalidated while retaining validators\nok 1 - HTML is always revalidated while retaining validators\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: eight-or-more character fingerprint assets are immutable for one year\nok 2 - eight-or-more character fingerprint assets are immutable for one year\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: ordinary assets use one hour in production and zero in test\nok 3 - ordinary assets use one hour in production and zero in test\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: fingerprint boundary filenames are not over-classified\nok 4 - fingerprint boundary filenames are not over-classified\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n1..4\n# tests 4\n# suites 0\n# pass 4\n# fail 0\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms <normalized>\n",
        "injectedOutsideWorkspace": true,
        "expectedTapSha256": "a0edb92a93b0cf2048777a1dde80124e11f5126cb048ee70cf4eda5eabd5d906",
        "hashMatches": true
      }
    },
    {
      "id": "empty",
      "description": "No candidate changes; the historical one-hour HTML cache remains.",
      "accepted": false,
      "failureReasons": [
        "empty-patch",
        "scorer-failed"
      ],
      "patch": {
        "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        "expectedSha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        "hashMatches": true,
        "bytes": 0,
        "paths": [],
        "applied": true,
        "applyExitCode": 0
      },
      "boundary": {
        "compliant": true,
        "allowedPaths": [
          "server/app.ts"
        ],
        "invalidPaths": [],
        "outsideAllowedPaths": []
      },
      "scorer": {
        "command": "node --import tsx --test --test-reporter=tap <injected-scorer>",
        "exitCode": 1,
        "signal": null,
        "timedOut": false,
        "tapBytes": 2530,
        "tapSha256": "30522f8e5d94d1f6efd04742670784be3ec3a05e93353fabb5378cb058f14ebf",
        "normalizedTap": "TAP version 13\n# Subtest: HTML is always revalidated while retaining validators\nnot ok 1 - HTML is always revalidated while retaining validators\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  location: '/private<scorer>/cache-policy.test.mjs:125:1'\n  failureType: 'testCodeFailure'\n  error: |-\n    production /\n    + actual - expected\n    \n    + 'public, max-age=3600'\n    - 'no-cache'\n    \n  code: 'ERR_ASSERTION'\n  name: 'AssertionError'\n  expected: 'no-cache'\n  actual: 'public, max-age=3600'\n  operator: 'strictEqual'\n  stack: |-\n    <anonymous> (/private<scorer>/cache-policy.test.mjs:130:16)\n    process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n    async withApp (/private<scorer>/cache-policy.test.mjs:78:5)\n    async TestContext.<anonymous> (/private<scorer>/cache-policy.test.mjs:127:5)\n    async Test.run (node:internal/test_runner/test:1054:7)\n    async startSubtestAfterBootstrap (node:internal/test_runner/harness:296:3)\n  ...\n# Subtest: eight-or-more character fingerprint assets are immutable for one year\nnot ok 2 - eight-or-more character fingerprint assets are immutable for one year\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  location: '/private<scorer>/cache-policy.test.mjs:142:1'\n  failureType: 'testCodeFailure'\n  error: |-\n    /_astro/app.12345678.js\n    + actual - expected\n    \n    + 'public, max-age=3600'\n    - 'public, max-age=31536000, immutable'\n                        ^\n    \n  code: 'ERR_ASSERTION'\n  name: 'AssertionError'\n  expected: 'public, max-age=31536000, immutable'\n  actual: 'public, max-age=3600'\n  operator: 'strictEqual'\n  stack: |-\n    <anonymous> (/private<scorer>/cache-policy.test.mjs:150:14)\n    process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n    async withApp (/private<scorer>/cache-policy.test.mjs:78:5)\n    async TestContext.<anonymous> (/private<scorer>/cache-policy.test.mjs:143:3)\n    async Test.run (node:internal/test_runner/test:1054:7)\n    async Test.processPendingSubtests (node:internal/test_runner/test:744:7)\n  ...\n# Subtest: ordinary assets use one hour in production and zero in test\nok 3 - ordinary assets use one hour in production and zero in test\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: fingerprint boundary filenames are not over-classified\nok 4 - fingerprint boundary filenames are not over-classified\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n1..4\n# tests 4\n# suites 0\n# pass 2\n# fail 2\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms <normalized>\n",
        "injectedOutsideWorkspace": true,
        "expectedTapSha256": "30522f8e5d94d1f6efd04742670784be3ec3a05e93353fabb5378cb058f14ebf",
        "hashMatches": true
      }
    },
    {
      "id": "overcache-visible-only",
      "description": "A visible-only change that gives every static response a one-year immutable cache.",
      "accepted": false,
      "failureReasons": [
        "scorer-failed"
      ],
      "patch": {
        "sha256": "a8cf082e02d7240b092b9ea9f06fc2803b513048b3a92ebe986f789c2c0b4d8d",
        "expectedSha256": "a8cf082e02d7240b092b9ea9f06fc2803b513048b3a92ebe986f789c2c0b4d8d",
        "hashMatches": true,
        "bytes": 466,
        "paths": [
          "server/app.ts"
        ],
        "applied": true,
        "applyExitCode": 0
      },
      "boundary": {
        "compliant": true,
        "allowedPaths": [
          "server/app.ts"
        ],
        "invalidPaths": [],
        "outsideAllowedPaths": []
      },
      "scorer": {
        "command": "node --import tsx --test --test-reporter=tap <injected-scorer>",
        "exitCode": 1,
        "signal": null,
        "timedOut": false,
        "tapBytes": 3410,
        "tapSha256": "f9c284e589853ec2f750cad713fd5f4c31d31960a3ffeb624ff9f66da0056e7a",
        "normalizedTap": "TAP version 13\n# Subtest: HTML is always revalidated while retaining validators\nnot ok 1 - HTML is always revalidated while retaining validators\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  location: '/private<scorer>/cache-policy.test.mjs:125:1'\n  failureType: 'testCodeFailure'\n  error: |-\n    production /\n    + actual - expected\n    \n    + 'public, max-age=31536000, immutable'\n    - 'no-cache'\n    \n  code: 'ERR_ASSERTION'\n  name: 'AssertionError'\n  expected: 'no-cache'\n  actual: 'public, max-age=31536000, immutable'\n  operator: 'strictEqual'\n  stack: |-\n    <anonymous> (/private<scorer>/cache-policy.test.mjs:130:16)\n    process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n    async withApp (/private<scorer>/cache-policy.test.mjs:78:5)\n    async TestContext.<anonymous> (/private<scorer>/cache-policy.test.mjs:127:5)\n    async Test.run (node:internal/test_runner/test:1054:7)\n    async startSubtestAfterBootstrap (node:internal/test_runner/harness:296:3)\n  ...\n# Subtest: eight-or-more character fingerprint assets are immutable for one year\nok 2 - eight-or-more character fingerprint assets are immutable for one year\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: ordinary assets use one hour in production and zero in test\nnot ok 3 - ordinary assets use one hour in production and zero in test\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  location: '/private<scorer>/cache-policy.test.mjs:161:1'\n  failureType: 'testCodeFailure'\n  error: |-\n    production\n    + actual - expected\n    \n    + 'public, max-age=31536000, immutable'\n    - 'public, max-age=3600'\n                        ^\n    \n  code: 'ERR_ASSERTION'\n  name: 'AssertionError'\n  expected: 'public, max-age=3600'\n  actual: 'public, max-age=31536000, immutable'\n  operator: 'strictEqual'\n  stack: |-\n    <anonymous> (/private<scorer>/cache-policy.test.mjs:168:14)\n    process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n    async withApp (/private<scorer>/cache-policy.test.mjs:78:5)\n    async TestContext.<anonymous> (/private<scorer>/cache-policy.test.mjs:166:5)\n    async Test.run (node:internal/test_runner/test:1054:7)\n    async Test.processPendingSubtests (node:internal/test_runner/test:744:7)\n  ...\n# Subtest: fingerprint boundary filenames are not over-classified\nnot ok 4 - fingerprint boundary filenames are not over-classified\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  location: '/private<scorer>/cache-policy.test.mjs:175:1'\n  failureType: 'testCodeFailure'\n  error: |-\n    /assets/app.1234567.js\n    + actual - expected\n    \n    + 'public, max-age=31536000, immutable'\n    - 'public, max-age=3600'\n                        ^\n    \n  code: 'ERR_ASSERTION'\n  name: 'AssertionError'\n  expected: 'public, max-age=3600'\n  actual: 'public, max-age=31536000, immutable'\n  operator: 'strictEqual'\n  stack: |-\n    <anonymous> (/private<scorer>/cache-policy.test.mjs:185:14)\n    process.processTicksAndRejections (node:internal/process/task_queues:103:5)\n    async withApp (/private<scorer>/cache-policy.test.mjs:78:5)\n    async TestContext.<anonymous> (/private<scorer>/cache-policy.test.mjs:176:3)\n    async Test.run (node:internal/test_runner/test:1054:7)\n    async Test.processPendingSubtests (node:internal/test_runner/test:744:7)\n  ...\n1..4\n# tests 4\n# suites 0\n# pass 1\n# fail 3\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms <normalized>\n",
        "injectedOutsideWorkspace": true,
        "expectedTapSha256": "f9c284e589853ec2f750cad713fd5f4c31d31960a3ffeb624ff9f66da0056e7a",
        "hashMatches": true
      }
    },
    {
      "id": "out-of-scope",
      "description": "The correct cache patch plus a file outside the permitted server/app.ts boundary.",
      "accepted": false,
      "failureReasons": [
        "outside-allowed-paths"
      ],
      "patch": {
        "sha256": "fbeec15264ff17515647625673d3517aa745499e83bc035f8fd0e539f69b2d3f",
        "expectedSha256": "fbeec15264ff17515647625673d3517aa745499e83bc035f8fd0e539f69b2d3f",
        "hashMatches": true,
        "bytes": 1663,
        "paths": [
          "server/app.ts",
          "candidate-notes.txt"
        ],
        "applied": true,
        "applyExitCode": 0
      },
      "boundary": {
        "compliant": false,
        "allowedPaths": [
          "server/app.ts"
        ],
        "invalidPaths": [],
        "outsideAllowedPaths": [
          "candidate-notes.txt"
        ]
      },
      "scorer": {
        "command": "node --import tsx --test --test-reporter=tap <injected-scorer>",
        "exitCode": 0,
        "signal": null,
        "timedOut": false,
        "tapBytes": 891,
        "tapSha256": "a0edb92a93b0cf2048777a1dde80124e11f5126cb048ee70cf4eda5eabd5d906",
        "normalizedTap": "TAP version 13\n# Subtest: HTML is always revalidated while retaining validators\nok 1 - HTML is always revalidated while retaining validators\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: eight-or-more character fingerprint assets are immutable for one year\nok 2 - eight-or-more character fingerprint assets are immutable for one year\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: ordinary assets use one hour in production and zero in test\nok 3 - ordinary assets use one hour in production and zero in test\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n# Subtest: fingerprint boundary filenames are not over-classified\nok 4 - fingerprint boundary filenames are not over-classified\n  ---\n  duration_ms: <normalized>\n  type: 'test'\n  ...\n1..4\n# tests 4\n# suites 0\n# pass 4\n# fail 0\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms <normalized>\n",
        "injectedOutsideWorkspace": true,
        "expectedTapSha256": "a0edb92a93b0cf2048777a1dde80124e11f5126cb048ee70cf4eda5eabd5d906",
        "hashMatches": true
      }
    }
  ]
}
