portfolio-optimiser/shared/README.md
Kjell Tore Guttormsen 6f861a0078 feat(persona): build the shared expert-reviewer persona as a framework-neutral Agent Skill
The expert reviewer was only a hardcoded verdict_input dict inside the offline
simulation. Build it as the real, shared artifact target picture §8 calls for:
shared/skills/expert-reviewer/ — a SKILL.md persona prompt (energy-advisor / M&V
role + the realization-gap methodology the validator cannot compute) plus a
canonical references/example-verdict.json. shared/ stays pure data; the MAF side
reads it via portfolio_optimiser.persona.load_persona_example (call-time,
fail-fast) and the Claude-SDK sibling reads the same JSON with its own loader.

This de-stubs the simulation: its persona judgement (decision + rationale + traced
marker) is now sourced from the artifact at call time, not an inline literal — so
the shared persona is genuinely consumed and cannot rot silently. decision is
binary (approved/rejected, the FeedbackContract the run path accepts);
approved_with_adjustment is rejected there and lives only in the bundle seed
frontmatter + the promotion gate, so the realization correction is carried in the
rationale prose.

Load-bearing trio (tests/test_persona_skill_loadbearing.py), each proven RED on its
own detach: structure + framework-neutrality, the example is valid pipeline input
(incl. FeedbackContract, on a throwaway copy), and the simulation's marker follows
the artifact file. Suite 149->152.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHR8iKxJRxDiDfNw8HZmWE
2026-06-30 13:59:42 +02:00

39 lines
2.2 KiB
Markdown

# shared/ — framework-neutral core
This directory holds the parts of the project that are **independent of any AI agent
framework** and are meant to be **shared, unchanged, between both reference
implementations**:
- **this repository** — the method built on Microsoft Agent Framework (MAF);
- **a sibling repository** (built later, in sequence) — the same method on the
**Claude Agents SDK**.
Sharing one identical core is what makes the two implementations a *fair comparison*:
both consume the same concept, the same example data, and the same expected outcomes,
so the only thing that differs is the agent framework itself.
## Contents (growing)
- [`CONCEPT.md`](CONCEPT.md) — the business concept, written for a non-specialist
(e.g. a business developer at another company).
- [`examples/bygg-energi-mikro/`](examples/bygg-energi-mikro/) — the first example knowledge
bundle (OKF / LLM-wiki): one office building, one LED-retrofit measure, with a seed expert
verdict encoding the realization gap and a golden-suite of expected validator outcomes. A
small **dev fixture** for exercising the agentic loop; a realistic full-scale example comes later.
- [`skills/expert-reviewer/`](skills/expert-reviewer/) — the **expert-reviewer persona** as a
framework-neutral Agent Skill: a `SKILL.md` persona prompt (energy-advisor / M&V role + the
realization-gap methodology the validator cannot compute) and a canonical
`references/example-verdict.json`. Both reference implementations instantiate the reviewer from
this one artifact; `shared/` stays pure data (each stack reads the JSON with its own loader).
- *(planned)* the method specification.
## Rules
- **Nothing in here may import or depend on a specific agent framework.** If it does,
it does not belong in `shared/`.
- **Repo layout (decision R1, 2026-06-26):** the shared core lives here for now. When
work on the sibling repository begins, it will be extracted into its own repository
(e.g. `portfolio-optimiser-commons`) via `git subtree split`, and both implementation
repos will consume it. This defers cross-repo plumbing until it is actually needed.
See the target picture for the full architecture: `docs/plan/2026-06-26-maalbilde-agentic-loop.md`.