{
  "name": "Grace 0.3.8 vs Claude Code + caveman + context-mode, confirmation test (same hours, night of 2 to 3 October 2026)",
  "date": "2026-10-03",
  "license": "Published by Grace for anyone to check. Please cite the source.",
  "setup": {
    "plan": "Claude Max 20x on every account",
    "baseline": "Claude Code with the token-saving plugins caveman and context-mode",
    "baselinePlugins": [
      "caveman",
      "context-mode"
    ],
    "parallelSessions": 3,
    "tasks": "30 tasks, 6 per level (easy, medium, hard, extreme, mixed), from our test of Grace 0.3.6 on 1 October 2026; none of them is in the other test of 2 October",
    "quality": "share of the secret acceptance criteria met, judged per task (0–1); met counts 1, partly met 0.5, not met 0",
    "claudeCostUsd": "Claude's cost for the run at Anthropic API list prices, as Claude Code reports it (USD). The accounts are subscriptions and were not billed per token; the figure only sizes each run's Claude work.",
    "claudeOutputTokens": "tokens Claude wrote during the run (all of the run's Claude replies)",
    "fiveHourLimit": "the account's own usage display (5-hour and weekly limit), read every 5 minutes; shown in whole percentage points",
    "folders": "every run started in an empty folder; some tasks give starter code in the task text"
  },
  "runs": {
    "confirm038": {
      "date": "2026-10-03",
      "version": "0.3.8",
      "simultaneous": true,
      "start": "2026-10-02T23:41:41Z",
      "end": "2026-10-03T02:29:52Z",
      "what": "Confirmation: Grace 0.3.8 (account A) and the baseline (account B) on 30 other tasks, in the same order, at the same time",
      "confirmed": false,
      "preRegisteredCheck": {
        "fixedBeforeStart": true,
        "result": "formally invalid",
        "rulesFailed": [
          "G2"
        ],
        "rulesFailedText": [
          "no waiting for a limit, and no gap in the readings at a 5-hour reset"
        ],
        "rulesPassed": [
          "G1",
          "G3",
          "G4",
          "B1",
          "B2",
          "B3",
          "B4",
          "B5",
          "B6"
        ],
        "readingGapSeconds": {
          "grace": 0,
          "alone": 54
        },
        "readingGapEffectPoints": 0.2,
        "note": "One rule fixed before the start was missed: on the baseline account, the 54 seconds before a 5-hour reset were not covered by a reading, so usage in those seconds is missing from the baseline's 31 %. That can only make the baseline's share look smaller (about 0.2 points at its average rate), never Grace's. Every rule on the result itself (saving, quality, crashes, time) was met."
      },
      "fiveHourLimitUsed": {
        "graceRead": 0.14,
        "graceOtherUsagePoints": 0,
        "graceAdjusted": 0.14,
        "aloneRead": 0.31,
        "aloneOtherUsagePoints": 0,
        "aloneAdjusted": 0.31
      },
      "weeklyLimitUsed": {
        "grace": 0.02,
        "alone": 0.05
      },
      "summary": {
        "tasks": 30,
        "scoredBoth": 29,
        "qualityScoredBoth": {
          "grace": 0.928,
          "alone": 0.9017
        },
        "all": {
          "grace": {
            "claudeCostUsd": 39.76,
            "claudeOutputTokens": 1536911,
            "durationSeconds": 13259
          },
          "alone": {
            "claudeCostUsd": 95.1,
            "claudeOutputTokens": 2915306,
            "durationSeconds": 25786
          }
        },
        "graceFaster": 28,
        "graceCostAtMostHalf": [
          "S005",
          "S008",
          "G019",
          "E002",
          "X004",
          "S010",
          "M029",
          "E004",
          "X006",
          "M034",
          "G022",
          "E006",
          "X008",
          "S022",
          "M036",
          "G025",
          "E013",
          "X010",
          "S026",
          "M038",
          "E015",
          "X013",
          "M039"
        ]
      },
      "readings": {
        "grace": [
          {
            "minute": 0,
            "fiveHour": 0,
            "weekly": 0.09
          },
          {
            "minute": 5,
            "fiveHour": 0.01,
            "weekly": 0.09
          },
          {
            "minute": 7,
            "fiveHour": 0.01,
            "weekly": 0.09
          },
          {
            "minute": 13,
            "fiveHour": 0.02,
            "weekly": 0.09
          },
          {
            "minute": 18,
            "fiveHour": 0.04,
            "weekly": 0.1
          },
          {
            "minute": 23,
            "fiveHour": 0.05,
            "weekly": 0.1
          },
          {
            "minute": 28,
            "fiveHour": 0.06,
            "weekly": 0.1
          },
          {
            "minute": 33,
            "fiveHour": 0.07,
            "weekly": 0.1
          },
          {
            "minute": 38,
            "fiveHour": 0.08,
            "weekly": 0.1
          },
          {
            "minute": 43,
            "fiveHour": 0.08,
            "weekly": 0.1
          },
          {
            "minute": 48,
            "fiveHour": 0.09,
            "weekly": 0.11
          },
          {
            "minute": 53,
            "fiveHour": 0.1,
            "weekly": 0.11
          },
          {
            "minute": 58,
            "fiveHour": 0.11,
            "weekly": 0.11
          },
          {
            "minute": 64,
            "fiveHour": 0.12,
            "weekly": 0.11
          },
          {
            "minute": 69,
            "fiveHour": 0.13,
            "weekly": 0.11
          },
          {
            "minute": 74,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 79,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 84,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 89,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 94,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 99,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 104,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 109,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 115,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 120,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 125,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 130,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 135,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 140,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 145,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 150,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 155,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 160,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 166,
            "fiveHour": 0.14,
            "weekly": 0.11
          },
          {
            "minute": 168,
            "fiveHour": 0.14,
            "weekly": 0.11
          }
        ],
        "alone": [
          {
            "minute": 0,
            "fiveHour": 0,
            "weekly": 0.46
          },
          {
            "minute": 5,
            "fiveHour": 0.01,
            "weekly": 0.46
          },
          {
            "minute": 7,
            "fiveHour": 0.01,
            "weekly": 0.46
          },
          {
            "minute": 13,
            "fiveHour": 0.01,
            "weekly": 0.46
          },
          {
            "minute": 18,
            "fiveHour": 0.02,
            "weekly": 0.46
          },
          {
            "minute": 23,
            "fiveHour": 0.03,
            "weekly": 0.47
          },
          {
            "minute": 28,
            "fiveHour": 0.04,
            "weekly": 0.47
          },
          {
            "minute": 33,
            "fiveHour": 0.06,
            "weekly": 0.47
          },
          {
            "minute": 38,
            "fiveHour": 0.06,
            "weekly": 0.47
          },
          {
            "minute": 43,
            "fiveHour": 0.08,
            "weekly": 0.47
          },
          {
            "minute": 48,
            "fiveHour": 0.09,
            "weekly": 0.47
          },
          {
            "minute": 53,
            "fiveHour": 0.1,
            "weekly": 0.48
          },
          {
            "minute": 58,
            "fiveHour": 0.11,
            "weekly": 0.48
          },
          {
            "minute": 64,
            "fiveHour": 0.12,
            "weekly": 0.48
          },
          {
            "minute": 69,
            "fiveHour": 0.13,
            "weekly": 0.48
          },
          {
            "minute": 74,
            "fiveHour": 0.14,
            "weekly": 0.48
          },
          {
            "minute": 79,
            "fiveHour": 0.15,
            "weekly": 0.49
          },
          {
            "minute": 84,
            "fiveHour": 0.16,
            "weekly": 0.49
          },
          {
            "minute": 89,
            "fiveHour": 0.17,
            "weekly": 0.49
          },
          {
            "minute": 94,
            "fiveHour": 0.19,
            "weekly": 0.49
          },
          {
            "minute": 99,
            "fiveHour": 0.2,
            "weekly": 0.49
          },
          {
            "minute": 104,
            "fiveHour": 0.2,
            "weekly": 0.49
          },
          {
            "minute": 109,
            "fiveHour": 0.22,
            "weekly": 0.5
          },
          {
            "minute": 115,
            "fiveHour": 0.23,
            "weekly": 0.5
          },
          {
            "minute": 120,
            "fiveHour": 0.24,
            "weekly": 0.5
          },
          {
            "minute": 125,
            "fiveHour": 0.25,
            "weekly": 0.5
          },
          {
            "minute": 130,
            "fiveHour": 0.26,
            "weekly": 0.5
          },
          {
            "minute": 135,
            "fiveHour": 0.27,
            "weekly": 0.5
          },
          {
            "minute": 140,
            "fiveHour": 0.27,
            "weekly": 0.51
          },
          {
            "minute": 145,
            "fiveHour": 0.28,
            "weekly": 0.51
          },
          {
            "minute": 150,
            "fiveHour": 0.28,
            "weekly": 0.51
          },
          {
            "minute": 155,
            "fiveHour": 0.28,
            "weekly": 0.51
          },
          {
            "minute": 160,
            "fiveHour": 0.29,
            "weekly": 0.51
          },
          {
            "minute": 166,
            "fiveHour": 0.3,
            "weekly": 0.51
          },
          {
            "minute": 168,
            "fiveHour": 0.3,
            "weekly": 0.51
          }
        ]
      }
    }
  },
  "tasks": [
    {
      "id": "S005",
      "title": "Checkout with mock payment provider, idempotency and gap-free invoice numbers",
      "level": "hard",
      "language": "TypeScript (Node + SQLite)",
      "grace": {
        "quality": 0.95,
        "claudeOutputTokens": 33605,
        "claudeCostUsd": 0.8974,
        "durationSeconds": 270
      },
      "alone": {
        "quality": 0.95,
        "claudeOutputTokens": 87138,
        "claudeCostUsd": 2.6096,
        "durationSeconds": 712
      }
    },
    {
      "id": "G018",
      "title": "Trade-event decoder for program logs with own Base58, BigInt and test vectors",
      "level": "mixed",
      "language": "JavaScript (Node)",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 15101,
        "claudeCostUsd": 0.4018,
        "durationSeconds": 124
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 20043,
        "claudeCostUsd": 0.6807,
        "durationSeconds": 182
      }
    },
    {
      "id": "E001",
      "title": "Amount parser reads 1.500 as €1.50",
      "level": "easy",
      "language": "TypeScript",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 10175,
        "claudeCostUsd": 0.2779,
        "durationSeconds": 89
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 13432,
        "claudeCostUsd": 0.5106,
        "durationSeconds": 118
      }
    },
    {
      "id": "X003",
      "title": "Pet-supplies online shop from scratch",
      "level": "extreme",
      "language": "TypeScript",
      "grace": {
        "quality": 0.8824,
        "claudeOutputTokens": 156908,
        "claudeCostUsd": 4.1862,
        "durationSeconds": 1236,
        "reason": "scored, but left out of the comparison: the other run of this task has no score"
      },
      "alone": {
        "quality": null,
        "claudeOutputTokens": 149732,
        "claudeCostUsd": 4.2764,
        "durationSeconds": 1308,
        "partialResultQuality": 0.1176,
        "reason": "run stopped by an API error before the end — not compared; its partial result was judged as shown in partialResultQuality"
      }
    },
    {
      "id": "S008",
      "title": "Fix three visual bugs in an SVG chart component",
      "level": "hard",
      "language": "JavaScript/SVG",
      "grace": {
        "quality": 0.8333,
        "claudeOutputTokens": 14533,
        "claudeCostUsd": 0.3874,
        "durationSeconds": 122
      },
      "alone": {
        "quality": 0.8333,
        "claudeOutputTokens": 30688,
        "claudeCostUsd": 0.9824,
        "durationSeconds": 283
      }
    },
    {
      "id": "M022",
      "title": "CHIP-8 emulator in C with headless acceptance test",
      "level": "medium",
      "language": "C",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 37833,
        "claudeCostUsd": 0.9595,
        "durationSeconds": 304
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 55342,
        "claudeCostUsd": 1.721,
        "durationSeconds": 480
      }
    },
    {
      "id": "G019",
      "title": "Move API keys out of config.json: config module with migration, schema and masking",
      "level": "mixed",
      "language": "Python",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 22675,
        "claudeCostUsd": 0.5593,
        "durationSeconds": 182
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 60794,
        "claudeCostUsd": 1.7623,
        "durationSeconds": 527
      }
    },
    {
      "id": "E002",
      "title": "Harden an accountant export against formula injection",
      "level": "easy",
      "language": "TypeScript",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 7286,
        "claudeCostUsd": 0.1852,
        "durationSeconds": 65
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 18449,
        "claudeCostUsd": 0.6641,
        "durationSeconds": 178
      }
    },
    {
      "id": "X004",
      "title": "SaaS billing with subscriptions, credits and quarterly quota",
      "level": "extreme",
      "language": "TypeScript",
      "grace": {
        "quality": 0.75,
        "claudeOutputTokens": 141996,
        "claudeCostUsd": 3.6255,
        "durationSeconds": 1108
      },
      "alone": {
        "quality": 0.8125,
        "claudeOutputTokens": 240960,
        "claudeCostUsd": 7.7023,
        "durationSeconds": 1978
      }
    },
    {
      "id": "S010",
      "title": "Page-based B+ tree with LRU-K buffer pool and latch crabbing",
      "level": "hard",
      "language": "C++",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 61707,
        "claudeCostUsd": 1.6036,
        "durationSeconds": 518
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 115273,
        "claudeCostUsd": 3.4199,
        "durationSeconds": 1006
      }
    },
    {
      "id": "M029",
      "title": "Agent workflow library in TypeScript",
      "level": "medium",
      "language": "TypeScript",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 28379,
        "claudeCostUsd": 0.7099,
        "durationSeconds": 218
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 66205,
        "claudeCostUsd": 2.0943,
        "durationSeconds": 555
      }
    },
    {
      "id": "G021",
      "title": "Resumable chunked upload with its own mock server",
      "level": "mixed",
      "language": "Python",
      "grace": {
        "quality": 0.9583,
        "claudeOutputTokens": 60895,
        "claudeCostUsd": 1.5815,
        "durationSeconds": 545
      },
      "alone": {
        "quality": 0.9583,
        "claudeOutputTokens": 105061,
        "claudeCostUsd": 3.0228,
        "durationSeconds": 1001
      }
    },
    {
      "id": "E004",
      "title": "ISO duration P1D silently becomes 0",
      "level": "easy",
      "language": "Python",
      "grace": {
        "quality": 0.8571,
        "claudeOutputTokens": 8121,
        "claudeCostUsd": 0.2083,
        "durationSeconds": 73
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 14341,
        "claudeCostUsd": 0.4975,
        "durationSeconds": 139
      }
    },
    {
      "id": "X006",
      "title": "In-browser spreadsheet with its own formula engine",
      "level": "extreme",
      "language": "TypeScript",
      "grace": {
        "quality": 0.8333,
        "claudeOutputTokens": 83408,
        "claudeCostUsd": 2.0636,
        "durationSeconds": 677
      },
      "alone": {
        "quality": 0.875,
        "claudeOutputTokens": 197310,
        "claudeCostUsd": 6.8437,
        "durationSeconds": 1673
      }
    },
    {
      "id": "S016",
      "title": "CDCL SAT solver with DRAT proofs",
      "level": "hard",
      "language": "C",
      "grace": {
        "quality": 0.9545,
        "claudeOutputTokens": 71467,
        "claudeCostUsd": 1.8903,
        "durationSeconds": 936
      },
      "alone": {
        "quality": 0.9545,
        "claudeOutputTokens": 97378,
        "claudeCostUsd": 2.849,
        "durationSeconds": 870
      }
    },
    {
      "id": "M034",
      "title": "mrpack tool: build, check and install modpacks offline",
      "level": "medium",
      "language": "Python",
      "grace": {
        "quality": 0.95,
        "claudeOutputTokens": 43974,
        "claudeCostUsd": 1.1542,
        "durationSeconds": 361
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 104955,
        "claudeCostUsd": 3.3395,
        "durationSeconds": 931
      }
    },
    {
      "id": "G022",
      "title": "Repair and harden a bank CSV import",
      "level": "mixed",
      "language": "TypeScript",
      "grace": {
        "quality": 0.8636,
        "claudeOutputTokens": 39019,
        "claudeCostUsd": 1.0086,
        "durationSeconds": 326
      },
      "alone": {
        "quality": 0.8636,
        "claudeOutputTokens": 79166,
        "claudeCostUsd": 2.3998,
        "durationSeconds": 692
      }
    },
    {
      "id": "E006",
      "title": "Config: 0 means off but gets reset",
      "level": "easy",
      "language": "JavaScript (Node)",
      "grace": {
        "quality": 0.9286,
        "claudeOutputTokens": 10683,
        "claudeCostUsd": 0.2854,
        "durationSeconds": 96
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 20842,
        "claudeCostUsd": 0.6711,
        "durationSeconds": 180
      }
    },
    {
      "id": "X008",
      "title": "2D retro game maker with editor, test mode and headless replay",
      "level": "extreme",
      "language": "TypeScript",
      "grace": {
        "quality": 0.8636,
        "claudeOutputTokens": 95181,
        "claudeCostUsd": 2.3454,
        "durationSeconds": 743
      },
      "alone": {
        "quality": 0.8636,
        "claudeOutputTokens": 267995,
        "claudeCostUsd": 10.5121,
        "durationSeconds": 2696
      }
    },
    {
      "id": "S022",
      "title": "Fraud patterns in a booking stream: stream processor with timers and checkpoints",
      "level": "hard",
      "language": "Java",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 64752,
        "claudeCostUsd": 1.6619,
        "durationSeconds": 556
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 175229,
        "claudeCostUsd": 5.887,
        "durationSeconds": 1616
      }
    },
    {
      "id": "M036",
      "title": "LZ77 packer for GBA graphics (BIOS-compatible)",
      "level": "medium",
      "language": "C",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 25425,
        "claudeCostUsd": 0.6224,
        "durationSeconds": 226
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 58584,
        "claudeCostUsd": 1.7821,
        "durationSeconds": 542
      }
    },
    {
      "id": "G025",
      "title": "Region unlocking: tests, bug fix, spatial index",
      "level": "mixed",
      "language": "Java",
      "grace": {
        "quality": 0.7727,
        "claudeOutputTokens": 43874,
        "claudeCostUsd": 1.1292,
        "durationSeconds": 504
      },
      "alone": {
        "quality": 0.8182,
        "claudeOutputTokens": 94005,
        "claudeCostUsd": 2.8206,
        "durationSeconds": 832
      }
    },
    {
      "id": "E013",
      "title": "TodoMVC in vanilla JS, exactly to spec",
      "level": "easy",
      "language": "JavaScript",
      "grace": {
        "quality": 0.9615,
        "claudeOutputTokens": 13732,
        "claudeCostUsd": 0.3581,
        "durationSeconds": 122
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 29736,
        "claudeCostUsd": 1.0006,
        "durationSeconds": 281
      }
    },
    {
      "id": "X010",
      "title": "Scripting language for game cutscenes with bytecode VM and debugger",
      "level": "extreme",
      "language": "TypeScript",
      "grace": {
        "quality": 0.8636,
        "claudeOutputTokens": 120241,
        "claudeCostUsd": 3.0937,
        "durationSeconds": 979
      },
      "alone": {
        "quality": 0.9091,
        "claudeOutputTokens": 209458,
        "claudeCostUsd": 6.7762,
        "durationSeconds": 1812
      }
    },
    {
      "id": "S026",
      "title": "Crash only in the release build (C++)",
      "level": "hard",
      "language": "C++",
      "grace": {
        "quality": 0.9,
        "claudeOutputTokens": 28915,
        "claudeCostUsd": 0.7583,
        "durationSeconds": 287
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 59945,
        "claudeCostUsd": 1.7792,
        "durationSeconds": 565
      }
    },
    {
      "id": "M038",
      "title": "Repair a package definition and build an import guard",
      "level": "medium",
      "language": "Python (pyproject)",
      "grace": {
        "quality": 1,
        "claudeOutputTokens": 14761,
        "claudeCostUsd": 0.3996,
        "durationSeconds": 126
      },
      "alone": {
        "quality": 1,
        "claudeOutputTokens": 29771,
        "claudeCostUsd": 0.9827,
        "durationSeconds": 268
      }
    },
    {
      "id": "G026",
      "title": "Port a video-project serializer to TypeScript, byte-identical",
      "level": "mixed",
      "language": "TypeScript (from Python starter code)",
      "grace": {
        "quality": 0.8182,
        "claudeOutputTokens": 94777,
        "claudeCostUsd": 2.4634,
        "durationSeconds": 927
      },
      "alone": {
        "quality": 0,
        "claudeOutputTokens": 28214,
        "claudeCostUsd": 0.8951,
        "durationSeconds": 294
      }
    },
    {
      "id": "E015",
      "title": "Accessible announcement bar and benefits ticker",
      "level": "easy",
      "language": "JavaScript",
      "grace": {
        "quality": 0.9333,
        "claudeOutputTokens": 13591,
        "claudeCostUsd": 0.3477,
        "durationSeconds": 131
      },
      "alone": {
        "quality": 0.9333,
        "claudeOutputTokens": 32311,
        "claudeCostUsd": 0.9648,
        "durationSeconds": 302
      }
    },
    {
      "id": "X013",
      "title": "Userspace TCP/IP stack over TAP",
      "level": "extreme",
      "language": "C",
      "grace": {
        "quality": 0.9615,
        "claudeOutputTokens": 142405,
        "claudeCostUsd": 3.7943,
        "durationSeconds": 1152
      },
      "alone": {
        "quality": 0.9615,
        "claudeOutputTokens": 365052,
        "claudeCostUsd": 12.9742,
        "durationSeconds": 3000
      }
    },
    {
      "id": "M039",
      "title": "Space Invaders with a replay test rig (TypeScript, Canvas)",
      "level": "medium",
      "language": "TypeScript (Canvas)",
      "grace": {
        "quality": 0.9583,
        "claudeOutputTokens": 31492,
        "claudeCostUsd": 0.8037,
        "durationSeconds": 256
      },
      "alone": {
        "quality": 0.4167,
        "claudeOutputTokens": 87897,
        "claudeCostUsd": 2.6833,
        "durationSeconds": 765
      }
    }
  ],
  "notPublished": "Acceptance criteria and full task texts are withheld so the tasks stay usable for future tests. Grace is described only by its version."
}
