HOT with selective index updates v72: final export validation

Status: PASS for export/application/content checks only.
Final-tip full-world and all 26 per-commit build/test gates: PASS.
See WORLD-VALIDATION.txt and PER-COMMIT-VALIDATION.txt for runtime evidence.
No build or runtime test was performed by this export task.
No AWS calls, pushes, branch rewrites, or source-worktree edits.

Source branch: tepid-v72-refresh
Source tip: 40e568cbfc542a36dd8fe166e84950c8ea119742
Source tip tree: fb989eb82261683fd99c52407d5c63f90d890320
Fork base: 72b916a20db4417cb3e825ab747236b154fdabd7
Upstream base: 9e7d152488f197e96f171f0714459c227c3f7693
Excluded first dev commit: 05e34267938426a9c8db53daf90cc972b549bee6
Pre-rebase source: 23b76c0534f3b2af1bf177ec068f157d7fbb3d98
Pre-rebase fork base: 5fc25decd43e312c7eda3896452a8e8167b1431c
Earlier v72 export tip: e999ede8fea8859249a20ab7451facce8cf109c8

27 source commits; 26 public patches. Range-diff: 25 '=' and two '!'.
The only changed stable patch IDs are public patches 22 and 24.
They add contrib/pageinspect and contrib/pg_buffercache, respectively,
to src/test/recovery/Makefile EXTRA_INSTALL. No other final-tip changes.
All 26 exported patch IDs match source and both newly applied chains.
Headers, numbering, Greg Burd <greg@burd.me> authorship, source From hashes,
filenames, omitted signature and absent base/prerequisite trailers checked.
First 21 patch files are byte-identical to the earlier export; tail five
have new From hashes. Patches 23/25/26 are otherwise byte-identical.
Source worktree HEAD/tree and status remained unchanged across checks.

Export command (OUT names this package directory):
git -c format.useAutoBase=false format-patch -v72 --numbered \
  --no-cover-letter --no-signature --no-base --output-directory "$OUT" \
  05e34267938426a9c8db53daf90cc972b549bee6..40e568cbfc542a36dd8fe166e84950c8ea119742

Full-tree proof (BASE, DEV, TIP, UPSTREAM are the exact commits above;
EXPECTED, WORKTREE and EVIDENCE are fresh scratch paths):
  git diff --binary BASE DEV > dev-only.patch
  git diff --binary UPSTREAM BASE > fork-ci-only.patch
  git worktree add --detach EXPECTED TIP
  git -C EXPECTED apply --reverse --index dev-only.patch
  git -C EXPECTED write-tree  # expected fork public tree
  git -C EXPECTED apply --reverse --index fork-ci-only.patch
  git -C EXPECTED write-tree  # expected upstream public tree
For each BASE (fork and upstream) in a separate NEW detached worktree:
  git worktree add --detach WORKTREE BASE
  git -C WORKTREE -c core.hooksPath=/dev/null am "$OUT"/v72-*.patch
  git -C WORKTREE diff --exit-code EXPECTED_TREE HEAD
  git -C WORKTREE rev-list --count BASE..HEAD  # 26
Both complete-tree comparisons returned 0, with empty diff output.
Both applied worktrees are clean. No three-way fallback or manual conflict
resolution. No path exclusions; no dev commit was applied. In particular,
pg_regress.c and pgindent were compared, not excluded with their dev hunks.
Expected/public fork tree: 8555bb874a85507442fa6530d41469d72ba6e6b6
Expected/public upstream tree: 50707883f1b37c2760d906a535a2b31059d6bc9f

Pre-rebase complete-tree reconstruction:
  git diff --binary OLD_BASE BASE > rebase-base-delta.patch
  git diff --binary EARLIER_V72 TIP > make-inputs-delta.patch
  export GIT_INDEX_FILE="$EVIDENCE/pre-rebase-plus-deltas.index"
  git read-tree OLD_TIP
  git apply --cached --binary rebase-base-delta.patch
  git apply --cached --binary make-inputs-delta.patch
  git write-tree
  unset GIT_INDEX_FILE
Result: fb989eb82261683fd99c52407d5c63f90d890320, exactly final source tree.
The second delta is exactly two additions, zero deletions, one Makefile.
No raw-patch-text or whole-path-exclusion substitute for tree comparison.

Runtime evidence scope (reported by the separate validation workers):
- Earlier tip e999ede8: Linux default Meson world 405 passed, 0 failed,
  36 skipped, plus two strict postworld stress arms passed.
- Final tip 40e568cb: fresh world 405 passed, 0 failed, 36 skipped;
  all 26 per-commit warning-free builds, regressions and isolation passed.
  Fresh final-tip reproduction passed. Prior stress results are reused
  with proof that all 2216 installed files are byte-identical, not rerun.
- Standalone GNU Make repair check: unmodified earlier tip fails both
  recovery TAP files for missing pageinspect; pageinspect-only passes
  055 (22/22) but 060 fails after 55 assertions for missing pg_buffercache;
  both additions pass 055 (22/22) and 060 (103/103), 125 assertions, exit 0.
  Each completed run recreated tmp_install and initdb template; no Meson
  world install or preinstalled helpers were used. Build enabled assertions,
  debug, injection points, TAP; compilation used COPT=-Werror.
  Tested fixup-tree delta equals the two additions folded into 22/24.
  This is focused packaging evidence, not final world/per-commit proof.

Existing warning: patch 21 benchmark scripts/run.sh line 266 has a trailing
space. Both git am runs accepted it unchanged. This is not a claim that
every patch passes git diff --check.

Packaging: 26 patches plus eight metadata/checksum files = 34 files.
No benchmark-results archive, dev setup, email draft, or build products.
SHA256SUMS covers every file except itself. The tarball checksum is recorded
outside the archive to avoid a checksum cycle. Recompute sums and archive
after any metadata changes. Local scratch paths and dev contents are not
included in this public report.

=== Exact dev delta paths ===
A	.clangd
A	.gdbinit
A	flake.lock
A	flake.nix
A	glibc-no-fortify-warning.patch
A	pg-aliases.sh
A	shell.nix
M	src/test/regress/pg_regress.c
M	src/tools/pgindent/pgindent

=== Exact fork CI delta paths ===
A	.github/workflows/fork-ocr-model-check.yml
A	.github/workflows/fork-ocr-review.yml
A	.github/workflows/fork-sync-upstream.yml

=== Two Makefile inputs ===
diff --git a/src/test/recovery/Makefile b/src/test/recovery/Makefile
index 99f6e99a..042362bb 100644
--- a/src/test/recovery/Makefile
+++ b/src/test/recovery/Makefile
@@ -10,6 +10,8 @@
 #-------------------------------------------------------------------------
 
 EXTRA_INSTALL=contrib/amcheck \
+	contrib/pageinspect \
+	contrib/pg_buffercache \
 	contrib/pg_prewarm \
 	contrib/pg_stat_statements \
 	contrib/test_decoding \

=== Fork applied HEAD and tree ===
66fbb5f54d3135968ce29f1eac1ae8c47fb62e39
8555bb874a85507442fa6530d41469d72ba6e6b6

=== Upstream applied HEAD and tree ===
d27d96f3430ddc550c23876c4ee02f24bb0e85ad
50707883f1b37c2760d906a535a2b31059d6bc9f

=== Pre-rebase to final range-diff ===
 1:  a826a910 =  1:  05e34267 dev: local dev-setup
 2:  901d2416 =  2:  62bbb724 Name the locator contract between table and index access methods
 3:  35528774 =  3:  4377e753 Rename TM_FailureData.traversed to retargeted
 4:  50b79192 =  4:  851bdc1b Report table AM tuple failures without heap metadata
 5:  32bd4a50 =  5:  3ed7037e Let the executor say which version of a row it names
 6:  332f10e1 =  6:  871163da Let an index AM store a variable-width locator
 7:  01ce649e =  7:  13b1b2d9 Carry row copies in after-trigger events
 8:  678d3ded =  8:  fb4edc0f Support table AMs that update rows in place
 9:  7e5ef84e =  9:  29cdc54b Let a table AM flag bitmap groups that do not combine exactly
10:  81ae920a = 10:  da5dbd8f Improve test coverage for heap-only tuple (HOT) update behavior
11:  fd096426 = 11:  6e803fa0 Let table AMs compare candidate attributes before an update
12:  b10cc5d2 = 12:  54454cb7 Implement the heap AM's modified-attrs comparison callback
13:  18839a5e = 13:  8cef372c Identify modified indexed attributes in the executor on UPDATE
14:  4a510847 = 14:  2e812cef Prepare index maintenance for selective updates.
15:  f557ef15 = 15:  449e5e40 Add the selective-indexed on-disk format: inline attr bitmap and stubs
16:  e8afa108 = 16:  80cc6a91 Add a per-block locator-split bit to the visibility map
17:  e33b2c87 = 17:  1706586a Implement heap HOT with selective index updates.
18:  589b993e = 18:  051add24 Extend heap statistics to include selective-indexed updates
19:  63c2643a = 19:  512dd02e Teach amcheck to recognize HOT-indexed chains and collapse stubs
20:  dabb672b = 20:  e34957c6 Add a subscription option for HOT-indexed updates
21:  9dc9dbca = 21:  6337dfbc [DO NOT MERGE] Add test table AMs for the locator contract
22:  85e75674 = 22:  06878eef [DO NOT MERGE] Add a HOT-indexed benchmark harness
23:  c16fc55e ! 23:  44c6717c Preserve HOT-indexed hop information when pruning again.
    @@ src/test/modules/index/sql/hot_chain.sql: SELECT * FROM index_scan_tids('hot_cha
     +INSERT INTO hot_prune VALUES (22, 0, 0, -1, 'duplicate');
     +DROP TABLE hot_prune;
     
    + ## src/test/recovery/Makefile ##
    +@@
    + #-------------------------------------------------------------------------
    + 
    + EXTRA_INSTALL=contrib/amcheck \
    ++	contrib/pageinspect \
    + 	contrib/pg_prewarm \
    + 	contrib/pg_stat_statements \
    + 	contrib/test_decoding \
    +
      ## src/test/recovery/t/055_hot_indexed_recovery.pl ##
     @@ src/test/recovery/t/055_hot_indexed_recovery.pl: my $final = $node->safe_psql('postgres',
      is($final, '0',
24:  3cec7458 = 24:  5a71b6b6 Check heap index coverage through validated visible anchors
25:  4c83bdb0 ! 25:  5aa92366 Initialize visibility map pages during HOT-indexed redo
    @@ src/backend/access/heap/heapam_xlog.c: heap_xlog_update(XLogReaderState *record,
      				visibilitymap_clear(rlocator, oldblk, vmbuffer_old,
      									VISIBILITYMAP_VALID_BITS))
     
    + ## src/test/recovery/Makefile ##
    +@@
    + 
    + EXTRA_INSTALL=contrib/amcheck \
    + 	contrib/pageinspect \
    ++	contrib/pg_buffercache \
    + 	contrib/pg_prewarm \
    + 	contrib/pg_stat_statements \
    + 	contrib/test_decoding \
    +
      ## src/test/recovery/meson.build ##
     @@ src/test/recovery/meson.build: tests += {
            't/057_snapshot_commit_race.pl',
26:  b1b08fc9 = 26:  ae3ccc6c Preserve valid anchors during concurrent index validation.
27:  23b76c05 = 27:  40e568cb Limit unique-check chain rechecks to the arriving index

=== Full commit/patch-ID mapping (tab-separated) ===
source_index	public_patch	pre_rebase	source	fork_applied	upstream_applied	old_stable_patch_id	stable_patch_id	subject
1	EXCLUDED	a826a910ee57cc678af58b412efdeac10e0243f9	05e34267938426a9c8db53daf90cc972b549bee6	-	-	e708b9cd13ea1792dae693cf5993ba4c7a5cb09c	e708b9cd13ea1792dae693cf5993ba4c7a5cb09c	dev: local dev-setup
2	0001	901d2416e34159fb93754dcce88d97bd9925d885	62bbb724c2f3fbed9178512c530599dbcc30d126	cebf1361298262e948190cbf1843c9c46e18cd05	6164ab2476edcaa23b1f35c21dde7ab073932943	440a41c81ff412b4161a6dced6289c1a8d3f2b8a	440a41c81ff412b4161a6dced6289c1a8d3f2b8a	Name the locator contract between table and index access methods
3	0002	3552877498edd671b41936a84519dde3b33f6bdb	4377e753049a198d6ae9e89035135b69c3ff8931	24a5e576dcd0d2068297d992324a1c4815f1ffd2	928f0667e326259f013fa5268d1a8ec0cbde3296	dfd6c60083b69e082d4550948843d3a3b23c3f3a	dfd6c60083b69e082d4550948843d3a3b23c3f3a	Rename TM_FailureData.traversed to retargeted
4	0003	50b79192101b97b61e5787a00dc8661214de997e	851bdc1ba4fe6d07035488597e102be2054ebeb3	82aec314135f9151c3540485f3758d0152068a18	16f0adda6337232c192640cff0bbbf3e66caa781	079cf1a1b159a60460f531a252aa76dfdd33f0db	079cf1a1b159a60460f531a252aa76dfdd33f0db	Report table AM tuple failures without heap metadata
5	0004	32bd4a50849db2a0006fc1e428c0a5baf86c2b43	3ed7037ee84f6d795decf8da1d05f680905162dc	a3609eab9cbd9c7a248bef7fba9167bbd67a30a4	a78145c8a507259516f2416a4b9c845f6a943f8f	6099daa713055967e8cb0fba1fb0aefe1a30f7e4	6099daa713055967e8cb0fba1fb0aefe1a30f7e4	Let the executor say which version of a row it names
6	0005	332f10e1d94895c27b080fae7d99dced63efa03c	871163dafef566d532f0ee428d1e88d51905e8a8	bf8418b674319352c5ad23dc696db073a3234d37	29f1ff5c90aa5696f64362c92921ff9eef8e1790	c09f56bd405437be75c59b9bd0333a4142f26a02	c09f56bd405437be75c59b9bd0333a4142f26a02	Let an index AM store a variable-width locator
7	0006	01ce649ea23e1578ca20b05d1788f8561aa80a5e	13b1b2d9d1b9ccfdc732d9d0ee2f9a818efc940d	0e7134188451eb3c379ad2bc89e2e7d20f93c20c	d5d3938a1e65001bb857d10ffe03cb4ba525d996	62c19f2c60794d1109f7369b981f5d2456cbc862	62c19f2c60794d1109f7369b981f5d2456cbc862	Carry row copies in after-trigger events
8	0007	678d3dedc97ca9423c431f4fe6e43a0aea30a680	fb4edc0f38777450c63cbe19d03ad837251379b7	36b934dfb0d03fb22fd6711e76a073c496947775	cfb5f73dac38c3bdbe7cac0710dd44a9294d8c09	495c8a8448168bcebaba31e789651fa60f03ca4f	495c8a8448168bcebaba31e789651fa60f03ca4f	Support table AMs that update rows in place
9	0008	7e5ef84e9c607838fe3d728c4464e577dc12d412	29cdc54b0d3ca389fd9a03f999c24cd4c585fa50	d4c292734281adfb2db99e606ebaad1566c7e051	3afddaf3cf3487cb7240a8e6cd6e33f39ad8f427	196cf21bea3e42dcc490ff0d7715f19f94eb6fef	196cf21bea3e42dcc490ff0d7715f19f94eb6fef	Let a table AM flag bitmap groups that do not combine exactly
10	0009	81ae920a237e4d214a1ea0bf3016c7c6015483ec	da5dbd8facba43675d9ec022c855d84e662dda0a	08b61868313477ae6b4c2a54cc0d6b28803cb68d	ebb012b12fdab3e6638d8ef370a21386fb00a833	73cadbbfe8eed0c8e7501e0a3cab755169261802	73cadbbfe8eed0c8e7501e0a3cab755169261802	Improve test coverage for heap-only tuple (HOT) update behavior
11	0010	fd0964268f842b3992c4148c24f4ebf9bbd6ee4b	6e803fa02cdc8e9da767c7ad325106d8d812043d	824222065b1f44e10bfb898eb0b5ddd7096fb88c	3af912e3acb6a4735a196fc3ec97468107313a8c	bcc4988d3cd4589232da7a075a05e50742779a54	bcc4988d3cd4589232da7a075a05e50742779a54	Let table AMs compare candidate attributes before an update
12	0011	b10cc5d22a8411cde2f7fcd130d0aaa8e39823a6	54454cb7fe56e1fc1aacf18e04c26eda3dd19b75	da39d2421e088519b3f44dfd0e42c6989fe597e6	d9fa2592b27288fa0f37d6ee001e4b8aaac14463	798f8e60de50b1c75441b67a166302871d5ca6c5	798f8e60de50b1c75441b67a166302871d5ca6c5	Implement the heap AM's modified-attrs comparison callback
13	0012	18839a5e963c9925934938feb42df5ca6efa0987	8cef372c2d0adddf49015a8d4f7e42cc37102e97	12fdd4ba74cf6adc4f42ccfa37478f394b48b076	7b520c359b2389f05eba0f71587d42b056417050	fb10094e2d72d6700e6aed7fd0ea33424f156824	fb10094e2d72d6700e6aed7fd0ea33424f156824	Identify modified indexed attributes in the executor on UPDATE
14	0013	4a510847a31ed05e5d7d286ed4f643df1f49932e	2e812cef942dc05109d290b64d2e192d33f4d2d7	f4dbd4f37cc4f1c12c4393e33d0320dcc619d4e6	26ff0195d52ce341e8d009e1e0aa62cc4a1e55ba	91a86a2ebcc2fb56c56fa244d09fb05affd9d618	91a86a2ebcc2fb56c56fa244d09fb05affd9d618	Prepare index maintenance for selective updates.
15	0014	f557ef159f062f94dc661674e584ed83e3da953c	449e5e4076b044a577bacfa9541984c793f37810	f0845fff3a42130a625e8dd93f50c849494e5226	0930f26ca0de4aba8a53e2fa85c8b34949bbfa71	3d11a3583177099643d4ea4696e497f6da6adff7	3d11a3583177099643d4ea4696e497f6da6adff7	Add the selective-indexed on-disk format: inline attr bitmap and stubs
16	0015	e8afa1086909b9178084751f694d946bb5a7d9d6	80cc6a918d42c427b3f76e49486c632274b8a886	875278e7d8c727fc2e82ce1a4dacbfda1fecec95	0e3ad8065fb389bffcf0db90e43ff146f2d0c17d	a6990b009d653d495bf6a19a5b5e32ca05796a93	a6990b009d653d495bf6a19a5b5e32ca05796a93	Add a per-block locator-split bit to the visibility map
17	0016	e33b2c876585bc5bb9f19db14c53474fd4982777	1706586a511f7b35e830b467bc894834c5b3b9f5	9882b1400d6d379abcadc48423e36b11e3ea09a3	59e6e1d468cef1467234fe67dfe3a1f18bf81b26	0d3df3688c7d66b3042e708eca645625c3a0a26d	0d3df3688c7d66b3042e708eca645625c3a0a26d	Implement heap HOT with selective index updates.
18	0017	589b993e1bc76292e2c4cfac6f95072fda622789	051add2418c528398c0ea30ae9411573e725a883	c4dcfd0127848709b6cadb2a493cc630945d8b3a	3e525b6376e264c66ae639449dab4e0a2a9ec0fd	a678ee48f231206af315699dbd0d75ddaada0812	a678ee48f231206af315699dbd0d75ddaada0812	Extend heap statistics to include selective-indexed updates
19	0018	63c2643ae7c577d562356964410fdc76cadc161e	512dd02e5efce48e45039ace64de3183e9208bd0	5686969901cbdda6025088fa111258ae38c17ae4	d007be0db9dbc1b41b5f2fc302b344646bc2441f	15e927aaa1acf298b3dabf00bee6ca011a441477	15e927aaa1acf298b3dabf00bee6ca011a441477	Teach amcheck to recognize HOT-indexed chains and collapse stubs
20	0019	dabb672bfd9dbbf5e82a34f8f0bd4c25286cb6f7	e34957c63e25eceb012d6e02598a40bd9ece8ddc	b1c1838ad6146485cbb1e39991ddf213b6bb5d45	72fa4d74792e2786ff4a18a1362db13690f5da55	d8c85a3275d2ac9c1d619154399d49ab91584115	d8c85a3275d2ac9c1d619154399d49ab91584115	Add a subscription option for HOT-indexed updates
21	0020	9dc9dbcafafdd57278c2f556f919d2bb01eff204	6337dfbc0b7f164f64cb34327adec83fae5bfc4e	0c22e8d948390ff93c12cd2fe492f71645832e54	9ca993daebe8b7c95d0a84124a8030f1c662f490	bb97a4a0eaaee8abeef39cd2f3a1ce96c5dfe1ec	bb97a4a0eaaee8abeef39cd2f3a1ce96c5dfe1ec	[DO NOT MERGE] Add test table AMs for the locator contract
22	0021	85e75674cb394c51d329ffe4bc9032d24489a2eb	06878eefe6070977eb8529ef038bc678c1923888	f6ecad6bcf7bd84dd1a6f5356233e7bf40c41544	fdf662cca4ce6e22a528dc529955d2f647f350c9	d33de901245fc15d674574777b8986dffe7833d0	d33de901245fc15d674574777b8986dffe7833d0	[DO NOT MERGE] Add a HOT-indexed benchmark harness
23	0022	c16fc55ed7e8af1a8c12a37d54cd34d370c8a3ea	44c6717ca29911505323e647a6a3cad2fa80ebb2	c3b7d5d071f1840e2cd1c3da65343fc2c349e2d9	487d3ad8298e3c03fd56c7cc763cfcad41f8adad	f8cf30e62857f40625d29cd39948961bb7d0fc19	fc9b69a8b63f291ee3e0c16dbdb10fa3625040c7	Preserve HOT-indexed hop information when pruning again.
24	0023	3cec745881dceccf5f6de4b5366dc0fb1e1245d4	5a71b6b6e9d3f023bd6c2f9da0bf9891bd58a6b2	fe8e86f04486e2eba99c4abcfbd1dcd967e58418	e1950df131f453ec6427c991eeb745e0ce879424	5304fab2ec3dc24bdcc95c1d8065fa5868082bf6	5304fab2ec3dc24bdcc95c1d8065fa5868082bf6	Check heap index coverage through validated visible anchors
25	0024	4c83bdb098cf1eefe2690e54495387177bde6438	5aa923662de0ba264b7c7614c724e44a3a6114ec	4526d81d9539e77900c5871570ecdac7b2d44b88	f37d2b5490bb953f8af9138b0e81d8cc55dff27b	163e426b33cd5851c34493e4f2a4a5fba47204ac	f5db1521f67f376a9261fcc523b9b5d573ab11ed	Initialize visibility map pages during HOT-indexed redo
26	0025	b1b08fc94ac595e0b093a16914889ed8e8b7bad1	ae3ccc6cb67946dac0f9b795cc86de51dd674d0e	d4262d3b1b583e4594e0790750015506e051df37	b3d061142abd30bff3f88d7d07447a168899245b	fe700f74e7adb760775a2fd85c19ca0011d71ec6	fe700f74e7adb760775a2fd85c19ca0011d71ec6	Preserve valid anchors during concurrent index validation.
27	0026	23b76c0534f3b2af1bf177ec068f157d7fbb3d98	40e568cbfc542a36dd8fe166e84950c8ea119742	66fbb5f54d3135968ce29f1eac1ae8c47fb62e39	d27d96f3430ddc550c23876c4ee02f24bb0e85ad	312a0e92f6ee9b7fc80afa0f4884e36c24dee139	312a0e92f6ee9b7fc80afa0f4884e36c24dee139	Limit unique-check chain rechecks to the arriving index

=== Fork apply log ===
patch 21:643: trailing whitespace.
  local seedopt="--random-seed=$seed" 
warning: 1 line adds whitespace errors.
Applying: Name the locator contract between table and index access methods
Applying: Rename TM_FailureData.traversed to retargeted
Applying: Report table AM tuple failures without heap metadata
Applying: Let the executor say which version of a row it names
Applying: Let an index AM store a variable-width locator
Applying: Carry row copies in after-trigger events
Applying: Support table AMs that update rows in place
Applying: Let a table AM flag bitmap groups that do not combine exactly
Applying: Improve test coverage for heap-only tuple (HOT) update behavior
Applying: Let table AMs compare candidate attributes before an update
Applying: Implement the heap AM's modified-attrs comparison callback
Applying: Identify modified indexed attributes in the executor on UPDATE
Applying: Prepare index maintenance for selective updates.
Applying: Add the selective-indexed on-disk format: inline attr bitmap and stubs
Applying: Add a per-block locator-split bit to the visibility map
Applying: Implement heap HOT with selective index updates.
Applying: Extend heap statistics to include selective-indexed updates
Applying: Teach amcheck to recognize HOT-indexed chains and collapse stubs
Applying: Add a subscription option for HOT-indexed updates
Applying: Add test table AMs for the locator contract
Applying: Add a HOT-indexed benchmark harness
Applying: Preserve HOT-indexed hop information when pruning again.
Applying: Check heap index coverage through validated visible anchors
Applying: Initialize visibility map pages during HOT-indexed redo
Applying: Preserve valid anchors during concurrent index validation.
Applying: Limit unique-check chain rechecks to the arriving index

=== Upstream apply log ===
patch 21:643: trailing whitespace.
  local seedopt="--random-seed=$seed" 
warning: 1 line adds whitespace errors.
Applying: Name the locator contract between table and index access methods
Applying: Rename TM_FailureData.traversed to retargeted
Applying: Report table AM tuple failures without heap metadata
Applying: Let the executor say which version of a row it names
Applying: Let an index AM store a variable-width locator
Applying: Carry row copies in after-trigger events
Applying: Support table AMs that update rows in place
Applying: Let a table AM flag bitmap groups that do not combine exactly
Applying: Improve test coverage for heap-only tuple (HOT) update behavior
Applying: Let table AMs compare candidate attributes before an update
Applying: Implement the heap AM's modified-attrs comparison callback
Applying: Identify modified indexed attributes in the executor on UPDATE
Applying: Prepare index maintenance for selective updates.
Applying: Add the selective-indexed on-disk format: inline attr bitmap and stubs
Applying: Add a per-block locator-split bit to the visibility map
Applying: Implement heap HOT with selective index updates.
Applying: Extend heap statistics to include selective-indexed updates
Applying: Teach amcheck to recognize HOT-indexed chains and collapse stubs
Applying: Add a subscription option for HOT-indexed updates
Applying: Add test table AMs for the locator contract
Applying: Add a HOT-indexed benchmark harness
Applying: Preserve HOT-indexed hop information when pruning again.
Applying: Check heap index coverage through validated visible anchors
Applying: Initialize visibility map pages during HOT-indexed redo
Applying: Preserve valid anchors during concurrent index validation.
Applying: Limit unique-check chain rechecks to the arriving index
