5807ac428c
style(s51): ruff format hitl module + tests
...
Gate: ruff format --check . clean.
2026-07-15 19:43:41 +02:00
eaca95a325
feat(s51): MAF-free transitive import-graph probe
...
Gate: pytest tests/test_hitl_loadbearing.py tests/test_okf.py → 24 passed.
2026-07-15 19:41:42 +02:00
c4c55fd417
feat(s51): hitl CLI — python -m portfolio_optimiser.hitl pending|route
...
Gate: pytest tests/test_hitl.py -k cli → 4 passed.
2026-07-15 19:39:49 +02:00
62d6b40eae
feat(s51): route pending proposals to experts by code-prefix
...
Gate: pytest tests/test_hitl.py tests/test_hitl_loadbearing.py -k route → 5 passed.
2026-07-15 19:38:00 +02:00
e9179271e6
feat(s51): fail-fast self-contained routing config loader
...
Gate: pytest tests/test_hitl.py -k routing_config → 6 passed.
2026-07-15 19:35:31 +02:00
b50e3fdff2
feat(s51): pending registry — outbox↔inbox id-join (MAF-clean)
...
Gate: pytest tests/test_hitl.py tests/test_hitl_loadbearing.py tests/test_okf.py → 26 passed.
2026-07-15 19:33:59 +02:00
ce5b1151c8
fix(s42): close review WARN — hermetic dry-run env + scoped azure hint
...
Post-hoc /trekreview of S4.2 surfaced two confirmed findings; both closed via TDD.
S42-001 (MAJOR): the new --live-dry-run CLI tests read PORTFOLIO_MODEL_MAP /
PORTFOLIO_FOUNDRY_PROJECT_ENDPOINT via resolve_model/AzureFoundryBackend but did
not isolate them, so both arms inverted their rc in a Foundry-configured env.
Add an autouse fixture that delenvs both, mirroring test_backends/test_preflight.
S42-002 (MINOR): the --live-dry-run except ValueError attached the azure-preflight
remediation to every offline-path ValueError (unknown project_id, empty docs_dir,
bundle mismatch). Scope the hint to args.profile == "azure"; structured refusal +
rc 1 preserved for all. New test proves a LOCAL unknown-project refusal carries no
azure hint.
Gate: pytest 358 passed / 4 skipped, ruff check + format clean, mypy 24 files.
2026-07-15 18:30:30 +02:00
d7313593bc
feat(s42): --live-dry-run CLI flag + dry-run summary
2026-07-15 18:08:28 +02:00
0e986fe6c4
feat(s42): live_dry_run cut in run_project + DryRunReport
2026-07-15 18:05:16 +02:00
ebae4639dd
feat(s42): byte-deterministic write_run_config outbox writer
2026-07-15 12:39:42 +02:00
f3b21db105
fix(s41): close review WARN — OSError refusal + scheme/profile branch coverage
...
Post-hoc /trekreview (WARN, scope 0670b2a..b513e64) surfaced 2 findings, both closed:
- MAJOR MISSING_TEST: the non-https scheme guard (preflight.py:61) and non-azure
profile refusal (:82-86) had zero test coverage — added
test_non_https_endpoint_refused + test_non_azure_profile_refused so an inverted
condition can't regress silently.
- MINOR MISSING_ERROR_HANDLING: an existing-but-unreadable PORTFOLIO_MODEL_MAP
raised PermissionError (an OSError, not ValueError) past the except at :95 →
widened to OSError (subsumes FileNotFoundError). test_unreadable_override_is_
structured_refusal proves the traceback-free invariant (red pre-fix).
Suite 348->351/4, ruff+format+mypy clean.
2026-07-15 11:58:10 +02:00
b513e64577
style(s41): ruff format preflight test files
2026-07-15 11:25:26 +02:00
123f71f547
docs(s41): verified Foundry auth recipe + necessary-but-not-sufficient note
2026-07-15 11:24:18 +02:00
44d6902186
test(s41): load-bearing preflight suite (AST no-network/no-auto-login guard + refusal teeth)
2026-07-15 11:23:15 +02:00
871999a55b
feat(s41): offline Azure/Foundry preflight CLI (env-contract + placeholder refusal)
2026-07-15 11:21:44 +02:00
82c85d5e7c
fix(s41): pass required credential in AzureFoundryBackend.create_chat_client
2026-07-15 11:18:40 +02:00
eb552f854e
feat(s41): PORTFOLIO_MODEL_MAP override + placeholder fail-fast in resolve_model
2026-07-15 11:17:06 +02:00
0670b2a6d8
test(s36): value-level guard for _ore_to_kr_str money formatter
...
Closes the one MAJOR from /trekreview of S3.6 (verdict WARN): the
user-facing NOK-string formatter had only an isinstance(...,str) check,
so a regression (wrong divmod, dropped padding, øre/kr transposition,
or non-breaking-space → ASCII) would ship a wrong money figure with the
suite green. Adds a load-bearing value-level test (thousands grouping,
sub-100-øre padding, negative-sign branch) pinning the actual Norwegian
\xa0-separated formatting; verified red under a divmod(...,1000) mutation
and reverted. Suite 333 passed / 4 skipped, ruff+mypy clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145ZKPLMVeqM47z2jxxokym
2026-07-15 10:25:05 +02:00
76d9f793c6
feat(s36): costsim CLI + no-network + no-hardcoded-price guards
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145ZKPLMVeqM47z2jxxokym
2026-07-15 10:05:29 +02:00
37625435c4
feat(s36): estimate table (kost-mot-verdi + placeholder rows + sourced quality guidance)
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145ZKPLMVeqM47z2jxxokym
2026-07-15 10:02:00 +02:00
eb889a7f0e
feat(s36): deterministic integer-ore estimate scaling with model x effort
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145ZKPLMVeqM47z2jxxokym
2026-07-15 09:59:55 +02:00
cfa93799a5
feat(s36): PricingContract + fail-fast loader + placeholder path + quality guidance
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145ZKPLMVeqM47z2jxxokym
2026-07-15 09:57:48 +02:00
47147e5f7c
feat(s36): MAF-free costsim skeleton + model-map reader + registration
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0145ZKPLMVeqM47z2jxxokym
2026-07-15 09:54:25 +02:00
620d5cfb83
refactor(fase2a): konsolider fire skriptede klienter til én kanonisk (S2.5)
2026-07-15 07:37:43 +02:00
7978bd5f49
test(fase2a): commit Step 2 optional bundle_dir/verdict_dir tests (S2.0, omitted from 9659045)
2026-07-15 07:29:19 +02:00
73c24fc69a
feat(fase2a): MAF version-guard (test-tidsvakt, dist-metadata) + pin agent-framework-core<2 (S2.5)
2026-07-15 07:28:40 +02:00
0a227a103b
feat(fase2a): herd load_verdicts_from_dir — vokabular-SKIP + caps (S2.5)
2026-07-15 07:26:22 +02:00
a706184bdd
feat(fase2a): wire run_project(outbox_dir, run_id) → outbox-skriving, load-bearing (S2.1)
2026-07-15 07:22:41 +02:00
79c6e44f92
feat(fase2a): MAF-fri outbox.py — byte-deterministisk proposal/outcome-writer (S2.1)
2026-07-15 07:18:21 +02:00
9311813080
feat(fase2a): percent-mål mot baseline 0 reiser ValueError (S2.0)
2026-07-15 07:14:29 +02:00
8ec71c9814
feat(fase2a): thread bundle_dir/verdict_dir i run_portfolio — kryssprosjekt-læring load-bearing (S2.0)
2026-07-15 07:12:50 +02:00
3497e64bdc
test(fase2a): repo-lokal mini-bundle-fixture for kryssprosjekt-læring (S2.0)
2026-07-15 07:01:06 +02:00
847ed90135
feat(fase1): export domain-model public API + green full suite (F1)
2026-07-07 08:17:10 +02:00
69ca508677
feat(fase1): assessment-method encoding — persisted dimension-scoped example + validator rule (F1)
2026-07-07 08:15:44 +02:00
16b6d80b82
feat(fase1): hard/soft goal-stop in run_portfolio on accumulated ledger (F1)
2026-07-07 08:11:43 +02:00
c6f62d41db
feat(fase1): GoalContract + GoalConfig standalone fail-fast loader (F1)
2026-07-07 08:01:53 +02:00
9720acb18c
feat(fase1): fail-closed expert realize gate (F1)
2026-07-07 08:00:23 +02:00
e0778d2230
feat(fase1): dimension-free dedup key + cross-dimension overlap flag (F1)
2026-07-07 07:57:22 +02:00
13905193f7
feat(fase1): typed savings ledger with deterministic provenance (F1)
2026-07-07 07:53:31 +02:00
d2029964cc
feat(fase1): dimension in run_project — context scope + candidate constraint (F1)
2026-07-07 07:50:26 +02:00
525ff0dda1
feat(fase1): dimension filter on bundle_context, default unchanged (F1)
2026-07-07 07:44:33 +02:00
a44256a994
feat(fase1): dimension IR + admits, MAF-free guard extended (F1)
2026-07-07 07:42:07 +02:00
24e73f47f6
test(ingest): http golden extraction, byte-deterministic (I6)
2026-07-04 17:12:34 +02:00
bbdcd62ae6
feat(ingest): gate http behind allow_network run-flag + dispatch (I6)
2026-07-04 17:04:05 +02:00
58dda468dc
feat(ingest): http read_http connector + injectable transport seam (I6)
2026-07-04 16:57:29 +02:00
4f45fe6037
test(ingest): SQL connector + load-bearing + golden, detach-proven (I4)
...
New: test_ingest_sql.py (connector mechanics + typed rendering + dispatch), test_ingest_sql_loadbearing.py (SQL seams: typed-NULL, typed-REAL, navigability via unchanged okf), test_ingest_golden_sql.py + examples/ingest-golden-sql/ (byte-frozen sqlite golden; NULL->empty, 4200.0->4200.0 and escape discriminate a typed impl from naive ones). Updated: sql-source refusal test repointed to http (I6); manifest schema-breadth comment. Each new seam proven RED at its detach point.
Refs: shared/ingest-spec.md 11 golden + load-bearing table
2026-07-04 06:56:02 +02:00
994f5be11c
test(ingest): golden extraction case examples/ingest-golden-file, byte-frozen (I2)
2026-07-03 18:40:53 +02:00
e66a2b4015
style(ingest): ruff format (I2)
2026-07-03 18:40:40 +02:00
dbf5dc5c13
test(spec-guard): ingest contract field cross-check vs spec §12 (I2)
2026-07-03 18:38:35 +02:00
6236f2fb78
test(ingest): load-bearing seam quartet + MAF-free guard, detach-proven (I2)
2026-07-03 18:37:30 +02:00