feat(sim): offline end-to-end simulation proving the learning loop closes
The primary method proof, offline — a deliberate, cost-driven substitution for målbilde §11.8's real-model run (the operator runs MAF against no real model; API for both repos is too costly privately). `portfolio_optimiser.simulation` drives `run_project` with a scripted synthetic chat client across two runs separated by a promotion, and shows the learning loop close end to end: - ScriptedChatClient subclasses the LAYERED OpenAIChatCompletionClient (not bare BaseChatClient — else the always-attached BudgetMiddleware no-ops), constructs offline (loopback url + dummy key), role-keys proposer/checker replies, and records every prompt into a shared sink. - simulate_learning_loop: Run A (fresh wiki) -> validated, persona-approved verdict carrying a realization marker absent from the bundle -> promote_verdict into the OKF wiki -> seed_store_from_bundle re-reads it -> Run B's hypothesis prompt carries the marker. An empty-wiki control on Run A proves causality. - `python -m portfolio_optimiser.simulation` prints an honest trace. Honesty (§1): this proves the plumbing, the deterministic spine, and that the learning dataflow closes — NOT that a live LLM would produce the proposal or verdict (scripted stand-ins). The genuine model-behaviour comparison lives on the Claude-SDK side (a minimal API run); the scripted client is MAF-side scaffolding, not part of the framework-neutral shared/ core. Load-bearing: tests/test_simulation_loadbearing.py goes red when promotion is detached (the marker never crosses into Run B). Suite 148->149. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHR8iKxJRxDiDfNw8HZmWE
This commit is contained in:
parent
6b645ad32a
commit
a9144cb9bb
4 changed files with 365 additions and 0 deletions
12
CLAUDE.md
12
CLAUDE.md
|
|
@ -88,6 +88,18 @@ Python ≥3.10. MAF (`agent-framework-core` 1.9.0). Pakkehåndtering: `uv`. To b
|
|||
dom er navigerbar (RØD når `link_in_index` detaches); promotert signal holdes ute av `bundle_context`
|
||||
(RØD når en beskrivende index-label lekker det inn). Index-RMW er ikke-atomisk (enprosess-MVP).
|
||||
- **Kostnadsdisiplin:** utvikle primært på lokal profil (gratis); Foundry/Azure (privat tenant finnes) kun til målrettet, minimal verifisering; billigste modeller + små syntetiske data + harde token-tak. Ingen tunge test-kjøringer.
|
||||
- **Offline simulering = primært metode-bevis (kostnadsdrevet, erstatter §11.8):** operatøren kjører
|
||||
IKKE MAF mot ekte modell (verken Azure/Foundry eller Ollama — API for begge repoene er for kostbart
|
||||
privat). `portfolio_optimiser.simulation` driver `run_project` med en SKRIPTET syntetisk chat-klient
|
||||
(`ScriptedChatClient` på `OpenAIChatCompletionClient` — IKKE bare `BaseChatClient`, ellers no-op-er
|
||||
`BudgetMiddleware`) over to kjøringer adskilt av en promotering, og viser at læringssløyfa lukkes:
|
||||
Run A's godkjente persona-dom (markør fraværende fra bundelen) → `promote_verdict` → re-seed → Run B's
|
||||
hypotese-prompt bærer markøren (tom-wiki-kontroll på Run A beviser kausalitet). **Ærlighet (§1,
|
||||
ufravikelig):** beviser plumbing + deterministisk ryggrad + at dataflyten lukkes — IKKE at en levende
|
||||
LLM ville produsert forslaget/dommen (skriptede stand-ins). Den genuine modell-atferd-sammenligningen
|
||||
lever på Claude-SDK-siden (minimal API-kjøring). Skriptet klient = MAF-side stillas, IKKE delt
|
||||
(`shared/` forblir framework-nøytralt). Kjøres `uv run python -m portfolio_optimiser.simulation`.
|
||||
Load-bearing: `tests/test_simulation_loadbearing.py` blir RØD når promoteringen detaches.
|
||||
- **STATE.md er local-only** (gitignored). Voyage session-state er efemert; STATE.md er kanonisk kontinuitet.
|
||||
- Prosess: Voyage-plugin (`/trekbrief → /trekplan → /trekexecute → /trekreview`) per større fase.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue