---
id: IR-14
title: "synapse: render param-level deprecation markers (deferred from IR-6)"
status: Complete
type: implementation
blocked_by: [IR-6]
unlocks: []
severity: Low
target_repo: synapse
---

## Problem

IR-6 landed per-method and per-activation deprecation rendering in synapse, but deferred per-parameter rendering per the retry guidance (to keep IR-6's scope minimum-viable). A parameter annotated with `#[deprecated]` in author code propagates through IR-5's macro capture into `ParamSchema.deprecation` on the wire, and through IR-6's plexus-protocol type extension into the Haskell `ParamSchema` record. Synapse reads it but does not yet render it.

Consumers reading a method's help text cannot see which parameters are deprecated. The deprecation story is not end-to-end until parameter-level rendering lands.

## Context

- `plexus-protocol/src/Plexus/Schema/Recursive.hs`: `ParamSchema { paramDeprecation :: Maybe DeprecationInfo }` exists (added by IR-6 prereq `7eb5eb8`).
- Synapse's method rendering: `renderMethodFull` in `src/Synapse/Algebra/Render.hs` and `renderMethodHelpWith` in `src/Synapse/CLI/Help.hs`. Both walk method parameters and render each; neither decorates per-parameter deprecation today.
- IR-6 added helpers `deprecationMarker` and `formatDeprecationLine` which are reusable here.

## Required behavior

For each parameter in a method's rendering, when `paramDeprecation` is `Just (DeprecationInfo since removed_in message)`:

- Prepend `⚠` to the parameter name.
- Append an indented `DEPRECATED since <since>, removed in <removed_in> — <message>` line after the parameter's description.

Applies in both `renderMethodFull` (full method rendering) and `renderMethodHelpWith` (IR-based help).

## Risks

| Risk | Mitigation |
|---|---|
| Parameter rendering pipeline differs subtly between `Render.hs` and `Help.hs`. | Check both sites, decorate each consistently. Tests below pin both paths. |

## What must NOT change

- Non-deprecated parameters render identically to pre-ticket.
- IR-6's per-method and per-activation rendering unchanged.

## Acceptance criteria

1. `cabal build` and `cabal test deprecation-test` in synapse pass.
2. New test fixture in `DeprecationSpec.hs`: method with a deprecated parameter — render output contains `⚠` on that parameter's line and the expected `DEPRECATED since … removed in … — …` text.
3. A non-deprecated parameter in the same method shows no `⚠`.
4. Same assertions in `Help.hs` path.

## Completion

PR against synapse. CI green. Status flipped to Complete in the same commit.
