fix(fase3): stamp real proposer model into provenance, kill fake-model leak (F1)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019any9zfGNNwWJPX5Zq2QRz
This commit is contained in:
Kjell Tore Guttormsen 2026-06-26 15:03:45 +02:00
commit e0f93dfa7b
2 changed files with 28 additions and 2 deletions

View file

@ -190,11 +190,19 @@ async def run_project(
gen_context = debate_output or context
# 5. Structured candidate -> blocking validation; token bound = the meter in this loop.
outcome = await generate_via_llm(factory("proposer"), project, gen_context, meter)
proposer_client = factory("proposer")
outcome = await generate_via_llm(proposer_client, project, gen_context, meter)
proposal = outcome.proposal
# 6. First-class provenance stamp (authoritative; independent of MAF Annotation).
model = "fake-model" if client_factory is not None else resolve_model(profile, "proposer")
# F1: an injected client_factory stamps the injected client's REAL model ("unknown" is the
# neutral fallback for a client that doesn't surface one -- never a fabricated name); the
# default path keeps the deterministic resolve_model.
model = (
(getattr(proposer_client, "model", None) or "unknown")
if client_factory is not None
else resolve_model(profile, "proposer")
)
stamp = ProvenanceStamp(
citations=citations,
model=model,