Ultimate · step sheet spec

The step sheet

The overflow sheet behind the ··· on a step. The app shipped an undesigned legacy version — two dead taps and a doctrine violation — and this board replaces it. The whole stance in one sentence: a sheet earns its rows. Every row does one real thing; a menu item that does nothing when tapped is worse than its absence. Below: your own step, someone else's step, the delete confirm, what was cut, and the bright lines that keep the tray honest.

Danger ink is spent on exactly one thing: Delete. --danger #B3322E, never rose (rose means celebration). Report stays ink — protection isn't danger.

01 Your step

The sheet on a regular step you posted. Three rows, three real actions: Share, Mark as milestone (with its ruled footnote), and Delete step in danger ink. No filler — nothing is here to look complete.

Learn to run trails
Step 12 · “Ran the whole loop without walking.”
Share Mark as milestoneMarking is quiet — nobody is notified. Delete step

Three rows, three real actions

Share posts the system share sheet with the step's public URL — and since sharing is one of the three step-with actions, it also counts, not just a courtesy row. Mark as milestone flips to Remove milestone with a filled diamond once the step is already marked, carrying the same quiet footnote both ways.

  • The milestone row's footnote rides the row itself — “Marking is quiet — nobody is notified.”
  • Marked already? The row reads Remove milestone with a filled ink diamond; still silent.
  • Delete is the sheet's only danger ink — line-icon and label both in --danger.

02 Someone else's step

The same sheet dressing on a step that isn't yours. Only two rows survive: Share and Report step. Reporting is protection, not danger, so it stays ink — and its own flow takes over once tapped.

Couch to 5K
Maya · Step 8 · “Week eight — the loop felt short today.”
Share Report step

Nothing else survives on another person's step

No “turn on notifications for this step” — the notification spec has no per-step subscriptions and never will; notifications announce people, not mechanics. No mute. No block here either — blocking lives on the profile, where the whole relationship is. Tapping Report hands off to the report flow's own sheet.

“Report step”, never “Report post” — Stepo has steps.
  • Report is ink, not danger — protection isn't a destructive act.
  • The report flow's own sheet (categories, anonymous subline) takes over from here.

03 Delete, confirmed

Delete is destructive, so it asks once — with an honest sentence and a styled, labeled primary. The destructive action is the button that looks like the action, not a link hiding beside a big Cancel.

Delete this step?
It goes right away, for everyone — along with its hearts, comments, and step-withs.

The destructive action is the styled primary

Never a link hiding beside a big Cancel. The legacy sheet inverted exactly this — its primary button said “Cancel” and Delete hung off a plain text button, training the thumb to fear the wrong control. Here the danger CTA is labeled with the real verb and “Keep it” is the quiet way out.

  • Consequence copy is honest and one sentence — no “Are you sure?”, no double-negative.
  • Badges already earned by others are permanent (ruled) — deletion never claws back recognition.
  • Deleting a final step returns the journey to ongoing; the badges stay.

04 What was cut

The shipped legacy sheet, drawn small — every one of these five rows was live UI in the app. Two are struck through: they did nothing, or they broke doctrine. The three that stayed each still earn their place.

ShareKept
Edit stepCut
Mark as milestoneKept
Turn on notifications for this stepCut
Report post → Report stepKept
The shipped legacy sheet · five rows, two dead

A dead tap is worse than an absence

Edit step went nowhere — no designed edit flow exists, so it's parked for its own future ruling before anyone re-adds it. “Turn on notifications for this step” was both a dead tap and a doctrine violation: a borrowed social-app pattern with no per-step subscription behind it, and none is coming.

  • The milestone row was kept — and gained its “nobody is notified” footnote.
  • Report post was kept, relabeled Report step — Stepo has steps.
  • Every cut row here was live UI in the shipped app, not a hypothetical.

05 Bright lines

The rules that keep the tray a tool tray. Break one and the sheet starts growing rows to look feature-rich instead of doing work.

The sheet is a tool tray, not a feature list.

Scope & status. Launch item — this board replaces the undesigned legacy sheet shipped on the step screen. It covers the overflow sheet only; the report flow it hands off to is report.html / report-crisis.html, the milestone footnote and its “Reached with …” memory line live on milestones-board.html, and the seven notification switches live on settings-notifications.html. Source of truth: DESIGN.md “Step sheet board (2026-07-13).” Danger ink is --danger #B3322E and appears on exactly two elements across the whole board: the Delete row and the Delete CTA.