Skip to content

feat(server,webapp): tell approvers that practice feedback is waiting, and expire stale proposals #1506

Description

@FelixTJDietrich

Outcome

When Hephaestus drafts feedback that needs a human decision, the people who can make that decision are
told. Proposals that nobody acts on expire with a stated reason instead of accumulating silently.

Problem

HUMAN_APPROVAL (Propose) is the default autonomy tier, and it is the tier every newly adopted practice
starts in. A practice in that tier composes real draft feedback and writes it as an approval-pending row.

Nothing tells anyone. There is no notification channel in the product at all — no mail subsystem, and the
approval package has no hooks. The queue is reachable only by an admin who happens to open the right page,
and nothing ages out.

Two failure modes follow:

  • The first week looks broken. A workspace turns Hephaestus on, drafts accumulate, nobody is told, and
    no developer receives anything. The product appears dead precisely when trust is being formed.
  • Stale drafts are worse than no drafts. A proposal approved three weeks after the pull request merged
    is noise at best. Nothing today prevents that.

What

  • Notify the people who can decide when feedback is waiting: a pending count on the workspace admin
    surface, and a message on a channel the workspace already uses. Digest, not per-item.
  • Expire proposals after a configurable window, recorded with a typed suppression reason so an expired
    draft is distinguishable from a rejected one.
  • Size the queue. Show how many proposals are waiting and how old the oldest is, so an admin can tell
    whether the tier is sustainable before it becomes a backlog.

Acceptance criteria

  • A workspace admin learns that feedback is awaiting a decision without opening the admin surface.
  • A proposal older than the configured window is suppressed with its own reason and never delivered.
  • The admin surface shows the pending count and the age of the oldest pending proposal.
  • Notification volume is bounded — one digest per workspace per period, never one message per item.

Out of scope

Metadata

Metadata

Assignees

No one assigned

    Labels

    application-serverSpring Boot server: APIs, business logic, databasefeatureNew feature or enhancementpriority:highAddress this sprint - Significant impactwebappReact app: UI components, routes, state management

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions