| … | … | @@ -4311,12 +4311,25 @@ injected per layer: |
| 4311 | 4311 | numbering. Only `tools/l2-ops` and l2's own gates stay on l2 until R4c-4e. |
| 4312 | 4312 | - **E6. The core gate's `hops` mode and the R4c-4b concurrency scripts,** compared line for line with Bare at |
| 4313 | 4313 | pool = 1. Any difference is a finding, fixed in core. |
| 4314 | - **E0 OUTCOME (2026-10-11): the outer-queue mechanism below was BUILT, MEASURED UNNEEDED, and REMOVED |
| 4315 | (keetd a86e194).** Its motivating example is wrong: `inOndata_` is set only inside `Replicator::_ondata`, |
| 4316 | which runs AFTER `verify` returns, outside its frontier; hooks fired inside `verify` resolve synchronously |
| 4317 | and queue nothing. Measured: a probe counting every microtask / completion / rejection routed through a |
| 4318 | `Foreign` frame found none in any gate (core, store, bee, blobs, fuzz, all m3c scenarios, m4c) — only |
| 4319 | r4c_scaffold's own cases; drill r4c4d0 (ForeignFn unwrapped, `foreign()` unwrapped, Frontier = capturing |
| 4320 | Sync) left every mutant surviving on all of those gates, and m3c s21 (a get resolved by upgrading data, |
| 4321 | ordered against 'append' / 'download' — as JS) passes with or without it. **What stays:** the E0 frontier |
| 4322 | sites (keetd 7e5752c repl, 3cf9e77 store, c50d1a9 bee + blobs, a67b01a tools + tests), with `Frontier` an |
| 4323 | alias of `Sync` and `scaffold::frontier(fn)`; drill r4c4d0 keeps the tripwire "verify outside a frontier", |
| 4324 | which must go red by E1. **If foreign capture ever shows up** (a gate red when a frontier is added), the |
| 4325 | mechanism returns with that gate as its test. The design as built, for the record: |
| 4314 | 4326 | - **E0 CORRECTION (2026-10-07, found before any code; decided by the user: an outer queue for hooks).** A |
| 4315 | 4327 | frontier scope around a whole core op also captures the microtasks that core's hooks queue in code OUTSIDE |
| 4316 | 4328 | core. For example, `core->verify` (replicator.cpp:732) reaches the replicator's `inOndata_` request |
| 4317 | | resolutions (replicator.cpp:145, 156) through `onappend` / `onupgrade`. The scope would drain those |
| 4318 | | microtasks before `_handleData`'s remaining steps; today, and in JS's single queue, they run after. R4c-4c-3's |
| 4319 | | scopes never hit this, because they wrapped pure storage calls. So E0 as written was NOT a no-op. A first fix |
| 4329 | resolutions (replicator.cpp:145, 156) through `onappend` / `onupgrade` [WRONG — see E0 OUTCOME above]. The |
| 4330 | scope would drain those microtasks before `_handleData`'s remaining steps; today, and in JS's single queue, |
| 4331 | they run after. R4c-4c-3's scopes never hit this, because they wrapped pure storage calls. So E0 as written |
| 4332 | was NOT a no-op. A first fix |
| 4320 | 4333 | (3cd545b: `queueMicrotaskForeign` at a fixed list of producer sites) was INCOMPLETE and is superseded here. |
| 4321 | 4334 | Core calls foreign code synchronously through many exits: about 25 `core->on*` hooks into the replicator, |
| 4322 | 4335 | `Session::emit` into user listeners, every API's CPS `done` (the caller's continuation), and option callbacks |