ReviewOS

also looking at this

craft-native/craft

fix(native): retain keyed controls and correct map and tab chrome

#368
Merged chris wants to merge codex/native-repeated-selector-identity into main
32 files +449 -100

Review threads live on the whole diff, not on one commit, so none are shown here - a thread's line means something in the branch's final form, and painting it into an intermediate step would put it on code it is not about.

.github/workflows/benchmarks.ymlmodified+2-2
Changes to .github/workflows/benchmarks.yml
@@ -35,9 +35,9 @@ jobs:
3535 fetch-depth: 0
3636
3737 - name: Setup Zig
38 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
38 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
3939 with:
40 version: '0.11.93'
40 version: '0.11.94'
4141 - name: Install Linux dependencies
4242 run: |
4343 sudo apt-get update
.github/workflows/binary-size.ymlmodified+2-2
Changes to .github/workflows/binary-size.yml
@@ -49,9 +49,9 @@ jobs:
4949 fetch-depth: 0
5050
5151 - name: Setup Zig
52 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
52 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
5353 with:
54 version: '0.11.93'
54 version: '0.11.94'
5555 - name: Install Linux dependencies
5656 run: |
5757 sudo apt-get update
.github/workflows/ci.ymlmodified+26-26
Changes to .github/workflows/ci.yml
@@ -33,9 +33,9 @@ jobs:
3333 steps:
3434 - uses: actions/checkout@v6
3535 - name: Install the managed Android toolchain
36 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
36 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
3737 with:
38 version: '0.11.93'
38 version: '0.11.94'
3939 install: 'false'
4040 packages: bun.com@1.4.3 git-scm.org@2.53.0 openjdk.org@17.0.20.8 android.com/cmdline-tools@14742923.0.0
4141 - name: Boot and dispose the stock Play image through the SDK
@@ -58,9 +58,9 @@ jobs:
5858 steps:
5959 - uses: actions/checkout@v6
6060 - name: Install the identical managed Android toolchain
61 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
61 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
6262 with:
63 version: '0.11.93'
63 version: '0.11.94'
6464 install: 'false'
6565 packages: bun.com@1.4.3 git-scm.org@2.53.0 openjdk.org@17.0.20.8 android.com/cmdline-tools@14742923.0.0
6666 - name: Verify bounded budget validation and normal readiness contracts
@@ -93,9 +93,9 @@ jobs:
9393 - uses: actions/checkout@v6
9494
9595 - name: Setup Pantry (provides Bun, Zig, etc.)
96 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
96 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
9797 with:
98 version: '0.11.93'
98 version: '0.11.94'
9999
100100 - name: Verify Zig installation
101101 run: zig version
@@ -178,9 +178,9 @@ jobs:
178178 - uses: actions/checkout@v6
179179
180180 - name: Setup Pantry (provides Bun and Zig)
181 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
181 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
182182 with:
183 version: '0.11.93'
183 version: '0.11.94'
184184
185185 - name: First-party Zig dependencies
186186 uses: ./.github/actions/first-party-zig-deps
@@ -237,9 +237,9 @@ jobs:
237237 - uses: actions/checkout@v6
238238
239239 - name: Setup Pantry (provides Bun, Zig, etc.)
240 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
240 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
241241 with:
242 version: '0.11.93'
242 version: '0.11.94'
243243
244244 - name: Install dependencies
245245 run: bun install
@@ -283,9 +283,9 @@ jobs:
283283 - uses: actions/checkout@v6
284284
285285 - name: Setup Pantry (provides Bun, Zig, etc.)
286 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
286 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
287287 with:
288 version: '0.11.93'
288 version: '0.11.94'
289289
290290 - name: Install dependencies
291291 run: bun install
@@ -310,9 +310,9 @@ jobs:
310310 - uses: actions/checkout@v6
311311
312312 - name: Setup Pantry (provides Bun, Zig, etc.)
313 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
313 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
314314 with:
315 version: '0.11.93'
315 version: '0.11.94'
316316
317317 - name: Install XcodeGen
318318 run: brew install xcodegen
@@ -352,9 +352,9 @@ jobs:
352352 - uses: actions/checkout@v6
353353
354354 - name: Setup Pantry (provides Bun, Zig, etc.)
355 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
355 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
356356 with:
357 version: '0.11.93'
357 version: '0.11.94'
358358
359359 - name: Setup Java
360360 uses: actions/setup-java@v6
@@ -403,9 +403,9 @@ jobs:
403403 - uses: actions/checkout@v6
404404
405405 - name: Setup Pantry (provides Bun, Zig, etc.)
406 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
406 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
407407 with:
408 version: '0.11.93'
408 version: '0.11.94'
409409
410410 - name: Install dependencies
411411 run: bun install
@@ -422,9 +422,9 @@ jobs:
422422 - uses: actions/checkout@v6
423423
424424 - name: Setup Pantry (provides Bun, Zig, etc.)
425 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
425 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
426426 with:
427 version: '0.11.93'
427 version: '0.11.94'
428428
429429 - name: Install dependencies
430430 run: bun install
@@ -449,9 +449,9 @@ jobs:
449449 - uses: actions/checkout@v6
450450
451451 - name: Setup Pantry (provides Bun, Zig, etc.)
452 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
452 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
453453 with:
454 version: '0.11.93'
454 version: '0.11.94'
455455
456456 - name: Install dependencies
457457 run: bun install
@@ -526,9 +526,9 @@ jobs:
526526 - uses: actions/checkout@v6
527527
528528 - name: Setup Pantry (provides Bun, Zig, etc.)
529 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
529 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
530530 with:
531 version: '0.11.93'
531 version: '0.11.94'
532532
533533 - name: Install dependencies
534534 run: bun install
@@ -584,9 +584,9 @@ jobs:
584584 fetch-depth: 0
585585
586586 - name: Setup Pantry (provides Bun, Zig, etc.)
587 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
587 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
588588 with:
589 version: '0.11.93'
589 version: '0.11.94'
590590
591591 - name: Install Dependencies
592592 run: bun install
.github/workflows/mobile-e2e.ymlmodified+12-12
Changes to .github/workflows/mobile-e2e.yml
@@ -113,9 +113,9 @@ jobs:
113113 - uses: actions/checkout@v6
114114
115115 - name: Setup Pantry (provides Bun, Zig, etc.)
116 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
116 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
117117 with:
118 version: '0.11.93'
118 version: '0.11.94'
119119
120120 - name: Install dependencies
121121 run: bun install --frozen-lockfile
@@ -167,7 +167,7 @@ jobs:
167167 uses: actions/checkout@v6
168168 with:
169169 repository: stacksjs/stx
170 ref: 413b21432886fda5c610e7eaaaa2ad95dce2f04f
170 ref: 0d85afbab4b569ac2f09113a6c9a5d11d926145f
171171 path: .stx-compiler
172172
173173 - name: Install stx compiler dependencies
@@ -267,9 +267,9 @@ jobs:
267267 - uses: actions/checkout@v6
268268
269269 - name: Setup Pantry (provides Bun, Zig, etc.)
270 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
270 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
271271 with:
272 version: '0.11.93'
272 version: '0.11.94'
273273
274274 - name: Install XcodeGen
275275 run: brew install xcodegen
@@ -286,7 +286,7 @@ jobs:
286286 uses: actions/checkout@v6
287287 with:
288288 repository: stacksjs/stx
289 ref: 413b21432886fda5c610e7eaaaa2ad95dce2f04f
289 ref: 0d85afbab4b569ac2f09113a6c9a5d11d926145f
290290 path: .stx-compiler
291291
292292 - name: Install stx compiler dependencies
@@ -400,9 +400,9 @@ jobs:
400400 - uses: actions/checkout@v6
401401
402402 - name: Setup Pantry (provides Bun, Zig, etc.)
403 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
403 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
404404 with:
405 version: '0.11.93'
405 version: '0.11.94'
406406
407407 - name: Setup Java
408408 uses: actions/setup-java@v6
@@ -434,7 +434,7 @@ jobs:
434434 uses: actions/checkout@v6
435435 with:
436436 repository: stacksjs/stx
437 ref: 413b21432886fda5c610e7eaaaa2ad95dce2f04f
437 ref: 0d85afbab4b569ac2f09113a6c9a5d11d926145f
438438 path: .stx-compiler
439439
440440 - name: Install Android stx compiler dependencies
@@ -566,9 +566,9 @@ jobs:
566566 - uses: actions/checkout@v6
567567
568568 - name: Setup Pantry (provides Bun, Zig, etc.)
569 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
569 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
570570 with:
571 version: '0.11.93'
571 version: '0.11.94'
572572
573573 - name: Cache Zig artifacts
574574 uses: actions/cache@v5
@@ -642,7 +642,7 @@ jobs:
642642 - uses: actions/checkout@v6
643643 with:
644644 repository: stacksjs/stx
645 ref: 413b21432886fda5c610e7eaaaa2ad95dce2f04f
645 ref: 0d85afbab4b569ac2f09113a6c9a5d11d926145f
646646 path: .stx-compiler
647647 - run: bun install --no-save
648648 working-directory: .stx-compiler
.github/workflows/release.ymlmodified+10-10
Changes to .github/workflows/release.yml
@@ -69,9 +69,9 @@ jobs:
6969 fetch-depth: 0
7070
7171 - name: Setup Pantry (provides Bun, Zig, etc.)
72 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
72 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
7373 with:
74 version: '0.11.93'
74 version: '0.11.94'
7575
7676 - name: Install System Dependencies
7777 if: matrix.platform.deps != ''
@@ -344,9 +344,9 @@ jobs:
344344 # publish the Zig package here: a failed second leg would otherwise make
345345 # an incomplete version visible in the pantry registry.
346346 - name: Stage draft release
347 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
347 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
348348 with:
349 version: '0.11.93'
349 version: '0.11.94'
350350 install: 'false'
351351 release: 'true'
352352 release-draft: 'true'
@@ -435,9 +435,9 @@ jobs:
435435 # paths; it does not rebuild a platform binary. The complete GitHub
436436 # release is public before this registry version can become visible.
437437 - name: Publish Zig package
438 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
438 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
439439 with:
440 version: '0.11.93'
440 version: '0.11.94'
441441 install: 'false'
442442 publish: 'zig'
443443 package-dir: packages/zig
@@ -644,9 +644,9 @@ jobs:
644644 fetch-depth: 0
645645
646646 - name: Setup Pantry (provides Bun, Zig, etc.)
647 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
647 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
648648 with:
649 version: '0.11.93'
649 version: '0.11.94'
650650
651651 - name: Install Dependencies
652652 run: bun install --frozen-lockfile
@@ -731,9 +731,9 @@ jobs:
731731 fetch-depth: 0
732732
733733 - name: Setup Pantry (provides Bun, Zig, etc.)
734 uses: pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231 # v0.11.93
734 uses: pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4 # v0.11.94
735735 with:
736 version: '0.11.93'
736 version: '0.11.94'
737737 - uses: actions/setup-node@v6
738738 with:
739739 node-version: '24'
docs/guides/native-stx.mdmodified+3-3
Changes to docs/guides/native-stx.md
@@ -61,10 +61,10 @@ capability APIs from the host.
6161The maintained Mobile E2E workflow checks out one exact stx compiler commit for
6262both simulator hosts. Update the iOS and Android refs together; the workflow
6363contract test rejects compiler skew between them.
64The current pair is pinned to `413b21432886fda5c610e7eaaaa2ad95dce2f04f`,
64The current pair is pinned to `0d85afbab4b569ac2f09113a6c9a5d11d926145f`,
6565which preserves authored reconciliation keys in created and cloned native nodes.
66This qualifies the compiler and native mutation models together; release qualification
67must use the corresponding normally published compiler before consumer adoption.
66This is the normally published STX `0.2.573` compiler. The native fixtures
67qualify its mutation metadata together with both native models.
6868
6969The host-neutral layout contract lives in Craft's Zig runtime at
7070`packages/zig/src/native_layout.zig`. It defines the shared row/column flex
packages/android/fixtures/native-navigation/README.mdmodified+1-1
Changes to packages/android/fixtures/native-navigation/README.md
@@ -105,7 +105,7 @@ Returning to a retained route reapplies native theme defaults before it becomes
105105visible, so a dark-mode change while another route is open cannot leave stale
106106colors behind.
107107CI uses `@stacksjs/stx` (`stx native compile`) pinned at
108`413b21432886fda5c610e7eaaaa2ad95dce2f04f` (STX authored-key qualification candidate). For an unreleased sibling
108`0d85afbab4b569ac2f09113a6c9a5d11d926145f` (stx `0.2.573`). For an unreleased sibling
109109checkout, set `STX_CLI=../stx/packages/stx/bin/cli.ts`; native support is part
110110of `@stacksjs/stx`, so do not install the historical `stx-native` package or
111111compiler. The compiler installs an initial tree atomically before sending
packages/ios/fixtures/native-navigation/README.mdmodified+1-1
Changes to packages/ios/fixtures/native-navigation/README.md
@@ -51,7 +51,7 @@ without relying on a screenshot.
5151
5252From the Craft repository, with `@stacksjs/stx` available as `stx` (the
5353maintained CI checkout is pinned to
54`413b21432886fda5c610e7eaaaa2ad95dce2f04f` / STX authored-key qualification candidate):
54`0d85afbab4b569ac2f09113a6c9a5d11d926145f` / stx `0.2.573`):
5555
5656```bash
5757bun packages/ios/scripts/test-native-navigation.ts
scripts/release-workflow.test.tsmodified+4-4
Changes to scripts/release-workflow.test.ts
@@ -18,7 +18,7 @@ type Job = {
1818}
1919const release = Bun.YAML.parse(readFileSync(join(import.meta.dir, '../.github/workflows/release.yml'), 'utf8')) as { jobs: Record<string, Job> }
2020const artifactDownload = 'actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093'
21const stxCompilerCommit = '413b21432886fda5c610e7eaaaa2ad95dce2f04f'
21const stxCompilerCommit = '0d85afbab4b569ac2f09113a6c9a5d11d926145f'
2222const needs = (job: Job) => typeof job.needs === 'string' ? [job.needs] : job.needs ?? []
2323const steps = (job: Job) => job.steps?.map(step => step.run ?? '').join('\n') ?? ''
2424
@@ -101,8 +101,8 @@ test('workflow setup uses a known Pantry CLI instead of resolving latest', () =>
101101 for (const [name, job] of Object.entries(workflow.jobs)) {
102102 for (const step of job.steps ?? []) {
103103 if (step.uses?.startsWith('pantry-pm/pantry/packages/action@')) {
104 expect(step.with?.version, `${file} ${name} must pin Pantry CLI`).toBe('0.11.93')
105 expect(step.uses, `${file} ${name} must pin the matching action source`).toBe('pantry-pm/pantry/packages/action@e4b2d439c174c41d3e1c99b5743acb5789e92231')
104 expect(step.with?.version, `${file} ${name} must pin Pantry CLI`).toBe('0.11.94')
105 expect(step.uses, `${file} ${name} must pin the matching action source`).toBe('pantry-pm/pantry/packages/action@da17bb9317e8f8c247618fb176fe97269f15bfe4')
106106 }
107107 }
108108 }
@@ -250,7 +250,7 @@ test('a failed native leg cannot publish a partial GitHub, Zig, or npm release',
250250 expect(release.jobs.npm.if).toContain("needs.prepare-npm.result == 'success'")
251251 expect(release.jobs.npm.if).toContain("needs.publish-release.result == 'success'")
252252 const zigPublish = registry.steps!.find(step => step.name === 'Publish Zig package')
253 expect(zigPublish?.with).toMatchObject({ version: '0.11.93', install: 'false', publish: 'zig', 'package-dir': 'packages/zig' })
253 expect(zigPublish?.with).toMatchObject({ version: '0.11.94', install: 'false', publish: 'zig', 'package-dir': 'packages/zig' })
254254 expect(zigPublish?.with?.release).toBeUndefined()
255255 expect(Object.entries(release.jobs).flatMap(([name, job]) =>
256256 (job.steps ?? []).filter(step => step.with?.publish === 'zig').map(() => name))).toEqual(['publish-pantry'])