Repository navigation
Releases: joslat/maf-doctor
Release list
v1.18.0
Registry examples now compile against the real MAF packages. Every example from MAF
1.10 to 1.23 was compiled against the packages it describes: 28 entries were wrong and
are fixed, and their compiler-error codes now match what a build reports, so
MafRunCs0618Hunt links your build errors to the right entry. The 1.10.0 and cumulative
migration guides are corrected too. New maintainer command verify-examples (used by
the release pipeline). Still covers MAF 1.23.
Added
- Product fixes release on their own when MAF is quiet.
auto-releaseonly fired when a
MAF train merged, so fixes onmainwaited for Microsoft (v1.17.0 needed a manual tag).
The weeklymaf-freshnessrun now also checks for a product release: when the latest
release is at least 30 days old andmainhas commits touching files that ship in the
packages, it dispatchesauto-releaseinproductmode (same canary, same
AUTO_RELEASEkill switch). No new schedule. - Registry examples are compiled against the real MAF packages.
maf-doctor verify-examplescompiles each entry'sexample_beforeagainst the old release's
packages andexample_afteragainst the new one's (the exact versions in the train
lock), and checks that acs_warningnaming a compiler diagnostic is the one old code
actually gets on the new packages. Snippets are compiled as written: undeclared
variables are typed from how they are used, and anything that only involves the
reader's own types is reported as unchecked, not as an error.--show <id>prints
the generated source and every diagnostic. Watcher PRs run it inverify(report-only
for now), restoring onlyMicrosoft.Agents.AI*package ids.
Fixed
- 28 registry entries corrected against the real packages (found by the new
compiler check across MAF 1.10–1.23):- 1.13.0 file store: the entries described
Streamcontent andFileListEntry
results. The real API reads and writesstringcontent,DeleteFileAsyncreturns
bool, the list methods returned names andListChildrenAsyncreturns
FileStoreEntryitems (compareTypewithFileStoreEntry.File/Directory;
there is noFileStoreEntryType), andSearchFilesAsync→SearchAsyncalso
renamedfilePatterntoglobPattern. - 1.10.0
ToolApprovalAgentOptionshasJsonSerializerOptionsand
AutoApprovalRules;EnableNonApprovalRequiredFunctionBypassingbelongs to
ChatClientAgentOptions. Fixed in the registry and in the 1.10.0 and cumulative
guides. - Examples that did not compile:
AgentSkill.Frontmatter.Name(1.12.0), the
AzureBlobAgentSessionStoreconstructor's requiredagentNamespace(1.22.0), and
six Foundry tool options without a parameterless constructor (1.23.0). - 27
cs_warningcodes now name the diagnostic a build actually reports, so
MafRunCs0618Huntcan link it to the entry: removed members areCS1061/CS0117,
notCS0246; added optional parameters areBINARY_BREAK, notCS0618; the 1.23.0
Foundry namespace move isCS0246.
- 1.13.0 file store: the entries described
v1.17.0 — complete MAF 1.1–1.23 knowledge, --baseline, C# 14, MCP SDK 2.2
Better knowledge of MAF 1.1 to 1.23, no change in coverage. Registry entries are now
checked against the real packages: about 40 entries were added, re-attributed or
rewritten. doctor --baseline gates CI on new findings only, C# 14 code parses, and
the MCP SDK moves to 2.2 (stateless spec 2026-07-28). The release pipeline now merges
additive MAF releases, retries a failed fill and releases on its own; MAF 1.24 will be
its first real run. Still covers MAF 1.23.
Added
doctor --baseline <file>: gate only on new findings. Pass the output of an earlier
maf-doctor doctor --all --json; matching findings (by drift-stable fingerprint) are
dropped before grading, so--fail-onfails only when something new appears. The
report and JSON (baseline_suppressed) say how many matched. The PR audit now uses the
base branch as its baseline, so its comment shows what the PR introduced.- Signature oracle for registry entries (report-only in
verifyfor watcher PRs).
Every new entry's API claims are checked against the real packages in the train lock:
the obsolete member must exist in the old package and the replacement member in the
new one. Across MAF 1.10–1.23 its only findings were real mis-attributions, now fixed. - The watcher runs within about four days of a MAF release. The weekly (Monday) freshness job dispatches
it as soon asmainis behind and no watcher PR is open (was: Thursdays only). - The fill agent repairs its own failed fill once. When the required
verifycheck
fails on the agent's commit,maf-fill-repairre-runs the agent (bounded by
MAF_FILL_MAX_REPAIRS, default 1), then labels the PRneeds-humanwith a runbook
link. - MCP spec 2026-07-28 (stateless) is served. With the 2.2.0 SDK, hosts can skip the
initializehandshake:server/discover,tools/listandtools/callwork with
per-request_meta. The classic handshake still negotiates up to 2025-11-25. - An MCP round trip runs on every PR (
build-test): every tool, prompt, resource
and template is listed, every resource read, the argument-free prompts rendered, a
real tool call made, and the stateless 2026-07-28 flow exercised. - Automatic releases. When a watcher PR merges (
.maf-versionchanges onmain),
auto-releasetags the next minor version, so each MAF train ships as a maf-doctor
release with no human step. Switched by theAUTO_RELEASErepository variable. - Release canary. Before anything is pushed to NuGet,
release.ymlinstalls the
packed tool from the local.nupkg, checks--version, runs an MCP stdio smoke test
(handshake, capability lists, a real tool call) andverify-registryagainst the
registry embedded in the package. - New MAF packages can no longer go unnoticed. The weekly
maf-freshnessjob lists
every verifiedMicrosoft.Agents.AI*package on nuget.org and keeps a rolling issue
open for any that is neither a watcher surface, a lifecycle-event package, nor
ignored with a reason in.github/maf-package-discovery.json. 24 of 35 packages had
gone undiffed for months. - Freshness badge. The README shows the
maf-freshnessstatus; the run now turns red
while the SLO is breached or a package is untracked. CLAUDE.mdwith the repository's working notes (it was referenced but missing).
Changed
- MAF-AP-SEC-001 (
DefaultAzureCredentialin AI code) is a warning, not an error. It is
hardening advice (Azure Identity: prefer a deterministic credential in production), not
a defect; as an error it graded an official Azure OpenAI sample "F" (now "B"). The
bundled samples move one finding from errors to warnings (6/4, still "F"). - The tool rolls forward to newer .NET runtimes (
RollForward=Major). .NET 8 and 9
reach end of support on 2026-11-10; the net8/net9/net10 builds keep shipping while MAF
supports them, and a machine with only a newer runtime (e.g. .NET 11) can still run it. - CI budget:
maf-freshnessruns weekly (Mondays; with the watcher's Thursday run a new
MAF release is picked up within about four days), and the Copilot semantic review runs
automatically only on release-watcher PRs (any PR can still be reviewed on demand with
workflow_dispatch). - C# 14 code is parsed correctly. The scanners and rewriters moved to Roslyn 5.6
(was 4.14) and parse at the latest language version through one helper, so extension
blocks, null-conditional assignment and thefieldkeyword no longer produce syntax
errors around the MAF calls being checked. The shipped analyzer stays on Roslyn 4.14
(it loads in the user's compiler); a test guards that pin. - MCP C# SDK 2.2.0 (
ModelContextProtocol, was 1.4.1). A drop-in for MAF Doctor:
same protocol version, tools, prompts, resources and templates (verified over stdio). xunit.runner.visualstudio4.0.0 (test-only).
Fixed
maf_compatibilityknew only 22 of the 27 MAF releases. 1.6.0, 1.6.2, 1.7.0, 1.8.0 and
1.9.0 answered "unknown version" and were missing from the regression-plan ladder,
although the registry has their changes. They now have rows (dependency floors from
the packages, notes from the registry), the 1.10.0 note no longer lists changes that
shipped in 1.6.2 to 1.9.0, and the 1.0 to 1.2 rows use the same row format as the rest. A new
cross-file check fails when the registry has entries for a release that the matrix
(doc or MCP tool) does not list.- The 20 re-attributed 1.6.2–1.9.0 entries now give real migration steps. Their old
text was vague and partly wrong:WithName/WithDescriptiondid not disappear in 1.9.0,
they moved to the newOrchestrationBuilderBase<TBuilder>(calls compile; rebuild). The
entries now name the actual replacements from the packages:SubAgents*→
BackgroundAgents*/BackgroundTask*(1.6.2), skillContent/Resources/Scripts→
GetContentAsync/GetResourceAsync/GetScriptAsync(1.7.0), and
ScriptDirectories/ResourceDirectories→ScriptFilter/ResourceFilter+
SearchDepth(1.8.0). DefaultAzureCredentialno longer flags non-AI code. MAF-AP-SEC-001 now applies only
to files that use an agent/AI stack (MAF, Microsoft.Extensions.AI, Azure AI, OpenAI,
Semantic Kernel). A false-positive sweep of non-MAF repos graded CleanArchitecture "C"
(and offered an autofix) for a Key Vault configuration credential; it is now "A".
eShop and aspire-samples were already clean.- Twenty 1.10.0 entries carried the wrong release. They were drafted from one lumped
1.6.1 → 1.10.0 diff; a per-release diff (and the new signature oracle) shows they
shipped in 1.6.2, 1.7.0, 1.8.0 and 1.9.0. Theirversion_introducedand
applies_to_codebasesnow match the real release. - Regression plans dropped changes from releases the matrix skips. A step lists the
entries introduced after its source version up to its target. Before, it listed only
entries introduced exactly at the target, so a 1.7.0 → 1.10.0 plan (one step: the
matrix had no 1.8.0/1.9.0 rows) left out the 1.8.0 and 1.9.0 changes. - The first public releases (MAF 1.1–1.3) gain registry coverage. A per-release diff
from 1.0.0 found 10 breaking changes with no entry: skill APIs (1.1.0), Foundry
AsAIAgent(1.2.0), and the 1.3.0 A2A client and hosting redesign (IA2AClient,
AddA2AServer+MapA2AJsonRpc/MapA2AHttpJson,RequestContext). The historical
MAF130-A2A-001/002notes are corrected:MapA2Adid ship in the 1.2.0 hosting
previews, andA2AServerRegistrationOptionshas noAgentCardproperty. - Sixteen breaking changes in MAF 1.6–1.10 had no registry entry. The watcher
used to jump from 1.6.1 to 1.10.0, so those releases were never diffed one by one. A
per-release diff of all 35 packages found them: Foundry toolbox removal and client
options (1.6.0), theAIProjectClientExtensionsmove andFoundryAgent.GetService
(1.6.2), session isolation on by default in Hosting stores and the removal of
declarative-workflow code generation (1.8.0), Harness constructor changes (1.9.0,
1.10.0), and the GitHub Copilot SDK namespace move (1.10.0). Noted in the 1.6.1 and
1.10.0 guides. - Nine breaking changes in MAF 1.18 and 1.21 were missing. Those releases were
processed while the watcher diffed only 8–9 packages. A backfill diff of the other
packages found them: Foundry.Hosting session stores returnAgentSession?and
AddFoundryResponsesgainedconfigure(1.18), the AspNetCore claims-isolation types
andUseClaimsBasedSessionIsolationwere renamed (1.18), and the A2AAgentRunMode
members were renamed toReturnMessage/ReturnTask/ReturnTaskWhen(1.21). Added as
registry entries with exact signatures and noted in the 1.18 and 1.21 guides. - The fill agent was told to follow MAF 1.3.0 rules.
.github/copilot-instructions.md
was a staleinitoutput ("NEVER introduce patterns not present in MAF 1.3.0") that
Copilot loads as repository instructions, including in the agentic fill. It now
describes this repository and points to the version-scoped constraints. - Docs describe the current self-update loop (agentic fill, required gates, freshness,
lock-file repair) instead of the retired Copilot-coding-agent issue flow:
TROUBLESHOOTING.md,docs/setup.md, themaf-release-watcherskill, the watcher's
commit message and notices.
Install or upgrade: dotnet tool update -g maf-doctor · Full history: CHANGELOG.md
v1.16.0
What's Changed
- Self-healing loop, phase 1: unstick the watcher, diagnose failures, agentic fill by @joslat in #185
- chore: MAF 1.18.0 registry/matrix/guide update (breaking) by @joslat in #186
- Agentic fill: make the push work end to end (proven on MAF 1.18.0) by @joslat in #189
- Track Microsoft.Agents.AI.Mcp; let REVIEW sentinels resolve in untracked packages by @joslat in #191
- chore: MAF 1.19.0 registry/matrix/guide update (breaking) by @joslat in #190
- chore: MAF 1.20.0 registry/matrix/guide update (additive) by @joslat in #192
- chore: MAF 1.21.0 registry/matrix/guide update (breaking) by @joslat in #193
- deps(actions)(deps): bump marocchino/sticky-pull-request-comment from 3.0.4 to 3.0.5 by @dependabot[bot] in #132
- deps(actions)(deps): bump docker/metadata-action from 6.1.0 to 6.2.0 by @dependabot[bot] in #133
- deps(actions)(deps): bump docker/login-action from 4.2.0 to 4.4.0 by @dependabot[bot] in #134
- deps(actions)(deps): bump docker/build-push-action from 7.2.0 to 7.3.0 by @dependabot[bot] in #135
- deps(actions)(deps): bump docker/setup-buildx-action from 4.1.0 to 4.2.0 by @dependabot[bot] in #136
- deps(docker)(deps): bump dotnet/sdk from
ed034a8to72dd743by @dependabot[bot] in #168 - deps(docker)(deps): bump dotnet/runtime from
ed5d539to68d3501by @dependabot[bot] in #169 - Diff all 35 MAF packages; never say SAFE past the registry (coverage horizon) by @joslat in #194
- deps: patch CVE-2026-62900 (SourceLink 10.0.303); group Dependabot updates by @joslat in #195
- Autonomy: auto-merge additive trains, envelope gate, freshness SLO, stalled-PR clock by @joslat in #197
- verify: autonomy envelope diffs from the merge-base by @joslat in #202
- fill agent: run the obligations gate; REVIEW sentinels need new entries by @joslat in #205
- MafDoctorStatus: report MAF knowledge freshness (U-02) by @joslat in #199
- deps(docker)(deps): bump the docker-base-images group with 2 updates by @dependabot[bot] in #198
- chore: MAF 1.22.0 registry/matrix/guide update (breaking) by @joslat in #196
- deps: repair Dependabot's single-framework lock files; keep gh-aw out of Dependabot by @joslat in #206
- deps(actions)(deps): bump the github-actions group with 10 updates by @dependabot[bot] in #208
- Registry hygiene (Q-03), regression-plan fix, verify merge-base fix, replay test by @joslat in #209
- Prepare v1.16.0 (MAF 1.18-1.23) + unblock PRs cut before #209 by @joslat in #210
- chore: MAF 1.23.0 registry/matrix/guide update (breaking) by @joslat in #207
- deps(nuget): Bump the nuget-minor-patch group with 6 updates by @dependabot[bot] in #201
Full Changelog: v1.15.0...v1.16.0
v1.15.0 — MAF 1.14–1.17 migration intelligence + CI reliability
maf-doctor v1.15.0
This release completes the repaired, sequential Microsoft Agent Framework update chain from MAF 1.13 → 1.14 → 1.15 → 1.16 → 1.17. Each MAF step was generated, audited against official assemblies/source, filled, independently reviewed, tested, and merged in order.
Migration intelligence
- MAF 1.14: agent-mode/session API changes, async message injection, approval-rule contexts and defaults, Harness file/shell composition, AG-UI package split, GitHub Copilot collection narrowing, and
ShellPolicybinary/deny-first behavior. - MAF 1.15: preview Hosting named-argument changes, abstract
DeleteSessionAsync, session/checkpoint isolation, streaming correlation, and declarativeautoSendbehavior. - MAF 1.16: VectorData 9.7→10.7 source/provider migrations, connector transitions, chat-history ownership, ToolApproval sessions, FileMemory scope, Foundry port binding, and A2A configuration boundaries.
- MAF 1.17: public APIs remain structurally clean; declarative/Foundry failures now terminate and respect redaction policy; Durable Task and Azure Functions retain package IDs under an independent extension-repository cadence.
maf://guide now ships the complete cumulative guide through MAF 1.17. MafMigrationPath understands both legacy and current guide metadata and returns every intervening release while excluding the already-applied source step.
CI and self-update repairs
- Replaced corrupt
dotnet-inspect0.7.8 evidence with exact-pinned 0.9.1 plus strict structural validation. - Added release-aware, per-package evidence planning and extraction ledgers; targeted Core, Workflows, Hosting, Harness, AG-UI, Copilot, Shell, and lifecycle transitions fail closed.
- Prevented skipped stable releases, retained historical-branch collisions, partial extraction, deleted scaffold obligations, and untrusted verifier/semantic-review execution.
- Restored semantic review after GitHub Models retirement.
- Fixed the Windows valid-path smoke test so it scans an isolated empty directory instead of the shared temp root, eliminating parallel 30-second timeouts.
Release integrity
- Both packages are versioned
1.15.0in lockstep. - The release validates exactly two NuGet packages and two symbol packages, including IDs, versions, TFMs, tool settings, analyzer layout, README/icon, and symbols before publication.
- All four artifacts receive provenance attestations and GitHub Release assets.
- Tag-triggered NuGet and GHCR publication both reject commits outside reviewed
mainhistory.
Validation
- 326 Python CI/helper tests passed.
- 3,861 .NET tests passed across net8.0, net9.0, and net10.0.
- Registry, cross-file, semantic-review, security-scan, audit, and workflow-invariant gates passed.
- Local release rehearsal produced and inspected all four artifacts; isolated install reported
maf-doctor 1.15.0, returned grade A on an empty directory, and embedded the cumulative MAF 1.17 guide.
Install / upgrade
dotnet tool install -g maf-doctor
dotnet tool update -g maf-doctorMigration data PRs: #176, #180, #181, #182. Release prep: #183.
v1.14.0 — Fable-5 residual remediation + report readability
maf-doctor v1.14.0
The Fable-5 residual-review remediation — a deep second-pass review of v1.13.0 turned up 115 findings, and this release closes 113 of them across the autofix engine, the CLI, the scan core, every reporting surface, and the entire CI / release / AI-automation pipeline. It shipped as nine independently-reviewed phases (PRs #154–163), plus a security-documentation refresh (#164) and a report-readability fix (#165).
CI green across net8/9/10 and Linux.
🙏 Thanks to Jesse Liberty for the feedback that prompted the report-readability improvement — scoring an app now produces a report that's genuinely easy to scan.
✨ Highlights
The scored report is now scannable. maf-doctor doctor spaces each finding out and separates them with a horizontal rule (the --all grouped view too). Machine surfaces — --json, --plan, --plan-json, SARIF — are byte-for-byte unchanged. (Suggested by Jesse Liberty.)
Before → after:
BEFORE AFTER
1. **[…]** finding one **1. [Source]** finding one
- Why: …
- Fix: … - **Why:** …
2. **[…]** finding two - **Fix:** …
- Why: … - `file:line` → `code`
---
**2. [Source]** finding two
Verifiable release provenance. Starting with this release, every published .nupkg carries a signed build-provenance attestation, and the publish pipeline refuses to release from any tag that isn't an ancestor of the reviewed main branch.
🔒 Security
- Fence-label injection closed (SEC-01) — the LLM data-fence label is sanitized (
[A-Za-z0-9._-], ≤64 chars) in both the C# and Python fencers, so an attacker-influenced registry id can't inject text outside the fence a downstream model reads. - Subprocess secrets no longer inherited (SEC-09) — credential-like env vars are stripped from every
dotnet/dotnet-inspect/gitchild, so a run on an untrusted repo can't read the host's secrets. - Hostile
.git/configneutralized (SEC-22) —gitruns withfsmonitor/hooksPath/pager/protocol.extlocked down +GIT_CONFIG_NOSYSTEM. - Build-provenance attestation + tag-on-
mainpublish guard (SEC-13). - NuGet vulnerability audit with teeth (SEC-15) —
NuGetAuditMode=all, HIGH/CRITICAL advisories fail restore. - Fork-safe PR automation (SEC-11) — jobs that build fork code no longer hold write scope; a trusted companion posts comments.
- Fail-closed release classification (WM-11) — a garbled/truncated upstream diff classifies as breaking, never silently additive.
- Non-vacuous mcp-scanner gate (SEC-12 / WM-13) and a widened CI templating-injection gate (WM-14).
- Container capability boundary (SEC-10).
🛠 Fixed & Changed
- Autofix engine — source-corruption / pipeline / encoding / preview / file-lock fixes; rewriter output is compile-verified.
- CLI & MCP lifecycle — strict args, honest exit codes, correct stdout/stderr separation.
- Scan core — parse-once + parallel scanning with honest caps.
- Reporting accuracy — single-source health grade, additive-diff contract, full SARIF fidelity, and prose-to-data fixes so the numbers reconcile across every surface.
📚 Documentation
- Security docs federated + refreshed (#164) — four documents, one job each: a navigation map, a single canonical scan-result home, and accuracy fixes (tool count corrected to 28, closed gaps updated, new attack classes documented).
📦 Install / upgrade
dotnet tool install -g maf-doctor # first time
dotnet tool update -g maf-doctor # upgrade to 1.14.0Full commit-by-commit detail is in CHANGELOG.md. Deferred, honestly-disclosed residual items live in docs/security/threat-model.md §5.
v1.13.0
What's Changed
- fix: security remediation — all 30 findings from 2026-07-19 assessment, verified across 4 review rounds by @joslat in #152
Full Changelog: v1.12.0...v1.13.0
v1.12.0
A second, more thorough steering-completeness pass — following v1.11.0's dead-reference fix, audited the full live tool/prompt catalogue against what the steering docs actually tell Copilot, Claude Code, and Cursor to do, and closed the real gaps found.
Added
- Self-update awareness in steering. Nothing in the four steering docs (or the
@mafagent) ever mentionedMafDoctorStatus— the tool that reports whether the installed package or a workspace'sinitis stale. Added: check occasionally, surface thedotnet tool update -g maf-doctor+maf-doctor initflow when needed, confirming with the user before the global tool update (repo-scopedinitis always safe to just run). maf://constraintsawareness in steering. Every MCP prompt (maf-audit,maf-migrate,maf-remediate,maf-migrate-from,maf-review,maf-debug) readsmaf://constraints— the non-negotiable hard rules — as its first step. The baseline steering never told the assistant to do the same for anything answered outside a prompt. Added as its own item, early in the list.- "Scan incomplete" awareness. v1.10.0 added
scan_truncated/files_scannedreporting when a repo scan hits a size cap, but steering never told the assistant to check for or surface it — a capped scan could silently present an incomplete grade as definitive. maf-onboardingnow referenced in steering, not just inmaf-help's routing table.MafAuditPullRequestnow referenced in steering — previously only mentioned inside themaf-migrateprompt's own text.- Discovery fallback in steering. Added a closing pointer to
MafTour()(full capability catalogue) and themaf-helpprompt (guided triage) — previously only reachable via the@mafagent (Mode 2 only), leaving Claude Code / Cursor / plain-initCopilot users with no discovery mechanism at all.
Notes
- Deliberately NOT added to steering (to avoid turning it into a full tool index — that's what
MafTour/maf-helpare for):MafScanAntiPatterns,MafValidateFanOut,MafScoreMigrationRisk,MafGenerateRegressionPlan,MafExplain, and similar — already reachable viamaf-review/maf-debug/ the@mafagent's own decision tree.
Full Changelog: v1.11.0...v1.12.0
v1.11.0
Steering-wiring review: dead agent references fixed, a real onboarding-prompt gap closed, and a sweep of stale docs.
A review of how init steers GitHub Copilot, Claude Code, and Cursor found that all four shipped steering files (and two of the MCP prompts) told the assistant to hand off to @maf-* specialist-agent personas that init's default install path never actually installs — dead references for anyone who just ran maf-doctor init rather than manually copying this repo's .github/.
Added
maf-onboardingMCP prompt. Themaf-helptriage prompt routed "I just joined the team" to@maf-onboarding— an agent persona with no MCP-prompt equivalent, unlike every other route. Added a real, always-available prompt mirroring the agent's guided first-day tour (codebase summary, agent topology viaMafSimulateWorkflow, hot-path files, current grade + top fixes viaMafDoctor). (Prompts 10 → 11.)
Fixed
- Dead
@maf-*agent references in all four steering files and two MCP prompts.initnever copies.github/agents/*.agent.mdinto a consumer repo (only manually copying this repo's whole.github/in — "Mode 2" — does, and only for GitHub Copilot); there is no Claude Code subagent or Cursor custom-mode equivalent anywhere. So.github/instructions/maf-doctor.instructions.md,.claude/maf-doctor.md, theAGENTS.mdblock,.cursor/rules/maf-doctor.mdc, and themaf-debug/maf-helpprompts were all routing to personas that don't exist for the common case — while the identical workflows were already sitting there, wired up by everyinitrun, as MCP prompts (maf-review,maf-audit,maf-migrate,maf-debug,maf-migrate-from). Steering now leads with the prompts and mentions the@-mention personas only as a Mode-2, Copilot-only enhancement. - Sidecar files carried no "don't hand-edit me" warning.
.github/instructions/maf-doctor.instructions.md,.claude/maf-doctor.md, and.cursor/rules/maf-doctor.mdcare fully overwritten on every re-init, but the only comment that said so lived in the source snippet's header — which is stripped before the file is written to a consumer's repo. Each now carries an accurate, undeleted note pointing at where durable customizations actually belong. - Stale header comments in the four
docs/steering/*.mdsource snippets — left over from a prior refactor, describing appending into the user's owncopilot-instructions.md/CLAUDE.mdwith merge semantics; the shipped design has been overwrite-on-reinit sidecars for a while. Rewritten to match, and to name Copilot's/Cursor's nativeAGENTS.mdsupport. - Stale
docs/steering/README.md— said "these three files" (there are four) and claimedcursor-rules.mdlands at./.cursorrules; the real destination is.cursor/rules/maf-doctor.mdc. --with-cursor's console output named the wrong file (.cursorrulesinstead of the actual.cursor/rules/maf-doctor.mdc).- Stale tool / prompt / skill counts drifted independently across README.md, NUGET_README.md, and several docs pages — reconciled to the live, drift-tested values: 28 tools, 11 prompts, 15 skills.
- No drift guard on the three duplicated steering bodies — added a test pinning that
copilot-instructions.md/claude-instructions.md/agents.mdstay identical.
Full Changelog: v1.10.0...v1.11.0
v1.10.0
MCP server memory leak fix + repo-scan hardening — and our first outside contribution 🎉
The MCP server no longer leaks memory while idle — a stray config-reload file watcher was recursively monitoring the MCP host's entire working directory (typically the user's home folder), ballooning to multiple GB within minutes under normal machine activity. Reviewing that fix surfaced a related class of issues, now also closed: repoPath must be a genuinely absolute path, every repo scan is bounded, and the MAF PR Audit CI check no longer fails on outside contributions. Full details in CHANGELOG.md.
A special thank you to @ANcpLua (Alexander Nachtmann) — maf-doctor's first outside contributor. He diagnosed this memory leak with a precise root-cause writeup (down to the exact sample stack trace) and shipped a minimal, well-verified fix in #147. Really appreciate the sharp catch and the quality of the report — this is exactly the kind of contribution that makes an open-source project better. 🙏
What's Changed
- fix: stop config-reload file watcher from ballooning memory in MCP mode by @ANcpLua in #147
- fix: harden PathGuard, cap repo scans, fix fork-PR audit comments (#148) by @joslat in #149
New Contributors
Full Changelog: v1.9.0...v1.10.0
v1.9.0
What's Changed
- Add MCP update and init freshness checks by @joslat in #142
- Document update freshness status in quickstart by @joslat in #143
Full Changelog: v1.8.0...v1.9.0