# Queue
- **Apple's keyframes lowering (SVG and box motion) ends on the first of repeated 100% blocks** (2026-11-12, read, not run). `forward` in `host/apple/src/svg_lower.rs` builds its own track, so it neither merges a block naming the animation's timing function with one naming none nor holds the last block at offset 1, both of which `Keyframes::track` and `Animation::value_at` in `exact-motion` now do as Chrome does. Build the lowered track from `Keyframes::track`.
- **An iOS navigation-collapse test fails on main** (2026-11-12, run at 00037e6f on an iOS 27 simulator, twice, at low load). `NavigationCollapseIOSTests.testWrappedScrollerLosesAndRegainsTheHeaderWhenContentMovesAboveIt` fails after about 8 s: its route does not push, so it never reaches the scrolling it tests. The class's other 20 tests pass (`bun host/apple/build.mjs --test --ios --only NavigationCollapseIOSTests`).
- **Apple's storage roots are one per process** (2026-11-12, read). `ROOTS` in `host/apple/src/picker.rs`, which answers `pickedPath`, `appRoots` and `appFile`, holds the roots of whichever app activated last, so a host process running two different apps' sessions can hand the earlier one the later one's directories. Key them by app.
- **Android headless carrier: a secret write fails with `sync /: Invalid argument`** (2026-11-12, #203). `bun exact.mjs test android --headless` on the OAuth fixture signs in and then cannot keep the session: the store's directory sync is refused (os error 22) on the emulator's filesystem. The APK carrier passes the same test. Evidence was an Android 16 (API 36.1) arm64 emulator.
- **Android headless carrier: the default store level refuses to start** (2026-11-12, #204). A TypeScript app built with `bun exact.mjs android --headless` and no `deploy.store.linux` stops at launch with "the baked store level requires the delivery adapter; regenerate the app entry"; with `"deploy": {"store": {"linux": "0"}}` (as apps/oauth-fixture has) it runs. Either the headless Android build should bake level 0 or the message should name the setting.
- **Android: no sustained frame measurement** (2026-11-12, #231). `agent android perf frames live` is refused as unsupported and `dumpsys gfxinfo` saw three frames in five seconds of an infinite animation under the test carrier's virtual clock, so the 3D-card fix (7de13f61) has no before/after number on a device.
- **Warn about top-level Intl on Android without Intl** (#205). The bake knows the target, but inspects bytecode with the host Hermes. Pass the selected Android bundle’s receipt availability through the captured bake inputs (including receipt-change invalidation), then warn on global Intl uses during module initialization in app and imported code. Reuse the scope-aware TypeScript walker; cover guarded and deferred uses and both Android carriers. The published v5 bundle still has no Intl.
- **OAuth credentials in Contract answers** (2026-11-12, #208). Neither `provider.accessToken(store)` nor `provider.idToken(store)` is guarded against being returned to Contract: both are ordinary strings with a documentation-only restriction. Decide whether to enforce that boundary.
- **The native prelude looks up a module's names in plain objects** (2026-11-12, read, not run). `js/src/prelude.js` `tool` reads `global.exact.tools[name]` and `failureCode` reads `FETCH_FAILURE[e.kind]`, so a handler name or a fetch failure kind of `constructor` or `toString` finds Object.prototype's member: `tool("constructor", args)` answers `Object(args)` where the web JS target now answers no handler (`host/web-js/ts-data.js`). Read each with `Object.hasOwn`, as host/web-js does.
- **Linux's `showPicker` and `saveFile` can ask the desktop portal too** (2026-11-12). The document pickers now ask `org.freedesktop.portal.FileChooser` (`host/linux/src/portal.rs`), while `input type=file`'s `showPicker` (LLP 1069.002 D8, which rules the portal) and `saveFile` (LLP 1069.010 D3) still refuse outside the agent. Their agent answers (`answer_picker`, `answer_save` in `presenter/picker.rs`) already copy a file in or out given a path, which is what `portal::choose` returns.
- **EAS worker qualification (#48).** Run the app-owned native build recipes on a real EAS worker with distribution signing, upload and store submission. Local artifact checks do not establish these.
- **`difftest explore … --js-only` drives every program and 18 diverge** (2026-11-12). Run over `contract/corpus apps/*/app.contract`, these remain undiagnosed. A module call is refused for a missing grant, which the runner answers as `prompt` (`contacts-calendar-fixture`, `geofence-fixture`, `photo-editor`, `photos-fixture`, `recorder`). The oracle has no answer for a source the runner never called (`bench` `portList`, `lights` `lights`). The driver's DOM has no `getBoundingClientRect` (`native-fixture`). The rest have no diagnosis yet: `agents`, `auth-fixture`, `expose`, `metronome`, `orientation-fixture`, `shelf`, `unsaid`, `grouped-touch`, `inline-image` and `share`. Each is either the driver's gap or the JS target's defect; tell which before fixing.
- **The workers publish an `exactBodyTo` file when an abort or a deadline lands between the body's end and the rename** (2026-11-12, read, not run). `host/apple/src/executor_body_to.rs` checks for an abort around each read and not between the last one and `staged.publish()`. The asynchronous machine admits the publish under the executor's lock (`executor_async_body_to.rs`); the workers could do the same.
- **The workers' retirement leaves a retired completion's accounting standing** (2026-11-12, read, not run). `complete` in `host/apple/src/executor_core.rs` returns at `state.retired` before it releases the run's bytes and counts, so they stay in the shared state for as long as a waker or a clone holds it. The asynchronous machine now applies physical ends after retirement (`executor_async_retire.rs`).
- **`exactBodyTo` is refused on Apple's own asynchronous lane** (2026-11-12). The machine's portable lanes write a reply to a file (LLP 1162 D8 item 5); `DarwinLane`'s callbacks run on URLSession's delegate queue, which must not block on a disk, so it refuses by name. It needs a download task or writes handed to another thread before the machine can be measured on a device.
- **Shelf's test file fails three tests on macOS on main** (2026-11-12).
- **`exact-data` tests share machine state across checkouts** (2026-11-12). Its lock and kept-document tests fail when two checkouts on one machine run them at once.
- **`exact-linux --lib` exhausts worker slots at the default 96 test threads** (2026-11-12). The asynchronous-core tests run out of slots; use 16 threads until the tests isolate their workers.
- **Rust receipt requirements pin a different ABI from the module builder** (2026-11-12). `bake/src/receipt.rs` writes `rustAbi: 2` in a Rust artifact's requirements, and its test pins it; `scripts/rust.mjs` writes the module ABI.
- **The photo-upload executor test can miss the uploads it must feed** (2026-11-11). `a_burst_of_photo_uploads_goes_three_at_a_time_and_leaves_other_streams_their_places` gathers open uploads before feeding them; uploads that open after that gather get no feed, and the test waits five seconds for an outcome that needs one. It failed 7 of 12 runs of the unchanged executor on a 96-core Linux machine.
- **The executor's quit test fails under a parallel run** (2026-11-11). `a_quit_ends_every_group` fails intermittently on the 96-core Linux machine.
- **The incremental runner test fails for geofence-fixture on Linux** (2026-11-11). `runner/tests/it/incremental.rs` fails for `geofence-fixture` at `18b358e0`.
- **App icons not yet seen running** (2026-11-11, LLP 1163 §4). tvOS's brand assets and the watch app's icon compile, and `assetutil` shows them, but no Apple TV or watch simulator runtime was installed to see them on a Home Screen. The Windows icon resource is linked only by a build on Windows, which has not run. The Android drive's check for an APK older than its sources (`exact-build.json`) counts no icon file, so an edit to an icon alone leaves the old APK looking current.
- **The Android build does not compile on origin/main** (2026-11-11, found building LLP 1163's icons). `host/linux/src/lower.rs:326`, Android-only, passes `n.style.cx` by value to `point`, and `Dimension` is no longer `Copy` since `2c765f970`. Taking `&Dimension`, returning `*v`, and calling `point(&n.style.cx)` and `point(&n.style.cy)` compiles (tried, not kept).
- **The branded-Chrome cleanup test counts other drives' bundle copies** (2026-11-11). `scripts/agent-browser.test.mjs`'s "branded Chrome removes its bundle copies after script and test shutdown" (macOS, `CHROME` naming branded Chrome) compares the shared `code_sign_clone` directory before and after; a Chrome another drive starts meanwhile and keeps open fails it. Check only the copies its own browsers made.
- **An inline Tab stop on the page joins a dialog popover's focus search** (2026-11-11, seen while fixing Tab from a negative-index control). `host/linux/src/presenter/typing.rs` `focus_stop` admits any inline Tab stop wherever its paragraph is, so when a `dialog` popover opens (`alert.rs:268`, which passes only the dialog's boxes), an inline link on the page can be chosen as the dialog's first stop. Restrict inline stops to paragraphs among the candidates, as starting points already are. Separately, `alert.rs:268` still takes a fragment's starting point when a dialog opens, though HTML's dialog focusing steps do not use one.
- **Android select menu (#243).** Replace the page-painted menu with LLP 1115.001 D10's anchored popup window, including touch scrolling, accessible option rows, focus restoration and the platform's transitions. A menu left open while layout moves its control paints from the previous frame's geometry, but taps use the new geometry. Long menus cannot be scrolled by touch (also documented in the Android README).
- **Later SVG switch children lose reference targets** (2026-11-11). `host/svg-file/src/lower.rs` skips every child after a switch takes one. `` draws only the first rectangle. Reproduced with the lowerer at `9e53578f22` and after the `systemLanguage` fix; retain unselected children for references without drawing them in the switch.
- **Tamber parameter range probes omit package tokens** (2026-11-11). With `brand = reading.card` supplied by a package and `Card.inset: length = 8px in 0..24`, the server accepts `set-param Card.inset=99px` while the build refuses it. `contract/cli/src/tamber_ops.rs` passes the app design alone to `written_ranges`; its probes cannot fold the package reference and return no range errors. Join the package tokens in those probes as in the ordinary fold.
- **Crawler files: three gaps the reviews of #240 found** (2026-11-11, read and partly run; not this change's). `host/web/serve.mjs:28`'s `PUBLIC_FILES` leaves `robots.txt` and `sitemap.xml` out, so `staticFile` and `listPublicFiles` return nothing for a wasm build's two files (run). The Bun render server (`host/web-js/render.mjs` `--serve`, near the static lookup) answers a GET of `/robots.txt` or `/sitemap.xml` for a `render=build` route at that path with a 500, since that route's build is a directory it sends as a file. `host/web-js/src/pages.rs:12` leaves a `render=build` route whose pattern has a parameter out of `pages.json`, so an app whose only build route is parameterized never runs the JS renderer and its pages are not built. A fix of all three, branch `fix/q0003-crawler-files-three-gaps-the` in the fleet checkout, is not landed: its escaping of built page paths (`host/web-js/route-pattern.js` `buildPageFile`) makes distinct routes share a file (`/.x` and `/%2Ex`, `/a` and `/%61`), and `host/web/serve.mjs` answers an enumerated page asked with any `Accept` but `text/html` with nothing.
- **Two tests fail on origin/main under Linux, and pass on macOS** (2026-11-11, `2099b234`, x86_64). `exact-apple`'s `inherited::a_percentage_min_height_on_a_list_row_has_no_basis` (`host/apple/tests/it/inherited.rs:447`: the row is 19.2 points tall, not 52) and `exact-runner`'s `incremental::every_app_plan_updates_incrementally_exactly_as_it_does_in_full` (`runner/tests/it/incremental.rs:706`, an app making fewer than a quarter as many commits as steps). Both fail alone too.
- **Swatch's Apple fixture needs native targets.** `packages/fixtures/swatch/test/apple.mjs` calls the Apple builder directly after `exact new`, whose default app has no Apple crate. Enroll the platforms the suite runs before building; today it stops at `Cargo has no swatchfixture-apple target`.
- **Virtualized iOS snap geometry (#219):** unmounted rows do not contribute a target on a descendant of the row root, a root displaced by a transform, a root with a font-relative or percentage inset or margin, or a target farther than the bounded window from the projection. The synchronous drag-end query examines at most 64 rows; with sparse targets, the nearest one can lie outside that window.
- **Android loses scroll travel before a delayed hit reply** (#233). A first fix exists on `wave18/android-scroll` (`6de28f5c`), not landed: it claims a hosted text field's gesture before the field receives it; a pending release can start a fling after the activity stops; net travel loses a reversal at a scroll limit; a lifted tracked pointer can leave a drag with no finger; an UP sample moves the content before flinging and counts that travel twice. Qualification needs a device, hosted fields, nested scrollers, multi-touch and lifecycle transitions.
- **More's pop to its list that ends while another tab shows sends no Back** (2026-11-11, `NavigationMoreIOSTests.testMoreTappedAgainThenAnotherTabLeavesTheRoutersStack`). More tapped again above a tab's root, then a tab on the bar tapped before the pop ends: the pop ends with More showing its list while the router is on the other tab, so `followMoresList` sends no Back, and Exact writes the routes above the root back into the tab's own controller, where picking its row shows them again. A pop within the tab's routes keeps its Back until More shows again (`morePopTab`); here More's record would have to wait until the row's tab shows.
- **A tab on the bar tapped during another tab's own Back loses that Back** (2026-11-11, read, not run). Home's animated Back, then a tab other than More tapped on the bar before it ends: that tab's press syncs, `syncTabs` writes Home's routes back into Home's controller during the pop and records them, and the pop's end finds nothing departed while navigation follows the other tab, so Detail is there again on Home. A pop of More within a tab's routes keeps More's record for this case (`morePopTab`); the same for a tab's own controller would skip its writes while a native pop is pending on it and keep its record when navigation stops following it.
- **The agent's tap on the router's own tab under More does nothing while More shows its list** (2026-11-11, read, not run). After the agent's `back` at a tab's root under More, More shows its list and the router stays on that tab. A `tap` on that tab's authored tab presses it, the router's tab does not change, and no selection is written, so More keeps showing its list; a person's pick of the row shows the tab. An app's navigation within the router's tab meanwhile writes into a controller off screen.
- **A press made from More's delegate call during a sync is not projected** (2026-11-11, read, not run). An ordinary batch's sync lays the tab container out, which can start More's push for a row picked in the turn before; More's `willShow` then presses the tab while `syncing`, and `sync`, called for that press's batch, returns at its re-entry guard, so its `children` ops do not reach `logicalChildren`, which takes a panel's children only from the batch `sync` is given; no later batch brings them back. By reading, for a plain tab that its row's press builds (Six in the More fixture), Exact's record of the panel then stays empty, and `declineMoreRow` declines each later pick of its row. `syncNextTurn` lays out before its sync for this reason; on re-entry, folding the batch's `children` ops and calling `syncNextTurn()` would fix it.
- **While More keeps a Back, `syncTabs` writes no tab's routes** (2026-11-11, read; `NavigationMoreIOSTests.testATabNotBuiltTappedWhileMoreKeepsABackIsFilledWithinTheTap` shows that a tab not built, tapped then, is still filled within the tap). A pop of More within a tab's routes that ends while another tab shows keeps More's record until More shows again (`morePopTab`); until then `syncTabs` writes no tab's routes and records neither More nor the own controller of the tab whose routes More holds, so a tab whose routes changed while it was not the router's tab is written only once it is, by `sync`. Writing every tab's routes but the popped tab's would end it; no test has shown a difference yet.
- **More selected again during its own pop can be read as a push within the tab** (2026-11-11, read, not run). More's Back under a tab's routes, a tab on the bar tapped, then More tapped again before the pop ends (about 0.47 s, LLP 1075.003 §9.16): if More's `willShow` for the tab's root comes while the pop's coordinator is still More's, its `from` controller is the popped route, so `followMore` presses nothing though the router is on the other tab, and the router follows only through the tab container's `didSelect`, which a selection of More in code does not send. `NavigationMoreIOSTests.testMoreTappedAgainBeforeItsBackLeftByAnotherTabEndsKeepsTheBack` passes with a tap. Pressing nothing only for an animated transition, as UIKit's push and pop are and More selected again was not (§9.16), would close it.
- **A tab's root route replaced while More holds it is written into the tab's own controller** (2026-11-11, read, not run). `moreTab` finds the tab by the tabpanel of More's first route; if the app replaces that route's node, `moreTab` is nil, and `syncTabs` writes the new root into the tab's own controller while More still shows the old one.
- **With an app's own delegate on More, a pop of More holds `changing` until the next batch** (2026-11-11, read, not run). While navigation follows More, `nativePopPending(on: more)` counts a pop whose end Exact, hearing no `didShow`, cannot see; `syncTabs` records More at the next sync, so until a batch comes the agent reads the transition `in-progress` and `popMayBegin` refuses More's back swipe. Applying `morePopTab`'s delegate condition in `nativePopPending` would end it.
- **The agent's `back` to More's list can reply before More reports its list** (2026-11-11, Duo Lab on the iPhone 18 Pro simulator, iOS 27.0, `--chrome platform`, on `main` `35ac89eb7b`, with and without the change that keeps More's Back when another tab is tapped during it). After `back` at a tab's root under More, the next `state navigation` read `transition` `in-progress` and an empty `stack` in every drive on `main` and in some with that change, and `idle` with the tab's root in the others. More's `willShow` and `didShow` for its list come after the pop call returns (LLP 1075.003 §9.16); the reply did not always wait for them. The same drives log UIKit's "Unbalanced calls to begin/end appearance transitions" for a `RouteController` once.
- **Duo Lab's Panes title draws over its first line on the iPhone 18 Pro simulator** (2026-11-11, iOS 27.0, `main` `35ac89eb7b`, `--chrome platform`). On Panes' root, and on `panes-next` ("Pushed panes"), the large title overlaps the text "Responsive layout. Split and Overlay require the native iOS app on iOS 27.1 or later." at the top of the screen.
- **Android status bar scope when native sheets land** (LLP 1105 D7, #209). The presenter resolves `modal` routes as covering pages today. When Android reports native presentations, use their coverage, detent/width and settled transition state; iOS leaves the bar behind a medium or iPad sheet and holds the committed style through transitions. Android still ignores `status-bar-animation`. Qualify the independent bar flags on a phone in both schemes, across routes and a sheet; no device/emulator run was available for this change.
- **iOS launch after `didFinishLaunching` (LLP 1047.001.001 Q2).** Find what moved about 16 ms after the callback when SafariServices was linked, in the phone measurements of §2.2.
- **SafariServices for other Apple entries (LLP 1047.001.001 Q3).** Measure an app extension and the watch companion before extending the device app executable’s launch link to them. An App Clip copies its parent’s executable and carries the link unmeasured.
- **Permission resources on return from Settings** (2026-11-11, found in #217). Android does not re-ask `enumerateDevices` after the camera is allowed in Settings. Announcing it on resume must wait for the camera provider: before it is ready the list has no cameras, so a bare invalidation would drop the anonymous entry. The JVM tests have no fixture for a provider with a camera. Android's `Pedometer.kt` does not invalidate `pedometerStatus` on resume, and `SpeechRecognition.kt` does not refresh `speechRecognitionStatus`. Apple's media-capture module does not invalidate `enumerateDevices` on return to the foreground either.
- **Tests seen failing while landing issue fixes that the fixes did not touch** (2026-11-11). `exact-linux`'s `agent::tests::exit::an_orderly_exit_waits_for_a_request_with_effects` (`host/linux/src/agent/tests/exit.rs:216`, `must_finish` still true after the exit's bound) failed 1 run in 20 on origin/main at a load average near 15, and 5 in 12 near 40. `pump::held_work_tests::a_wake_without_a_reply_releases_held_work` and `pump::abort_tests::an_abort_whose_answer_was_replaced_is_still_cancelled_on_an_empty_pump` failed in whole-suite runs and passed alone. `scripts/agent-launch.test.mjs` "a native build is stale when a setting its module inlined has another value now" failed once in a run of the whole file and passed in the next three. The first run of `host/web-js/build.test.mjs` in a checkout whose web compiler is not yet built fails about fourteen tests in a millisecond each, and the second run passes. `PressFocusIOSTests.testADismissedSheetHandsNothingOn` fails on origin/main's own sources on an iOS 27.0 simulator, alone as well as in its class. `contract`'s `growth` test `resource_clock_advice_grows_with_derives` (`contract/cli/tests/growth.rs:130`, a ratio of two best-of-three timings near 150 µs and 1 ms held to 6.0) failed at 6.9 in a whole-suite run and in one of three runs alone. `host/web-js/answer-timers.test.mjs` "a live page waits the full delay after an async answer resumes" failed 14 runs in 24 alone, at a load average under 10: the two timers armed after the answer resumes are due in 500 and -500 ms where the test expects 2000 and 1000, as if measured from when the page's clock last moved and not from now. If that is the runtime and not the test's paused clock, a live page's timer set after a long wait fires early. `scripts/agent-test.test.mjs` "authored media preferences apply before observations, override by name, and survive reload" expects `prefer: unknown dark: expected`, and the message now carries a `did you mean` hint before `expected`. `executor::core::stream::tests::a_burst_of_photo_uploads_goes_three_at_a_time_and_leaves_other_streams_their_places` failed once in a whole-suite run of `exact-apple` and once of `exact-linux` (the test is shared source), at load averages near 25 to 40, and passed five times alone. `contract`'s `growth` test `resource_clock_advice_grows_with_functions` failed once in a whole-suite run and passed three times alone.
- **Setup's cargo advice on Windows can blame the wrong file** (2026-11-11, read in #3, not run). `cargoProxyFault` (`scripts/exact.mjs`) probes whatever `cargo` the shell runs and then looks up `cargo.exe` across the whole `PATH`. Windows runs the first match by `PATHEXT` in each directory, so with a `cargo.cmd` shim ahead of rustup's `cargo.exe` the fault names the working proxy as the one that refuses `+` and skips its directory. Resolving the failing file as the shell does, and comparing directories by real path without case, would close it.
- **A standalone app whose first boot is refused draws nothing** (2026-11-11, found in #163). A Rust source whose `answer` returns `Unavailable` at boot refuses the boot. A release iOS build then shows a blank view (the session is `failed` with the reason in `bootError`), Linux prints `exact: boot: …` and exits, and the web JS target empties its root. LLP 1031 D8 leaves the previous generation or the embedder's fallback visible; a standalone app's first boot has neither. What it should show is undecided.
- **An inline run's opacity: what Apple's fix left, and Linux** (2026-11-11). Apple now fades a nested `text` run's colour, background, shadow and stroke by its opacity (`paragraph` ops carry it). Still full ink: the paragraph's decoration lines drawn through a faded run, the widgets and watchOS path (`HeadlessSession`), and a button title's direct text child. The Linux painting host applies no run opacity at all. An infinitely animated run re-sends its paragraph every frame, as a changing run colour already does.
- **A positioned box inside an aligned multi-column container is not where Chrome places it** (2026-11-11). A 320×100 container with `column-count:2`, `column-gap:0` and `align-content:end` holds a 20px block, then a `position:relative` block whose child is `position:absolute; top:0; left:0` and 10×10. The kernel paints the child at (160, 80) (`kernel/src/fragment/cut.rs`). Chrome 156.0.8078.4 paints it at (800, 80), and the container's scroll width is 960; with 30px blocks it paints both `top:0` and a static position at (480, 80). Chrome's rule seems to be one for every inset: the column is `floor((flow_y + align) / pitch)`, and y is the remainder plus the alignment. An `overflow:hidden` containing block keeps its child with it at (160, 80). This entry first said Chrome paints the child unshifted at (160, 0); it does not, and the attempt built on that, branch `fix/q0024-a-positioned-box-inside-an`, is not landed. Not declared in LLP 1093 D10; Chrome fixture rows in `kernel/tests/it/browser_columns.rs` would hold it.
- **A build script that watches a directory outside its package** (2026-11-11, #171). A bake refuses one (`completeBuild` in `scripts/app.mjs`), naming the package and the directory: a watch of `../..` above a path dependency holds the app, its target directory and the bake's output. Recording one needs the receipt and the drive's freshness check (`receiptChanges`, `watchedNewer` in `scripts/agent-launch.mjs`) to share one list of the directories builds and tools write, directory listings recorded without those, each link's target recorded, and link cycles skipped.
- **Web JS sends before source activation refuse finite arguments** (2026-11-11). When `data.answer()` returns `null`, `host/web-js/rt.js` refuses the send's action instead of waiting for `data.ready()`. Reproduced on `db0f0618` and with the non-finite argument fix; the runner already waits for activation.
- **Android's island pictures, what an emulator showed and what a phone still owes** (2026-11-11, LLP 1159.000 D1; `issues/closed/20261110-android-recorder-drops-island-images.md`). On an API 36 emulator a page with `text-shadow`, `-webkit-text-stroke`, `background-clip: text`, a `clip-path`, a `mask-image` and a blurred SVG shape draws as the web's does, and a blended SVG element draws unblended and says so once in the log, as the schema's `mix_blend_mode` row records. Not measured: what a shadow or a stroke that animates costs, since each paint sends a new picture; and nothing was seen on a phone's GPU.
- **On Apple a one-axis `overflow` clip on a node with an overlay or a material clips both axes** (2026-11-11). `clip` beside `visible` puts the children in the shadow's clip box (`BoxShadow.swift`), which a node with an overlay or glass cannot take, so those keep the both-axes mask. The clip box also reaches only 65,536 points past the node on the visible axis. Neither is declared in LLP 1001.
- **An outside app's Rust workspace after its checkout moves, and a bake source built with arguments** (2026-11-11, #163). After exact2 moves, `bun exact.mjs update` repairs `exact-*` paths and leaves any other exact2 crate (`contract`) on the old path, so Cargo cannot read it; the way out is to write that path as `/…` again and run `update`. `buildModule` (`host/web-js/module.mjs`) copies only a path, `::default()` or `::new()` into the module it generates, so a data source constructed with arguments needs a crate of the app's own named in `rust.module.package`. Its matcher reads the raw script, so a commented-out call it can copy is taken ahead of a live one it cannot, as on origin/main; that is left for the real parse. A fix for either needs edits made on a real parse of the manifest, and of the build script, not on patterns over their text.
- **Apps in SDK-named folders** (2026-11-11, token audit row 06). `exact new /exact --name Everbloom` still refuses the `exact-apple` collision. Deriving a prefix from the display name needs one crate identity shared by `createApp`, `updateApp`, `ensureShells` and `resolveApp`; changing the scaffold alone would break a later update or build. Keep the directory alternative in the error until those paths agree.
- **Native executor test isolation on a shared Mac** (2026-11-11). Default-concurrency runs can exhaust test worker slots and hit request or exit deadlines in `exact-linux` and `exact-apple`. The branch's full root and Linux test commands pass with four test threads; the baseline Apple library also hits a process deadline. Qualify test worker admission and real-time waits under suite load.
- **A build does not notice a stale copy of an in-app `file:` package** (2026-11-11, #115). Bun copies a `file:` package inside the app's directory into `node_modules`, so an edit to its source builds the old copy until `bun install`, silently. A check that compares only the files a build read with the package's source (`checkInstalledReads`, one refusal rule, every producer) is built and held on branch `wave10/build`; what it still gets wrong: a Windows implementation's `exact.json` is taken from beside its Rust root, not where it is declared (`packages/device/windows` names `../linux/lib.rs`); the APK's Kotlin directories are walked whole, so a `.DS_Store` or README there refuses a build Gradle would not compile it into; web extension implementations reach the page bundle through `ext-*.js` outside both checked records; a file read through a link from one installed package directory into another (Bun's isolated installs keep them under `node_modules/.bun`) is looked up by the physical directory's name in `bun.lock`, not by its package's; a copy missing beside a present source throws `ENOENT` instead of refusing; the APK entry's test needs the Android Rust target to reach the check; one bake test sets `TARGET` for every bake in its binary; and that test fails under `EXACT_JS_ENGINE=stub`. Not covered at all: a package's Rust module files beyond its root, and Contract files a package gives an app whose data is Rust.
- **Apple readers of an `app:/` file that still take a path** (2026-11-11). Apple's `saveFile` copies the file `appFile` (`host/apple/src/picker.rs` `app_file`) joins as text, with `FileManager.copyItem`, which copies a link the app planted there. An animated `app:/` GIF or WebP opens through `AppFiles.open`, but its later frames are read from its URL (`AnimatedRaster.swift`), so a link put in its place after it opened is read. A widget's `app:/` image (`ExactSnapshot` `SnapshotRasters.resolve`) admits a link that stays below its root. Each wants the walk `readFile` takes (`AppFileWalk`).
- **Android extension writers that still follow a link planted after the path is answered** (2026-11-11, #164). Each needs app code holding `fs.write` on the directory to act in the moment between the context's check and the write. The writes Exact's own Kotlin makes go through `Files.output`/`Files.write` (`O_NOFOLLOW`), but three do not: the camera on a device, where CameraX opens the answered `File` itself when the shutter finishes (hand it a stream or descriptor opened with no-follow before `takePicture`; CameraX is not in every machine's Gradle cache, so it was not compiled with the rest); the recording encoder's output on a device, which `MediaMuxer` and `RandomAccessFile` open by path (`Recording.kt` `Encoder`, `Parts.kt` `PartWriter` and `mux`'s `.mp4.tmp`); and a parent directory swapped for a link, which is followed both inside `picker::place` itself (`host/linux/src/picker.rs` `place_from` checks the parts one at a time by path, and `file` joins the path again after `open_from`, so a directory replaced by a link between two lookups answers a path that already goes through it) and at any later write, a speech transcript's directory during a running recognition included, since `O_NOFOLLOW` guards only the last name. The fix for all of them is one thing: a descriptor-relative walk from the app root (`openat` with `O_NOFOLLOW|O_DIRECTORY`, as ibex2's `AppDirectories` does) with the parent's descriptor held through the write.
- **iOS: a batch between a resize and its layout still lays a native container out at the old size** (2026-11-10). `ExactView.fitAheadOfLayout` tells the session a new size before a trait, tint or text-size change's batches. Other batches still run in the old frames: `fit()` applies a new display scale's batches (`canvasDisplay`, `tellDisplayScale`) before the size, `tellPage` applies one on activation and from the scene notifications, and a timer or main-queue batch can land there too. On an iPhone Duo such a batch during a refresh can leave the scroller's refresh inset under a large title, as the appearance change did. Fitting from the view's own `frame` and `bounds` setters, as the Mac view fits from `resizeSubviews(withOldSize:)`, would cover them all, at the cost of a fit inside UIKit's autoresizing on every rotation and fold, which may read the safe area before UIKit settles it. The early fit also runs before the session holds a new appearance, so a view whose text colour the new width changes can be noted as painting in an appearance of its own (`noteAppearance`) and ease rather than snap at the next flip (`set_view_scheme`).
- **iOS: a refresh control there at boot is hosted by the navigation bar on an iPhone Duo** (2026-11-10, seen in a probe app on the 27.1 simulator). The stack is laid out before its window, and UIKit moves the control into the folded display's fixed 58-point large-title bar. Not yet compared with a hand-built app on the same OS; if its control stays in the scroll view, this is a tell.
- **`packages/background-transfer/test/apple.mjs macos` fails four assertions** (2026-11-11; two runs at be826004 on macOS 27.0.1): the upload's response body, download `d1`, folder `f1` and appear `f2`. The upload's `uploaded` was 8 of 8 in both; an earlier run read 0 (the carrier's `sent`, `host/apple/Sources/ExactKit/Transfers.swift`), so that count may be intermittent. The suite had not run since `exact new` stopped naming Apple by default. A first `host/apple/build.mjs` of a fresh `exact new` app is refused by the driver as stale: the build writes `.exact/shells` after the `started` its receipt records (`build.mjs` takes it from the process's start); the suite now writes the shells first.
- **A placed canvas child's layout change, with VoiceOver running** (2026-11-11, #68). On iOS a canvas whose surface places its children posts one `.layoutChanged` when the set or order of its exposed children changes, and nothing while they only move. It posts behind a dialog's sheet and under `inert` too, so a culled card there makes VoiceOver read the screen again once: the accepted cost of a rule with no reachability state. Listen for that re-read with VoiceOver on a phone. The Mac still posts `.layoutChanged` for every placed child whose placement changed, each frame (`GpuMac.swift` `readPlacements`, `NodeView.placementChanged`); a fix wants VoiceOver on a Mac to judge which element to name.
- **A look's `color` under a `color-scheme` boundary on the wasm web host** (2026-11-11, #111). The JS target gives a boundary below a hovered or focused node the look's colour (`modes.js` tags it, `colour_below` in `host/web/src/host/looks.rs`); the wasm host's boundaries still write the inherited colour onto themselves and stop it. A press colour probably does not cross a boundary on the web either, and two nested looks that both hold give the text the later rule's colour where Apple, like CSS inheritance, gives the inner one's. The iOS XCTests for the Apple path (an iPad's pointer) have not run.
- **Where a JavaScript render still differs from the render host** (2026-11-11, found in #108; `host/web-js/render-settle.test.mjs` `DIFFERS` pins each). The render host rejects a refused storage call; a JavaScript render leaves it unanswered. So a source that catches the refusal answers its fallback there and stays pending here (as LLP 1048.000 D9 has a refused source keep its placeholder), and a stream whose mapper awaits a refused call, one it makes itself or one made before the stream opened, ends its message there (a settled 200) and holds the stream to the deadline here (a 503). Rejecting the refused call here, as the render host does, would close both; it is not done, since a rejection nothing handles in a render ends the `serve` process today.
- **A detached rejection on a server promise ends a JavaScript render's process** (2026-11-11, found reviewing the render store's refusal). `host/web-js/render.mjs` hands each render's realm the server's own `fetch`, `Request`, `Response`, streams, `crypto.subtle` and `WebAssembly`, so their promises, and every promise chained on them, belong to the server's realm. When one is left rejected with a value made outside the render's realm, as `new Response('body').text().then(() => { throw 'x'; })` or a refused `store.set` caught and rethrown as its message, `render.mjs`'s `unhandledRejection` listener cannot tell which render owns it and keeps Bun's fatal handling, and the process exits. The string rethrow exits it on main too. Containing it needs every promise a render sees made in its own realm (each promise-returning server API wrapped, and the objects they return) or renders run where an unhandled rejection ends only that render.
- **`exact-linux`'s timing tests fail under a loaded Mac** (2026-11-12). `cargo test -p exact-linux --lib` on an M5 running other builds fails one or two of `presenter::pump`'s `an_abort_whose_answer_was_replaced_is_still_cancelled_on_an_empty_pump` and `a_wake_without_a_reply_releases_held_work`, and `executor::core::async_tests::the_suite_passes_on_the_asynchronous_core`, a different one each run (main failed one of five runs); each passes alone. Find the wall-clock wait each takes and give it the test clock (`docs/testing.md`). `agent::tests::exit::an_orderly_exit_waits_for_a_request_with_effects` is another (2026-11-12): it failed twice in full `--lib` runs and passes alone.
- **`exact-apple`'s executor tests fail together under load** (2026-10-27, a Mac Studio shared with long Lean lanes). `cargo test -p exact-apple --lib executor` failed nine socket and idle tests (`executor_socket_tests.rs`, "an outcome within five seconds"; `executor_idle_tests.rs`) and `the_suite_passes_on_the_asynchronous_core`; each passes alone. A short read no longer zeroes its unused buffer tail on every read (2026-11-12), which cleared the large-body timeout under contention, but the nine were not reproduced and a contended run still fails the child-process `maxBuffer` test. Find what each five-second wait waits on before lengthening it.
- **Three press tests cannot open their page on this Mac** (2026-11-12, main f72a364c). In `host/web/tests/press.test.mjs`, "only the innermost pressable shows the press…", "a pressable that declares no feedback dims while pressed…" and "the pressed paint shows by the press rule…" fail in about 2 ms with `the DevTools pipe closed (Target.createTarget)` (`open`, line 147, through `agent-launch.mjs:484`), every run; the other 27 pass. The fleet's Chromium runs them. Find which browser `open` launches there and why its pipe closes.
- **Nine web-js document and build tests fail on main on this Mac** (2026-11-12, 9e55aa1b). In `host/web-js/document-agent.test.mjs`, seven navigation cases whose data is discarded or outlives its answer (`storeStatus`, `discardedStatus`, `discardedHeldStatus`, `discardedLooseStatus`, `backgroundSync`, and two deadline cases) answer 200 where the test expects 404, or report `settled: true` at the deadline. In `host/web-js/build.test.mjs`, the production starter is 46,610 bytes against its 45 KiB budget (`build.test.mjs:101`), and an app whose head names `