Skip to content

pm health's remediation_map sends agents to pm validate --fix-hints, which emits no hint for unknown-author events, while history-author-acknowledge --all-actionable is never named #943

Closed

Description

@unbraind

Summary

On 2026.8.8, an agent that follows pm health's own remediation_map for
history_unknown_author_events is sent to a command that cannot remediate it, while the command
that can is never named. The two commands also disagree about whether the tracker is healthy at
all, which is what sends the agent looking for a remediation in the first place.

Observed on a real 627-item tracker where every check is ok except storage.

1. The remediation map names the wrong command

pm health --json emits:

remediation_map:
  history_unknown_author_events: "pm validate --check-history-drift --fix-hints"

Running exactly that, on the same tracker, with --fix-hints explicitly passed:

$ pm validate --check-history-drift --fix-hints
ok: true
has_warnings: true
checks:
  ...
warnings:
  - "validate_history_unknown_author_events:108"

That is the entire output for this warning: a count. No affected item ids, no event coordinates,
no hint — despite --fix-hints being the flag whose whole purpose is to produce one. An agent
that follows the remediation map lands here and has strictly less information than pm health
already gave it (health at least lists affected_item_ids and samples with item_id/line
coordinates).

The command that actually remediates this is pm history-author-acknowledge, which the
remediation map never mentions:

$ pm history-author-acknowledge --help
Append audited dispositions for immutable unknown-author events.
Options:
  --event <item-id:line>       Unknown-author event coordinate (repeatable)
  --all-actionable             Select all actionable events
  --attributed-author <value>  Reviewed principal attribution
  --reviewer <value>           Disposition reviewer
  --reason <value>             Review evidence

--all-actionable (added for #831) is exactly the bulk selector this case needs. Pointing the
remediation map at history-author-acknowledge --all-actionable instead of at pm validate would
make the loop terminate.

Suggested fix: point remediation_map.history_unknown_author_events at
pm history-author-acknowledge --all-actionable, and either make pm validate --fix-hints emit
the same coordinates pm health already computes for this warning, or stop advertising
--fix-hints as producing a hint for it.

2. pm health and pm validate disagree about the same tracker

Same workspace, same moment, same underlying condition (108 actionable unknown-author events):

Command Top-level result
pm health --json ok: false
pm validate --check-history-drift ok: true, has_warnings: true

pm validate models this correctly — it separates "is the tracker valid" from "are there
warnings", so a caller can gate on ok and still surface warnings. pm health collapses the two,
so a single warn-severity check sinks ok with no way to distinguish degraded from broken
from the ok field alone.

This is the same contract complaint as #785, which was closed. The directories case from that
issue is genuinely fixed — on 2026.8.8 a missing optional type folder no longer even warns:

$ pm init --prefix wt && rmdir .agents/pm/epics
$ pm health --json | jq '.ok, [.checks[] | select(.status != "ok")]'
true
[]

But the fix appears to have been applied to that check rather than to the aggregation rule, so a
storage warn still sinks ok. Adopting pm validate's shape here — ok plus a separate
has_warnings — would make the two commands agree and give agents a gate they can rely on.

Why this matters for agents

A fleet that mandates "pm health must be ok" as a CI gate can never pass once a tracker
carries any legacy unattributed history, because most of it is permanently unfixable by
construction: of the 1217 unknown-author events here, 1109 are legacy_unknown_event_count —
written by CLI versions that predate author attribution. Only 108 are actionable. The gate
therefore reports a permanent failure for a condition that is, for the majority of its input,
not a defect and not remediable.

Environment

  • @unbrained/pm-cli 2026.8.8 (reproduced immediately after upgrading from 2026.8.5)
  • Linux, Node 22
  • Tracker: 627 items, 638 history streams, 2756 history events

Activity

  1. coderabbitai commented on Aug 8, 2026

    @coderabbitai
    🔗 Related PRs

    #200 - Add validation self-repair and agent ergonomics primitives [closed]
    #306 - Complete agent self-service remediation registry (extension adoption + duplicate-issue-codes gaps) [merged]
    #568 - Promote SDK governance engines and harden cross-platform release reliability [merged]
    #593 - SDK-first agent UX graph, ownership, and recovery contracts [merged]
    #783 - Harden SDK context integrity, merge safety, and agent-efficient output [merged]


    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 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:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

  2. unbraind commented on Aug 9, 2026

    @unbraind
    OwnerAuthor

    Canonical PM item: pm-jwmszf. This issue remains open and unclaimed; the PM item records the all-status duplicate check, acceptance contract, and related author-attribution lineage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions