portfolio-optimiser/azure.yaml
Kjell Tore Guttormsen 426ccb0ad6 feat(4d): hostet inngang — main.py wrapper rundt run_project på én asyncio-løkke
To målinger avgjorde formen FØR koden: (1) hosting-pakkas InvocationsHostServer
finnes kun i bygg som krever agent-framework-core>=1.13.0 (treet låser 1.9.0;
eneste 1.9-kompatible bygg er en forlatt alfa som importerer mcp udeklarert),
(2) et gjenbrukt bygget workflow er single-use på 1.9.0 (kall-serie [2,0,0] —
rundetaket persisterer; ferskt objekt per kall er ren kontroll). Derfor spikens
§5-fallback: hosting.py serverer kontrakten (8088/PORT, /readiness,
/invocations, SIGTERM→0) selv, stdlib asyncio på ÉN løkke — aldri as_agent()
(gatene ligger utenfor grafen), aldri tråder (NG1-guarden fanget første utkast
med ThreadingHTTPServer; asyncio-formen består den by construction).

Payload whitelistes på run_projects signatur — ukjente felt nektes ved navn
(400), aldri stille droppet; profile defaulter til azure kun her. ValueError →
400, alt annet → 500 {error_type, error}; Rejection er vellykket kjøring → 200.
outbox.outcome_payload ekstrahert som den ENE kopien av validated/rejected-
forgreningen (kø-(p)-regelen). azure.yaml validert GRØNN mot begge autoritative
skjemaer (jsonschema, hentet ferskt); ingen env:, ingen startupCommand (imagets
CMD er den ene kopien). Dockerfile: 3.12-slim-bookworm + git + uv==0.9.8 +
uv sync --frozen --no-dev; git archive <indeks-tre> | docker build
--platform linux/amd64 grønn på nøyaktig de stagede bytene.

Iron Law fulgt: testfila rød ved collection FØR modulen fantes. 835 passed /
4 skipped (fra 821), ruff+format+mypy rene. Seks mutasjoner mot HELE suiten,
alle røde på riktig test: detach felt-mappingen · dropp ukjente felt stille ·
flipp 400/500 · detach azure-defaulten · detach SIGTERM-handleren · detach
main.py-shimen (de to siste kun fanget av subprosess-testen, P4-presedensen).
Deploy IKKE utført — azd-steget er operatørens.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PEiiSGRShizKc771ZBa1iq
2026-08-13 23:31:02 +02:00

28 lines
1.5 KiB
YAML

# yaml-language-server: $schema=https://raw.githubusercontent.com/Azure/azure-dev/main/schemas/v1.0/azure.yaml.json
#
# Fase 4d. The four open choices were closed against the two authoritative JSON schemas
# (docs/2026-08-13-fase4-azure-yaml-valg.md), not against Learn prose:
#
# * `language: docker`, NO `codeConfiguration` — codeConfiguration is ZIP-source mode,
# and the git-pinned dependencies need our own Dockerfile (git in the base image).
# * `protocols` pinned to invocations 2.0.0, stated outright: the header contract in
# spike §1.5 (x-agent-user-id / x-agent-foundry-call-id, gateway allowlist) is a
# 2.0.0 property, and 1.0.0 is deprecated with a blocking deadline.
# * `project` is REQUIRED for host azure.ai.agent (the $ref'd azure.ai.agent.json);
# `config:` is deprecated there and not used.
# * NO `env:` block, deliberately: FOUNDRY_PROJECT_ENDPOINT must never be redeclared
# (it would risk shadowing the platform's injected value — spike pkt. 2), and model
# selection is config (the packaged data/model_map.json, override via
# PORTFOLIO_MODEL_MAP), not environment variables.
# * NO `startupCommand`, deliberately: the image's CMD (Dockerfile) is the ONE copy of
# the start command — a second copy here could drift from it.
name: portfolio-optimiser
services:
portfolio-optimiser:
host: azure.ai.agent
kind: hosted
project: .
language: docker
protocols:
- protocol: invocations
version: "2.0.0"