Complete Ramp Tasks
Use this skill to inspect the authenticated user's Ramp attention feed, route
each outstanding task to the correct workflow, and prove that completed tasks
and task-sanction card locks are actually cleared.
Non-Negotiables
- Start from the live attention feed. Use the MCP tool
GetAttentionFeed or
ramp tasks list; do not infer outstanding tasks from an email, a prior
response, or a card's lifecycle state.
- Pass a non-empty
rationale on every Ramp tool call or CLI command.
- Show the task and proposed changes before any write, then get the user's
explicit confirmation. Never mark a task complete merely to remove a card
sanction.
- Treat
TRANSACTION_REVISION_REQUESTED and other task types as routing keys.
Satisfy the underlying task with its owning skill; do not dismiss, mutate, or
relabel an unfamiliar task to make it disappear.
- A card whose underlying lifecycle state is
ACTIVE can still be unspendable.
is_spendable, active_locks, and blocking_task_count are authoritative;
lifecycle state alone is not.
- Never report a task complete or a card unlocked from a successful write call
alone. Poll the attention feed and, for a card sanction,
ListCards with a
finite retry bound. Success requires the task to disappear and the exact card
to report is_spendable: true.
1. Read the Attention Feed
MCP:
GetAttentionFeed(rationale="Find the user's outstanding Ramp tasks")
CLI:
ramp tasks list --rationale "Find the user's outstanding Ramp tasks" --agent
Inspect every returned section. Preserve task_snapshot_uuid, task_type, the
task's entity UUIDs, due date, revision reason, required fields, and any Ramp
link returned in context. For each section, accumulate unique
task_snapshot_uuid values across its complete cursor chain until
next_cursor is null before claiming the feed is complete:
ramp tasks list --json '{
"rationale": "Continue reading the user's outstanding Ramp tasks",
"sections": [{
"section_type": "{section_type}",
"cursor": "{next_cursor}",
"limit": 20
}]
}' --agent
After pagination, compare the number of unique hydrated items collected for
each section with that section's total_count. If the counts differ, hydration
silently omitted one or more outstanding tasks: treat the feed as incomplete,
retry the bounded read, and never interpret the missing context as completion.
If total_count changes while traversing the cursor chain, restart that bounded
attempt from the first page rather than combining two snapshots. Likewise, if
an item or section contains an error, say that the feed is incomplete and retry
that bounded item. Summarize work by task type and urgency only from a fully
accounted feed.
2. Dispatch by Task Type
| Task type |
Workflow |
TRANSACTION_REVISION_REQUESTED |
Load ramp-complete-expenses. Review the revision request, correct the requested transaction fields, call CompleteTransactionRevision / ramp transactions complete-revision with the user's accepted nonblank reason, then perform both postcondition checks below. |
TRANSACTION_MISSING_ITEMS |
Load ramp-complete-expenses; fill only the missing receipt, memo, accounting, fund, trip, or attendee requirements. |
| Transaction, reimbursement, bill, or non-procurement request approval |
Load ramp-approval-dashboard; show details and confirm before approving or rejecting. |
| Procurement approval, submitted request, PO status, or follow-up |
Load ramp-manage-procurement. For a change request, require its original_request and complete change_request_diff old/new values before confirmation. |
| Procurement draft |
Load ramp-submit-procurement-request. |
| Vendor document or onboarding task |
Load ramp-manage-vendors. |
| Physical-card activation task |
Load ramp-card-management. |
| Unknown or unsupported task type |
Present the task context and returned Ramp link. Ask the user to complete it in Ramp; do not guess a mutation. |
One item can require multiple corrections. Keep its task_snapshot_uuid and
transaction/entity UUID attached to the workflow so a similarly named task is
not changed by mistake.
3. Handle a Task-Sanctioned Card
When a user asks why a card is locked or asks to unlock it:
- Call
ListCards before taking action. Identify the exact card by card UUID,
cardholder, display name, and last four digits.
- If
is_spendable is true, report that live state. Do not call an unlock
tool.
- Inspect every entry in
active_locks. When remediation_action is
GET_ATTENTION_FEED, do not call manual card unlock. Read the attention feed
and resolve its outstanding tasks through this workflow. Use
blocking_task_count to report how many tasks still block spending.
- For any other remediation action, return to
ramp-card-management, which
routes LOCK_OR_UNLOCK_CARD, UNLOCK_FRAUD_LOCKED_CARD, and CONTACT_RAMP.
The underlying card_state may be ACTIVE while a sanction lock is present.
Never use card_state == ACTIVE by itself as evidence that the card can spend.
4. Verify Postconditions
After the owning workflow reports success, use bounded polling (at most three
rechecks in the current run) with GetAttentionFeed / ramp tasks list. On
every attempt, traverse every returned section's complete cursor chain until
next_cursor is null, accumulate unique task_snapshot_uuid values, and
require the accumulated count to equal each section's total_count before
checking for the completed task's UUID or entity UUID.
- The task postcondition passes only when the completed item is absent from the
outstanding feed (or the live response explicitly reports it completed).
- If a section's hydrated-item count differs from
total_count, the attempt is
incomplete and cannot prove absence.
- If a section's
total_count changes between pages, restart that bounded
attempt rather than combining pages from different feed snapshots.
- If the task is still present, report it as outstanding and include any newly
returned reason or missing field. Do not claim success.
For a task-sanctioned card, poll ListCards within the same finite bound for the
same cardholder and card UUID. The combined postcondition passes only when the
task is absent and that exact card reports is_spendable: true. A successful
task write, PENDING_VERIFICATION, an absent lifecycle transition,
is_locked: false, or card_state: ACTIVE alone is insufficient.
If the task disappears but the card remains locked, report the remaining lock
state and reason. Do not loop manual unlock calls or say the card is spendable.
Gotchas
| Issue |
Required response |
| Empty first page with a section cursor |
Follow the returned per-section pagination contract before concluding there are no tasks. |
| Task write returned success but item remains |
Treat the task as outstanding; re-read its live context and report what remains. |
card_state is ACTIVE while is_spendable is false |
The card cannot spend; inspect active_locks and follow each remediation_action. |
Task disappeared but is_spendable remains false |
Report active_locks and blocking_task_count; do not claim the card was unlocked. |
| Unknown task type |
Present its context and Ramp link for a user handoff; do not invent a completion call. |
1---2name: ramp-complete-tasks3description: Find and complete items in the Ramp attention feed. Use when: 'what needs my attention', 'show my tasks', 'overdue tasks', 'complete my Ramp tasks', 'why is my card locked', or a card is locked until required tasks are completed. For approval-only queues, use ramp-approval-dashboard.4---56# Complete Ramp Tasks78Use this skill to inspect the authenticated user's Ramp attention feed, route9each outstanding task to the correct workflow, and prove that completed tasks10and task-sanction card locks are actually cleared.1112## Non-Negotiables1314- Start from the live attention feed. Use the MCP tool `GetAttentionFeed` or15 `ramp tasks list`; do not infer outstanding tasks from an email, a prior16 response, or a card's lifecycle state.17- Pass a non-empty `rationale` on every Ramp tool call or CLI command.18- Show the task and proposed changes before any write, then get the user's19 explicit confirmation. Never mark a task complete merely to remove a card20 sanction.21- Treat `TRANSACTION_REVISION_REQUESTED` and other task types as routing keys.22 Satisfy the underlying task with its owning skill; do not dismiss, mutate, or23 relabel an unfamiliar task to make it disappear.24- A card whose underlying lifecycle state is `ACTIVE` can still be unspendable.25 `is_spendable`, `active_locks`, and `blocking_task_count` are authoritative;26 lifecycle state alone is not.27- Never report a task complete or a card unlocked from a successful write call28 alone. Poll the attention feed and, for a card sanction, `ListCards` with a29 finite retry bound. Success requires the task to disappear and the exact card30 to report `is_spendable: true`.3132## 1. Read the Attention Feed3334MCP:3536```text37GetAttentionFeed(rationale="Find the user's outstanding Ramp tasks")38```3940CLI:4142```bash43ramp tasks list --rationale "Find the user's outstanding Ramp tasks" --agent44```4546Inspect every returned section. Preserve `task_snapshot_uuid`, `task_type`, the47task's entity UUIDs, due date, revision reason, required fields, and any Ramp48link returned in `context`. For each section, accumulate unique49`task_snapshot_uuid` values across its complete cursor chain until50`next_cursor` is null before claiming the feed is complete:5152```bash53ramp tasks list --json '{54 "rationale": "Continue reading the user's outstanding Ramp tasks",55 "sections": [{56 "section_type": "{section_type}",57 "cursor": "{next_cursor}",58 "limit": 2059 }]60}' --agent61```6263After pagination, compare the number of unique hydrated items collected for64each section with that section's `total_count`. If the counts differ, hydration65silently omitted one or more outstanding tasks: treat the feed as incomplete,66retry the bounded read, and never interpret the missing context as completion.67If `total_count` changes while traversing the cursor chain, restart that bounded68attempt from the first page rather than combining two snapshots. Likewise, if69an item or section contains an error, say that the feed is incomplete and retry70that bounded item. Summarize work by task type and urgency only from a fully71accounted feed.7273## 2. Dispatch by Task Type7475| Task type | Workflow |76|---|---|77| `TRANSACTION_REVISION_REQUESTED` | Load `ramp-complete-expenses`. Review the revision request, correct the requested transaction fields, call `CompleteTransactionRevision` / `ramp transactions complete-revision` with the user's accepted nonblank reason, then perform both postcondition checks below. |78| `TRANSACTION_MISSING_ITEMS` | Load `ramp-complete-expenses`; fill only the missing receipt, memo, accounting, fund, trip, or attendee requirements. |79| Transaction, reimbursement, bill, or non-procurement request approval | Load `ramp-approval-dashboard`; show details and confirm before approving or rejecting. |80| Procurement approval, submitted request, PO status, or follow-up | Load `ramp-manage-procurement`. For a change request, require its `original_request` and complete `change_request_diff` old/new values before confirmation. |81| Procurement draft | Load `ramp-submit-procurement-request`. |82| Vendor document or onboarding task | Load `ramp-manage-vendors`. |83| Physical-card activation task | Load `ramp-card-management`. |84| Unknown or unsupported task type | Present the task context and returned Ramp link. Ask the user to complete it in Ramp; do not guess a mutation. |8586One item can require multiple corrections. Keep its `task_snapshot_uuid` and87transaction/entity UUID attached to the workflow so a similarly named task is88not changed by mistake.8990## 3. Handle a Task-Sanctioned Card9192When a user asks why a card is locked or asks to unlock it:93941. Call `ListCards` before taking action. Identify the exact card by card UUID,95 cardholder, display name, and last four digits.962. If `is_spendable` is true, report that live state. Do not call an unlock97 tool.983. Inspect every entry in `active_locks`. When `remediation_action` is99 `GET_ATTENTION_FEED`, do not call manual card unlock. Read the attention feed100 and resolve its outstanding tasks through this workflow. Use101 `blocking_task_count` to report how many tasks still block spending.1024. For any other remediation action, return to `ramp-card-management`, which103 routes `LOCK_OR_UNLOCK_CARD`, `UNLOCK_FRAUD_LOCKED_CARD`, and `CONTACT_RAMP`.104105The underlying `card_state` may be `ACTIVE` while a sanction lock is present.106Never use `card_state == ACTIVE` by itself as evidence that the card can spend.107108## 4. Verify Postconditions109110After the owning workflow reports success, use bounded polling (at most three111rechecks in the current run) with `GetAttentionFeed` / `ramp tasks list`. On112every attempt, traverse every returned section's complete cursor chain until113`next_cursor` is null, accumulate unique `task_snapshot_uuid` values, and114require the accumulated count to equal each section's `total_count` before115checking for the completed task's UUID or entity UUID.116117- The task postcondition passes only when the completed item is absent from the118 outstanding feed (or the live response explicitly reports it completed).119- If a section's hydrated-item count differs from `total_count`, the attempt is120 incomplete and cannot prove absence.121- If a section's `total_count` changes between pages, restart that bounded122 attempt rather than combining pages from different feed snapshots.123- If the task is still present, report it as outstanding and include any newly124 returned reason or missing field. Do not claim success.125126For a task-sanctioned card, poll `ListCards` within the same finite bound for the127same cardholder and card UUID. The combined postcondition passes only when the128task is absent and that exact card reports `is_spendable: true`. A successful129task write, `PENDING_VERIFICATION`, an absent lifecycle transition,130`is_locked: false`, or `card_state: ACTIVE` alone is insufficient.131132If the task disappears but the card remains locked, report the remaining lock133state and reason. Do not loop manual unlock calls or say the card is spendable.134135## Gotchas136137| Issue | Required response |138|---|---|139| Empty first page with a section cursor | Follow the returned per-section pagination contract before concluding there are no tasks. |140| Task write returned success but item remains | Treat the task as outstanding; re-read its live context and report what remains. |141| `card_state` is `ACTIVE` while `is_spendable` is false | The card cannot spend; inspect `active_locks` and follow each `remediation_action`. |142| Task disappeared but `is_spendable` remains false | Report `active_locks` and `blocking_task_count`; do not claim the card was unlocked. |143| Unknown task type | Present its context and Ramp link for a user handoff; do not invent a completion call. |