Skip to content

Boundary B5 remainder: retire ReflectiveBoundary.albedo (the rest of B5 was dissolved by G6.3) #368

Description

@deOliveira-R

Goal (outcome). ReflectiveBoundary carries no albedo parameter, because a partially-reflecting wall is AlbedoBoundary — one law per physical thing, and the parameter that used to blur them is gone.

Context: B5 is ~2/3 DISSOLVED, and this is what is left

Campaign phase B5 (.claude/plans/boundary_machinery_review.md:1223-1238) was written as "type white's realized operator as the rank-one it is; add apply_transpose AND flip is_adjointable; unblock #300." Reconciled [M] 2026-08-14 at 0f5ca91c, most of it has already happened by a different route:

  • "Type AngularAverageOperator.apply as the rank-one it is"the operator is RETIRED (b4f0f5c9, "retire AngularAverageOperator onto the factored chain"). It was factored, not re-typed: PartialCurrentOperator (orpheus/sn/boundary/angular.py:65) @ IsotropicEmissionOperator (:191). Every surviving mention is past-tense history.
  • "C-2: two-part or it is a no-op — add apply_transpose and flip is_adjointable"done at G6.3 step 3, and orpheus/geometry/boundary/_factors.py:1135-1150 says so in place: "FLIPPED 2026-08-04 at G6.3 step 3 (numerics: spaces MANDATORY on every operator, and the SPACE owns shape + traversal (book-keeping is not math) #330), which absorbed the B5 step this comment was waiting on. … Factoring the realization into PartialCurrentOperator @ IsotropicEmissionOperator REMOVED the ambiguity rather than resolving it: each link has ONE honest transpose."
  • [M] white realizes adjointable today: SNBoundaryRealizer().realize(WhiteBoundary(...), space)TensorProductOperator, is_adjointable = True, apply_transpose returns.

A future session must re-derive B5's scope from the tree, not from :1223-1238 — that section describes an operator that no longer exists and a flip that already happened.

What genuinely remains

1. Retire ReflectiveBoundary.albedo — this issue

[M] three forward references still promise it and are the greppable surface:

  • orpheus/geometry/boundary/_factors.py:130"retiring the parameter is campaign phase B5"
  • orpheus/geometry/boundary/_factors.py:1197"retired in phase B5"
  • docs/theory/foundations/boundary_conditions.rst:627 — same claim

⚠ Owed the full three-search retirement audit (.claude/rules/coding-standards.md): graph callers, text grep across code + tests + docs/ split by TENSE (past-tense history STAYS), and direct constructors. Note orpheus.geometry.boundary IS partly rendered, so some xrefs here are -W-gated — unlike orpheus.numerics.operator, where B3.3 measured that grep is the only gate.

⚠ Also check the marker migration: any catches(...) / verifies(...) on tests that pin the parameter.

2. The composite B.H-with-white gate — NOT this issue, it is a #189 dependency

B5's stated gate is "B.H works with a white face installed". [M] the leaf half is done (above), but SNMesh.BOUNDARY_OPERATOR_REGISTRY == ['reflective', 'vacuum'] — white cannot be tag-installed on an SN face at all, so the composite gate is gated behind #189, i.e. behind campaign phase B6. Do not attempt it here.

3. #300 stays open

"Unblocks #300 (Woodbury on the rank-1 B)"#300 is still OPEN and is the real payoff of the rank-one typing.

Spun out of the B4–B7 reconciliation; sibling: #367 (B4).

Metadata

Metadata

Assignees

No one assigned

    Labels

    level:L0Term verificationmodule:geometrygeometry/ mesh infrastructuremodule:sn02.Discrete.Ordinatestype:improvementEnhancement to existing functionality

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions