feat(major2): run_mandate_across_bundles threads one reviewer; run_portfolio takes none [skip-docs]

Ordre 20260904T173146Z-8102814273-from-portfolio-optimiser, steg 8 av 10.

Dispatcheren faar proposal_reviewer og videresender den til hver per-base run_project.
EN gjenstand, aldri en kopi per base: dispatchen er SEKVENSIELL, saa en terminal-reviewer
komponerer. Assertert med `is`, ikke `==` - en fersk reviewer per base ville vaert en annen
gjenstand med identisk oppfoersel, som `==` paa en vanlig callable ikke kan skille (samme
identitets-leksjon test_multibase_loadbearings store-arm ble rettet til).

Doera faar sitt EGET vitne (S7a-3-regelen: hver doer som aapner en base faar sin egen
mutasjon, fordi en uvitnet kopi kan regrere alene).

run_portfolio faar INGENTING - samtidige boelger deler en terminal, som er --portfolio-
partisjonens egen grunn - og fravaeret er ASSERTERT, saa en senere "symmetri"-endring er en
roed test og ikke en stille utvidelse.

RODT foer impl: T22 (TypeError paa ukjent keyword).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-05 07:10:31 +02:00
commit ee7da3bb94
2 changed files with 53 additions and 0 deletions

View file

@ -1844,6 +1844,12 @@ async def run_mandate_across_bundles(
max_tokens: int = _DEFAULT_MAX_TOKENS,
top_k: int = 3,
portfolio_meter: PortfolioMeter | None = None,
#: MAJOR-2, threaded unchanged into every per-base ``run_project``. ONE object, never a copy
#: per base: the dispatch is SEQUENTIAL, so a single terminal reviewer composes. Which base is
#: being asked about is visible to the expert because the request carries the approach label
#: AND ``project_id`` — each base's own, read by ``_project_from_bundle`` — so bases can be
#: told apart even when a multi-base commission reuses approach ids.
proposal_reviewer: ProposalReviewer | None = None,
) -> MultiBaseResult:
"""Evaluate ONE commission across SEVERAL knowledge bases — the multi-base dispatch (§ C.7).
@ -1976,6 +1982,7 @@ async def run_mandate_across_bundles(
top_k=top_k,
mandate=sub_mandate,
meter=_run_meter(None, portfolio_meter, max_rounds),
proposal_reviewer=proposal_reviewer,
),
)
# D2, dispatcher-side accounting. The condition is the dispatcher's OWN map and nothing