Commit Graph
2526 Commits
Author SHA1 Message Date
Dotta dd57bfba21 Revert "Split run progress from liveness disposition"
This reverts commit 55518170ad.
2026-04-29 16:02:22 -05:00
Dotta caf37a355d Revert "PAP-2731 Implement sky explicit-wait UI surfaces"
This reverts commit 08a9e0caf0.
2026-04-29 16:02:11 -05:00
DottaandPaperclip 0a345e9648 Handle liveness escalation blockers as waiting
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 14:29:47 -05:00
Dotta 398d85488c Guard liveness recovery by issue creation time 2026-04-29 14:24:30 -05:00
DottaandPaperclip 41a989e00c Make database backups full logical dumps
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 14:20:19 -05:00
Dotta ba88e86f63 Cancel queued runs for cancelled issues 2026-04-29 14:15:24 -05:00
DottaandPaperclip ed51123e3c PAP-2852 Add space-width gap between caret and mention menu
Per visual feedback the menu was sitting flush against the cursor;
introduce MENTION_MENU_CARET_GAP (10px) so the popover floats roughly
one space-width to the right of the caret.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 14:14:59 -05:00
Dotta 2ba694d10f Clarify explicit waiting posture for plans 2026-04-29 14:02:53 -05:00
DottaandPaperclip 02dd5309b3 Cover live-run polling cap
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 14:01:06 -05:00
DottaandPaperclip 33bcaa5a4c Allow recovery owners to cancel stale runs
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 14:00:36 -05:00
DottaandPaperclip 229a4c60a2 Limit legacy disposition preview lookback
Default the legacy execution-disposition preview to recently created issues, keep an explicit --all escape hatch, and cover the lookback behavior with a targeted test.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 13:54:24 -05:00
DottaandPaperclip b13c9f5fba Limit legacy disposition preview to recent issues
Default the legacy execution-disposition preview to a 48-hour lookback and require --all for full historical scans. This keeps repair passes from treating stale blocked/review rows as current cleanup work unless the operator explicitly asks for a backfill.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 13:35:23 -05:00
DottaandPaperclip 4c5eaeadd5 PAP-2822 Walk back visible disposition badges per board feedback
The board accepted the canonical executionDisposition payload + classifier
but found the visible badges in IssueRow / IssueProperties / Storybook too
noisy on production surfaces. UI-only walkback: keep the data layer, drop
every visible badge.

- Delete IssueDispositionBadge component and its test.
- Drop the badge import, suppression rule, and trailing-slot references in
  IssueRow (desktop + mobile). Existing waiting pill, status-icon ring, and
  blockerAttention copy remain unchanged.
- Drop the badge IIFE and related imports from IssueProperties so the
  Status row only renders the StatusIcon again.
- Prune the badge cases from IssueRow.test (Live, Stalled, dispatchable,
  Resuming, explicit-waiting suppression) so the file still type-checks.
- Storybook: remove "Canonical disposition badges" and "IssueRow with
  disposition badge inline" sections plus DispositionRowSurface and
  dispositionRowFixtures. The rest of Status Language is unchanged.

Kept: executionDisposition on issue payloads, the resolver and its test,
and the PAP-2818 contract doc — future features can consume the field
without re-running the classifier work.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 13:25:59 -05:00
Dotta 7690c21148 Add legacy execution disposition preview 2026-04-29 13:11:49 -05:00
DottaandPaperclip 7fc94107cf PAP-2818 Document execution disposition contract
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 13:04:55 -05:00
DottaandPaperclip 326fd2f6fb Allow cancelling question interactions
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 11:54:37 -05:00
DottaandPaperclip 0b85f56d27 PAP-2853 Close 8px flip-gap on mention menu
Align CSS max-height with MENTION_MENU_HEIGHT (208) so the rendered
menu fills the layout-reserved space; previously max-h-[200px] clipped
the box 8px short of the JS layout budget, leaving a visible gap above
the caret line on the flipped path.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 11:48:01 -05:00
DottaandPaperclip aa1628008e PAP-2822 Address UX review on disposition badge
- Drop the dispatchable "Ready" variant from the badge: the only place it ever
  rendered was Storybook (IssueRow and IssueProperties already returned null
  for it). dispositionCategory now returns null for dispatchable.
- Pull agent_continuable into a discrete "Resuming" category with a muted
  indigo treatment so it doesn't share the rose alarm family with Recovery /
  Needs attention / Stalled, and surface "Resuming · n/m" on the visible
  badge instead of hiding the attempt counter in the tooltip.
- Differentiate human_escalation_required by owner on the visible label:
  Needs board / Needs manager / Needs owner / Needs external. Color stays in
  the rose family but the actionable bit is no longer hover-only.
- Bump invalid (Stalled) to a solid rose-600 fill so it stands out against
  the rest of the rose family at scan distance, satisfying the parent plan's
  acceptance criterion that the board can spot a stalled review leaf without
  reading the full thread.
- Mirror the IssueRow suppression rule on IssueProperties so the Status row
  doesn't double-render the same waiting/recovery signal as the chat-thread
  IssueBlockedNotice.
- Add aria-label={tooltip} on the badge so screen readers get the path
  detail, not just the category label.
- Storybook: rename and split the disposition matrix to cover all four
  escalation owners, both Resuming attempts, and add a populated IssueRow
  surface that shows the badge in production layout context (Live, Resuming,
  Needs board, Needs manager, Stalled).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 11:45:11 -05:00
DottaandPaperclip 925ac9a3c1 PAP-2852 Anchor mention menu to caret and allow touch scrolling
Mention menu now sits on the same line as the caret and to the right of
the cursor (tracking each typed character instead of staying glued to
the @ marker). When the menu would overflow below the viewport it flips
above the line so it doesn't cover the line.

Touch handling no longer preventDefaults on touchstart, so the dropdown
scrolls natively on mobile; selection runs only on touchend if the
finger lifted with negligible movement (a tap, not a scroll).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 11:16:43 -05:00
DottaandPaperclip 6ac545bae7 PAP-2822 Render execution disposition badge in board UI
Adds IssueDispositionBadge that maps the canonical disposition to a
small palette of categories (live, ready, waiting, blocked-chain,
recovery, needs attention, stalled). Renders the badge in the inbox
row and on the issue detail status row, suppressing it where the
existing waiting/recovery copy already conveys the same signal so we
don't double up. Storybook gains a section showing every category for
UX review.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 10:50:32 -05:00
DottaandPaperclip 2b3a7f683b PAP-2822 Expose canonical executionDisposition on issue payloads
Adds a per-issue read-model resolver that loads the disposition state
vector (active runs, queued wakes, agents, interactions, approvals,
recovery/productivity-review issues, latest run evidence) and runs the
shared classifier. Wires it into issue list, detail, and
heartbeat-context responses, and surfaces it on the shared Issue type
as `executionDisposition` so the board can read execution health
without inferring it from status alone.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 10:50:25 -05:00
DottaandPaperclip cbd091b3ef Harden agent issue authz
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 10:40:32 -05:00
DottaandPaperclip ed6600b9d1 Hide redundant sibling blocker chips
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 10:38:29 -05:00
Dotta 613812d1c0 Add terminal bench loop skill smoke 2026-04-29 10:33:13 -05:00
DottaandPaperclip 04c85b6db6 Integrate canonical recovery dispositions
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 10:28:23 -05:00
Dotta d354ecadfa PAP-2820 Enforce issue transition dispositions 2026-04-29 10:26:50 -05:00
DottaandPaperclip 9413f55381 Add canonical issue execution disposition classifier
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 10:19:22 -05:00
DottaandPaperclip 628d879978 Move issue cost summary above activity feed
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 09:49:51 -05:00
Dotta eb6957fa86 Fix mention chip padding cascade 2026-04-29 09:38:50 -05:00
DottaandPaperclip 229487afef Unify issue activity ledger
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-29 08:49:35 -05:00
DottaandPaperclip ffe319a3f7 PAP-2789 Simplify waiting banner Owner/Resume rows and fix Jump anchor
The explicit-wait IssueBlockedNotice rendered Target/Owner/Resume as a row
of pills. Drop the Target pill entirely and render the remaining Owner and
Resume entries as a plain dl/dt/dd block — the value matters more than the
chip styling for these long-form details.

The "Jump to questions/confirmation/approval" affordance referenced anchor
ids that did not exist in the DOM (`issue-thread-interaction-{id}` and
`issue-approval-{id}`); the actual anchors are `interaction-{id}` and
`approval-{id}`. Switch to those ids and use a button with
scrollIntoView({behavior:"smooth"}) so the jump actually scrolls to the
target.

Add a small ExplicitWaitingJumpAnchor component that flips the arrow ↑/↓
based on whether the target is above or below the banner, recomputing on
scroll/resize.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 22:34:52 -05:00
DottaandPaperclip bcc88b561a PAP-2778 Wrap waiting pills instead of overflowing
The Target/Owner/Resume chips in the explicit-wait IssueBlockedNotice
banner used inline-flex with `truncate max-w-[Nrem]` on inner spans, so
on narrow viewports a single chip (especially Resume's full sentence)
extended past the container edge. Cap each chip at max-w-full and let
the value span wrap on word boundaries; desktop layout is unchanged.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 21:07:29 -05:00
DottaandPaperclip 9703830313 PAP-2753 Add copy button to markdown code blocks
Wraps fenced code blocks in MarkdownBody with a relative container and an
absolute-positioned Copy button (top-right) that copies the block contents
to the clipboard via navigator.clipboard with an execCommand fallback for
non-secure contexts. The button is hidden by default and reveals on hover
or focus, swaps to a check icon and "Copied\!" label for ~1.5s after
clicking, and falls back to "Copy failed" when the clipboard write throws.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 19:05:52 -05:00
DottaandPaperclip 08a9e0caf0 PAP-2731 Implement sky explicit-wait UI surfaces
Replaces the rose liveness-break banner for issues whose blocker-attention
read model reports `state="covered"` with `reason="explicit_waiting"`.

- IssueBlockedNotice: add a sky-toned banner with Hourglass icon, kind-aware
  headline/body copy (plan confirmation, user response, suggested tasks,
  board approval, generic fallback), Target/Owner/Resume pill row, a "Jump
  to confirmation" anchor, and a sky chip strip for parent-of-leaf chain
  waits. Rose banner still wins on tie via the existing precedence.
- StatusIcon: add a sky ring + bottom-right nub for explicit_waiting and
  emit `data-blocker-attention-state="explicit_waiting"`. Tooltip is
  "Waiting on board/user/agent" or prefixed "Blocked · ..." when blocked.
- IssueRow: add a sky `Waiting · {owner}` pill (collapses to `Waiting` on
  mobile) when the row's attention reason is explicit_waiting. Owner label
  resolves via new optional agent/user maps wired in by IssuesList & Inbox.
- IssueDetail/IssueChatThread: lift the linkedApprovals query into the chat
  tab and pass interactions/approvals/agentMap/userLabelMap/currentUserId
  through to the new banner.
- Storybook + tests: extend coveredBlockedMatrix with sky cells, add four
  new BlockedNotice fixtures (plan, user response, board approval, chain),
  and cover the new states with unit tests on StatusIcon, IssueBlockedNotice,
  and IssueRow.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 19:00:13 -05:00
DottaandPaperclip 5adbe69381 Harden pending wait recovery gating
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 18:31:24 -05:00
Dotta 7f9ae0adcd Harden recovery wait boundaries 2026-04-28 18:20:46 -05:00
DottaandPaperclip c1fd7521a8 PAP-2729 Handle interaction waiting lifecycle
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 18:13:05 -05:00
DottaandPaperclip 1e68cb9be0 Handle explicit waits in liveness read models
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 18:06:29 -05:00
DottaandPaperclip b72ab70a4f Fix pause resume QA blockers
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 18:02:28 -05:00
DottaandPaperclip 7a57a54b77 Implement issue pause resume UI
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 17:38:21 -05:00
DottaandPaperclip 2834e356d9 PAP-2720 Load full thread before jump-to-latest
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 17:23:36 -05:00
DottaandPaperclip 8d1647b039 PAP-2672 Converge Jump-to-latest on the absolute newest comment
The user reported having to click Jump-to-latest ~10 times before the
viewport actually pinned to the latest comment on long threads (e.g.
PAP-2536). The virtualizer estimates 220px per unmeasured row, so
totalSize is hugely underestimated until rows render and get measured;
a single smooth scroll lands above the real bottom and each subsequent
click walks closer as more rows mount and expand.

- IssueChatThread.handleJumpToLatest now awaits an optional
  onRefreshLatestComments before resolving the latest target so any
  comment that arrived after the initial load (or was dropped on a
  live-update reconnect) is in the loaded set first.
- scrollToLatestCommentWithSettle issues the initial smooth scroll,
  then on an 80 ms tick re-issues scrollIntoView({ block: "end" }) on
  the latest comment row for up to 4 s, exiting once the row's bottom
  matches the scroll container's bottom (within 4 px) and scrollTop +
  scrollHeight have been stable for 3 ticks. If the row hasn't been
  mounted into the virtualizer buffer, scrollToIndex is used to nudge
  the offset until it is.
- IssueDetail destructures `refetch` from the comments useInfiniteQuery
  and threads refetchLatestComments through to IssueChatThread.

QA verified on PAP-2720: single-click convergence in 327-407 ms across
5 successive trials, comment-fa353646 lands flush with the viewport
bottom (-0.44 px sub-pixel), stopped-scroll stability holds.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 17:09:41 -05:00
DottaandPaperclip de4ce9828d PAP-2643 Phase 3: gate run-liveness continuation and scheduled retry promotion under pause holds
Suppress bounded run-liveness continuation wakes when an active pause hold
covers the issue, and cancel due scheduled retries with errorCode `issue_paused`
instead of promoting them only to be cancelled at claim time. Adds regression
coverage for both gates plus the no-pause-hold passthrough invariant.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 16:57:28 -05:00
DottaandPaperclip 47d862b4b2 Show agent models on agents page
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 16:32:41 -05:00
DottaandPaperclip 38b57c5d56 Render rose recovery_needed surface across StatusIcon, BlockedNotice, and rows
StatusIcon adds an AlertTriangle overlay on the red-ring blocked variant
when the read model reports recovery_needed; tooltip and aria-label
spell out the liveness break and which leaf is invalid.

IssueBlockedNotice gets a rose container variant with two copy
templates: parent-perspective ("paused at a liveness break in [leaf]")
and leaf-perspective ("productive run that exited without queueing a
continuation"). The sub-row label flips to "Liveness break at" and an
owner pill renders with the next-action verb derived from the
nextActionHint.

IssueRow surfaces "liveness break at {leaf}" in the meta line for
recovery_needed parents so inbox/MyIssues rows show the actionable leaf
without opening the parent.

The status-language Storybook matrix gains the four new state/reason
combinations and parent/leaf-perspective notice variants. Targeted
vitest cases cover both the icon overlay and notice rendering.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 15:59:14 -05:00
DottaandPaperclip 3ea2ff4187 Surface invalid-leaf recovery_needed in blockerAttention read model
A blocked parent like PAP-2089 currently reports a generic
needs_attention chain even when its leaf is the productive-run-stopped
shape from PAP-2674's plan. Extend listIssueBlockerAttentionMap to
fetch each candidate leaf's latest issue-linked succeeded run plus its
productivity-review state, classify the leaf as recovery_needed when it
matches the shape, and propagate the leaf identifier, next-action
owner, and CTA hint up to the root. The leaf itself also surfaces
recovery_needed on its own attention so the leaf-level notice can
render when an inbox wake lands directly on it.

Adds two integration cases (productive_run_stopped and
continuation_exhausted) to the embedded-Postgres regression suite.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 15:59:03 -05:00
DottaandPaperclip 7d475f85bf Add recovery_needed and next-action surface to IssueBlockerAttention
Phase 5 of the liveness plan needs the blocker read model to distinguish
a "productive run stopped without continuation" leaf from generic
attention or stalled-review chains. Extend the shared type so server and
UI share one vocabulary for the new surface (state, reasons, owner,
hint).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 15:58:54 -05:00
Dotta 2656a86dae Recover productive stranded runs 2026-04-28 15:30:19 -05:00
DottaandPaperclip 4b309a9e3b Classify runnable liveness follow-up
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-28 15:27:32 -05:00
Dotta 55518170ad Split run progress from liveness disposition 2026-04-28 15:23:52 -05:00