From 33f592d26bf73194ccf3aef8a8ff25c6b74a95b2 Mon Sep 17 00:00:00 2001 From: John Travers Date: Sat, 24 Oct 2026 13:00:38 +0100 Subject: [PATCH 1/3] SEP 21: refresh against the integrated tree and split phase 0 Record SEPs 22-30 as Final and add the SEP 29, 30, 31 and 34 contracts; take SEP 34's admittance metric and collar passivity rule on spatial routes; name the driver's committed-endpoint statistics call for the accumulators; correct stale references (stability intervals, the spatial collar diagnostic, the in-repository native backend, the keyword interfaces). Split phase 0 into 0a (windows, monitors, geometry, reflection) and 0b (escaped-field records), move the energy diagnostics' contract to R3, and remove the phase-space filter and directional occupancy to the roadmap. Add Q22. Co-Authored-By: Claude Opus 5.5 --- .../dev/seps/sep-0021-absorbing-boundaries.md | 322 ++++++++++-------- 1 file changed, 187 insertions(+), 135 deletions(-) diff --git a/docs/dev/seps/sep-0021-absorbing-boundaries.md b/docs/dev/seps/sep-0021-absorbing-boundaries.md index e47c02d4b..761f2bd68 100644 --- a/docs/dev/seps/sep-0021-absorbing-boundaries.md +++ b/docs/dev/seps/sep-0021-absorbing-boundaries.md @@ -5,7 +5,7 @@ | **SEP** | 21 | | **Title** | Temporal boundaries: wider windows, absorption and the escaped field | | **Author** | John Travers | -| **Drafting agent** | Opus 5.5 (2026-10-16); GPT-6 (review revisions, 2026-10-16; window-strategy revision, 2026-10-20) | +| **Drafting agent** | Opus 5.5 (2026-10-16); GPT-6 (review revisions, 2026-10-16; window-strategy revision, 2026-10-20); Opus 5.5 (refresh against the integrated tree, 2026-10-24) | | **Status** | Draft | | **Review status** | Reviewed | | **Reviewers** | John Travers (human); GPT-6 (AI); Fable 5.1 (AI); Opus 5.5 (AI) | @@ -81,8 +81,10 @@ project's standing preference is a robust default over conditional speed-ups. **The absorber is silent.** Nothing reports how much energy the temporal collar removed, or how much of the field sat inside it. `warn_walkoff` is an a-priori estimate from a -span the caller supplies. The spatial routes already measure their collar's fluence -fraction at field-bearing saved planes (`spatial_collar_fraction`); SEP 22 deliberately +span the caller supplies. The spatial routes already measure their collar's +electric-field-norm share at field-bearing saved planes (`collar_field_fraction`, +renamed and redefined by [SEP 34](sep-0034-medium-flux.md), which keeps it distinct +from physical flux); SEP 22 deliberately skips that diagnostic at statistics-only planes. Neither that diagnostic nor sparse output is a boundary-safety monitor. The temporal collar has no equivalent. A run whose physics happens inside the absorber is answered differently @@ -127,7 +129,6 @@ whether that policy makes a robust default is a campaign result, not an assumpti - an optional escaped-field record: the spectrum and energy of what left the window, estimated from crossings through a surface in the flat region before the collar, subject to the qualification of §4.7; -- a phase-space filter, measured as an exploratory candidate on the Runge–Kutta path; - the keyword switches the roadmap asks for (`absorber=False`, `absorber_scheme=`); - the wide-window reference and the campaign that uses it. @@ -149,8 +150,9 @@ whether that policy makes a robust default is a campaign result, not an assumpti the grid during propagation, remeshing, and automatic restart on a larger grid. Fixed launch placement and prescribed frames are in scope (§4.11); a general offset-grid API and independently asymmetric absorber ramps remain follow-up work. -- Production perfectly matched layers, transparent boundary conditions and phase-space - filters (§10); the phase-space filter prototype remains in scope. +- Perfectly matched layers, transparent boundary conditions and phase-space filters + (§10). The phase-space filter prototype and the directional occupancy diagnostic + were removed from this SEP on 2026-10-24 and kept as roadmap items (Q13, Q14). - Implicit or IMEX treatment for the Runge–Kutta stepper. Its floor is about 38 steps (§4.3; about 45 for the low-storage RK4 march of [SEP 24](archive/sep-0024-low-storage-interaction-picture-runge-kutta.md), which must refuse @@ -178,12 +180,17 @@ whether that policy makes a robust default is a campaign result, not an assumpti - `stable_step`, `warn_walkoff`, and the translation refusal of a replayed schedule or step floor past the limit; - for the multistep stepper, the stability-capped order choice of the exponential - formulation (SEP 16 phase 6). The per-step collar refuses interpolated planes. + formulation (SEP 16 phase 6). The per-step collar refuses interpolated planes; +- on the keyword interfaces, `prop_capillary` takes `absorber=` and + `absorber_scheme=`, `prop_waveguide` takes `absorber=` only, and the other `prop_*` + functions take neither. No interface accepts `absorber=False`; `None` means the + default collar. The grids build the temporal collar in `solprop.grid._temporal_collar`. Its flat region is $\pm\min(T_{\mathrm{req}}/2,\,(1-2f)T/2)$, with $T$ the realised window and $f$ = -`collar_fraction` = 0.05. Each edge is therefore at least 5 % of the window, and is -otherwise whatever slack the transform size leaves. +`collar_fraction` = 0.05, which must lie strictly between 0 and 0.5. Each edge is +therefore at least 5 % of the window, and is otherwise whatever slack the transform +size leaves. **Prior studies this builds on:** @@ -203,50 +210,42 @@ otherwise whatever slack the transform size leaves. - *An absorber switch on the keyword interfaces.* The `absorber=False` and `absorber_scheme=` keywords are in scope. Whether spatial runs should default to an absorber is not. -- *The split-step collar on the general modal route, Kokkos against the reference.* The - split scheme's out-of-band disagreement has to be resolved before phase 0 compares +- *The split-step collar on the general modal route, native against the reference.* The + split scheme's out-of-band disagreement is unresolved, so phase 0a does not compare that scheme on a general modal guide. The item is linked and kept. #### 3.1 Implemented contracts and sequencing The campaign starts from the delivered contracts below, not the earlier drafting -costs or proposed interfaces. This cross-check is dated 2026-10-20: SEP 22 and SEP 24 -are Final on the integration branch; SEP 23's three CPU implementations are delivered, -with closing qualification still pending. SEP 27's accepted implementation is nearing -completion; SEP 28 is Accepted and has not begun implementation. A campaign records -the exact solprop and backend revisions it actually uses. +costs or proposed interfaces. This cross-check was first made on 2026-10-20 and +refreshed on 2026-10-24 against the integrated tree (kernel schema 35, output +schema 23): SEPs 22–30 are Final, SEP 34 is merged with one test phase open, and +SEP 31's implementation is awaiting merge. A campaign records the exact solprop +revision, including its in-repository native backend, that it actually uses. | SEP | Contract this proposal must preserve | Consequence for SEP 21 | |---|---|---| | [22](archive/sep-0022-memory-lean-spatial-execution.md) | All-zero temporal rates compile no temporal pass under either scheme; `collar_length` separates in-stage strength from the spectral ceiling; statistics-only observations avoid field transfers and may skip spatial collar diagnostics. | Use the real zero-pass baseline. Keep spatial strengths fixed when disabling temporal absorption. Monitor independently of output, with backend reductions rather than mandatory whole-field downloads (§4.12, Q16). | -| [23](archive/sep-0023-far-field-aperture-spectra.md) | `absorbed_power` has four J/m channels: spectral, transverse, evanescent, material. The transverse channel is the k⊥ rate; temporal and real-space spatial collars are excluded. | Preserve the four-channel meaning and order. Add temporal diagnostics separately; compare rate definitions and qualified integrals, not an unresolved endpoint trapezoid (§4.6, §7). | +| [23](archive/sep-0023-far-field-aperture-spectra.md) | `absorbed_power` has four J/m channels: spectral, transverse, evanescent, material. The transverse channel is the k⊥ rate; temporal and real-space spatial collars are excluded. SEP 34 now weights every channel by the medium's axial admittance. | Preserve the four-channel meaning, order and flux weighting. Add temporal diagnostics separately; compare rate definitions and qualified integrals, not an unresolved endpoint trapezoid (§4.6, §7). | | 24 ([implemented stepper](../../guide/numerics/choosing-a-stepper.md)) | `LowStorageRungeKutta` replays a fixed schedule, has no dense output or embedded error estimate, and is calibrated by observable convergence. Its in-place register ownership and held checkpoint state are deliberate. | Include it in the campaign with independently calibrated schedules. Checks use sufficiently close committed endpoints; extra check steps require a newly calibrated schedule. Do not restore full-volume storage merely to monitor the boundary. | | [27](archive/sep-0027-held-plasma-current.md) | Field-grid rate plasma uses the held-current source, including two gated products and a sampled-gate certificate. The source gate remains when temporal field absorption is off. | Plasma candidates and references must all use this source. Converge the gate products and response preparation separately from the field absorber (§4.8); old gated-polarisation results do not settle the boundary choice. | -| [28](archive/sep-0028-free-space-evaluation.md) | CPU source evaluation, temporal tiles, projections and register folds change while the source physics and canonical state layout stay fixed. | Its baseline must include SEP 27's streams and lifetimes. SEP 21 must measure monitor overhead on that execution path and repeat affected free-space cost comparisons before recommending a default. | - -**Execution order.** SEP 27's acceptance and execution agreement explicitly places -SEP 28 after the physics change and its measured baseline. Finish and integrate that -source first; inventory its retained inputs, both current-product transforms and -projection streams in SEP 28's phase 0. Use the same source and gates on both sides -of SEP 28's performance comparison. Any adjustment to SEP 28's accepted inventory -belongs in its implementation record, with approval if it changes the accepted scope. - -SEP 21 need not wait to develop analytic witnesses, guard prototypes, window/frame -derivations or plasma-free comparisons. Its plasma campaign must use the integrated, -qualified SEP 27 source, and its final CPU free-space cost recommendation must be -checked after SEP 28 on the affected routes and grid sizes. Earlier measurements are -labelled with their baseline and repeated where source cost or storage changes; -modal results are not invalidated merely because a free-space path was optimised. -R6/R7 state this qualification explicitly rather than applying a presumed speed-up. - -For production work, the recommended order is SEP 27, then SEP 28's shared source -and buffer changes, then SEP 21's native monitor/accumulator integration on those -paths. Independent SEP 21 work can proceed alongside them. Earlier integration of -a shared endpoint hook requires an agreed ownership contract and requalification -after the other changes; competing edits to stage buffers are not independent work. -Use the next free kernel/output schemas at integration, not version numbers reserved -by an older draft. This is an integration constraint, not a requirement to finish the -escaped-field reconstruction before choosing a useful window or alarm. +| [28](archive/sep-0028-free-space-evaluation.md) | No seam change. Free-space chunks zero out-of-crop bins per chunk and alias the node field and polarisation onto the chunk's rows; CPU crossings are tiled; free-space, line and planar grids take a 1 GiB default node budget. | Guard reductions and accumulators must not assume a full-volume node field or reuse an aliased stage row without proving it holds the committed endpoint (§4.12). Measure monitor overhead on this execution path. | +| [29](archive/sep-0029-compiled-backend-distribution.md) | The native backend lives in this repository as `solprop-native`, checked against the kernel schema and its contract tuples at import; native builds need GCC 14 or newer. | Native work lands in the same pull request as the Python backends, following the native contributor rules, and refuses unimplemented quantities by name. | +| [30](archive/sep-0030-standard-benchmark-suite.md) | `benchmarks/` holds only the standard suite; campaign harnesses and raw results are kept with the project's development records. | Phase 0's harness follows that rule; cases that remain useful after the campaign, such as the wide-window references, become suite cases in phase 2 (§11). | +| [31](sep-0031-simulation-coupling.md) | Remapping reports the share of a record's energy outside the temporal collar's flat region (`one_low`/`one_high`), and pulse measures average where the collar is exactly one; persisted frame records rebuild absolute phase and delay; a relaunched run is a new run with an inherited origin. SEP 31 leaves wider windows and escaped-field models to this SEP. | Geometry changes keep the meaning of the collar's flat-region fields or update those consumers; a window without temporal absorption still needs a defined edge band, for which the guard band is the candidate. Reuse the frame records to align fields in §4.8 and §4.11. Accumulators start at zero in a relaunched run unless Q22 decides otherwise. | +| [34](sep-0034-medium-flux.md) | Spatial routes have a physical admittance metric, `SpatialFlux`, with endpoint weights and a radial endpoint term in the linear exponent. A collar need not commute with the admittance, so its quadratic-form change is measured, never inferred from a field-norm decrement. | The spatial metric $M$ of §4.6 is SEP 34's; the radial endpoint term is part of the ledger's $E^\dagger M'E$. SEP 34's passivity rule answers part of Q15 on those routes. Its uniform-loss test that keeps the collar's field fraction negligible must keep passing. | + +**Execution order.** SEP 27 and SEP 28 are integrated, so the ordering this section +recorded on 2026-10-20 is satisfied: the plasma campaign uses the qualified held-current +source and the free-space costs are measured after SEP 28's changes, with no +remeasurement caveat for earlier baselines. Work that edits the driver's accepted-step +surface, the keyword interfaces or the output schema rebases onto SEP 31 once it is +merged. Use the next free kernel and output schemas at landing, not numbers reserved +by an older draft: SEP 31's frame follow-up and [SEP 33](sep-0033-single-precision-mlx.md) +may take numbers first. If SEP 33 lands before phase 2, every new accumulator and +reduction states its accumulation precision and is covered in binary32. This is an +integration constraint, not a requirement to finish the escaped-field reconstruction +before choosing a useful window or alarm. ### 4. Theory @@ -364,12 +363,14 @@ $$ The first form says the floor depends only on the absorber's dimensionless strength and the method. The second says what it costs: protecting a walk-off of $\Delta\tau_p$ through -an edge of width $w$. With today's $A N = 252$ and the intervals of -`benchmarks/sep13/stability.py`: +an edge of width $w$. With today's $A N = 252$ and the package's intervals +(`boundaries.STABILITY_RADIUS` for IP-DOPRI5, `LOW_STORAGE_REAL_INTERVAL` for the +low-storage march, and `PEC_REAL_INTERVAL` in `solprop.stepper.multistep`, which its +test derives from the recurrence's spectral limit), rounded: | method | $r$ | $n_{\min}$ | |---|---:|---:| -| IP-DOPRI5 | 3.31 | 38 | +| IP-DOPRI5 | 3.3 | 38 | | RK4 (SEP 24's implemented low-storage march) | 2.785 | 45 | | PEC2/3 | 0.55 | 229 | | PEC3/4 | 0.30 | 420 | @@ -649,8 +650,9 @@ endpoint weights respected. This is an energy-density proxy, not the temporal Po trace, which differs for a broadband dispersive index. Define zero occupancy for a zero field. General modal and spatial routes must use their documented metric and state the diagnostic's meaning; a sum of squared internal modal amplitudes is not a -universal physical energy. Spatial vacuum-admittance statistics retain their existing -limitation (conventions §4). +universal physical energy. On spatial routes the metric is +[SEP 34](sep-0034-medium-flux.md)'s axial admittance, with its endpoint weights; the +spatial collar's `collar_field_fraction` is a field-norm share, not this proxy. **The energy ledger uses the actual evolution operator.** Write the route's energy as $U=E^\dagger M(z)E$, with $M$ including quadrature, DFT, real-field and power weights. @@ -667,7 +669,11 @@ $U_t(z)=\int_0^zR_t(s)\,ds$; spectral removal uses the spectral-collar contribut in exactly the same identity. The familiar $\int\alpha|E(t)|^2dt$ follows for an unprojected scalar envelope with a constant power weight. For a frequency-dependent metric, $M$ and $C$ need not commute: unweighted contractivity does not prove -$R_t\ge0$. Do not clip a signed contribution to force a positive ledger. Phase 0 +$R_t\ge0$. SEP 34 §4.2 states the same rule for a spatial screen or collar against +the nonlocal admittance: measure the quadratic-form change, never call a field-norm +decrement physical absorption. On radial gradients its endpoint term in the linear +exponent belongs to $E^\dagger M'E$. Do not clip a signed contribution to force a +positive ledger. Phase 0 checks passivity in the actual metrics and reports any failure before recommending a default. Changing the collar operator to enforce another metric needs a recorded maintainer decision (Q15), not an unnoticed normalisation change. @@ -683,7 +689,8 @@ all other contributions are proved zero or explicitly included. SEP 23's existing `absorbed_power` is an instantaneous four-channel rate, not a temporal escape counter. Preserve its spectral, transverse (k⊥), evanescent and -material channels; material gain can make the last one negative. On its supported +material channels, now weighted by SEP 34's admittance; material gain can make the +last one negative. On its supported routes, a spectral integral uses the same actual summed `spectral_rate` and metric. SEP 22's custom spectral rate is not separately attributable to the soft collar (Q16). Temporal removal and any real-space spatial removal require separately named @@ -703,7 +710,12 @@ stage as if it were the corrected endpoint. In the current shared driver, it on replay; the quadrature alarm deliberately consumes trial buffers. The new accumulators therefore need a hook after state and position commitment, or explicit accepted endpoint data, consistently on adaptive RK, both multistep formulations and -replay, including the low-storage march after its finish/commit block. Rejections +replay, including the low-storage march after its finish/commit block. The driver +already has one such point: the call to `StepDriver._take_step_stats`, made after +the state is finished and the position advanced in both step loops, the multistep +march, the low-storage replay and the batch driver. Its docstring records the +asymmetry of `_on_accepted_step`. The accumulators attach there, or at an +equivalent committed-endpoint call beside it. Rejections contribute nothing. An in-place stage register is not retained endpoint data; any extra buffer must respect the march's ownership contract and appear in its ledger. Any change to that protected hook surface bumps the kernel schema. Extra transforms @@ -718,16 +730,11 @@ short excursion occurred between samples. Resume restores accumulators and their endpoint, so splitting a run or changing output cadence does not lose or double-count removal. These are requirements for phase 2, not capabilities of the current alarm hook. -Two optional diagnostics help interpret failures: +An optional diagnostic helps interpret failures. A directional occupancy, which +classifies collar content as outgoing or incoming by windowed Fourier analysis [5], +was also proposed; it was removed from this SEP on 2026-10-24 and kept on the +roadmap (Q14). -- **Directional occupancy.** A windowed Fourier analysis in each collar classifies - outgoing, incoming and unresolved cells from $\beta_1(\omega)-\beta_1^{\mathrm f}$, - accounting for frequency resolution, mode dependence and dispersive spread [5]. - Use a specified frame normalisation so classified occupancies sum to the measured - proxy. Incoming content can be reflection, wrap-around or genuine returning physics; - this diagnostic alone does not distinguish them. A nonlinear walker can violate the - free-flow classification without triggering a reliable automatic flag. Phase 0 - measures its usefulness before it becomes part of phase 2. - **Surface crossing.** The commutator of §4.7 produces a complex amplitude source, not by itself a positive directional energy flux. In a constant-metric, lossless quadratic-dispersion limit its quadratic-form balance gives the usual current. @@ -973,9 +980,9 @@ feature is selecting outgoing content in phase space. - As a discrete operation at fixed z it would restart the multistep history. Whether that is needed when the source is negligible in the buffer is untested. -It is therefore measured in phase 0 as an exploratory candidate on the Runge–Kutta path, -which keeps no history, and its classification is used as a diagnostic (§4.6). It is not -a candidate default. +It is not a candidate default. The exploratory prototype on the Runge–Kutta path and +the classification diagnostic this section once motivated were removed from this SEP +on 2026-10-24 (Q13, Q14) and remain roadmap items; the analysis is kept for them. #### 4.10 Retaining the field: cost and accuracy without temporal absorption @@ -1169,7 +1176,8 @@ $\beta_2=0$ case. Boundary flux and its z-quadrature can be tested against this identity. General dispersion, changing metrics, losses and nonlocal sources require the operator balance of §4.6. Signed net flux does not count unique outward escape: recrossings, coherent contributions and already wrapped content prevent that -interpretation without further assumptions. Directional analysis (§4.6) and the +interpretation without further assumptions. Directional analysis (a roadmap item, +Q14) and the surface record (§4.7) are optional refinements, not requirements for the basic alarm. **Policy and qualification.** The candidate default has an early warning threshold @@ -1242,8 +1250,7 @@ What is refused: support; explicit check planes may be used where qualified (§4.12). Basic diagnostics are intended to be on by default, subject to phase 0 measuring -their endpoint transforms and reductions. Directional analysis and the escaped record -are separate opt-ins. Unsupported route/stepper/plane combinations fail by name. +their endpoint transforms and reductions. The escaped record is a separate opt-in. Unsupported route/stepper/plane combinations fail by name. Guard checks are available with or without temporal absorption and are separate from the removal ledger. The sketch does not fix a scalar threshold for every route: R7 specifies absolute/relative normalisation, bands, noise handling, guard margins @@ -1337,7 +1344,7 @@ must be inventoried together before implementation. - Persist the complex accumulators, last quadrature endpoint, surface/metric identity and errors for resume. Dense observations require a separately qualified partial-step accumulator; initially require step planes for these records. -- Kernel and output schema bumps; device-resident work on Kokkos. List all accumulators +- Kernel and output schema bumps; device-resident work in the native backend. List all accumulators and work buffers in `memory_ledger()`, including per-batch-member storage. **Implicit collar (phase 4, only if phase 1 passes).** @@ -1350,7 +1357,7 @@ must be inventoried together before implementation. - **The backends:** - `numpy_ref` first, as the oracle; - `numba_cpu` with the solve in compiled passes; - - Kokkos, where CG is a few batched FFT pairs and reductions per corrector, on device + - the native backend, where CG is a few batched FFT pairs and reductions per corrector, on device as on host. **Cost:** @@ -1359,7 +1366,7 @@ must be inventoried together before implementation. |---|---| | retained wider window | roughly linear response/storage growth and $n_t\log n_t$ transforms, offset against actual calls saved; measure realised coarse/fine sizes and total wall time | | guard monitor | temporal synthesis when not reusable, reductions, dense-state evaluation or extra check-plane steps, and any device synchronisation | -| diagnostics | endpoint transforms plus metric reductions per accepted step; plane/periodic occupancy; optional directional transforms | +| diagnostics | endpoint transforms plus metric reductions per accepted step; plane/periodic occupancy | | record | state and quadrature buffers per edge; commutator transforms or the split complement, measured per route | | implicit solve | transforms in predictor and corrector; Krylov iterations depend on condition number and residual target; no required extra physical-source call | | wider collar | grows $n_t$ when there is no slack: at most a factor of two on a power-of-two grid, less on 2-3-5-smooth sizes | @@ -1483,7 +1490,7 @@ Tolerances: separately. The alarm threshold alone does not establish the observable budget. **Parity.** Every new kernel quantity agrees across `numpy_ref`, `numba_cpu` and the -Kokkos CPU build within the summation-bound tolerances of [testing.md](../testing.md). +native CPU build within the summation-bound tolerances of [testing.md](../testing.md). **Benchmarks.** Calls, steps, order histograms and the distribution of $h\alpha_{\max}/(2r)$ over accepted steps, realised grid sizes, wall time, transforms, @@ -1554,7 +1561,7 @@ does not reconstruct it. | Transparent boundary conditions [2] | The constructions considered here need an exterior dispersion model beyond a real-axis table and an explicit boundary treatment replacing the periodic discretisation (§4.4). Approximating their nonlocality in z introduces another error budget. | | Optimised absorbing-potential shapes [1] | They minimise reflection, often with unbounded peaks (Manolopoulos's double pole, [1, eqs 216–220]); that worsens the floor. At fixed width and prescribed steady-drift attenuation, changing a bounded complement profile can lower the peak by at most two (§4.3); this is not a universal bound on reflection or total error. The plateau profile tests that bound. | | A real part in the collar, after Jolicard–Humbert and Hussain–Roberts [1, eq. 175] | A phase modulation ahead of the damping that speeds slow walkers, improving absorption at low $\Omega$. It adds imaginary-axis eigenvalues, so does not escape the floor, and it alters physics adjacent to the window. Not pursued; phase 0's reflection measurement says whether slow walkers need it. | -| Phase-space filter [5] as the default | Not a term in the equation, so not stiff, and its error bound depends on the buffer and free-flow assumptions, with a required interval cap (§4.9). But it assumes a linear buffer, leaves slow content ambiguous, and as a discrete operation would restart the multistep history. Measured on the RK path in phase 0, and used as a diagnostic (§4.6). | +| Phase-space filter [5] as the default | Not a term in the equation, so not stiff, and its error bound depends on the buffer and free-flow assumptions, with a required interval cap (§4.9). But it assumes a linear buffer, leaves slow content ambiguous, and as a discrete operation would restart the multistep history. Not prototyped here; a roadmap item since 2026-10-24 (Q13). | | A Strang split | SEP 14's unchanged-history implementation lost order with a nonlinear source; repairing multistep history and the projected subflow is outside this study. | | IMEX Runge–Kutta (ARK) [8] | Removes RK's floor, which is about 38 steps and rarely binds. ARK4(3)6L is order four with six stages (DOPRI5 has seven stages and six new evaluations with FSAL), can suffer stiff order reduction despite the implicit component's stage order two, and needs a solve per stage [8, pp. 25, 28]. | | Multirate inner sub-stepping of the collar | Studied in SEP 15's campaign; it addressed the limit but did not make the fastest candidate, and the source is frozen across inner steps. | @@ -1567,13 +1574,21 @@ does not reconstruct it. ### 11. Phases -**Phase 0: the campaign (no package change).** +**Phase 0: the campaign (no package change).** Two parts, each with its own report +in Part II. Phase 0a gates phases 1 and 2; phase 0b gates phase 3 only, and may run +after phase 2 has started. + +- The harness and raw results are kept with the project's development records, as + SEP 30 requires; cases that stay useful, such as the wide-window references and the + retained-window comparison, become suite cases in phase 2. Runs use `numpy_ref` and + `numba_cpu`, are timed on an otherwise idle machine, and record the solprop + revision, source equation, gates and backend capabilities. +- SEP 27's held-current source is integrated and qualified, and SEP 28's free-space + changes are in, so plasma and free-space cost comparisons use the current tree on + both sides (§3.1). + +**Phase 0a: windows, monitors and collar geometry.** -- Scripts in `benchmarks/sep21/`, run on `numpy_ref` and `numba_cpu`. -- Apply §3.1's sequencing: analytic and plasma-free studies can start independently; - plasma comparisons use qualified SEP 27 on both sides, and affected CPU free-space - cost conclusions are remeasured after SEP 28. Record revisions, source equation, - gates and backend capabilities; an older baseline is not the final recommendation. - The wide-window references of §4.8 for each case of §7. - A production comparison at matched observable errors (§4.10): the present window with no temporal absorption, wider windows, and the in-stage and per-step collars. @@ -1586,56 +1601,65 @@ does not reconstruct it. do not infer accuracy from `rtol` or assume its deferred adaptive pair exists. Use measured backend memory ledgers, including checkpoint and monitor storage. - Fixed asymmetric placement and prescribed midpoint/fastest-light frames (§4.11), - with coordinate/phase alignment and source-history costs measured. Distinguish - settings already expressible from prototypes needing an implementation decision. -- Guard-monitor prototypes (§4.12) on accepted endpoints and sufficiently frequent + with coordinate/phase alignment (reusing SEP 31's frame records) and source-history + costs measured. Distinguish settings already expressible from prototypes needing an + implementation decision. +- Guard-monitor prototypes (§4.12) on committed endpoints and sufficiently frequent interior checks, including deliberate crossings between endpoints, spreading with zero central drift, nonlinear walkers, weak bands and noise. Measure the relation between thresholds and wide-reference observable errors, missed violations, false alarms and the extra transforms/steps required. Sparse saved planes are insufficient. - The floor law: steps, order histograms and $h\alpha_{\max}/(2r)$ distributions. - A geometry sweep with the existing in-stage scheme: collar fraction 5, 10 and 20 %; - strength at constant protected walk-off and at today's $AN$; the complement and - plateau profiles. -- At the best geometry, the in-stage scheme against the split. + strength at constant protected walk-off and at today's $AN$, counting one edge and + both (Q17); the complement and plateau profiles. +- The reflection of slow walkers against the criterion of §4.2, over $\Omega w$ and + $AN$ (§4.8); R1 depends on it. +- At the best geometry, the in-stage scheme against the split, except on a general + modal guide while the split scheme's native disagreement there is open (§3). - An attribution of the split's in-window error: linear/nonlinear splitting, hard projection and the fine/coarse collar discretisation difference. +- The transfer of the geometry results to one radial case (R4). +- Passivity of the temporal collar in each route's actual metric (§4.6, Q15). +- **Exit:** a report with recommendations R1–R4, R6 and R7 below. + +**Phase 0b: the escaped-field records.** + - The flux and removal records emulated from both narrow absorbed runs and the wide references, with enough accepted-endpoint data to converge their quadrature. References alone cannot measure absorber feedback. Measure commutator tails for each dispersion, projection and spectral collar, and test the initial-field and variable-flow terms (Q12). -- The reflection of slow walkers against the criterion of §4.2. -- The phase-space filter prototyped on the Runge–Kutta path (Q13), beside the per-step - collar, against the wide window. -- The directional occupancy (§4.6) evaluated offline on the saved planes (Q14). -- **Exit:** a report with recommendations on: - - **R1:** geometry and strength defaults; - - **R2:** whether the floor still binds a case that matters after R1 and the R6/R7 - retained-window comparison. Phase 1 requires a case where temporal absorption - remains necessary or competitive within stated memory/runtime limits, and where - removing its cap could improve measured total cost. A cap on an avoidable collar - alone does not qualify; - - **R3:** diagnostic thresholds; - - **R4:** whether the spatial collars transfer. - - **R5:** a qualified definition, error budget, supported-route matrix and measured - memory/transform cost for the escaped record and energy diagnostics; explicitly - decide any physical-metric passivity problem (Q15). R5 is a gate before phase 3. - - **R6:** the measured accuracy/runtime/memory tradeoff for each production boundary - strategy, with and without placement/frame changes, and a recommendation on - retaining the current default, admitting a monitored opt-in, or adopting a - monitored default without temporal absorption. State counterexamples and resource - limits; no single speed-up or unrun estimate settles the default. - - **R7:** guard geometry, metric, absolute/relative thresholds, noise/band policy, - sampling coverage, supported routes/plane modes, warning/error behaviour and - checkpoint contract. Qualify tested accuracy budgets and report failures openly. - R7 gates a production monitor independently of the escaped-field reconstruction; - if it fails, R6 cannot recommend the monitored default. Any adopted default or - new frame/placement setting requires a recorded maintainer decision before phase 2. +- **Exit:** a report with recommendation R5. + +The recommendations: + +- **R1:** geometry and strength defaults; +- **R2:** whether the floor still binds a case that matters after R1 and the R6/R7 + retained-window comparison. Phase 1 requires a case where temporal absorption + remains necessary or competitive within stated memory/runtime limits, and where + removing its cap could improve measured total cost. A cap on an avoidable collar + alone does not qualify; +- **R3:** diagnostic thresholds, and the energy diagnostics' route metrics, measured + passivity decision (Q15), committed-endpoint contract and quadrature error budget; +- **R4:** whether the spatial collars transfer. +- **R5:** a qualified definition, error budget, supported-route matrix and measured + memory/transform cost for the escaped record. R5 is a gate before phase 3. +- **R6:** the measured accuracy/runtime/memory tradeoff for each production boundary + strategy, with and without placement/frame changes, and a recommendation on + retaining the current default, admitting a monitored opt-in, or adopting a + monitored default without temporal absorption. State counterexamples and resource + limits; no single speed-up or unrun estimate settles the default. +- **R7:** guard geometry, metric, absolute/relative thresholds, noise/band policy, + sampling coverage, supported routes/plane modes, warning/error behaviour and + checkpoint contract. Qualify tested accuracy budgets and report failures openly. + R7 gates a production monitor independently of the escaped-field reconstruction; + if it fails, R6 cannot recommend the monitored default. Any adopted default or + new frame/placement setting requires a recorded maintainer decision before phase 2. **Phase 1: the implicit-collar study (prototypes only, after R2/R6/R7).** -- NumPy prototypes in the benchmarks, for both multistep formulations, with the collar +- NumPy prototypes in the campaign harness, for both multistep formulations, with the collar implicit in predictor and corrector: - the storage rule, the collar part of the stored history at the corrected state, and the hard step cap at $2r_{\rm AM}/\alpha_{\max}$ (§4.5); @@ -1661,21 +1685,27 @@ does not reconstruct it. **Phase 2: qualified boundary strategies, diagnostics and keywords.** +- The keyword switches of §5 on every `prop_*` interface: `absorber=False` and + `absorber_scheme=`, with conflicting settings refused by name. - As decided on R1/R3 and R6/R7. Implement the retained-window mode, guards and warning/error behaviour if qualified, plus the selected fixed-placement/frame support and manual guidance. Adoption of a new default is an explicit decision. -- Absorbed-energy diagnostics require R5's metric, endpoint and quadrature contract; +- Absorbed-energy diagnostics require R3's metric, endpoint and quadrature contract; the basic guard monitor requires R7 and its shared metric definitions, not a successful escaped-field reconstruction. These parts may land separately. Any proposed physical-operator change returns to the maintainer under Q15. -- On all three backends in order: `numpy_ref`, `numba_cpu`, then Kokkos CPU in - solprop-kokkos. +- On all three backends in order: `numpy_ref`, `numba_cpu`, then the native CPU + build, in the same pull request. - The manual pages and the tutorial. - The re-run of affected examples. +- The lasting campaign cases promoted to the SEP 30 suite. +- Geometry changes keep the meaning of the temporal collar's flat-region fields that + SEP 31's remapping and pulse measures read, or update those consumers in the same + pull request. - Output and, where guard data or scheduling changes the seam or the endpoint hook changes its protected surface, kernel schema bumps. -**Phase 3: the escaped field.** Requires R5 and phase 2's endpoint/ledger contract; +**Phase 3: the escaped field.** Requires phase 0b's R5 and phase 2's endpoint/ledger contract; implementation may overlap only after that shared contract is fixed. - The qualified flux record (or the removal fallback, on Q11/R5) on all three @@ -1689,7 +1719,7 @@ implementation may overlap only after that shared contract is fixed. (§4.5); a kernel schema bump. - The Adams manual section rewritten. -**Closing.** The full gate, the slow and coverage lanes, and the Kokkos-selected slow lane, +**Closing.** The full gate, the slow and coverage lanes, and the native-selected slow lane, once. Device qualification follows later, under the standing policy. ### 12. Open questions @@ -1740,7 +1770,8 @@ once. Device qualification follows later, under the standing policy. 5. **Q5: where the absorbed energy is accumulated.** Resolved 2026-10-16 (John Travers): per accepted step, reported at the saved planes (§4.6, §6). Review found that the existing `quadrature_error` hook has different state timing on adaptive and replay - paths, so a consistent committed-endpoint hook/data contract is required. + paths, so a consistent committed-endpoint hook/data contract is required. The + driver's per-step statistics call is already such a point on every march (§4.6). 6. **Q6: the escaped record under the in-stage multistep collar.** Resolved 2026-10-16 (John Travers): accepted-step accumulation, with trapezoidal quadrature as the initial candidate. Review qualification: forward local linear propagation, endpoint storage and an @@ -1784,18 +1815,20 @@ once. Device qualification follows later, under the standing policy. 12. **Q12: the flux buffer.** How wide must the gap between the surfaces and the collar be to reduce the commutator's tails below the error budget, including the hard band projection and spectral collar as well as tabulated/modal dispersion? There may be - no affordable gap. Measured in phase 0 and resolved by R5. -13. **Q13: a phase-space filter prototype.** Resolved 2026-10-16 (John Travers): phase 0 - measures Soffer and Stucchio's filter on the Runge–Kutta path, against the per-step - collar and the wide window (§4.9), as exploratory benchmark work that adds nothing to - the package unless a later proposal takes it up. -14. **Q14: the directional occupancy.** Resolved 2026-10-16 (John Travers): evaluated - offline in phase 0, and included in phase 2 only if it separates wrapped content and - nonlinear walkers from ordinary outgoing radiation on the phase 0 cases. - -15. **Q15: record and energy qualification (AI review).** Deferred to phase 0/R5: - specify each route's metric, measure collar passivity in it, choose the committed - endpoint contract, and qualify surface reconstruction and diagnostic quadrature. + no affordable gap. Measured in phase 0b and resolved by R5. +13. **Q13: a phase-space filter prototype.** Resolved 2026-10-16 (John Travers) as an + exploratory phase 0 measurement on the Runge–Kutta path. Revised 2026-10-24 (John + Travers): removed from this SEP to keep the campaign to what can change a default. + §4.9 keeps the analysis, and a roadmap item keeps the prototype. +14. **Q14: the directional occupancy.** Resolved 2026-10-16 (John Travers) as an + offline phase 0 evaluation. Revised 2026-10-24 (John Travers): removed from this SEP + with Q13 and kept as a roadmap item. + +15. **Q15: record and energy qualification (AI review).** Deferred to phase 0a/R3 + (specify each route's metric, measure collar passivity in it, choose the committed + endpoint contract and qualify diagnostic quadrature) and phase 0b/R5 (qualify the + surface reconstruction). On spatial routes the metric is SEP 34's admittance, and + SEP 34 §4.2 already requires the quadratic-form change to be measured. Any change to the physical collar operator or narrowing of production scope needs a maintainer decision before implementation. This review does not select a new physics default or claim that the proposed flux record has already passed. @@ -1869,13 +1902,16 @@ once. Device qualification follows later, under the standing policy. Establish where dense checks avoid extra source calls and where check planes are required. Declare the tested scope and any missed accuracy-budget violations; neither endpoint occupancy nor an energy fraction alone certifies containment. -21. **Q21: integration and benchmark baseline (2026-10-20).** §3.1 records the - established SEP 27 → SEP 28 order and recommends placing SEP 21's shared native - hook work after those source/buffer changes. Independent campaign work can begin - earlier. R6/R7 must identify the qualified source, stepper, backend and monitoring - costs; affected pre-SEP-28 free-space results need remeasurement. This reconciles - the draft with SEPs 22–24 and the pending work without reopening their accepted - physics or selecting a new boundary default. +21. **Q21: integration and benchmark baseline (2026-10-20).** Satisfied 2026-10-24: + SEP 27 and SEP 28 are integrated, so the campaign measures the qualified source and + the optimised free-space path directly, and no earlier baseline needs remeasuring + (§3.1). Native work lands with the Python backends in the same repository. +22. **Q22: accumulators across a relaunch (2026-10-24).** SEP 31 relaunches a saved + plane as a new run with an inherited origin, and its transport report keeps a + sequential energy ledger. Should a child run's temporal removal and guard history + start at zero, or should the chain ledger carry the parent's? Proposed: start at + zero, record the parent's totals as a chain-ledger item, and decide in phase 2 + alongside R3's output contract. ### 13. References @@ -2011,3 +2047,19 @@ parts) are cited through it. and reusable-runner resets. Plasma comparisons preserve the held-current source gate and qualify its products independently of the absorber. No numerical campaign was run, no default was changed and no frozen Part I of another SEP was edited. +- 2026-10-24: Refreshed by Opus 5.5 (drafting agent) at John Travers's request against + the integrated tree (kernel schema 35, output schema 23), before review and + acceptance. §3.1 records SEPs 22–30 as Final and adds SEPs 29, 30, 31 and 34; the + execution order and Q21 are satisfied. §4.6 takes SEP 34's admittance metric and + collar passivity rule on spatial routes and names the driver's existing + committed-endpoint statistics call for the accumulators. Stale references were + corrected: the stability intervals now live in the package, `collar_field_fraction` + replaced `spatial_collar_fraction`, the native backend is in this repository, and + the keyword interfaces' present absorber arguments are stated. At John Travers's + request phase 0 is split into 0a (windows, monitors, geometry, reflection; R1–R4, + R6, R7) and 0b (escaped-field records; R5); the energy diagnostics' metric and + endpoint contract moved from R5 to R3 so phase 2 does not wait for 0b; the campaign + harness follows SEP 30's rule on development records; and the phase-space filter + prototype and directional occupancy were removed to the roadmap (Q13, Q14). Q22 + added for accumulators across a SEP 31 relaunch. No campaign was run and no default + was changed. From ff0d5a27bfb1d2b6c7c6e28cf79e134437c737f1 Mon Sep 17 00:00:00 2001 From: John Travers Date: Sat, 24 Oct 2026 13:12:25 +0100 Subject: [PATCH 2/3] SEP 21: Opus AI review and response Record the AI review of the unreviewed 2026-10-20 revision and the refresh (AR1-AR12) and revise Part I in response: name the phase for every deferred question, follow the package's stability intervals, place SEP 34's radial endpoint term in the linear operator, weigh the removed temporal pass in the cost comparison, list the temporal collar's other consumers, add the energy-diagnostic prototypes to phase 0a, define the monitored band for the check cadence, and state what absorber=False does on the spatial interfaces. Add roadmap items for the phase-space filter and the directional occupancy. Co-Authored-By: Claude Opus 5.5 --- docs/dev/roadmap.md | 16 + .../dev/seps/sep-0021-absorbing-boundaries.md | 382 +++++++++++++++--- 2 files changed, 353 insertions(+), 45 deletions(-) diff --git a/docs/dev/roadmap.md b/docs/dev/roadmap.md index 9014f5699..080ca92fd 100644 --- a/docs/dev/roadmap.md +++ b/docs/dev/roadmap.md @@ -911,6 +911,22 @@ a general offset time-axis API, independently asymmetric absorber ramps, and ada recentering or grid expansion, with consistent history, response memory, noise and output-coordinate transport. Those require a separate design and remain outside SEP 21. +**A phase-space filter for the temporal boundary.** Soffer and Stucchio's +time-dependent filter (J. Comput. Phys. 225, 1218, 2007) deletes only the windowed +Fourier content a free flow would carry out of the window, so it adds no stiff term +to the equation. Its free-buffer assumption, its interval cap for broadband fields and +its restart of multistep history are untested here. +[SEP 21](seps/sep-0021-absorbing-boundaries.md) §4.9 analyses it; a prototype on the +Runge–Kutta path, against the wide-window reference, was removed from that SEP's +campaign and would be measured first. + +**A directional collar occupancy.** Classifying the content of each temporal collar as +outgoing, incoming or unresolved from its windowed spectrum and group delay could help +separate wrap-around and reflection from ordinary outgoing radiation, though incoming +content can also be genuine returning physics. Removed from +[SEP 21](seps/sep-0021-absorbing-boundaries.md); worth evaluating offline on saved +planes against its wide-window cases before adding a diagnostic. + **A self-focusing collapse estimate.** The critical power is provided ({func}`~solprop.spatial.critical_power`), but not the Marburger estimate of the collapse distance, which the radial tutorial computes by hand. diff --git a/docs/dev/seps/sep-0021-absorbing-boundaries.md b/docs/dev/seps/sep-0021-absorbing-boundaries.md index 761f2bd68..a2e3acc03 100644 --- a/docs/dev/seps/sep-0021-absorbing-boundaries.md +++ b/docs/dev/seps/sep-0021-absorbing-boundaries.md @@ -27,7 +27,7 @@ wrapping around the periodic grid. Done as solprop does it, as a damping rate in every source evaluation, it can also be the stiffest term the default multistep stepper integrates. Its peak-rate stability cap puts a conservative floor under the step count for the default strength, independent of fibre length or tolerance: about 420 steps at -order three (PEC3/4) and 1450 at order five (PEC5/6). On short runs and on runs whose pulse stays clear of +order three (PEC3/4) and 1440 at order five (PEC5/6). On short runs and on runs whose pulse stays clear of the collar, that floor sets the cost. One alternative is the existing per-step split, whose collar map has no explicit stability cap, but whose first-order error reaches the physical window @@ -233,7 +233,7 @@ revision, including its in-repository native backend, that it actually uses. | [29](archive/sep-0029-compiled-backend-distribution.md) | The native backend lives in this repository as `solprop-native`, checked against the kernel schema and its contract tuples at import; native builds need GCC 14 or newer. | Native work lands in the same pull request as the Python backends, following the native contributor rules, and refuses unimplemented quantities by name. | | [30](archive/sep-0030-standard-benchmark-suite.md) | `benchmarks/` holds only the standard suite; campaign harnesses and raw results are kept with the project's development records. | Phase 0's harness follows that rule; cases that remain useful after the campaign, such as the wide-window references, become suite cases in phase 2 (§11). | | [31](sep-0031-simulation-coupling.md) | Remapping reports the share of a record's energy outside the temporal collar's flat region (`one_low`/`one_high`), and pulse measures average where the collar is exactly one; persisted frame records rebuild absolute phase and delay; a relaunched run is a new run with an inherited origin. SEP 31 leaves wider windows and escaped-field models to this SEP. | Geometry changes keep the meaning of the collar's flat-region fields or update those consumers; a window without temporal absorption still needs a defined edge band, for which the guard band is the candidate. Reuse the frame records to align fields in §4.8 and §4.11. Accumulators start at zero in a relaunched run unless Q22 decides otherwise. | -| [34](sep-0034-medium-flux.md) | Spatial routes have a physical admittance metric, `SpatialFlux`, with endpoint weights and a radial endpoint term in the linear exponent. A collar need not commute with the admittance, so its quadratic-form change is measured, never inferred from a field-norm decrement. | The spatial metric $M$ of §4.6 is SEP 34's; the radial endpoint term is part of the ledger's $E^\dagger M'E$. SEP 34's passivity rule answers part of Q15 on those routes. Its uniform-loss test that keeps the collar's field fraction negligible must keep passing. | +| [34](sep-0034-medium-flux.md) | Spatial routes have a physical admittance metric, `SpatialFlux`, with endpoint weights and a radial endpoint term in the linear exponent. A collar need not commute with the admittance, so its quadratic-form change is measured, never inferred from a field-norm decrement. | The spatial metric $M$ of §4.6 is SEP 34's. Its radial endpoint term is joined to the cumulative linear exponent, so it belongs to $\mathcal L$, where it cancels $E^\dagger M'E$ for the retained forward field; the ledger must not count it twice. SEP 34's passivity rule answers part of Q15 on those routes. Its pending phase 3 adds a uniform-loss test that keeps the collar's field fraction negligible; that test must keep passing. | **Execution order.** SEP 27 and SEP 28 are integrated, so the ordering this section recorded on 2026-10-20 is satisfied: the plasma campaign uses the qualified held-current @@ -372,10 +372,10 @@ test derives from the recurrence's spectral limit), rounded: |---|---:|---:| | IP-DOPRI5 | 3.3 | 38 | | RK4 (SEP 24's implemented low-storage march) | 2.785 | 45 | -| PEC2/3 | 0.55 | 229 | +| PEC2/3 | 0.545 | 231 | | PEC3/4 | 0.30 | 420 | -| PEC4/5 | 0.16 | 788 | -| PEC5/6 | 0.087 | 1448 | +| PEC4/5 | 0.163 | 773 | +| PEC5/6 | 0.0877 | 1437 | The same numbers come out of the default grids for the benchmark cases, which differ in everything but $AN$: @@ -671,8 +671,10 @@ unprojected scalar envelope with a constant power weight. For a frequency-depend metric, $M$ and $C$ need not commute: unweighted contractivity does not prove $R_t\ge0$. SEP 34 §4.2 states the same rule for a spatial screen or collar against the nonlocal admittance: measure the quadratic-form change, never call a field-norm -decrement physical absorption. On radial gradients its endpoint term in the linear -exponent belongs to $E^\dagger M'E$. Do not clip a signed contribution to force a +decrement physical absorption. On radial gradients SEP 34 joins its endpoint +amplitude term to the cumulative linear exponent: it is part of $\mathcal L$ and +cancels $E^\dagger M'E$ for the retained forward field, so it is counted once, +there. Do not clip a signed contribution to force a positive ledger. Phase 0 checks passivity in the actual metrics and reports any failure before recommending a default. Changing the collar operator to enforce another metric needs a recorded @@ -706,16 +708,20 @@ flow, use the per-step factor $1-e^{-\alpha h}$ (exponential weights). Coupled s evolution needs a separately qualified exponential-weighted or refined rate integral; that factor alone is not its exact total loss. Do not use the last trial stage as if it were the corrected endpoint. In the current shared driver, -`_on_accepted_step` runs before state/position commitment on an adaptive run and after -it on replay; the quadrature alarm deliberately consumes trial buffers. The new +`_on_accepted_step` runs before state/position commitment on the adaptive +Runge–Kutta loop and after it on replay and on the multistep march; the quadrature +alarm deliberately consumes trial buffers. The new accumulators therefore need a hook after state and position commitment, or explicit accepted endpoint data, consistently on adaptive RK, both multistep formulations and replay, including the low-storage march after its finish/commit block. The driver already has one such point: the call to `StepDriver._take_step_stats`, made after the state is finished and the position advanced in both step loops, the multistep march, the low-storage replay and the batch driver. Its docstring records the -asymmetry of `_on_accepted_step`. The accumulators attach there, or at an -equivalent committed-endpoint call beside it. Rejections +asymmetry of `_on_accepted_step`. That method returns at once unless periodic +statistics rows were requested and is not on the native backend's protected driver +surface, so the accumulators take a new call at the same sites rather than living +inside it; adding that call to the protected surface is the kernel schema change +named below. Rejections contribute nothing. An in-place stage register is not retained endpoint data; any extra buffer must respect the march's ownership contract and appear in its ledger. Any change to that protected hook surface bumps the kernel schema. Extra transforms @@ -730,10 +736,9 @@ short excursion occurred between samples. Resume restores accumulators and their endpoint, so splitting a run or changing output cadence does not lose or double-count removal. These are requirements for phase 2, not capabilities of the current alarm hook. -An optional diagnostic helps interpret failures. A directional occupancy, which -classifies collar content as outgoing or incoming by windowed Fourier analysis [5], -was also proposed; it was removed from this SEP on 2026-10-24 and kept on the -roadmap (Q14). +A directional occupancy, classifying collar content as outgoing or incoming by +windowed Fourier analysis [5], was also proposed; it was removed from this SEP on +2026-10-24 and is a roadmap item (Q14). One interpretive point remains: - **Surface crossing.** The commutator of §4.7 produces a complex amplitude source, not by itself a positive directional energy flux. In a constant-metric, lossless @@ -746,7 +751,7 @@ roadmap (Q14). Two records are possible: the linearly propagated amplitude removed by the collar (reactant–product decoupling [1, eq. 227]), and a reconstruction from a surface before -the collar (inspired by tSURFF [6]). Q11 prefers the latter, subject to phase 0 +the collar (inspired by tSURFF [6]). Q11 prefers the latter, subject to phase 0b establishing its accuracy for this nonlocal, band-limited problem. tSURFF's local Hamiltonian result does not by itself prove absorber independence here. @@ -1022,9 +1027,13 @@ mask fixed. Extra response work over retained tails and extra monitoring are cou The hypothesis is strongest where the collar forces hundreds of steps but the physical source needs far fewer. It is weaker where nonlinear accuracy or source-history variation already limits the step. SEP 16's 1329-to-965 canonical call reduction came -from a per-step collar, not an enlarged grid without absorption; by itself it would -not pay the FFT cost of doubling. Its RDW ablation found little benefit from weakening -the collar. These observations motivate distinct cases, not a universal speed-up. +from a per-step collar, not an enlarged grid without absorption; as a call ratio alone +it is below the 2.14 operation-count factor of doubling. But a retained window also +drops the temporal pass, which SEP 22 measured at 2.0–2.3 times the per-step cost on +`numba_cpu` and 1.6 on the native CPU build for a Cartesian Kerr case, so $C_{\rm wide}/ +C_{\rm collar}$ can be well below the operation count; the ratio is backend- and +route-dependent and is measured, on every CPU backend, not estimated. Its RDW ablation +found little benefit from weakening the collar. These observations motivate distinct cases, not a universal speed-up. Removing a collar removes an artificial term and its integration error. It does not remove temporal aliasing, truncation of response memory, spectral discretisation error @@ -1135,7 +1144,13 @@ $$ \Delta z_{\rm check}\le\theta\,w_g/v_{\max},\qquad 0<\theta<1, $$ -sets an initial check cadence. Phase 0 calibrates $\theta$ and adds spreading and +sets an initial check cadence. $v_{\max}$ is not the drift range of the whole +frequency grid: its edge bins carry only noise and would make the cadence arbitrarily +short, the reason Q3 rejects grid-predicted strength. It is taken over a declared +monitored band, the bins and modes whose content exceeds a stated spectral floor, or +the conservative monitoring range of §4.11, and content outside that band is covered +by the guard occupancy itself, not by the cadence. R7 defines the band. Phase 0a +calibrates $\theta$ and adds spreading and nonlinear allowances; for negligible drift, spreading still sets a check interval. This is not a finite-propagation-speed theorem for full dispersion and projection. Reference [5]'s related buffer/velocity criterion assumes free exterior evolution; @@ -1171,7 +1186,9 @@ $$ j=v|a|^2+\beta_2\operatorname{Im}(a^*\partial_t a). $$ -Thus $d\int_{t_l}^{t_r}|a|^2dt/dz=j(t_l)-j(t_r)$; pure advection is the +This holds in the internal Fourier convention of this section; on saved arrays in the +optics convention the dispersive term of $j$ changes sign. Thus +$d\int_{t_l}^{t_r}|a|^2dt/dz=j(t_l)-j(t_r)$; pure advection is the $\beta_2=0$ case. Boundary flux and its z-quadrature can be tested against this identity. General dispersion, changing metrics, losses and nonlocal sources require the operator balance of §4.6. Signed net flux does not count unique outward escape: @@ -1257,20 +1274,24 @@ R7 specifies absolute/relative normalisation, bands, noise handling, guard margi and cadence before implementation. A monitored default without temporal absorption requires R6/R7 and a maintainer decision; it must remain accessible without disabling the spectral collar. Phase 2 supplies the corresponding convenience-interface path. -`absorber=False` disables both soft collars, retains the hard representable-band mask, -and rejects conflicting strength or scheme settings. A spectral-only collar, its +`absorber=False` disables both soft collars, temporal and spectral, retains the hard +representable-band mask, and rejects conflicting strength or scheme settings. On the +spatial interfaces (`prop_radial`, `prop_free`, `prop_planar`) it does not touch the +transverse collars, which keep their own settings; the docstrings say so, and a +switch for those collars stays out of scope (§3). A spectral-only collar, its temporal rates identically zero while the spectral rate stays, is built by `absorber(grid, …, temporal=False)` and compiles no temporal pass under either scheme; SEP 22's phase 1 supplied both, and this SEP keeps them (Q16). The proposed `walkoff` -option changes temporal strength while preserving the spectral rate. Phase 0 must +option changes temporal strength while preserving the spectral rate. Phase 0a must specify which explicit parameter combinations conflict and how the parent interval is supplied (Q18). [SEP 22](archive/sep-0022-memory-lean-spatial-execution.md)'s `Absorber.collar_length` currently sets both temporal and real-space spatial strength. Mapping `walkoff` into that shared field therefore needs R4's decision about spatial coupling, or a separately approved strength parameter; it cannot silently change -the spatial boundary. Phase 0 settles the precise signatures, route support -and resume agreement, to a rounding bound rather than bit identity -([SEP 25](archive/sep-0025-rounding-level-reproducibility.md)), before phase 2 begins. +the spatial boundary. Phase 0a settles the precise signatures, route support +and resume agreement of phase 2's settings, to a rounding bound rather than bit +identity ([SEP 25](archive/sep-0025-rounding-level-reproducibility.md)), before phase 2 +begins; phase 0b settles those of the escaped-field record before phase 3. ### 6. Implementation strategies @@ -1292,7 +1313,14 @@ for phase, output alignment, response preparation, history and resume. If a fram candidate requires a larger redesign, retain its measurements and defer that setting explicitly rather than blocking the basic retained-window mode. -**Geometry and strength (phase 2).** These are pure physics-layer and grid changes: +**Geometry and strength (phase 2).** These are physics-layer and grid changes. The +grid's temporal collar is shared state, not only absorber geometry: besides the +absorber's rates it sets the field-grid plasma source gate and its derivative, the +Raman kernel's tail taper, the TDSE descriptor's time collar, the recorded analysis +window that processing reads back, and the flat region SEP 31's remapping and pulse +measures use. A geometry change states its effect on each of these consumers and +keeps or deliberately updates it, with a test; changing the absorber must not move a +source gate silently (§4.8). - **`walkoff`** sets the temporal peak from the realised profile area. For a shape $q(t)\in[0,1]$, set $\alpha_{\max}=2\Gamma_{\min}v_p/\int_{\rm edge}q\,dt$, @@ -1448,8 +1476,6 @@ No new dependencies. - Check the restricted conservative energy ledger, then fixtures with material loss, Raman/plasma energy exchange, variable metrics and projection loss using the full balance. A diagnostic residual must be consistent with its own quadrature bound. - - Compare incoming and outgoing classification against controlled reflected, - wrapped and genuinely returning packets; do not label every incoming packet a leak. - Verify coherent spectral reconstruction and resolution/averaging limits on separated pulses. Compare the escaped estimate with the identically windowed wide-reference field, with consistent Fourier scaling and route weights. @@ -1580,8 +1606,9 @@ after phase 2 has started. - The harness and raw results are kept with the project's development records, as SEP 30 requires; cases that stay useful, such as the wide-window references and the - retained-window comparison, become suite cases in phase 2. Runs use `numpy_ref` and - `numba_cpu`, are timed on an otherwise idle machine, and record the solprop + retained-window comparison, become suite cases in phase 2. Accuracy runs use + `numpy_ref` and `numba_cpu`; cost comparisons are timed on `numba_cpu` and the native + CPU build, whose per-step ratios differ, on an otherwise idle machine, and record the solprop revision, source equation, gates and backend capabilities. - SEP 27's held-current source is integrated and qualified, and SEP 28's free-space changes are in, so plasma and free-space cost comparisons use the current tree on @@ -1621,6 +1648,11 @@ after phase 2 has started. projection and the fine/coarse collar discretisation difference. - The transfer of the geometry results to one radial case (R4). - Passivity of the temporal collar in each route's actual metric (§4.6, Q15). +- The energy diagnostics prototyped on committed endpoints: occupancy and removal + rates, the split's discrete energy difference, their trapezoid against exponential + weights or refinement over three step levels, and the extra transforms they cost; + then the thresholds at which occupancy and removal correlate with wide-reference + errors (R3). - **Exit:** a report with recommendations R1–R4, R6 and R7 below. **Phase 0b: the escaped-field records.** @@ -1753,8 +1785,9 @@ once. Device qualification follows later, under the standing policy. - **The trade.** A walk-off default ends the slack effect of §4.3, but changes every run's absorber. Slices keep their parent's strength with `boundary_length` either way. - - **Status.** John Travers supports the walk-off default subject to phase 0's R1 and - this review of the steady-drift assumption. + - **Status.** Deferred to phase 0a/R1 and the maintainer decision that follows it, + before phase 2. John Travers supports the walk-off default subject to R1 and the + test of the steady-drift assumption. 4. **Q4: the collar's placement and width.** Resolved in principle 2026-10-16 (John Travers): - The temporal collar is added *outside* the requested window: the flat region always @@ -1809,7 +1842,7 @@ once. Device qualification follows later, under the standing policy. length decoupling (Q16); the real-space collars' geometry after R4. 11. **Q11: the form of the escaped-field record.** Resolved 2026-10-16 (John Travers): the - surface-flux record of §4.7. The removal record is the fallback if phase 0 finds the + surface-flux record of §4.7. The removal record is the fallback if phase 0b finds the flux buffer unaffordable or the reconstruction insufficiently accurate. Neither is built without R5; failed qualification is reported to the maintainer. 12. **Q12: the flux buffer.** How wide must the gap between the surfaces and the collar @@ -1852,8 +1885,11 @@ once. Device qualification follows later, under the standing policy. - **The grid must not grow for it.** Q4 places the collar outside the requested window and grows the grid to fit. A collar built with `temporal=False`, or whose rates are all zero, absorbs nothing and must add no width: the grid stays at the - requested window, as it does today (`collar_fraction` must be positive now, and - the flat region is $\min(T_{\mathrm{req}}/2,\,(1-2f)T/2)$). Otherwise a + requested window, as it does today. Today, though, such a grid's flat region is + still shrunk below $\pm T_{\mathrm{req}}/2$ on a tight grid, because the collar + geometry ignores the rates (`collar_fraction` must lie in (0, 0.5), and the flat + region is $\min(T_{\mathrm{req}}/2,\,(1-2f)T/2)$); phase 2 removes that + shrinkage with Q4. Otherwise a spectral-only run on a grid matched to a measurement would gain 12–20 % in samples, memory and transform time for nothing. - **One effective length (delivered; R4 still measures its suitability).** SEP 22's @@ -1876,27 +1912,30 @@ once. Device qualification follows later, under the standing policy. conservative by two in the exponent. The convention is chosen before R1: counting one edge, $\Delta\tau_p = T_{\mathrm{req}}/2$ reproduces today's default strength; counting both, it halves it ($AN$ about 100–135 on the tight grids of §6 - and 25 on the full CtC grid), and the floors of §4.3 halve with it. Phase 0's - wide-window reference measures which attenuation the physics needs. + and 25 on the full CtC grid), and the floors of §4.3 halve with it. Deferred to + phase 0a/R1: its wide-window reference and geometry sweep measure which + attenuation the physics needs. 18. **Q18: review recommendations (AI review, 2026-10-18), for acceptance.** - **An early keyword phase.** `absorber=False` and `absorber_scheme=` on the keyword - interfaces depend on no phase-0 result. Recommended: a phase 2a, independently - mergeable before phase 0 closes. The spectral-only collar and its compiled-away - pass no longer wait on it: SEP 22's phase 1 delivered them (Q16). + interfaces depend on no phase-0 result, so a phase 2a was recommended. Declined + 2026-10-24 (John Travers): the keywords land with phase 2 (§11). The + spectral-only collar and its compiled-away pass do not wait on them: SEP 22's + phase 1 delivered them (Q16). - **`walkoff` beside `boundary_N`.** §5 rejects "conflicting" `walkoff` and `boundary_N`, yet `boundary_N` keeps setting the spectral $\ell$ when `walkoff` sets the temporal strength, so no conflict is defined; state which combinations are refused. A slice built afresh with `walkoff` needs its parent's $L_{\rm ref}$, which no keyword carries; `boundary_length` is today's answer and - the manual says so (§6). -19. **Q19: production strategy and default (2026-10-20).** Deferred to phase 0/R6: + the manual says so (§6). Deferred to phase 0a, which specifies the refused + combinations with R1; phase 2 implements them. +19. **Q19: production strategy and default (2026-10-20).** Deferred to phase 0a/R6: which retained windows, placements and prescribed frames are cheaper at matched physical accuracy, and in which cases does absorption remain necessary or more efficient? Report memory limits, monitoring costs, counterexamples and uncertain comparisons. Recommend a default only after R7 qualifies its failure policy and the maintainer has reviewed the evidence. Compare with the cheapest admissible production window, not the cost of the most refined reference. -20. **Q20: guard reliability and cost (2026-10-20).** Deferred to phase 0/R7: choose +20. **Q20: guard reliability and cost (2026-10-20).** Deferred to phase 0a/R7: choose route metrics, guard widths, bands/noise treatment, absolute and relative warning and stop thresholds, and a check cadence that resolves crossing and spreading. Establish where dense checks avoid extra source calls and where check planes @@ -2063,3 +2102,256 @@ parts) are cited through it. prototype and directional occupancy were removed to the roadmap (Q13, Q14). Q22 added for accumulators across a SEP 31 relaunch. No campaign was run and no default was changed. +- 2026-10-24 (later): Reviewed by Opus 5.5 (AI), covering the unreviewed 2026-10-20 + revision and the refresh (AR1–AR12 below). The drafting agent's response revises + Part I; no finding remains open. Next: human review and acceptance. + +### AI review — 2026-10-24 (Opus 5.5) + +Scope: the unreviewed 2026-10-20 revision (§3.1, §§4.10–4.12, the retained-window +mode, the guard monitor, placement and frames, R6/R7, Q19–Q21) and the 2026-10-24 +refresh (the §3.1 table, SEP 34 in §4.6, the committed-endpoint hook, the phase 0a/0b +split with the energy-diagnostic contract moved to R3, the removal of the filter and +directional occupancy, Q22). Checked against the code on this branch, SEPs 22–34 and, +read-only, SEP 31's implementation branch. Earlier reviews used no numbered findings in +Part III, and R1–R7 already name the phase 0 recommendations, so these findings use +the prefix **AR**. Part I was not edited. No campaign or propagation was run; the +derivations below were redone by hand and the stated numbers recomputed. + +**Verified without a finding.** §4.10: the FFT factors 2.14 and 4.57 at +$n_t=2^{14}$, and the break-even inequality $K_{\rm collar}/K_{\rm wide} > +C_{\rm wide}/C_{\rm collar}$. §4.11: the stationary-phase delay, and the widths +$W_0+\Delta\tau$ (fastest-light frame with an early-edge launch, or a midpoint frame +with a centred launch) against $W_0+2\Delta\tau$ (centred launch in the fastest-light +frame). §4.12: one full period of advection multiplies every stored coefficient by +$e^{-2\pi ik}=1$ on both grids (the field grid's frame term runs through the origin, +the envelope grid's acts on offset frequencies), so the final state cannot reveal it. +The cadence bound is dimensionally right and conservative for a packet whose leading +edge must be seen inside a guard before it reaches the seam. The continuity current is +right in sign and factor: for $\partial_z a=-v\partial_t a+i\beta_2\partial_t^2a/2$, +$a^*\partial_z a+{\rm c.c.}=-v\partial_t|a|^2-\beta_2\partial_t\operatorname{Im}(a^*\partial_t a)$, +and a local Kerr term drops out. A component $a\propto e^{i\Omega t}$ gives +$j=(v+\beta_2\Omega)|a|^2$, the group-delay rate $\beta_1+\beta_2\Omega-\beta_1^{\rm f}$, +which is consistent with the internal convention's plane wave $e^{i(\omega t-\beta z)}$ +(conventions §2). The code claims also check out. `StepDriver._take_step_stats` runs after the commit at every call site: in +`backends/driver.py`, the adaptive loop commits at 1575–1578 and calls the hook at +1593, and replay commits at 1765–1768 and calls it at 1771. `backends/multistep.py`'s +adaptive march commits in `_attempt` before the call at 2968, and its replay calls it +at 3018. The low-storage replay commits at 638–646 and calls it at 590. The batch +replay calls it at 183 and fans it out to members at 237–240. +`STABILITY_RADIUS` = 3.3, `LOW_STORAGE_REAL_INTERVAL` = 2.785 and +`PEC_REAL_INTERVAL` = (1.0, 0.545, 0.3, 0.163, 0.0877, 0.0465), indexed by `order`. +`collar_fraction` must lie strictly inside (0, 0.5), and the flat region is +$\min(T_{\rm req}/2,(1-2f)T/2)$ (`grid.py` 1764, 1798). `collar_field_fraction` is a +field-norm share (`backends/spatial.py` 62). On the keyword interfaces, `absorber=` and +`absorber_scheme=` are as §3 states (`driver/interface.py` 724–725, 1198). Kernel +schema 35 and output schema 23 are correct. SEP 31's `edge_share` reads +`t_collar.one_low/one_high` (`coupling/remap.py` 474–476). + +**AR1 — blocking. Q18's early keyword phase is neither adopted nor declined (§11, +Q18, §5).** Q18 recommends a phase 2a for `absorber=False` and `absorber_scheme=`, +"independently mergeable before phase 0 closes", and marks itself "for acceptance". +§11 still puts the keywords in phase 2, which needs 0a's R1/R3/R6/R7. Its second item, +which `walkoff`/`boundary_N` combinations are refused and how a slice gets +$L_{\rm ref}$, is deferred only by §5's "Phase 0 must specify". SEP 0 requires every +open question to be resolved or deferred to a named phase. *Fix:* record the +maintainer's decision on phase 2a. If it is adopted, add it to §11 with its own exit, +and note that it needs §5's definition of `absorber=False` (AR10). If it is declined, +say so in Q18. Defer the second item explicitly to phase 0a/R1. + +**AR2 — blocking. Several open questions and references were not re-targeted after the +split (Q3, Q11, Q17, Q19, Q20, §4.7, §5).** Q3's status ("supports the walk-off +default subject to phase 0's R1 and this review") names no phase or decision point. +Q17 says the convention is "chosen before R1", but phase 0a's geometry sweep is what +measures it. Q19 and Q20 defer to "phase 0/R6" and "phase 0/R7"; they belong to 0a. +§4.7 (line 749) and Q11 say "phase 0" where the record's qualification is now 0b. §5's +"Phase 0 settles the precise signatures, route support and resume agreement … before +phase 2 begins" cannot hold for the escaped-field signatures if 0b may finish after +phase 2 starts. *Fix:* give Q3 and Q17 an explicit deferral ("deferred to phase 0a/R1; +maintainer decision before phase 2"). Change Q19/Q20 to 0a and §4.7/Q11 to 0b. Split +§5's sentence: 0a settles the keywords, `walkoff`, diagnostics and `BoundaryCheck`, +and 0b settles `escaped_field` and `escaped_spectrum` before phase 3. + +**AR3 — should-fix. Removed work is still promised, and the roadmap items that the text +cites do not exist (§7, §4.6, §2, §4.9, §10, Q13, Q14).** §7, "The records and +diagnostics", still requires that tests "compare incoming and outgoing classification +against controlled reflected, wrapped and genuinely returning packets". That is the +removed directional occupancy. §4.6's "An optional diagnostic helps interpret failures" +now introduces only the removed item. §2, §4.9, §10, Q13 and Q14 say the filter +prototype and the directional occupancy are "kept as roadmap items", but +`docs/dev/roadmap.md` has neither; the only "phase-space" in `docs/` outside this SEP is +in SEP 8. SEP 0's rule for a reduced scope is to restore still-relevant informal work on +the roadmap. *Fix:* delete the §7 bullet, reword the §4.6 sentence, and add the two +roadmap items in the same pull request, linking §4.9. + +**AR4 — should-fix. The §4.3 floor table no longer follows from the constants it now +cites (§1, §4.3).** The refresh says the table uses `PEC_REAL_INTERVAL`, rounded. With +$AN=252$, $AN/(2r)$ from those values gives 231, 420, 773 and 1437 for PEC2/3 to +PEC5/6. The table shows 229, 420, 788 and 1448, which are computed from the rounded +$r$ of 0.55, 0.30, 0.16 and 0.087. The abstract's "1450 at order five" inherits the +error. The 2026-10-18 review accepted the old figures as approximations only because +the source of $r$ was unstated. *Fix:* show $r$ = 0.545, 0.3, 0.163 and 0.0877 and +$n_{\min}$ = 231, 420, 773 and 1437, and say "about 1440" in §1. + +**AR5 — should-fix. SEP 34's radial endpoint term is put in the wrong part of the +ledger (§3.1 SEP 34 row, §4.6).** The text says the endpoint term "is part of the +ledger's $E^\dagger M'E$" and "belongs to $E^\dagger M'E$". In the code the term +$-\tfrac12\ln(Y_z(z)/Y_z(0))$ is joined to $\Phi$ (`translate/linop.py` +`endpoint_phi`, 1743–1777), so it belongs to $\mathcal L$, and the propagated variable +is the field with $M\propto Y_z(z)$. Its contribution is +$2\operatorname{Re}(E^\dagger M\mathcal L_{\rm end}E)=-E^\dagger M'E$, which cancels the +metric-change term exactly; that is SEP 34 §4.4's invariance of $Y_z|E|^2$. A ledger +written as the text says would count the gradient's metric change twice and show +spurious removal on a lossless radial gradient. *Fix:* say that the endpoint term is +part of $\mathcal L$ and cancels $E^\dagger M'E$ for the lossless forward model. Add a +§7 witness: on a lossless radial gradient with zero collar, the ledger residual is +within its quadrature bound. + +**AR6 — should-fix. The cost argument of §4.10 leaves out the removed temporal pass, +and the campaign's timing backends leave out the native build (§4.10, §11 phase 0).** +§4.10 says that SEP 16's 1329-to-965 call reduction "by itself … would not pay the FFT +cost of doubling" (1.38 against 2.14). The only measured cost of the in-stage temporal +pass, SEP 22 §3, shows it alone multiplying the step cost by 2.02–2.26 on `numba_cpu` +and 1.60–1.63 on the native CPU build. That case is a Cartesian Kerr-only grid, so it +does not transfer to modal routes, but it shows that $C_{\rm wide}/C_{\rm collar}$ at +$q=2$ can be near or below one. In that case doubling wins even at a 1.38 call ratio. +The ratio also differs by backend, while phase 0 times only `numpy_ref` and +`numba_cpu`, and R6 chooses a default on measured wall time. *Fix:* replace the +sentence with the decomposition: per route and per backend, measure the temporal pass's +share of $C_{\rm collar}$ beside the $n_t\log n_t$ growth. Include the native CPU build +in phase 0a's timing comparison, or state why numba timings stand in for it. + +**AR7 — should-fix. The grid's temporal collar is shared state, not only the absorber's +geometry (§3.1, §4.8, §4.12, §6, Q4, Q16).** `grid.t_collar` also sets: + +- the plasma source gate and its derivative (`translate/masks.py` 327–328, + `t_window_fine`, `window_derivative`); +- the Raman response's tail taper, whose width is `t_collar.width_high`, which sets the + response-memory truncation (`translate/raman.py` 131, 301, 747); +- the TDSE descriptor's `time_collar` (`translate/tdse.py` 782); +- the recorded analysis window `t_window_min/max` (`output/schema.py` 1016–1017); +- SEP 31's `edge_share`. + +§4.8 deals with the plasma gate only. The R1 width default, Q4's "collar outside the +requested window" and the retained mode's guard band would therefore also change Raman +memory truncation, the TDSE descriptor and the output metadata. §4.12 also requires +that "a zero temporal rate neither grows the grid nor silently reduces the analysis +aperture". With `temporal=False` today, the flat region on a tight grid is still +$(1-2f)T/2 Date: Sat, 24 Oct 2026 14:03:28 +0100 Subject: [PATCH 3/3] SEP 21: record the confirmed absorber=False scope on spatial interfaces Co-Authored-By: Claude Opus 5.5 --- docs/dev/seps/sep-0021-absorbing-boundaries.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dev/seps/sep-0021-absorbing-boundaries.md b/docs/dev/seps/sep-0021-absorbing-boundaries.md index a2e3acc03..c9616f570 100644 --- a/docs/dev/seps/sep-0021-absorbing-boundaries.md +++ b/docs/dev/seps/sep-0021-absorbing-boundaries.md @@ -1278,7 +1278,7 @@ the spectral collar. Phase 2 supplies the corresponding convenience-interface pa representable-band mask, and rejects conflicting strength or scheme settings. On the spatial interfaces (`prop_radial`, `prop_free`, `prop_planar`) it does not touch the transverse collars, which keep their own settings; the docstrings say so, and a -switch for those collars stays out of scope (§3). A spectral-only collar, its +switch for those collars stays out of scope (§3; John Travers, 2026-10-24). A spectral-only collar, its temporal rates identically zero while the spectral rate stays, is built by `absorber(grid, …, temporal=False)` and compiles no temporal pass under either scheme; SEP 22's phase 1 supplied both, and this SEP keeps them (Q16). The proposed `walkoff` @@ -2345,7 +2345,7 @@ follows. content outside that band, and R7 defines the band. - **AR10.** §5: `absorber=False` on the spatial interfaces disables the temporal and spectral collars only. The transverse collars keep their own settings, and a switch - for them stays out of scope. This is proposed for confirmation at acceptance. + for them stays out of scope. Confirmed by John Travers, 2026-10-24. - **AR11.** §4.6 now restricts the pre-commit asymmetry to the adaptive Runge–Kutta loop. It also says the accumulators need a new call at the statistics call sites, which is a protected-surface change with a kernel schema bump. §4.12 notes the