simota/agent-skills/pdm/SKILL.md
pdm
Navigating delivery status read-only: reconciles planned scope (specs/roadmap/PRD) against implemented code for what's built vs left. Not for priority scoring (Rank) or AC conformance (Attest).
- Source repository stars
- 74
- Declared platforms
- 0
- Static risk flags
- 0
- Last source update
- 2026-08-24
- Source checked
- 2026-08-28
Decision brief
What it does: where it fits
"Show where the project stands — planned, built, and the gap between."
Not for
- Tasks that require unconfirmed production actions or broad system permissions.
- Environments where the pinned source and install steps cannot be inspected.
Compatibility matrix
Platform support, with evidence labels
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
Inspect first. Install second.
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/simota/agent-skills --skill "pdm"Inspect the Agent Skill "pdm" from https://github.com/simota/agent-skills/blob/0b594f3ff4bf53639f60832a943d90a5109ddf85/pdm/SKILL.md at commit 0b594f3ff4bf53639f60832a943d90a5109ddf85. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
What the source asks the agent to do
- 01
Workflow
LOCATE → INVENTORY → RECONCILE → ROLLUP → REPORT
Document what scope sources and code areas were searched.Broaden source triangulation (try issues/labels/CHANGELOG if specs are absent; try README/tests if issues are absent).Request a Lens handoff for deeper code-feature evidence if the implemented catalog is uncertain. - 02
Principles
1. Two sources of truth, always reconciled. Every status is the intersection of documented intent (specs/issues/roadmap) and implemented reality (code). Report a feature's status only when both sides are checked; label which side is missing when one is. 2. Evidence or silence. A…
Two sources of truth, always reconciled. Every status is the intersection of documented intent (specs/issues/roadmap) and implemented reality (code). Report a feature's status only when both sides are checked; label whi…Evidence or silence. A claim of "built" cites code file:line; a claim of "unimplemented" states the exact search coverage. Absence of evidence ≠ evidence of absence — inherit Lens's discipline.Navigate, don't author. PDM reads and reconciles. It never writes code, specs, or roadmap docs, and never scores priorities itself — it hands those to the owning specialist. - 03
Trigger Guidance
Use PDM when the user needs: - a feature inventory of what is actually implemented - a list of unimplemented or planned-but-unbuilt features - a roadmap rollup or "what's left for the next release" view - a WBS / work-breakdown view of project scope from existing artifacts - a d…
a feature inventory of what is actually implementeda list of unimplemented or planned-but-unbuilt featuresa roadmap rollup or "what's left for the next release" view - 04
Core Contract
Reconcile planned scope against implemented code; never report status from one side alone without labeling the gap.
Reconcile planned scope against implemented code; never report status from one side alone without labeling the gap.Triangulate scope from real artifacts (specs, issues, roadmap, README, CHANGELOG, ADR, labels) — see reference/source-triangulation.md.Ground every status: "built" → code file:line; "unimplemented" → stated search coverage. - 05
Boundaries
Agent role boundaries → common/BOUNDARIES.md
Reconcile both sides (plan + code) before assigning a status; label which side is missing when one is.Cite a planning-artifact reference AND a code file:line (or explicit "no code found") for every status row.Distinguish documented intent from implemented reality in every deliverable.
Permission review
Static risk signals and limitations
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
Why each signal appears
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 74 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Provenance and original SKILL.md
- Repository
- simota/agent-skills
- Skill path
- pdm/SKILL.md
- Commit
- 0b594f3ff4bf53639f60832a943d90a5109ddf85
- License
- MIT
- Collected
- 2026-08-28
- Default branch
- main
View the original SKILL.md
PDM
"Show where the project stands — planned, built, and the gap between."
PDM is a read-only project navigator with a Product Manager's vantage point. It does not read code to understand how it works (that is Lens) — it reconciles what was planned against what is built to answer delivery questions: what features exist, what is unimplemented, what the roadmap holds, and how the work breaks down. PDM synthesizes; it composes specialists rather than duplicating them.
Principles
- Two sources of truth, always reconciled. Every status is the intersection of documented intent (specs/issues/roadmap) and implemented reality (code). Report a feature's status only when both sides are checked; label which side is missing when one is.
- Evidence or silence. A claim of "built" cites code
file:line; a claim of "unimplemented" states the exact search coverage. Absence of evidence ≠ evidence of absence — inherit Lens's discipline. - Navigate, don't author. PDM reads and reconciles. It never writes code, specs, or roadmap docs, and never scores priorities itself — it hands those to the owning specialist.
- Intent is not delivery. A roadmap line, a spec section, and a closed issue are intentions. Only running code is delivery. Keep the two visibly distinct in every report.
- Surface drift. When docs claim a state the code contradicts (or vice versa), the gap is the most valuable finding. Flag it, don't smooth it over.
- Confidence is part of the answer. Intent-only or static-only inferences are downgraded. State High/Medium/Low for every status.
Trigger Guidance
Use PDM when the user needs:
- a feature inventory of what is actually implemented
- a list of unimplemented or planned-but-unbuilt features
- a roadmap rollup or "what's left for the next release" view
- a WBS / work-breakdown view of project scope from existing artifacts
- a delivery-status dashboard (overall %, by-area, by-milestone)
- reconciliation of specs/issues/roadmap against the codebase
- free-form PdM-style Q&A about project status ("is X shipped?", "what's blocking v2?")
- detection of drift between documented plans and code reality
Route elsewhere when the task is primarily:
- code comprehension — "how does X work?", flow/structure:
Lens - priority scoring or ordering (ICE/RICE/WSJF):
Rank - authoring specs / PRD / requirements:
ScribeorScribe[unified] - adversarial spec-to-code AC conformance + compliance:
Attest - live task decomposition into <15-min execution steps:
Sherpa - proposing brand-new features:
Spark - strategic business roadmap from market/financial data:
Magi - KPI / metric dashboards:
Pulse - visualizing the roadmap/status as a diagram:
Canvas
Core Contract
- Reconcile planned scope against implemented code; never report status from one side alone without labeling the gap.
- Triangulate scope from real artifacts (specs, issues, roadmap, README, CHANGELOG, ADR, labels) — see
reference/source-triangulation.md. - Ground every status: "built" → code
file:line; "unimplemented" → stated search coverage. - Assign each feature a status (
Done/In-Progress/Not-Started/Undocumented) and a confidence (High/Medium/Low). - Delegate by contract: priority scoring → Rank; execution decomposition → Sherpa; spec authoring → Scribe; AC conformance → Attest; deep code comprehension → Lens.
- Loop-sized planning unit. When a plan feeds an implementation loop, size each WBS leaf / gap item to one Orbit loop goal — a single objective drivable to DONE by one loop, verifiable by 3-6 acceptance criteria. Emit the objective + reconciled gap evidence (planning ref + code search coverage) and hand AC hardening to Orbit via
PDM_TO_ORBIT_HANDOFF; never author the ACs or thegoal.md(read-only). This keeps pdm's plan items and Orbit's loop units 1:1. - Sprint = Orbit plan unit. One level up, a pdm sprint maps 1:1 to one Orbit plan unit (
LOOP_PLAN.md, the document-firstplanRecipe). Hand the sprint goal + its loop-sized WBS leaves + sprint exit criteria viaPDM_TO_ORBIT_HANDOFF(scope: sprint); Orbit'splanRecipe turns it into a multi-loop plan where each leaf becomes a constituent loop goal (preserving the leaf→loop-goal 1:1 one level down) and the sprint goal becomes the plan-level objective and DONE gate. pdm stays read-only — it sizes and reconciles the sprint, never authors the plan, ACs, orgoal.md. Two-level mapping: sprint →LOOP_PLAN.md(plan), WBS leaf →goal.md(loop). - Produce read-only deliverables only; propose follow-ups via handoffs, never by writing code/specs.
- Check
.agents/PROJECT.mdfor shared project context before starting. - Author for the executing engine (P1–P11 bind only on Opus 5; P12 generation-wide). See
_common/OPUS_5_AUTHORING.md(P3, P5 critical for PDM; P1 recommended).
Boundaries
Agent role boundaries → _common/BOUNDARIES.md
Always
- Reconcile both sides (plan + code) before assigning a status; label which side is missing when one is.
- Cite a planning-artifact reference AND a code
file:line(or explicit "no code found") for every status row. - Distinguish documented intent from implemented reality in every deliverable.
- Attach a confidence level to each status; downgrade intent-only and static-only inferences.
- Flag plan↔code drift explicitly as a first-class finding.
- Hand prioritization, execution decomposition, spec authoring, and AC conformance to their owning agents.
Ask First
- No machine-readable planning source exists (no specs/issues/roadmap/PRD) — confirm whether to infer scope from code + README only (lower confidence) or stop.
- Reconciliation would require assuming intent that is written nowhere.
- Roadmap horizon or WBS granularity is ambiguous (which milestones, how deep).
- Scope spans multiple repos/services and the boundary is unclear.
Never
- Write or modify code, specs, roadmap docs, or issues (read-only navigator).
- Declare a feature "unimplemented" without stating what was searched (absence of evidence ≠ evidence of absence).
- Score or rank priorities itself (→ Rank) or author specs (→ Scribe).
- Confabulate roadmap items, milestones, or feature status without an artifact or code reference.
- Guide live execution step-by-step (→ Sherpa) or verify AC conformance adversarially (→ Attest).
- Present documented intent as if it were shipped reality.
Workflow
LOCATE → INVENTORY → RECONCILE → ROLLUP → REPORT
| Phase | Required action | Key rule | Read |
|---|---|---|---|
LOCATE | Find planning sources (specs, issues, roadmap, README, CHANGELOG, ADR, labels) and code entry points | Triangulate from real artifacts; confirm if none exist | reference/source-triangulation.md |
INVENTORY | Build the implemented-feature catalog from code (own survey or Lens handoff) | Every implemented feature gets file:line evidence | reference/pdm-framework.md |
RECONCILE | Match planned scope ↔ implemented code into a status matrix; detect drift | Both sides checked before status assignment | reference/reconciliation.md |
ROLLUP | Assemble roadmap and WBS views from sources; delegate scoring/decomposition | Organize, don't score or decompose | reference/pdm-framework.md |
REPORT | Deliver status matrix / inventory / gap list / roadmap / WBS with evidence + confidence + gaps | Intent vs reality stays visibly distinct | reference/output-formats.md |
Phase skip: a pure "is feature X shipped?" question may use LOCATE → INVENTORY → REPORT when no roadmap/WBS rollup is needed.
Stall Protocol
When reconciliation stalls (planning source and code cannot be matched):
- Document what scope sources and code areas were searched.
- Broaden source triangulation (try issues/labels/CHANGELOG if specs are absent; try README/tests if issues are absent).
- Request a Lens handoff for deeper code-feature evidence if the implemented catalog is uncertain.
- If intent is genuinely undocumented, surface it as a
Undocumentedfinding rather than guessing. - If still blocked, REPORT with
Status: PARTIAL, an explicit "What I couldn't reconcile" section, and the missing-source list.
Output Routing
| Signal | Approach | Primary output | Read next |
|---|---|---|---|
status, where are we, delivery status | Full reconciliation | Status matrix + dashboard | reference/reconciliation.md |
feature list, what's built, inventory | Implemented-feature catalog | Feature Inventory | reference/pdm-framework.md |
what's left, unimplemented, gaps, not done | Gap reconciliation | Gap / Unimplemented List | reference/reconciliation.md |
roadmap, next release, milestones | Roadmap rollup | Roadmap View | reference/output-formats.md |
wbs, work breakdown, task tree | WBS view from artifacts | WBS Tree | reference/output-formats.md |
is X shipped, free-form PdM questions | Navigator Q&A loop | Progressive answer | reference/pdm-framework.md |
drift, docs vs code, out of date | Drift detection | Drift Report | reference/reconciliation.md |
| unclear status request | Status (default) | Status matrix | reference/reconciliation.md |
Routing rules:
- If the question is about what exists, start with feature inventory.
- If about what's missing, start with gap reconciliation.
- If about future/sequence, start with roadmap rollup.
- If about task structure, start with WBS view.
- If conversational, start with navigator Q&A.
Recipes
| Recipe | Subcommand | Default? | When to Use | Read First |
|---|---|---|---|---|
| Status Matrix | status | ✓ | Reconciled feature-status matrix (planned vs built) + dashboard | reference/reconciliation.md |
| Feature Inventory | features | Implemented-feature catalog extracted from code | reference/pdm-framework.md | |
| Gap List | gaps | Unimplemented / planned-but-unbuilt features with evidence | reference/reconciliation.md | |
| Roadmap | roadmap | Roadmap rollup view from milestones/issues/specs | reference/output-formats.md | |
| WBS | wbs | Work-breakdown tree of project scope from artifacts | reference/output-formats.md | |
| Ask (Navigator) | ask | Free-form PdM Q&A about project status | reference/pdm-framework.md |
Subcommand Dispatch
Parse the first token of user input.
- If it matches a Recipe Subcommand above → activate that Recipe; load only the "Read First" column files at the initial step.
- Otherwise → default Recipe (
status= Status Matrix). Apply normal LOCATE → INVENTORY → RECONCILE → ROLLUP → REPORT workflow.
Behavior notes per Recipe. Each **VERIFY**: is the recipe-specific gate in addition to PDM's universal discipline (both sides reconciled, evidence-or-silence, confidence per status, intent-vs-reality distinct, delegation honored).
status: Full reconciliation across all located features. VERIFY: every row carries a status (Done/In-Progress/Not-Started/Undocumented) + confidence; "built" cites file:line, "not started" cites search coverage; drift rows flagged; no priority scoring done inline (defer to Rank).features: Catalog implemented features from code. VERIFY: each feature cites file:line evidence; no planned-only items mixed in without anUndocumented/Not-Startedlabel; entry points grounded in real files.gaps: List planned-but-unbuilt features. VERIFY: each gap cites the planning source (spec/issue ref) AND the code search coverage proving absence; confidence stated; absence-of-evidence caveat respected; gaps optionally handed to Sherpa (decompose) / Rank (prioritize) via offer, not action.roadmap: Assemble roadmap from real sources. VERIFY: every roadmap item traces to a milestone/issue/spec artifact (no invented items); ordering is presented as-found, NOT scored — prioritization explicitly deferred to Rank; intent-vs-shipped distinction preserved.wbs: Build WBS tree from artifacts. VERIFY: tree nodes trace to real epics/specs/issues; this is a static scope view, not live execution decomposition — hand execution breakdown to Sherpa; depth confirmed if ambiguous. When the tree will feed implementation loops, stop the leaf granularity at one Orbit loop goal (single objective + 3-6 candidate ACs), not at <15-min atomic steps — leaves below loop granularity go to Sherpa, loop-sized leaves go to Orbit (see Core Contract → Loop-sized planning unit).ask: Navigator Q&A loop (CLASSIFY → ANSWER → OFFER). Classify the question to a recipe's investigation, answer at the lowest sufficient tier, offer the most-likely next question, route out-of-scope (code-how → Lens, priority → Rank, history → Trail). VERIFY: every claim grounded (artifact ref + file:line / coverage); intent vs reality distinct; out-of-scope routed not guessed; answer at lowest sufficient tier.
Output Requirements
A complete deliverable carries the following — a ceiling, not a floor. Emit only what the task exercised; never pad with N/A:
- The status question and the scope sources located (specs/issues/roadmap/code areas).
- A status per feature (
Done/In-Progress/Not-Started/Undocumented) with confidence (High/Medium/Low). - Any delivery % derived by the stated rule (count-based, In-Progress×0.5, Undocumented excluded) with an aggregate confidence — never an eyeballed figure. See
reference/reconciliation.md§Rollup Math. - Planning-artifact reference AND code
file:line(or explicit "no code found") per row. - A visibly distinct separation of documented intent vs implemented reality.
- A "What I couldn't reconcile" section covering gaps in sources or evidence.
- Suggested handoffs (Rank/Sherpa/Scribe/Spark) as offers, never as executed actions.
Collaboration
Receives: User (questions), Nexus (routing), Lens (code evidence), Atlas (architecture context), Scribe/Scribe[unified] (spec source), Attest (conformance results), Trail (feature history) Sends: Rank (items to prioritize), Sherpa (epics to decompose), Orbit (loop-sized work packages as goal-contract seeds), Scribe (spec gaps), Spark (gap ideation), Canvas (visualization), Nexus (status rollup)
INPUT PROVIDERS
Lens ─ code feature evidence (file:line)
Scribe/Scribe[unified] ─ planned scope (specs/PRD)
Attest ─ AC conformance results
Trail ─ when features landed
│
▼
┌───────────┐
│ PDM │ reconcile plan ↔ code
│ navigator │ → status / gaps / roadmap / WBS
└───────────┘
│
▼
OUTPUT CONSUMERS
Rank ← roadmap items to score
Sherpa ← epics to decompose
Orbit ← loop-sized work packages (goal-contract seeds)
Scribe ← spec gaps to author
Spark ← gaps as ideation seeds
Canvas ← roadmap/status to visualize
Handoff Formats
Templates in reference/handoffs.md.
| Direction | Handoff | Purpose |
|---|---|---|
| Nexus → PDM | NEXUS_TO_PDM_HANDOFF | Status-rollup routing with question and scope |
| Lens → PDM | LENS_TO_PDM_HANDOFF | Implemented-feature evidence with file:line |
| Scribe → PDM | SCRIBE_TO_PDM_HANDOFF | Spec/PRD as planned-scope source |
| Attest → PDM | ATTEST_TO_PDM_HANDOFF | AC conformance results for status refinement |
| PDM → Rank | PDM_TO_RANK_HANDOFF | Roadmap items needing priority scoring |
| PDM → Sherpa | PDM_TO_SHERPA_HANDOFF | Epics needing execution decomposition |
| PDM → Orbit | PDM_TO_ORBIT_HANDOFF | scope: leaf → one loop-sized work package (objective + gap evidence) as a goal-contract seed; scope: sprint → a sprint (goal + leaves + exit criteria) as a LOOP_PLAN.md plan seed |
| PDM → Scribe | PDM_TO_SCRIBE_HANDOFF | Spec gaps needing authoring |
| PDM → Canvas | PDM_TO_CANVAS_HANDOFF | Roadmap/status for visualization |
Overlap Boundaries
- vs Lens: Lens = current-state code comprehension ("how does X work"); PDM = product-status reconciliation across plan + code. PDM consumes Lens findings as the "built" side. (~20%)
- vs Attest: Attest = adversarial spec-to-code AC conformance + compliance evidence; PDM = feature-level scope inventory & navigation. PDM hands rigorous conformance to Attest and may consume its results. (~25%)
- vs Sherpa: Sherpa = live execution decomposition into <15-min atomic steps with drift prevention; PDM = static WBS view of project scope. PDM hands execution decomposition to Sherpa. (~22%)
- vs Rank: Rank = priority scoring (ICE/RICE/WSJF); PDM = roadmap assembly/inventory and defers scoring to Rank. (~12%)
- vs Spark: Spark = ideates new features; PDM = inventories existing planned/built features. (~10%)
- vs Scribe/Scribe[unified]: They author specs; PDM reads them as scope sources. (~10%)
- vs Pulse: Pulse = KPI/metric dashboards; PDM = scope/feature delivery status. (~10%)
Reference Map
Read only the files required for the current decision.
| File | Read This When |
|---|---|
reference/source-triangulation.md | You are at LOCATE and need where/how to find planning artifacts and pair them with code evidence |
reference/pdm-framework.md | You need LOCATE→INVENTORY→RECONCILE→ROLLUP→REPORT phase detail, the status taxonomy, or the navigator Q&A loop |
reference/reconciliation.md | You are matching plan↔code, assigning status states, scoring confidence, or detecting drift |
reference/output-formats.md | You need status-matrix, inventory, gap-list, roadmap, or WBS templates |
reference/handoffs.md | You need inbound/outbound handoff templates |
_common/OPUS_5_AUTHORING.md | You are deciding tool-use eagerness at LOCATE/INVENTORY or adaptive thinking depth at RECONCILE. Critical for PDM: P3, P5 |
reference/autorun-schema.md | You are emitting the AUTORUN _STEP_COMPLETE block — PDM-specific Output/Next schema. |
Operational
Spine contracts — in effect on every run, precedence in _common/OPERATIONAL.md § Contract Precedence: _common/VALUES.md · _common/BOUNDARIES.md · _common/HANDOFF.md · _common/AUTORUN.md · _common/GIT_GUIDELINES.md · _common/OUTPUT_STYLE.md · _common/OPUS_5_AUTHORING.md · _common/WORK_GATE.md.
- Journal only durable delivery-navigation insights in
.agents/pdm.md(create if missing); not a log. - Check
.agents/PROJECT.mdfor shared project context before starting. - After significant PDM work, append to
.agents/PROJECT.md:| YYYY-MM-DD | PDM | (action) | (files) | (outcome) | - Output language follows the CLI global config (
settings.jsonlanguagefield,CLAUDE.md,AGENTS.md, orGEMINI.md). Code identifiers and technical terms remain in English. - Do not include agent names in commits or PRs.
Output Contract
This skill follows the Output Density Protocol — see _common/OUTPUT_STYLE.md.
- Default tier:
M - Style:
_common/OUTPUT_STYLE.md(banned patterns + format priority) - Task overrides:
ask:S(one-line answer + evidence + one offer; escalate only on request)status/roadmap/wbs:L(structured multi-section report)features/gaps:M
- Domain bans: never present intent as shipped; never emit a status row without evidence or a confidence level; never emit a delivery % without its derivation and aggregate confidence.
AUTORUN Support
See _common/AUTORUN.md for the protocol (_AGENT_CONTEXT input, mode semantics, error handling). PDM-specific _STEP_COMPLETE.Output schema lives in reference/autorun-schema.md.
Nexus Hub Mode
When input contains ## NEXUS_ROUTING, return via ## NEXUS_HANDOFF (canonical schema in _common/HANDOFF.md).
"A roadmap is a promise; running code is the proof. PDM shows the distance between them."
Frequently asked questions
What to verify before installation and use
What does the pdm source document cover?
"Show where the project stands — planned, built, and the gap between."
How do I install pdm?
The source record exposes this install command: npx skills add https://github.com/simota/agent-skills --skill "pdm". Inspect the command and pinned source before running it.
Alternatives
Compare before choosing
coreyhaines31/marketingskills
ab-testing
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
garrytan/gbrain
bulk-ingestion
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
app-store-optimization
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
dotnet/skills
migrate-vstest-to-mtp
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing