fix(run): S10 del 2 — post-mortem: stopp-artefakt, SDK-isolasjon, raw-JSON-direktiv
Transkript-analyse av den stoppede live-kjøringen (10 kall, 162 250 tokens, $0.331506): konfig-lekkasjen (setting_sources=None laster ALLE filsystem- settings) injiserte operatørens Claude-konfig i hvert kall — ~10-15k uncachede tokens, en påtvunget bekreftelses-preamble som gjorde ren-JSON-svar umulige, og en checker kapret av lekkede instrukser (debatt konvergerte aldri). - persist_stop_artifacts: stopp-event verbatim + usage/kost persisteres ALLTID ved BudgetExceeded (delt usage-shape med fullført-run-stien) - build_call_options: setting_sources=[] (SDK isolation mode, verifisert mot installert 0.2.110-kilde), system_prompt=None → tom system-prompt; detach- bevis via monkeypatchet query - _generation_prompt: krever ONLY the raw JSON object (fence-innpakning ga 4 fullpris parse-retries) 187/187 uten nøkkel · ruff + mypy --strict rene · tre detach-bevis RØDE → grønn Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QdSfQdND84oeq2mbjueLTS
This commit is contained in:
parent
0238507df4
commit
7637c6feae
7 changed files with 253 additions and 25 deletions
|
|
@ -22,6 +22,7 @@ from portfolio_optimiser_claude.loop import (
|
|||
generate_candidate,
|
||||
parse_checker_verdict,
|
||||
run_debate,
|
||||
run_project,
|
||||
)
|
||||
|
||||
# One affected item: 100 × 1000 = 100_000 NOK total; nominal feasible 30_000;
|
||||
|
|
@ -208,3 +209,21 @@ class TestParseCheckerVerdict:
|
|||
|
||||
def test_empty_text_parses_as_absent(self) -> None:
|
||||
assert parse_checker_verdict("").decision == "absent"
|
||||
|
||||
|
||||
class TestGenerationPrompt:
|
||||
def test_generation_demands_the_raw_json_object_only(self) -> None:
|
||||
# S10 post-mortem: 3 of 4 generation replies carried plausible JSON
|
||||
# wrapped in a markdown fence + commentary — each one a full-price
|
||||
# blind parse-retry (§3 Step 2). The prompt must forbid the wrapping.
|
||||
client = ScriptedClient(
|
||||
replies=[
|
||||
reply("reasoning"),
|
||||
reply("VERDICT: APPROVE"),
|
||||
reply(json.dumps(VALID_PROPOSAL)),
|
||||
]
|
||||
)
|
||||
run_project(client, "context", meter=_meter(), max_debate_rounds=1)
|
||||
generation_prompt = client.prompts("proposer")[1]
|
||||
assert "ONLY the raw JSON object" in generation_prompt
|
||||
assert "no markdown fences" in generation_prompt
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue