/trekreview flagged the Spike B(b) fan-out experiment as BROKEN_SUCCESS_CRITERION
(BLOCKER): it asserted a per-client call_count reached 3 on a reused instance vs
1 on a fresh one — a tautology true for any un-reset mutable counter, independent
of MAF, that never exercised the real G2/B7 shared-Workflow state-corruption
footgun. It was a false-confirm of a de-risk assumption.
Rebuilt to observe genuine MAF thread state via the messages each participant
RECEIVES (new FakeChatClient.received_texts seam):
- shared_instance_conversation_bleed: a reused built ConcurrentBuilder Workflow
accumulates the conversation across .run() calls — run N's participants receive
runs 0..N-1's prompts/replies (measured [[p0],[p0,p1],[p0,p1,p2]], strictly
monotonic) => genuine cross-run contamination.
- fresh_instance_conversation_isolation: a fresh instance per run gives each a
clean thread => each participant sees only its own project ([[p0],[p1],[p2]]).
Assumption now CONFIRMED with a meaningful observable. findings-b.md gains a
Method note recording why it was rebuilt; README rows updated.
Also fixes the MINOR: a_groupchat.run_live now mkdirs the findings dir before
write_text so a post-disposal run does not lose the measured result.
Gate green: ruff check + format, mypy src, pytest 48 passed / 1 skipped.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fif1r1En5W542HbZV88yMH
Completes Fase 0 (skeleton & decision-lock):
- reference_domain.py + data/reference_projects.json: a synthetic
"anleggskostnad" portfolio (3 fictional construction-cost projects with
cost line items) as the framework's bundled reference input. Plain typed
loader (frozen dataclasses); the JSON-Schema data-source *contract* (B5)
is deliberately deferred to Fase 2.
- backends.py: Profile (azure|local) + ChatBackend Protocol seam +
AzureFoundryBackend/LocalBackend stubs + get_backend() selector
(fail-fast on unknown profile). Empty skeleton per D2 — create_chat_client
raises NotImplementedError until live wiring in Fase 1. Return type is the
MAF BaseChatClient (the common base of FoundryChatClient/OpenAIChatClient).
Quality gate green: ruff format + check, mypy (src) clean, 12 pytest passed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9FyyENxebxVThjrn9et8C