docs(p12): MAF debt re-measured U1-U19 - 6/5/8 unchanged row for row, the pin bump moved U5's premise not its status [skip-docs]

Re-measured all 19 rows of the prior-art register 15.1 against ce22b0e with the
review's grep-then-read-the-call-site method (37 modules / 17 747 lines). No row
moved in either direction over the 109 commits since 29.08; in-row changes (debate
got four Function Tools and an observing FunctionMiddleware, da5f10f) move no
status. Of the six "ja" only U3 is on the default CLI path. SkillsProvider is no
longer @experimental in installed core 1.16.0 and MAF's own FileSkillsSource loads
po's two skills 2/2, so one of three reasons behind "SkillsProvider AVVIST" is dead.
okf 0.8.3: 5 rows tried, 0 moved. A/B/C formulated, not decided. src untouched, NOK 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-11 10:50:14 +02:00
commit 6eb58e5a26

View file

@ -0,0 +1,354 @@
# P12 — MAF-gjelden re-målt: U1U19 mot dagens kode (2026-09-11)
> **Ordre:** `20260911T082410Z-5561027910-from-.claude`. **Mandat:** re-mål de 19 radene i
> `docs/research/2026-06-23-prior-art-platform.md` § 15.1 mot koden på `ce22b0e`, si hva som mangler
> per rad, prøv hva okf 0.8.3 muliggjør, og formuler (A)/(B)/(C) på nytt uten å avgjøre dem.
> **Ingen kode er endret** (`git diff --stat ce22b0e -- src` er tom). **NOK 0.** **Ingen push.**
> Hvert tall under kommer fra en kommando kjørt i DENNE økten (§ 9); der et eldre dokument siteres,
> står fil og linje.
## § 0 Hva som ER målt og hva som IKKE er det
**Målt:**
* **Ny telling: 6 ja · 5 delvis · 8 nei av 19 — UENDRET fra 29.08, rad for rad.** Ingen rad har flyttet
status, verken opp eller ned, over de 109 commitene siden 29.08 (57 av dem rører `src`).
* **Av de 6 «ja» er ÉN på CLI-ens default-sti uten flagg (U3).** U18 er default på den hostede flaten
og opt-in på CLI-en. U4, U6, U12 og U14 er opt-in bak et flagg eller en miljøvariabel som er AV
som default (§ 3, kolonnen «I DAG»).
* **Innenfor-rad-endringer finnes, men ingen flytter en status.** Debatten fikk fire Function Tools og
en observerende `FunctionMiddleware` på den normative stien (`da5f10f`, U7/U8). Et nytt
`@tool` er definert, men har 0 kallere i `src` (`ccd65d3`, U7).
* **Pinne-løftet (`ef2f1cb`, 1.9.0 → 1.16.0) har FJERNET ett premiss uten at po endret en linje:**
`SkillsProvider` er ikke lenger `@experimental` i installert core 1.16.0. De tre markørene i
`_skills.py` sitter nå på `MCPSkillResource`/`MCPSkill`/`MCPSkillsSource` (`:4187/:4229/:4862`,
alle `MCP_SKILLS`). MAFs egen `FileSkillsSource` laster **2/2** av po sine SKILL.md (§ 6). U5
forblir **nei** (0 kallsteder). Men én av de tre begrunnelsene i avvisningen (plan 23.08 § D.2)
er død, og det er et veivalg (§ 7, D).
* **`MiddlewareTermination` finnes i installert 1.16.0** (`_middleware.py:75`, ingen
`@experimental` på den) og **brukes ikke av po:** 0 treff over 37 filer / 17 747 linjer.
* **okf 0.8.3: 5 U-rader prøvd, 0 flyttet** (§ 6). PATH-okf er nå **0.8.3**, ikke 0.8.1 som ordren
sa, og den er byte-lik taggen `v0.8.3`.
* **Innboksen: 2/2 lukket.** Begge meldingenes premiss «tagget lokalt, upushet» holder ikke lenger:
okf `main` og alle fire taggene v0.8.0v0.8.3 ligger på Forgejo.
**IKKE målt:**
* **Ingen rad er bekreftet LEVENDE.** Et grep-tall måler kallsteder, ikke om kapabiliteten virker mot
en modell.
* Innholdet i MAF-releasene 1.101.16 utover de konstruktene radene navngir, som `ContextWindowCompactionStrategy`
(`_compaction.py:1624`). Den er sett, men ikke målt.
* Om Microsoft Learn fortsatt kaller `SkillsProvider` eller compaction «experimental» i prosa. Kilden
her er den INSTALLERTE koden, ikke dokumentasjonen.
## TEST NÅ
```bash
uv pip list | grep agent-framework # core 1.16.0 · foundry 1.8.2 · openai 1.8.2 · orch 1.1.1
grep -rn --include="*.py" -F 'MiddlewareTermination' src | wc -l # 0 (kjent-positiv: samme stavemåte i .venv → 7 filer)
git log -S'FileCheckpointStorage(' --oneline -- src # c08ae91 — U12s nei→ja-flytt (siste flytt noen rad har hatt)
git log -S'debate_middleware' --oneline -- src # da5f10f — innenfor-rad-endring U8 (ingen statusflytt)
bash scratchpad/p12/u_grep.sh # hele konstrukt-tabellen, src-treff + venv-kjent-positiv
uv run pytest -q && git status --porcelain # 1577 passed / 5 skipped; kun de to utrackede
```
## § 1 Premisser, med utfall per rad
| # | Premiss (ordren) | Utfall | Kommando |
|---|---|---|---|
| (i) | HEAD `ce22b0e`, `ls-remote origin main` = `d8dadbf`, upushet = 1 | ❌ **AVVIK:** HEAD `ce22b0e` ✅, men `ls-remote origin main` = **`ce22b0e`** → upushet = **0** før denne økta. Noen har pushet siden PM målte | `git rev-parse HEAD`; `git ls-remote origin main` |
| (ii) | nøyaktig to utrackede | ✅ `docs/presentasjon-portfolio-optimiser.html` + `scratchpad/`. HTML-en er ikke rørt, ikke lest og ikke staget | `git status --porcelain` |
| (iii) | `wc -l STATE.md` = 117 | ✅ 117 | `wc -l STATE.md` |
| (iv) | 1577/5, ruff/format/mypy rene, golden `ea8c534…` | ✅ **1577 passed, 5 skipped** (294,85 s), ruff «All checks passed!», format «199 files already formatted», mypy «no issues found in 37 source files», golden `ea8c534773acdbe41ae68f2c55724d69aaf8be4f` (av INNHOLDET) | `uv run pytest -q`; `uv run ruff check src tests`; `uv run ruff format --check src tests`; `uv run mypy src`; `shasum -a 1 tests/golden/demo-transcript.stdout` |
| (v) | nevneren er 19 | ✅ 19, på linje 271289 | `grep -c '^| U[0-9]' docs/research/2026-06-23-prior-art-platform.md` |
| (vi) | 29.08: 6/5/8 | ✅ ordrett i `docs/2026-08-29-maf-gjelden-omfang.md` l. 1617 | lest |
| (vii) | 37 filer / 17 747 linjer | ✅ 37 / 17 747 (på `3bdc5c1`, 29.08-dokets commit: 34 / 12 873) | `ls src/portfolio_optimiser/*.py \| wc -l`; `wc -l src/portfolio_optimiser/*.py \| tail -1`; `git ls-tree -r --name-only 3bdc5c1 src` + `git show` |
| (viii) | core 1.16.0 · foundry 1.8.2 · openai 1.8.2 · orch 1.1.1 | ✅ identisk; pinnen `pyproject.toml` l. 1217 | `uv pip list \| grep agent-framework` |
| (ix) | okf på PATH = 0.8.1 | ❌ **AVVIK:** PATH-okf er **0.8.3** (`uv tool list` → «llm-ingestion-okf v0.8.3»; `…/tools/llm-ingestion-okf/bin/python -c "…__version__"``0.8.3`; uv-receipt: `git = "…/open/llm-ingestion-okf.git?rev=v0.8.3"`). Operatøren har installert på nytt siden PM målte. Den er LEST og ikke rørt | `uv tool list`; `__version__`; `~/.local/share/uv/tools/llm-ingestion-okf/uv-receipt.toml` |
| (x) | v0.8.3 = `0963dfa…`, kun lokal | ✅ tagg `v0.8.0``v0.8.3`, `rev-list -n1 v0.8.3` = `0963dfa5e5be6282cdbc41b08d85460b8fd309ef`. ❌ **AVVIK:** «kun lokal» holder IKKE. `ls-remote --tags origin \| grep -c 'v0\.8'` = **8** (4 annoterte tagger × 2 linjer), og `ls-remote origin main` = `0308169` = lokal `main` | `git -C ~/repos/llm-ingestion-okf ls-remote …` |
| (xi) | `--source-quota`/`--stem-prefix` er i `--help`, ikke CHANGELOG | ✅ begge i `okf consume --help` (PATH-0.8.3) | `okf consume --help` |
| (xii) | P9/P10/P11 re-måles ikke | ✅ ingen re-måling. Tall derfra er sitert med linje | — |
| (xiii) | A/B/C ordrett | ✅ alle tre linjene funnet der ordren sier (§ 7) | `sed -n` på de tre filene |
| (xiv) | innboks 2, kø 0 utenom ordren | ✅ inbox = 2 (rc 0), `orders` maxdepth 1 = 0 | `find … -type f \| wc -l` |
| — | «109 commits siden 29.08» | ✅ **109** med `--since='2026-08-29 00:00'`. Uten klokkeslett ga samme kommando **108**, fordi git leser en dato uten tid som «den datoen, på nåværende klokkeslett», så tallet flytter seg med tid på døgnet | `git log --oneline --since='2026-08-29 00:00' \| wc -l` |
## § 2 Versjonsmålingen
| Hva | Tall | Kommando |
|---|---|---|
| MAF installert | core **1.16.0**, orchestrations **1.1.1**, foundry **1.8.2**, openai **1.8.2** | `uv pip list \| grep -i agent-framework`; `importlib.metadata.version(...)` |
| `@experimental` i `_skills.py` (U5) | **3**: `:4187` `MCPSkillResource`, `:4229` `MCPSkill`, `:4862` `MCPSkillsSource` (alle `MCP_SKILLS`). `SkillsProvider` (`:1831`) og `FileSkillsSource` (`:2790`) har **ingen**. Reviewen målte `@experimental(SKILLS)``:76/:120` i 1.9.0 | `grep -n -A2 '@experimental' .venv/…/agent_framework/_skills.py` |
| `@experimental` i `_evaluation.py` (U15) | **20** (reviewen: 20 i 1.9.0) | `grep -c '@experimental' …/_evaluation.py` |
| `@experimental` i `_compaction.py` (U16) | **0** (29.08 så 0 i en scratch-1.16.0; nå installert) | `grep -c '@experimental' …/_compaction.py` |
| `@experimental` i `_harness/` (U19) | **16** (29.08 § 6 l. 36: 16) | `grep -rh '@experimental' …/_harness \| wc -l` |
| `@experimental` i `_magentic.py` (U4) | **0** | `grep -c '@experimental' …/agent_framework_orchestrations/_magentic.py` |
| `MiddlewareTermination` (U8) | **finnes**, `_middleware.py:75`. Fila har 3 markører, på `:353` `add_tools`, `:390` `remove_tools` og `:745` `MiddlewareBundle`, ingen på den. `MiddlewareFailure` finnes på `:85`. Begge eksportert fra `agent_framework` | `grep -rn 'class MiddlewareTermination\|class MiddlewareFailure'`; `grep -n -A1 '@experimental' …/_middleware.py`; `hasattr(agent_framework, …)` |
| okf på PATH | **0.8.3**, to målemåter: `uv tool list` og `__version__`. `which okf` = `~/.local/bin/okf` | se § 1 (ix) |
| okf eksport-0.8.3 | `git archive v0.8.3` pakket ut under `scratchpad/p12/okf-083-export/`. `diff -rq -x __pycache__ export/src/llm_ingestion_okf <PATH-site-packages>` → eneste avvik er `Only in <PATH>: _data` (pakkedata: `consumption-contract.md`, `okf-consume-template.md`). **PATH-0.8.3 ≡ tagg-0.8.3 i kildekode** | `git -C ~/repos/llm-ingestion-okf archive v0.8.3 \| tar -x`; `diff -rq` |
| `okf check`-regler | **16** på PATH-0.8.3 og **16** fra eksporten. STATE sa «regel 16 kun på main». Den er nå i taggene | `python -c "from llm_ingestion_okf import contract_check as c; print(len(c.RULES))"` |
| okf-pinnen po selv bruker | `v0.3.2` = `f14c075` (uendret, HOLDT) | `grep -n llm-ingestion-okf pyproject.toml uv.lock` |
**Hvilken okf som målte hva:** alt i § 6 er målt med **PATH-0.8.3**, bortsett fra SKILL.md-proben,
som leser **eksport-0.8.3**-katalogen `skills/`. Den katalogen følger ikke med pakken, men de to er
bevist like i kildekode.
## § 3 U1U19 mot dagens kode
**Metode** (ordrett fra `docs/2026-08-25-fable-misjonsreview.md` § 2): «Nevner: `grep -rn
--include="*.py" -F <konstrukt> src` over 34 moduler / 11 650 linjer (`wc -l`), deretter kallstedet
lest. `tests/` og `spikes/` teller IKKE som bruk. «Bevis» er der konstruktet faktisk kalles, ikke der
det nevnes i prosa.» **Min nevner:** 37 moduler / 17 747 linjer
(`ls src/portfolio_optimiser/*.py | wc -l`; `wc -l src/portfolio_optimiser/*.py | tail -1`).
**Kjent-positiv per null:** hvert konstrukt er grepet med SAMME `-F`-stavemåte over de fire
installerte `agent_framework*`-pakkene (`venv`-tallet i `scratchpad/p12/u_grep.sh`). En `src=0` teller
bare som null når `venv > 0`, altså når stavemåten finnes. Konstrukter med `venv = 0` er
registerets C#- eller ikke-installerte navn. De er validert på det Python-navnet som faktisk finnes,
og det står i raden.
Kapabilitets-kolonnen siterer § 15.1 ORDRETT: «Kapabilitet» — «MAF-konstrukt / API».
| ID | Kapabilitet (§ 15.1, l. 271289, ordrett) | 29.08 | I DAG | Bevis (kallsted, fil:linje) | Endring siden 29.08, og hvorfor |
|---|---|---|---|---|---|
| U1 | Orkestrator fan-out per prosjekt — `ConcurrentBuilder` / `AgentWorkflowBuilder.BuildConcurrent()` + FanIn-aggregering | nei | **nei** | `ConcurrentBuilder` src **0** (venv 4). Håndrullet: `run.py:2004` `wave_results = await asyncio.gather(` | Ingen. Forekomster 0 → 0 (`git grep -c``3bdc5c1` mot nå) |
| U2 | Per-prosjekt graf-workflow — `WorkflowBuilder` (fan-out/fan-in, conditional/switch-case-edges, superstep, typesikkerhet) | nei | **nei** | `WorkflowBuilder` src **0** (venv 14) | Ingen. 0 → 0 |
| U3 | Debatt-mønster (maker-checker) — `GroupChatBuilder`; C# `RoundRobinGroupChatManager.ShouldTerminateAsync` + `MaximumIterationCount`; Python `termination_condition`-lambda | ja | **ja** (default-stien, hver kjøring) | `workflow.py:104` `builder = GroupChatBuilder(` · `:108` `termination_condition=make_termination(...)`, kalt fra `run.py:1265` `debate = fresh_workflow(` | Ingen. 1 → 1. Debatten fikk verktøy og middleware (se U7/U8), men byggeren er den samme |
| U4 | Åpne delsteg (kun ved behov) — Magentic: `MagenticBuilder`/`StandardMagenticManager`; `max_round_count`/`max_stall_count`/`max_reset_count`; progress ledger | ja | **ja** (opt-in: `--explore`, default `None`, `run.py:2469`) | `explore.py:1361` `builder = MagenticBuilder(` · `:1364` `max_round_count=contract.max_rounds`, nådd fra `run.py:3603` `explore(` / `:3589` `resume_exploration(` | Ingen. 2 → 2. `_magentic.py` har 0 `@experimental` i orch 1.1.1 |
| U5 | Brukerleverte metoder — Agent Skills: `skills/<navn>/SKILL.md` + `scripts/` + `references/` + `assets/`; `SkillsProvider` (Py) / `AgentSkillsProvider` (C#); `McpSkillsSource` (Py 1.8.0) | nei | **nei** | `SkillsProvider` src **0** (venv 3), `MCPSkillsSource` **0** (venv 3). Eneste `SKILL.md`-treff er prosa: `persona.py:3` | **Status uendret, premisset flyttet av pinnen (`ef2f1cb`):** `SkillsProvider` er ikke lenger `@experimental` i 1.16.0 (§ 2), og MAFs `FileSkillsSource` laster po sine to skills 2/2 (§ 6). Avvisningens tre grunner (plan 23.08 § D.2: «`ExperimentalFeature.SKILLS`; egen loader virker; commons eier innholdet») er nå én død, to står. → veivalg D |
| U6 | Datatilgang — MCP-tools: `MCPStdioTool` / `MCPStreamableHTTPTool` / `MCPWebsocketTool`; eksponer agent som server via `as_mcp_server()` | ja | **ja** (opt-in: `--mcp-config`, default `None`, `run.py:2577`) | `mcp_tools.py:154` `MCPStdioTool(` · `:170` `MCPStreamableHTTPTool(`, wiret `run.py:1235` `build_mcp_tools(mcp_servers) if mcp_servers else []`. `MCPWebsocketTool` 0 (venv 3), `as_mcp_server` 0 (venv 1) | Ingen. 1 → 1 |
| U7 | Solver/validator/Monte Carlo som verktøy — Function Tools (alle store providere, inkl. Anthropic) | delvis | **delvis** | `@tool`: `datasource.py:108` `retrieve_cost_docs` (veg-stien, `run.py:1204`) · `explore.py:1033/1066/1095/1113` `list_bundles`/`read_bundle`/`read_dir`/`read_file`**nå på debattens default bundle-sti** `run.py:1187` `debate_tools = list(navigator_tools([bundle_dir], ...))` · `explore.py:1230` `quick_validate` (kun utforskning, rådgivende). Validatoren på den normative stien er IKKE et verktøy (kalles etter generering) | **Innenfor raden:** `@tool` 5 → 7 (`baa6f45` `read_dir`, `ccd65d3` `concept_adjudication_state`). `navigator_tools` 2 → 6 (`da5f10f` S2c: debatten navigerer, `76b939b`). **Status uendret:** registerets formål er solver/validator/MC som verktøy, og det er fortsatt bare den rådgivende `quick_validate`. `make_adjudication_tool` (`tools.py:43`) har **0 kallere i `src`** (1 i tests), altså et definert verktøy uten wiring |
| U8 | Intercept av tool-calls (blokkerende validator) — Middleware-pipeline `.Use()`; `FunctionMiddleware` (`InvokingAsync`/`InvokedAsync`) | delvis | **delvis** | `budget.py:228` `class BudgetMiddleware(ChatMiddleware)` · `mcp_tools.py:197` `class ToolCallRecorder(FunctionMiddleware)` · `explore.py:352` `class ExplorationToolRecorder(FunctionMiddleware)`, **nå også på debatten** `run.py:1262` `debate_middleware = [budget_mw, ExplorationToolRecorder(debate_tool_calls)]`. `MiddlewareTermination` src **0** (venv 7), `MiddlewareFailure` **0** (venv 4) | **Innenfor raden:** `FunctionMiddleware` 2 → 4 (`4aa4f9c` klassen, `da5f10f` på debatten). Ny middleware OBSERVERER, ingen blokkerer. Primitiven for å blokkere finnes i installert 1.16.0 (§ 2) og er ubrukt |
| U9 | Læringssløyfe-injeksjon — Custom `ContextProvider` / `HistoryProvider` | delvis | **delvis** | `verdicts.py:340` `class ExpeLContextProvider(ContextProvider)`. Bærende bruk: `run.py:1385` `fewshot = ExpeLContextProvider(...).format_fewshot()` string-konkatenert inn i `gen_context`. Dekorativ bruk: `run.py:15631565` `before_run` inn i en kastet `SessionContext` (`run.py:1560`: «is NOT what reaches the prompt»). `context_providers` src **0** (venv 11); proposeren kaller rått `generate.py:630` `chat_client.get_response(` | Ingen. `ContextProvider` 8 → 8. F3 (29.08 § 1) står uendret |
| U10 | Vektorlagre — Azure AI Search, Cosmos, Qdrant, Redis, Postgres (innebygde abstraksjoner) | nei | **nei** | `QdrantCollection`/`CosmosNoSql`/`RedisCollection` venv **0**: integrasjonspakkene er ikke installert (`uv pip list` viser kun de fire `agent-framework*`). Bred kontroll `grep -rniE 'qdrant\|redis\|cosmos\|postgres\|azure_ai_search\|vectorstore\|vector_store' src` = **2**, begge egne: `semretrieval.py:355` `save_vector_store` / `:393` `load_vector_store` (numpy, «MAF-free», D-C) | Ingen |
| U11 | Citation-aware RAG-injeksjon — Custom `AIContextProvider`; `TextSearchProvider` (C#, `SourceName`/`SourceLink`); Azure AI Search agentic retrieval (GA 2026-04-01) | delvis | **delvis** | `provenance.py:18` `from agent_framework import Annotation, TextSpanRegion` · `:100` `TextSpanRegion(` inne i `ProvenanceStamp.to_annotations()` (`:93`, «for display only»). Egen sitatbæring: `datasource.Citation`, `bundle_citations`, `bundle_excerpt_citations` (`7aa06d5`). `AIContextProvider`/`TextSearchProvider` er C#-navn (venv 0) | **Ingen statusflytt, men et forbehold:** `to_annotations()` har **0 kallere i `src`** (1 i `tests/test_provenance.py:49`), og slik var det også på `3bdc5c1` (2 → 2 forekomster). MAF-typen bor altså bare på et bibliotek-API for visning. «Delvis» hviler på po sin EGEN sitatbæring, som vokste (pre-passets utdrags-siteringer), ikke på en MAF-provider |
| U12 | Persistens / kræsj-overlevelse — Checkpointing (InMemory/File/Cosmos), pending HITL re-emitteres ved resume; Durable Task-extension for langvarig HITL | ja (opt-in) | **ja** (opt-in: `--checkpoint-dir`, default `None`, `run.py:2546`) | `explore.py:1375` `builder = builder.with_checkpointing(checkpoint_storage(checkpoint_dir))` · `:687` `return FileCheckpointStorage(` · resume `:2076` `checkpoint_storage=checkpoint_storage(checkpoint_dir)`. `InMemoryCheckpointStorage` 0 (venv 4) | **Innenfor raden:** `ef2f1cb` (F15) flyttet park-vakten til det deklarerte feltet `pending_request_info_events` (`explore.py:1931`). Tellingen 1 → 1. Siste FLYTT noen rad har hatt er fortsatt `c08ae91` (26.08) |
| U13 | HITL-gates — Tool approval (`@tool(approval_mode='always_require')` Py / `ApprovalRequiredAIFunction` C#); `RequestPort`/`request_info()`; `MagenticPlanReviewRequest`/`.approve()`/`.revise()` | delvis | **delvis** | Plan review: `explore.py:674` `MagenticPlanReviewRequest` i `_ALLOWED_CHECKPOINT_TYPES` · `:1624` filtrerer `request_info`-events. CLI-dør `--plan-review` (`store_true`, av, `run.py:2490`) + asynkron via `--checkpoint-dir`/`--resume`. Layer-1: `workflow.py:116` `with_request_info(...)` bak `enable_layer1_hitl=False` (`workflow.py:78`, `run.py:1009`), `enable_layer1_hitl=True` i `src` = **0**, så biblioteket er eneste dør. `approval_mode` src **0** (venv 16). Hosting nekter: `hosting.py:200` | **Ingen statusflytt.** MAJOR-2s `--proposal-review` (`59f3fce`, `fedf989`) er en EGEN terminal-reviewer: `proposal_review.py` har 0 `agent_framework`-importer (de to treffene `:1112` er prosa). Den er HITL i misjonens forstand, men ikke et MAF-konstrukt, så den flytter ikke raden |
| U14 | Observabilitet (deploy-gate) — OpenTelemetry (GenAI-konvensjoner) | ja | **ja** (opt-in: `PORTFOLIO_OTEL` på truthiness, av når uset, `tracing.py:63/:153`) | `tracing.py:160162` `configure = configure_otel_providers``:196` `configure(enable_console_exporters=False, exporters=exporters)`. Tre kallsteder: `run.py:2727`, `simulation.py:1061`, `hosting.py:375` | Ingen. 4 → 4 |
| U15 | Evaluering — `LocalEvaluator`, `evaluate_workflow()`, Foundry Adaptive Evals | nei | **nei** | `LocalEvaluator` 0 (venv 2), `evaluate_workflow` 0 (venv 3), `evaluate_agent` 0 (venv 3) | Ingen. Avvisningens vilkår («MAF-flaten NEI inntil `EVALS` forlater `ExperimentalFeature`», plan 23.08 § D.3) er **ikke** oppfylt: 20 markører i 1.16.0 |
| U16 | Kontekst-kompaktering — `CompactionProvider` (SlidingWindow/Truncation/summarization) | nei | **nei** | `CompactionProvider` 0 (venv 4), `compaction_strategy` 0 (venv 10), `apply_compaction` 0 (venv 3), `SlidingWindowStrategy` 0 (venv 2) | Ingen. `_compaction.py` har 0 `@experimental` installert. Vilkårene fra 29.08 § 4 er **ikke** inntruffet (§ 5) |
| U17 | Agent-som-verktøy — `AsAIFunction()` (C#) / `as_tool()` (Py) — IKKE `AIFunctionFactory.Create()` | nei | **nei** | `as_tool(` 0, `.as_tool` 0 (venv 1) | Ingen. **LUKKET** 29.08 § 4 (l. 141147), ingen gjeld |
| U18 | Modell-backend + per-agent modellvalg — `FoundryChatClient(project_endpoint, model, credential)`; Responses Agent vs Foundry Agent | ja | **ja** (default på den hostede flaten, `hosting.py:79` `_HOSTED_DEFAULT_PROFILE = "azure"`; opt-in på CLI-en, `--profile` default `"local"`, `run.py:2441`) | `backends.py:150` `return FoundryChatClient(project_endpoint=endpoint, model=model, credential=credential)` i `AzureFoundryBackend` (`:125`) | Ingen. 1 → 1. Distinksjonen default/opt-in er ny i denne tabellen, ikke i koden |
| U19 | Harness-mønstre (bakgrunn/loop) — Agent Harness: `ShellExecutor`, `FileMemoryStore`, `ToolApprovalAgent` (Py 1.7.0) | nei | **nei** | Python-navnene: `create_harness_agent` 0 (venv 4), `ToolApprovalMiddleware` 0 (venv 5), `AgentLoopMiddleware` 0 (venv 5). `FileMemoryStore`/`ToolApprovalAgent` finnes ikke i Python (venv 0, jf. reviewen § 3.1) | Ingen. **LUKKET** 29.08 § 4 (l. 149160), ingen gjeld. Revisit-vilkåret «mister `@experimental`» er ikke oppfylt: 16 markører |
## § 4 Ny telling og diff mot 29.08
**Ny telling, 11.09 på `ce22b0e`: 6 ja (U3, U4, U6, U12, U14, U18) · 5 delvis (U7, U8, U9, U11, U13) ·
8 nei (U1, U2, U5, U10, U15, U16, U17, U19) — av 19.** Nevner: 19 rader
(`grep -c '^| U[0-9]'`), 37 moduler / 17 747 linjer.
**Av de 6 «ja», etter hvor de gjelder:**
| Rad | Normativ default-sti | Bak hva | Default |
|---|---|---|---|
| U3 | ✅ hver kjøring | — | på |
| U18 | ✅ på hostet flate, ❌ på CLI | `--profile azure` (CLI) | CLI: `local`; hosting: `azure` |
| U4 | ❌ | `--explore` | `None` |
| U6 | ❌ | `--mcp-config` | `None` |
| U12 | ❌ | `--checkpoint-dir` | `None` |
| U14 | ❌ | `PORTFOLIO_OTEL` | uset = av |
**Diff mot 29.08, rad for rad:** 0 av 19 har flyttet status. For hver rad er den bærende
konstruktens forekomster målt på `3bdc5c1` (29.08-dokets commit) og i dag, og
`git log -S'<konstrukt>' --since='2026-08-29 00:00' -- src` er kjørt. Kolonnen «Endring» i § 3 bærer
tallet. De eneste konstruktene med commits i vinduet:
| Konstrukt | Forekomster 29.08 → nå | Commits (`git log -S`) | Rad | Flytter status? |
|---|---|---|---|---|
| `@tool` | 5 → 7 | `baa6f45`, `ccd65d3` | U7 | nei — navigasjon/adjudikasjon, ikke validator |
| `navigator_tools` | 2 → 6 | `76b939b`, `da5f10f` | U7 | nei — samme grunn |
| `FunctionMiddleware` | 2 → 4 | `4aa4f9c` | U8 | nei — observerer, blokkerer ikke |
| `ExplorationToolRecorder` / `debate_middleware` | 0 → 6 / — | `4aa4f9c`, `da5f10f` | U8 | nei |
| `pending_request_info_events` | — | `ef2f1cb` | U12 | nei — vakt re-forankret |
| alle andre 20 konstrukter i skriptet | uendret | ingen | — | — |
**Symmetrisk sjekk:** ingen konstrukt har FÆRRE forekomster i dag enn på `3bdc5c1`. Ingen rad har
flyttet nedover.
**Én rad flyttet PREMISS uten at po endret kode:** U5. Pinne-løftet `ef2f1cb` (02.09) fjernet
`@experimental(SKILLS)` fra `SkillsProvider`, men statusen er fortsatt nei fordi po ikke kaller den.
## § 5 Hva som mangler, per rad som ikke er «ja»
**Estimatskalaen, forankret i målte commits** (`git show --stat`). **Estimatene under er VURDERINGER,
ikke målinger:**
* **liten**`4aa4f9c` (MAJOR-1 a): 1 src-fil, +82/4 src-linjer (2 filer / +218 4 totalt), under én økt.
* **middels**`c08ae91` (flyttet U12 nei→ja): 4 src-filer, +987/91 src-linjer (7 filer / +1 754 91
totalt), én økt.
* **stor** = mer enn én økt, ELLER rører proposer-kallstien (`generate.py:630`) eller den obligatoriske
validator-invarianten. Referanse: 29.08 § 5 anslo F3 + F16 TIER 2 til 2,54 økter, og det tallet er
selv en vurdering.
| ID | I DAG | Hva som mangler (én setning) | Estimat (vurdering) |
|---|---|---|---|
| U1 | nei | Fan-out via `ConcurrentBuilder` med samme admission-reservasjon som bølgemodellen bærer (S3.4). Et begrunnet avvik, plan 23.08 § D.2 | middels |
| U2 | nei | En per-prosjekt `WorkflowBuilder`-graf. P10 «eksplisitt NULL», plan 23.08 § D.2 («Magentic ER graf-laget») | stor |
| U5 | nei | `SkillsProvider` wiret på agentene, så SKILL.md-prosaen når en agent via MAF og ikke via egen loader | middels (wiringen i seg selv er liten; bevis på budsjett og hva hver rolle får se er det som koster) |
| U7 | delvis | Validatoren eksponert som Function Tool på den normative stien, ved siden av den blokkerende gaten og ikke i stedet for den | middels |
| U8 | delvis | En middleware som BLOKKERER (`MiddlewareTermination`). Forutsetter at proposeren går via `Agent` og ikke rå `get_response()` (F3/F16, 29.08 § 3) | stor |
| U9 | delvis | Injeksjonen båret av `context_providers=` på en `Agent` i stedet for string-konkatenering. Samme forutsetnings-refaktor som U8 (29.08 § 1) | stor (delt med U8, ikke additivt) |
| U10 | nei | En MAF-vektorintegrasjon (egen pakke) i stedet for numpy brute-force. D-C/D7 er et bevisst valg | middels |
| U11 | delvis | En MAF-`ContextProvider` som injiserer siterte utdrag. «Navigate, never stuff» (plan 23.08 § D.2) avviser query-time retrieval | middels |
| U13 | delvis | `approval_mode` på et verktøy og en ikke-bibliotek-dør til Layer-1 `with_request_info`. Hosting nekter fortsatt review med vilje | middels |
| U15 | nei | `LocalEvaluator`/`evaluate_workflow` tatt i bruk. Blokkert av avvisningens eget vilkår: 20 `@experimental` | middels (når vilkåret faller) |
| U16 | nei | `compaction_strategy=` på utforskningsagentene, uten at kompaktering kan kutte en frø-tilnærming (§ C.6 dør 1) | uestimert per 29.08 § 4. Vurdering: middels, forutsatt egen scoping-økt |
| U17 | nei | — | **ingen gjeld.** LUKKET 29.08 § 4 l. 141147: kryss-prosjekt er non-goal 2 |
| U19 | nei | — | **ingen gjeld.** LUKKET 29.08 § 4 l. 149160: harness er fortsatt eksperimentell (16 markører) |
**U16-vilkårene (29.08 § 4 l. 176177), sjekket: IKKE inntruffet, nei på begge.**
1. «en `--explore`-kjøring mot en levende modell treffer et kontekstvindu-avslag»: **0 observert.**
Den ene levende utforsknings-400-en er `ChatClientException: Error code: 400 — No tool call found for
function call output` (`docs/2026-09-07-prepass-mater-q5b-k2.md` l. 215), et tool-call-parings-avslag
og ikke et vindus-avslag. `grep -rliE 'context_length_exceeded|maximum context length' docs scratchpad`
gir **0 filer**. Mønsteret er validert mot `kontekstvindu`, som gir treff i `docs/`. De to
03.09-treffene (`2026-09-03-syretest-s7a-k2.md` l. 92, `…-s7a2-k2.md` l. 126) er REGNET
(«mer enn noe kontekstvindu») for den gamle `read_bundle`-formen, ikke observerte avslag.
2. «operatøren ønsker å bygge lange (>10 runder) utforskningsløp»: **ingen bestilling.** Alle **4/4**
levende utforsknings-konfiger har `"max_rounds": 3` (`scratchpad/q5b/live/*.json`).
**Rader som bare kan bekreftes LEVENDE:** statusene over er grep-målinger og krever ingen betalt
kjøring. Det eneste som bare kan observeres levende er U16-vilkår 1. Det krever en betalt
`--explore` som faktisk sprenger vinduet. **Krever betalt kjøring, ikke målt.** Referansen er Q5=B,
tre levende utforskningsarmer til **NOK 2,78** (0,17 / 1,46 / 1,15), det dyreste kallet 80 713
input-tokens (samme dok l. 233240). Et forsøk på å sprenge vinduet må ligge over det, så anslaget
er **≥ NOK 1,5 og ~1030 min per arm, uten garanti for at avslaget oppstår.** Anslaget er selv en
vurdering. Ikke kjørt: NOK 0 er bindende.
## § 6 Hva okf 0.8.3 muliggjør — smalt, med nevner
**5 U-rader prøvd (U5, U11, U16, U7, U13), 0 flyttet.** Alt målt med PATH-0.8.3, som er
kilde-identisk med eksport-0.8.3 (§ 2). SKILL.md-proben leser eksport-0.8.3-katalogen `skills/`.
| Rad | Hva ble prøvd | Tall | Flytter raden? | Hvorfor |
|---|---|---|---|---|
| U5 | Laster MAFs EGEN `FileSkillsSource` (1.16.0) SKILL.md-katalogene? Probe: `scratchpad/p12/skills_probe.py`, `uv run --project <po> python`, med `search_depth=1` | **po `shared/skills`: 2/2** (`expert-reviewer`, `falsification-reviewer`). **okf eksport-0.8.3 `skills/`: 2/3** (`okf-consume-template`, `okf-prosjekt`). `okf-consume` ble **avvist** med MAFs egen melding: «frontmatter name 'b-golden-segmented-okf-v0-2-consume' that does not match the directory name 'okf-consume'; skipping». Kjent-negativ (katalog uten SKILL.md): 0. Alle fem beskrivelser er innenfor `MAX_DESCRIPTION_LENGTH` = 1 024 (335490 tegn) | **nei** | Formatene er forenlige. Det ene avslaget er en navneregel: `okf skill` navngir skillen `<bundle>-consume`, og `--out` lar kalleren velge katalognavnet. Men po kaller ingen `SkillsProvider` (0 i `src`), så forenligheten gjør U5 billigere å bygge, ikke bygget |
| U11 | Flytter 0.8.3s STS-`sources[0].title`, `description` fra første spec-punkt og `okf build --frontmatter KEY=VALUE` noe for `provenance.py`? | `provenance.py` leser **0** av nøklene `sources`/`description`/`bundle_id`/`title`. po leser `"sources"` (okf.py 1, prepass.py 1), `"title"` (okf.py 2), `"bundle_id"` (`okf.py:926`) og `description` **0**. `--help`: `--frontmatter` «REPLACES only sources and description» | **nei** | Metadataen når po via pre-passets utdragsfelt (P3), men U11 spør etter en MAF-provider for sitatbærende injeksjon. Ingen okf-flate kan få po til å kalle en |
| U16 | Er `--source-quota` / prepass-kuttet en delvis erstatning for compaction? | `--source-quota N`: «cap how many DELIVERED places one source document may take» (konsum, FØR kjøringen). `CompactionStrategy`: «Protocol for in-place message compaction strategies» (`_compaction.py:61`), anvendt på den LØPENDE samtalen via `apply_compaction(messages, strategy=…)` (`:1475`) eller `Agent(compaction_strategy=…)` (`_agents.py:824`). P11s kvote-tall siteres og re-produseres ikke: `docs/2026-09-11-p11-okf-081.md` l. 109, l. 123, l. 134136 | **nei** | Ortogonale: kvoten avgrenser hva som KOMMER INN i ett payload, compaction avgrenser hva som BLIR LIGGENDE i en samtale som vokser. Et payload-kutt kan ikke hindre at en utforskningsløkke vokser forbi vinduet, som er 29.08s U16-risiko |
| U7 / U13 | Gir en ny okf-flate (`okf check` regel 16, `--frontmatter`, `consume`) en naturlig Function Tool- eller HITL-form? | po kaller okf-CLI-en **0** ganger (`grep -rnE 'import subprocess\|subprocess\.\|shutil\.which' src` = 3 treff, alle prosa). po importerer kun den pinnede biblioteks-API-en: 9 importlinjer i `ingest.py`/`ingest_mcp.py`, `pyproject.toml:58` `rev = "v0.3.2"` | **nei** | Den nye flaten er en CLI i 0.8.x. Å gjøre den til et verktøy krever enten en subprosess mot en PATH som `git archive HEAD` ikke bærer, eller et løft av okf-pinnen v0.3.2 → 0.8.x (HOLDT, utenfor scope) |
## § 7 A/B/C — formulert på nytt, ALDRI avgjort
**Det ferske tallgrunnlaget som premiss, felles for alle tre:** gjeldsoversikten er **6/5/8, uendret
rad for rad**. Ingen MAF-primitiv har blitt tatt i bruk eller forsvunnet siden 29.08. okf 0.8.3
flytter 0 av 5 prøvde rader. Tallene som A, B og C ble besluttet på (P6/P7/P8) er ikke rørt.
### (A) Prosa-skanningen
**Beslutningen, ordrett** (`docs/2026-09-09-p7-forankrede-identifikatorer.md` l. 189191; ordren sa
l. 188190, men teksten står én linje lenger ned): «**Prosa-skanningen er valgt bort med tallene i § 3,
ikke bygget.** Ufanget forblir: en ugrunnet identifikator som kun står i agent-/debatt-prosa og aldri
blir en `affected_item`-kode — målt 2 av 4 (P6), 2 av 4 (S7c), 1 av 2 (P4).»
**Ferskt premiss:** debatten har nå en middleware-liste på den normative stien (`run.py:1262`, U8,
`da5f10f`). Hvis A noen gang bygges, finnes altså søm-stedet uten F3-refaktoren. Tallene som avgjorde
A (2/4, 2/4, 1/2) er uendret.
| Alternativ | Koster | Låser | Gjør umulig |
|---|---|---|---|
| (a1) **urørt** | 0 | ingenting | å fange den ufangede klassen (2/4, 2/4, 1/2) |
| (a2) bygg prosa-skanning som GATE | middels (vurdering) | et identifikator-MØNSTER over prosa, som P7 § 3 avviste fordi korpusene har heterogene former | «ingen skjønn»-regelen for prosa. Falske treff på tokens som aldri nådde en dom (P7: fire slike) |
| (a3) prosa-TELLING som rapport (P8-formen: si, ikke nekt) | litenmiddels (vurdering) | et mønster, men bare for under-telling | ingenting blokkerer. Klassen forblir ufanget, bare synlig |
**Påvirker tallene PM-anbefalingen «urørt»?** **Nei.** Gjeldsoversikten sier bare hvor A kunne bodd,
ikke at den er verdt å bygge.
### (B) Blindsone-VALGET
**Beslutningen, ordrett** (`docs/2026-09-09-p6-betalt-k2-etter-kollaps.md` l. 210211): «Blindsonen har
flyttet seg videre: fra RANGERINGEN (S7c) til LESNINGEN (funn 5) til **VALGET** — hvilket dokument
modellen bestemmer seg for å bygge på.» Og l. 202204: modellen «bygde likevel forslaget sitt
utelukkende på merkekravene i de generelle tekniske kravene — det ENE utdraget den navngir — og myntet
kostkoder for det».
**Ferskt premiss:** ingen U-rad adresserer valget. U11 (sitatbærende injeksjon) er delvis med egen kode
og med en MAF-type uten kallsted. U16 og okf-kvoten avgrenser volum, ikke valg (§ 6). P11 målte
dessuten at 0.8.1 som levert ikke leverer prisskjemaet i noen arm, og P11 ble ikke re-målt her.
| Alternativ | Koster | Låser | Gjør umulig |
|---|---|---|---|
| (b1) **urørt** | 0 | ingenting. P8-rapporten informerer | å vite om valget endrer seg når prisskjemaet faktisk leveres |
| (b2) bestill en BETALT måling av valget med prisskjemaet levert | ≈ NOK 0,21,5 per arm (Q5=B-referansen, vurdering) | ingenting i kode | — (den krever en okf-leveranse som inneholder prisskjemaet, og P11 viser at default ikke gjør det) |
| (b3) styr valget i rendering/rangering (prioriter prisskjema-formede utdrag) | middels (vurdering) | et domene-skjønn i po, som funn 5 og `collapse_padding` er skrevet for å unngå | po som generisk rammeverk for dette domenet |
**Påvirker tallene PM-anbefalingen «urørt»?** **Nei.**
### (C) Fixtur-publiseringen
**Beslutningen, ordrett** (`docs/2026-09-09-p8-forankringstilbudet.md` l. 162166): «De leverte KUTTENE
(10 kB N100, 96 kB K2) er ikke sporet: å committe verbatim anbudstekst og standardtekst inn i et repo
som publiseres på `open/` er en publiseringsbeslutning som tilhører operatøren, ikke denne ordren.»
**Ferskt premiss:** gjeldsoversikten berører ikke C. Den eneste relaterte målingen er at testene P7/P8
bruker (`tests/fixtures/p7-grounding/`) fortsatt er det suiten gater på, og den er 1577/5 grønn.
| Alternativ | Koster | Låser | Gjør umulig |
|---|---|---|---|
| (c1) **nei** | 0 | ingenting | at 8-/435-distinkt-tallene gates. De står som målinger i P8 § 4 |
| (c2) ja, spor kuttene i `open/`-repoet | liten (vurdering) | verbatim anbuds- og standardtekst i offentlig historikk. En push til `open/` kan ikke trekkes tilbake. Rettighetsspørsmålet er operatørens å vurdere, ikke målt her | å angre publiseringen |
| (c3) gate mot kuttene der de ligger (`~/corpora/…`), skip når de mangler | liten (vurdering) | en gate som er stille fraværende i en fersk klon | at gaten beviser noe i `git archive HEAD`-pakka. Det er repoets «skip = stille fravær»-fellen |
**Påvirker tallene PM-anbefalingen «nei»?** **Nei.**
### (D) Nytt veivalg målingen avdekket: `SkillsProvider`-avvisningens premiss
**Beslutningen, ordrett** (`STATE.md`, låste beslutninger): «**MAF-evals + SkillsProvider AVVIST som
flate.**» Begrunnelsen for U5 (`docs/plan/2026-08-23-magentic-utforskningssloeyfe.md`, § D.2-tabellen):
«NEI — `ExperimentalFeature.SKILLS`; egen loader virker; commons eier innholdet».
**Ferskt premiss:** den første av tre grunner er død i installert 1.16.0 (§ 2). `FileSkillsSource`
laster po sine to skills 2/2 (§ 6). Evals-halvdelen står uendret: 20 markører, og vilkåret i plan
23.08 § D.3 er ikke oppfylt.
| Alternativ | Koster | Låser | Gjør umulig |
|---|---|---|---|
| (d1) **avvisningen står, med oppdatert begrunnelse** (egen loader + commons-eierskap) | 0 (én setning i STATE) | ingenting | at CLAUDE.md-konvensjonen «Metode kodifiseres som Agent Skill» nås av en agent via MAF |
| (d2) re-åpne U5 som en egen, målt ordre | middels (vurdering, § 5) | ingenting før den er bestilt | — |
## § 8 Honesty limits
* **Ingen betalt kjøring, NOK 0.** Ingen rad er bekreftet LEVENDE. U16-vilkår 1 kan bare observeres
levende og er IKKE målt (§ 5).
* **Et grep-tall måler KALLSTEDER, ikke om kapabiliteten virker.** «ja (opt-in)» betyr at et kallsted
finnes bak et flagg, ikke at flagget har vært kjørt mot en modell i dette vinduet.
* **Estimatene i § 5 og § 7 er VURDERINGER**, forankret i to målte commits, men ikke målinger.
* **En rad kan flytte seg av en pinne-bump og ikke av po sin egen kode.** U5s premiss gjorde nettopp det
(`ef2f1cb`). `@experimental`-tallene er målt i INSTALLERT kode, ikke i Microsoft Learn-prosa.
* **Nevneren er ETT repo i ÉN commit** (`ce22b0e`, 37 moduler / 17 747 linjer).
* **U11-statusen hviler på et forbehold** som står i raden: MAF-typen konstrueres bare i en metode med 0
kallere i `src`. Samme grunnlag som 25.08 og 29.08 ga «delvis», så statusen er holdt for å måle
endring og ikke skifte linjal. Med en strengere lesning av metoden ville U11 vært «nei» (6/4/9).
* **`FileSkillsSource`-proben beviser LASTING, ikke at en agent bruker skillen godt.** Ingen agent er
konstruert med `SkillsProvider`.
* **(A), (B) og (C) forblir operatørens og ble ikke flyttet av denne økta.** (D) er formulert, ikke avgjort.
## § 9 Verifiseringslogg (kjørt i denne økten, 2026-09-11)
| # | Påstand | Kommando → resultat |
|---|---|---|
| 1 | Innboks 2, kø 0 | `find ~/.claude/coord/portfolio-optimiser/inbox -type f \| wc -l` → 2 (rc 0); `…/orders -maxdepth 1 -type f` → 0 |
| 2 | okf pushet | `git -C ~/repos/llm-ingestion-okf ls-remote origin main``0308169` (= lokal `main`); `ls-remote --tags origin \| grep -c 'v0\.8'` → 8 |
| 3 | Innboks lukket | `coord-done.sh <begge>` → «2 message(s) archived» (rc 0); inbox → 0 |
| 4 | po-remote | `git ls-remote origin main``ce22b0e…` = HEAD |
| 5 | Kontroll | `uv run pytest -q -p no:cacheprovider` → 1577 passed, 5 skipped, 294,85 s; ruff/format/mypy rene; golden `ea8c534…` |
| 6 | Nevner | `ls src/portfolio_optimiser/*.py \| wc -l` → 37; `wc -l … \| tail -1` → 17 747; på `3bdc5c1`: 34 / 12 873 |
| 7 | Konstrukt-tabellen | `bash scratchpad/p12/u_grep.sh` (61 konstrukter, src + venv-kjent-positiv) |
| 8 | Kallsteder | `grep -rn --include="*.py" -F <konstrukt> src` per treff, deretter `sed -n` på kallstedet |
| 9 | Diff per konstrukt | `git log -S'<c>' --since='2026-08-29 00:00' -- src` + `git grep -F -c <c> 3bdc5c1 -- src` mot nå |
| 10 | `@experimental` | `grep -c`/`grep -n -A2 '@experimental'``_skills.py`, `_evaluation.py`, `_compaction.py`, `_middleware.py`, `_harness/*`, `_magentic.py` |
| 11 | U5-probe | `PYTHONDONTWRITEBYTECODE=1 uv run --project <po> python scratchpad/p12/skills_probe.py` → 2/2, 2/3 (+ 1 avslag ved navn), kjent-negativ 0 |
| 12 | okf-ekvivalens | `git archive v0.8.3 \| tar -x`; `diff -rq` → kun `_data` |
| 13 | okf-regler | `contract_check.RULES` → 16 (PATH og eksport) |
| 14 | U16-vilkår | `grep -rliE 'context_length_exceeded\|maximum context length' docs scratchpad` → 0 filer (mønster-kontroll `kontekstvindu` → treff); `grep '"max_rounds"' scratchpad/q5b/live/*.json` → 3 i 4/4 |
| 15 | Skala | `git show --stat c08ae91` / `4aa4f9c` (-- src og totalt) |
| 16 | `src` urørt | `git diff --stat ce22b0e -- src` → tom |
## § 10 Avvik fra ordren, uttalt
* **Linje-sitatet for (A)** står på l. 189191, ikke l. 188190. Teksten er ordrett den ordren siterte.
* **okf-eksporten** ble bygget som ordren sa, men målingene i § 6 er kjørt med **PATH-0.8.3**, fordi PATH
nå ER 0.8.3 og er bevist kilde-identisk med taggen (§ 2). Ingen scratch-venv ble bygget. Det ville
resolvert fritt og vært den svakere av de to målemåtene.
* **Innboks-grunnen** («premisset upushet holder ikke, 8 tagg-linjer på remote») står i sluttrapporten og
her. `coord-done.sh` har ingen grunn-parameter (`--help` lest først).
* **Et fjerde veivalg (D)** er lagt til under § 7. Ordren ba om «ethvert ekte veivalg målingen avdekket».