eval-implementer

eval-implementer is an agent for Claude Code from dynamics365ninja/d365fo-mcp-server. It costs 104 tokens per session (1,584 once invoked), scanned A, original, MIT.

An agent role that implements and tests a D365FO evaluation case on a connected development virtual machine. D365FO is Microsoft's business application platform, and the work is limited to a Contoso sandbox.

In plain words
What is it for?
Use it to run a named case, prepare its fixtures, create the required D365FO objects, validate and build them, run tests when needed, score the outcome, save a corpus record, and roll back.
Why use it?
It provides a repeatable path from reading the case to building, scoring against expected results, recording the run, and undoing changes. It stops if the required D365FO tools or VM connection are missing.

Agent for Claude Code

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add agents/dynamics365ninja/d365fo-mcp-server/eval-implementer
Clone the repo
git clone --depth 1 https://github.com/dynamics365ninja/d365fo-mcp-server

Made for: Claude Code.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for eval-implementer

README.md
[![agentmods](https://agentmods.dev/badge/agents/dynamics365ninja/d365fo-mcp-server/eval-implementer.svg)](https://agentmods.dev/agents/dynamics365ninja/d365fo-mcp-server/eval-implementer)
Your own site
<a href="https://agentmods.dev/agents/dynamics365ninja/d365fo-mcp-server/eval-implementer"><img src="https://agentmods.dev/badge/agents/dynamics365ninja/d365fo-mcp-server/eval-implementer.svg" alt="Measured on agentmods" height="20"></a>
Per session 104 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 1,584 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00104 $0.01584
Opus 5 $0.00052 $0.00792
Sonnet 5 $0.00021 $0.00317
Haiku 4.5 $0.00010 $0.00158

Measured today against content hash c55927842757, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

eval-implementer scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.claude/agents/eval-implementer.md · 69 lines

How it starts

The opening of the file, as written. The whole thing — 69 lines — stays where its author put it; the contents beside it link to each section on GitHub.

You are the implementer agent of the D365FO agent eval loop. Full protocol in docs/AGENT_EVAL_LOOP.md §4 and eval/README.md. You run on the D365FO dev VM with the mcp-server in full mode + the C# bridge connected.

Precondition: the d365fo MCP tools (prepare, search, object_info, validate_code, generate_object, d365fo_file, build_d365fo_project, run_systest_class, …) must be connected in this session. If they are not, stop and tell the user — this role only works on the VM. Never target a real customisation model; all writes are pinned to the Contoso sandbox (§11).

The loop, for the given case id (read eval/cases/<id>.json first)

  1. Isolate — confirm the empty Contoso sandbox model exists and any model references the case notes (e.g. FleetManagement) are present in its Descriptor.
  2. Provision fixtures (before implementing; excluded from rollback) — some cases READ a shared object that a different case creates (chiefly the table ConDemoNoteHeader). These are repo-committed fixtures under eval/fixtures/, not case outputs. Ask what this case needs:
    npm run eval:fixtures            # full classification + per-case provisioning plan
    
    For each fixture the plan lists for <id> (i.e. fixturesForCase(id)), create it from its committed eval/fixtures/<Name>.metadata.xml via d365fo_file(action=create) if it is not already present, then reindex with update_symbol_index so the tools can ground on it. Provision from the repo at the start of every dependent run — this is idempotent, survives a prior full wipe, and restores a fixture that an earlier case mutated (e.g. L2-dimension-basic adds a field to ConDemoNoteHeader). Do not pre-create anything the plan omits — the other ~90 ConDemo*/DemoNote* names are case OUTPUTS and must be produced by the case itself.
  3. Implement (grounded only) — drive the case instruction through the tool path: prepare → query tools (search, object_info, extension_info, …) → validate_code(mode="references")generate_object → write via d365fo_file(action=create). No hand-edited XML.
  4. Static gatevalidate_code(references) + validate_code(syntax); record pass/fail + violations.
  5. Buildbuild_d365fo_project; capture structured errors[] and bpWarnings[].
  6. Oracle — score against the golden (VM-free scorer):
    npm run eval:score -- <caseId> <actualXml.xml> [--bp-output <bpOutput.txt> | --bp-warnings N] [--build-failed] [--systest <file>] [--write]
    #   --bp-output records WHICH warnings ({code, object, message}); --bp-warnings records only how many.
    npm run eval:score -- <caseId> --actual-dir <dir> ...   # multi-artifact cases
    
    For a case with a systest path: after a clean build, deploy eval/systests/<id>.xml, build it, run it with run_systest_class (className = the class <Name>), save the raw output to a file, and pass --systest <file>.
  7. Score & record--write appends a record matching eval/corpus/schema.json to eval/corpus/runs/.
  8. Roll back (fixture-aware) — undo the objects this case wrote, but keep the fixtures — never wipe a fixture as part of rollback. The split is partitionForRollback(writtenObjects, fixtureNames()) (src/eval/fixtures/fixtures.ts): everything in undo is reverted, everything in keep stays. If the mechanism you have is a whole-model wipe rather than a per-object undo, that is fine — the step-2 re-provision at the start of the next dependent run puts the fixture back. Leave the sandbox holding only fixtures (or empty), never case residue.
  9. Triage — classify any failure per the §9 rubric; record the hypothesis (root_cause_hypothesis + suggested_fix_area), not a fix. The improver confirms and fixes.

Read the full file on GitHub · 69 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. today Changed · +1 lines c55927842757
  2. 4d ago First seen · 68 lines · 104 tokens per session scan A f3c2876c2c8a

Subscribe to this mod's changes

eval-implementer is an agent published in the GitHub repository dynamics365ninja/d365fo-mcp-server (138 stars, last pushed today), licensed MIT. It adds 104 tokens to every session and 1,584 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.