Repository navigation
Description
Summary
pm health reports extension_migration_pending and counts it in
triage.migration_pending_count, but no command in the CLI applies a pending extension
migration. The warning is permanent, it holds pm health at ok: false, and there is no
documented or discoverable way for an agent or a human to clear it.
Reproduction — pm-cli 2026.8.5
Install any extension that ships a registerMigration (both published starter packages do), then:
$ pm health --json | jq '.checks[]|select(.name=="extensions").details.triage
|{warning_count,migration_pending_count,migration_failed_count}'
{
"warning_count": 12,
"migration_pending_count": 2,
"migration_failed_count": 0
}
Warnings:
extension_migration_pending:project:pm-starter:pm-starter-0001-noop
extension_migration_pending:project:pm-ts-starter:ts-starter-noop
The count does not change after running write commands (pm create, etc.) in the workspace —
verified across several mutations.
There is no remediation surface
Everything reachable is diagnostic-only:
| tried | result |
|---|---|
pm migrate |
Unknown command migrate |
pm --help | grep -i migrat |
no match |
pm contracts --json |
no command whose name/path matches migrat |
pm schema --help |
list, show, show-status — migrations only referenced as rename/remap item-schema definitions, unrelated |
pm package --help |
no migration subcommand |
pm extension --help |
--doctor / doctor — "Run consolidated extension diagnostics"; no apply/repair |
pm health --help |
"Validates tracker/runtime health including extension triage, migration, and integrity diagnostics" — validates only |
health.checks[].details |
rich triage block, but capability_guidance is [] and there is no remediation_map entry for this code (the telemetry check does carry one: {"telemetry_queue_pending": "pm health --check-telemetry"}) |
PreflightRuntimeDecision exposes run_extension_migrations / enforce_mandatory_migration_gate,
but those are override inputs, not a user-invocable action, and the published overrides here are
conservative pass-throughs that preserve the host decision (ctx.decision?.run_extension_migrations ?? true),
so nothing is suppressing the run from the extension side.
Impact
pm healthok: trueis the fleet's CI/release gate. A permanently-pending migration means a
workspace can never pass it, for a reason the operator cannot act on.- It is indistinguishable, from the outside, between "the host has not run these yet" and "these
are broken" —migration_failed_countstays0, so there is no signal either way. - This is the same shape as graph audit stale_lifecycle_block has no honest resolution for work blocked on an external party, despite blocked_reason carrying the evidence #891: a diagnostic that reports a state with no honest resolution.
The only ways to make it quiet are to stop shipping migrations or to ignore the check, and both
discard real signal.
What would close it
Any one of:
- A user-invocable apply path —
pm extension migrate(orpm extension --migrate, or a
--apply-migrationsflag onpm health/pm package) that runs pending extension migrations
and reports applied/failed counts. - If migrations are meant to apply automatically, document when, and make the warning state
why this one has not run yet (gate disabled? scope mismatch? not yet triggered?). - Failing both, add a
remediation_mapentry forextension_migration_pendingnaming the exact
command, exactly as the telemetry check already does fortelemetry_queue_pending.
Option 3 alone would at least make it actionable; option 1 is what the warning implies exists.
Environment
@unbrained/pm-cli2026.8.5- Node 22, Linux
- Project-scope extensions, 17 published
pm-*packages installed
Activity
coderabbitai commentedon Aug 5, 2026
🔗 Related PRs
#306 - Complete agent self-service remediation registry (extension adoption + duplicate-issue-codes gaps) [merged]
#406 - feat(mcp): extension-aware built-in actions + action-scoped name schema (pm-zumn, pm-fq80) [merged]
#414 - Clear CLI complexity suppressions across PM SDK and CLI [merged]
#428 - Harden SDK extension runtime packaging [merged]
#491 - Harden init target safety and package install verification [merged]
📝 Issue Planner
Check the box below or use the
@coderabbitai plancommand to generate an implementation plan and prompts that you can use with your favorite coding assistant.🧪 Issue enrichment is currently in open beta.
You can configure auto-planning by selecting labels in the issue_enrichment configuration.
To disable automatic issue enrichment, add the following to your
.coderabbit.yaml:💬 Have feedback or questions? Drop into our discord!
unbraind commentedon Aug 5, 2026
Canonical pm item: pm-ig5cfe\n\nThis report is included in the extension lifecycle contracts implementation tranche. Progress, relationships, source/test/doc links, decisions, and verification evidence will be recorded on that item.