Maaling foer bygging. Alle aatte antakelsene i planens § F flyttet fra «umaalt» til et maalt utfall; ingenting bygget, ingenting i src/. S0 (versjon): 1.0.1 loeser paa core 1.9.0. Diffen mot 1.0.0 er upstream #4371 - `StandardMagenticManager.__init__` mistet sin persistente `AgentSession`, og hvert manager-kall mynter naa en engangs-sesjon. **E2 OG E4 er dermed BORTE (4/4 -> 0/5).** E1 (single-use) og E7 (orphan `_agent_thread`, :1369) staar. Ordrens «felles hvis» (E7 staar -> revert) hviler paa at 1.0.1 ikke kjoeper noe; den kjoepte noe stoerre enn det som ble haapet, saa laasen staar paa 1.0.1 I PAAVENTE AV OPERATOEREN. S1 (B7): E1-E4 + E7 i repoets form. Versjons-sensitiviteten testes mot en STRUKTURELL sonde (holder manageren en persistent sesjon?), aldri en versjonsstreng - den sier AARSAKEN og overlever en versjon planen ikke har sett. S2 (budsjett): A1+A2 GROENNE. `BudgetMiddleware` fyrer paa manager-stien (`meter.tokens == 8`), og `BudgetExceeded` forlater `workflow.run` som repoets EGEN type med `kind`/`limit`/`observed` intakt - ikke pakket i en ExceptionGroup. S3 (plan review): rundturen virker; en revise koster 2 manager-kall, 0 ledger-kall, 0 runder, og SPOER PAA NYTT -> `max_plan_revisions` maa inn i kontrakten. S3b: doer 3 staar. To rundturer per menneskesvar; `from_strings` gjenopptar IKKE manageren, kun `approve` gjoer det. Pris: `AgentApprovalExecutor` er ikke re-eksportert. S4 (resume i NY prosess): GROENN. Pris: `FileCheckpointStorage` nekter aa deserialisere plan-review-typene uten `allowed_checkpoint_types` - uten det feiler resume som et FRAVAER (tom listing), ikke som en feil. S5: median `validate_proposal` 13,6 ms - fritt kallbart i loekka. S6 (scratch-venv, ingenting lagt til pyproject): 2 `workflow.run`-spans, men `enable_console_exporters` skriver til STDOUT og ville oedelagt golden-transkriptet; `ConsoleSpanExporter(out=sys.stderr)` gir spanene paa stderr OG byte-identisk stdout. Klienten er repoets `ScriptedChatClient` og budsjett-typene er PRODUKSJONENS - en bar `BaseChatClient` no-op-er middleware, og `spikes/_harness.py`s egen kopi er nettopp grunnen til at koe-(y) fantes. Load-bearing MAALT mot HELE suiten, groenn kontroll 920/5: konstant persistent-sesjon (2 roede) · aldri fest middleware paa manageren (3 roede, detach-armen groenn) · detach markoer-registreringen (1 roed) · flipp `_route`-rekkefoelgen (4 roede) · resume uten `checkpoint_id` (1 roed) · builder uten `with_checkpointing` (1 roed) · tom `_ALLOWED_CHECKPOINT_TYPES` (1 roed). Og EN falsifisert: resume uten `checkpoint_storage=` gir 0 roede - planens E-tabell navngir feil detach-punkt, og det er skrevet inn i § F i stedet for aa staa som en gate som ikke kan bli roed. Planens V1-sti ble portabel i2eb4622(pakke-gaten var roed paa HEAD siden2e33905). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UTEa7uw2JMxgijx8k8XgxG
39 lines
1.5 KiB
Python
39 lines
1.5 KiB
Python
"""S4's second half: resume a pending Magentic plan review in a **fresh interpreter**.
|
|
|
|
A resume proved inside the parent process would prove nothing about U12. The whole point of the
|
|
asynchronous HITL time-scale is that the expert answers days later, in a process that never saw
|
|
the run — so the only thing allowed to cross the boundary is the checkpoint on disk. Running the
|
|
resume as its own module, launched by ``subprocess``, is what makes that boundary real
|
|
(``tests/test_hosting_loadbearing.py`` set this precedent for the hosted shim).
|
|
|
|
Usage (the test supplies the arguments; nothing here is wired into ``src/``)::
|
|
|
|
python -m spikes.e_magentic_resume <storage_dir> <request_id> <checkpoint_id>
|
|
|
|
Writes ONE line of JSON to stdout: the resumed run's manager calls, remaining requests and
|
|
outputs. Anything else on stdout would make the parent's parse the fragile part of the spike.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import json
|
|
import sys
|
|
|
|
from spikes.e_magentic import resume_from_checkpoint
|
|
|
|
|
|
def main(argv: list[str]) -> int:
|
|
if len(argv) != 4:
|
|
print(f"usage: {argv[0]} <storage_dir> <request_id> <checkpoint_id>", file=sys.stderr)
|
|
return 2
|
|
storage_dir, request_id, checkpoint_id = argv[1], argv[2], argv[3]
|
|
result = asyncio.run(
|
|
resume_from_checkpoint(storage_dir, request_id=request_id, checkpoint_id=checkpoint_id)
|
|
)
|
|
print(json.dumps(result, sort_keys=True))
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main(sys.argv))
|