)]}'
{
  "commit": "f53c31601f90c1b840c0703c5537c3ce1e4b6f5c",
  "tree": "44be007a509a003965c0ccbe3bf095b9c78c6713",
  "parents": [
    "37867f63e497cfa4a4e182c43c2beef75307cdb2"
  ],
  "author": {
    "name": "Russ Cox",
    "email": "rsc@golang.org",
    "time": "Wed Aug 26 06:40:11 2026 -0400"
  },
  "committer": {
    "name": "Russ Cox",
    "email": "rsc@golang.org",
    "time": "Thu Aug 27 18:29:21 2026 -0700"
  },
  "message": "unicode/norm: don\u0027t truncate runes in the recomposition map key\n\ncombine built its map key as uint32(uint16(a))\u003c\u003c16 + uint32(uint16(b)),\ntruncating both runes to 16 bits. Supplementary-plane runes therefore\naliased BMP entries in both directions: entries whose decomposition uses\na supplementary rune were stored under a truncated key, and lookups with\na supplementary rune found unrelated BMP entries. The result is a\ncomposition that is not canonically equivalent to its input, reachable\nfrom plain BMP text:\n\n\tNFC(U+05D2 U+0307) \u003d U+105C9  // Hebrew gimel + dot above\n\tNFC(U+0300 U+11F41) \u003d U+1F43  // Kawi rune destroyed\n\nThis is not a Unicode 17 regression; it affects the Unicode 15 tables\ntoo, at 15056 two-rune inputs, and 15379 under Unicode 17.\n\nPack each recompMapPacked entry as a big-endian uint64 holding three\n21-bit fields: the two decomposition runes and the composed rune. That\nis wide enough for any rune and keeps the entries at 8 bytes each, so\nthe table size is unchanged.\n\nAn exhaustive scan of every rune followed by every combining or\nbackward-combining rune now reports no output that fails to be\ncanonically equivalent to its input, and NFC is idempotent throughout.\n\nChange-Id: I2795f7d129d7a1adb40e5666f2cd33888935e9fb\nReviewed-on: https://go-review.googlesource.com/c/text/+/822082\nLUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cgolang-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nReviewed-by: Damien Neil \u003cdneil@google.com\u003e\nReviewed-by: David Chase \u003cdrchase@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5aab24533afa034bb8f282843ceb9b657e3b58fd",
      "old_mode": 33188,
      "old_path": "unicode/norm/composition_test.go",
      "new_id": "3a849708c46e0f2c4e4ed7da86b33bb857c4cfda",
      "new_mode": 33188,
      "new_path": "unicode/norm/composition_test.go"
    },
    {
      "type": "modify",
      "old_id": "b3cf5d9bdee236a6c6af6f59573a46c6f425008a",
      "old_mode": 33188,
      "old_path": "unicode/norm/forminfo.go",
      "new_id": "956708eec0d8aaaf7aa81f9954fcf50155262392",
      "new_mode": 33188,
      "new_path": "unicode/norm/forminfo.go"
    },
    {
      "type": "modify",
      "old_id": "963eb2cf51a93d18966febc081f1acb5197b70ca",
      "old_mode": 33188,
      "old_path": "unicode/norm/maketables.go",
      "new_id": "fc4c6d4305148e75b49bf34ce08bb0b722a1b0de",
      "new_mode": 33188,
      "new_path": "unicode/norm/maketables.go"
    },
    {
      "type": "modify",
      "old_id": "d9623241ca4d8a6c673f5015eab19f437050c5b2",
      "old_mode": 33188,
      "old_path": "unicode/norm/tables15.0.0.go",
      "new_id": "c30c6f7bf5b9babfaa6f6ef2854b9068fc286060",
      "new_mode": 33188,
      "new_path": "unicode/norm/tables15.0.0.go"
    },
    {
      "type": "modify",
      "old_id": "dfd555fc1b5703718ac462b7eb8176856219fe5a",
      "old_mode": 33188,
      "old_path": "unicode/norm/tables17.0.0.go",
      "new_id": "c3231891205d3052b5584f904dc32ef968c5535e",
      "new_mode": 33188,
      "new_path": "unicode/norm/tables17.0.0.go"
    }
  ]
}
