Access review
Run a semi-automated access review for campaign $ARGUMENTS (or ask the
user for the campaign name). Review entries only — do not create, start,
cancel, or close campaigns.
Before executing, read these files relative to this skill directory:
references/mcp-tools.md — MCP tool names, inputs, pagination
references/decision-rubric.md — semi-auto decision rules
references/notes-format.md — working memory file schema
Preconditions
- A Probo MCP server must be connected. The plugin ships two hosted servers,
probo-us and probo-eu; self-hosted instances are configured in the agent.
If tools fail with auth errors, stop and tell the user to complete OAuth
sign-in for that server (Claude Code: /mcp or claude mcp login probo-us;
Codex: codex mcp login probo-us; OpenCode/Cursor: configure MCP in settings
then authenticate).
- Resolve the server, then the organization. These are separate
choices: one server can hold several organizations, and the caller can have
organizations on more than one server. Settle both before any campaign call,
because
listAccessReviewCampaigns requires organization_id.
- Server. Use the server for the region the user names, or the only
connected server when there is one. Otherwise call
listOrganizations on
each connected server and take the server whose organizations uniquely
match the one the user named. Never infer the region from a merely
non-empty result — when the match is not unique, show each server with the
organizations it returned and ask which to use.
- Organization. Once the server is settled, call
listOrganizations on
it unless an earlier probe already returned its organizations. Take the
unique name match, or the only organization when the server returns one.
Otherwise list them and ask the user to pick.
- Resolve the campaign from
$ARGUMENTS (name match or GID) within that
organization. If the campaign is ambiguous, list listAccessReviewCampaigns
results and ask the user to pick one.
- Campaign
status must be IN_PROGRESS or PENDING_ACTIONS. Stop with a
clear message for DRAFT, COMPLETED, or CANCELLED.
Working notes file
Create or resume .probo/access-reviews/<campaign-slug>.md per
references/notes-format.md. Create .probo/access-reviews/ if missing.
Workflow
1. Orient
- Call
getAccessReviewStatistics for the campaign.
- Summarize totals and pending count for the user.
- If no pending entries, report completion and stop.
2. Fetch batch
- Call
listAccessEntries with campaign_id, filter.decision: PENDING,
size: 50.
- Use
last_cursor from the notes file when resuming.
3. Classify each entry
Apply references/decision-rubric.md:
| Class |
Action |
| Auto |
Queue for recordAccessReviewEntryDecisions |
| Ambiguous |
Present to user; do not write yet |
| Skip |
Log in notes only (no API write) |
Hold auto decisions in memory until step 4 succeeds — do not append them to the
notes file yet.
4. Write auto decisions
- Batch via
recordAccessReviewEntryDecisions when possible.
- Non-
APPROVED decisions must include decision_note.
- On MCP error, stop and do not advance
last_cursor or update entry notes.
- After a successful API response, append each recorded auto decision to the
notes file
## Entry notes table.
5. Present ambiguous entries
Show email, roles, flags, proposed decision, rationale. Record only after
explicit user confirmation.
6. Checkpoint
Update notes: last_cursor, session log, updated_at. Ask to continue if
next_cursor is set.
Hard rules
- Never call
closeAccessReviewCampaign or campaign setup mutations unless
the user explicitly requests setup work outside this skill.
- Never invent entry IDs or decisions — use MCP responses only.
- Never record non-
APPROVED without decision_note.
1---2name: access-review3description: Run a semi-automated Probo access review campaign. Use when the user wants to review access entries, decide approve/revoke/escalate, or resume an in-progress campaign with MCP and .probo/access-reviews/ notes.4---56# Access review78Run a **semi-automated** access review for campaign `$ARGUMENTS` (or ask the9user for the campaign name). Review entries only — do not create, start,10cancel, or close campaigns.1112Before executing, read these files **relative to this skill directory**:1314- `references/mcp-tools.md` — MCP tool names, inputs, pagination15- `references/decision-rubric.md` — semi-auto decision rules16- `references/notes-format.md` — working memory file schema1718## Preconditions19201. A Probo MCP server must be connected. The plugin ships two hosted servers,21 `probo-us` and `probo-eu`; self-hosted instances are configured in the agent.22 If tools fail with auth errors, stop and tell the user to complete OAuth23 sign-in for that server (Claude Code: `/mcp` or `claude mcp login probo-us`;24 Codex: `codex mcp login probo-us`; OpenCode/Cursor: configure MCP in settings25 then authenticate).262. Resolve **the server**, then **the organization**. These are separate27 choices: one server can hold several organizations, and the caller can have28 organizations on more than one server. Settle both before any campaign call,29 because `listAccessReviewCampaigns` requires `organization_id`.30 - **Server.** Use the server for the region the user names, or the only31 connected server when there is one. Otherwise call `listOrganizations` on32 each connected server and take the server whose organizations uniquely33 match the one the user named. Never infer the region from a merely34 non-empty result — when the match is not unique, show each server with the35 organizations it returned and ask which to use.36 - **Organization.** Once the server is settled, call `listOrganizations` on37 it unless an earlier probe already returned its organizations. Take the38 unique name match, or the only organization when the server returns one.39 Otherwise list them and ask the user to pick.403. Resolve the campaign from `$ARGUMENTS` (name match or GID) within that41 organization. If the campaign is ambiguous, list `listAccessReviewCampaigns`42 results and ask the user to pick one.434. Campaign `status` must be `IN_PROGRESS` or `PENDING_ACTIONS`. Stop with a44 clear message for `DRAFT`, `COMPLETED`, or `CANCELLED`.4546## Working notes file4748Create or resume `.probo/access-reviews/<campaign-slug>.md` per49`references/notes-format.md`. Create `.probo/access-reviews/` if missing.5051## Workflow5253### 1. Orient5455- Call `getAccessReviewStatistics` for the campaign.56- Summarize totals and pending count for the user.57- If no pending entries, report completion and stop.5859### 2. Fetch batch6061- Call `listAccessEntries` with `campaign_id`, `filter.decision: PENDING`,62 `size: 50`.63- Use `last_cursor` from the notes file when resuming.6465### 3. Classify each entry6667Apply `references/decision-rubric.md`:6869| Class | Action |70| --- | --- |71| **Auto** | Queue for `recordAccessReviewEntryDecisions` |72| **Ambiguous** | Present to user; do not write yet |73| **Skip** | Log in notes only (no API write) |7475Hold auto decisions in memory until step 4 succeeds — do not append them to the76notes file yet.7778### 4. Write auto decisions7980- Batch via `recordAccessReviewEntryDecisions` when possible.81- Non-`APPROVED` decisions **must** include `decision_note`.82- On MCP error, stop and do not advance `last_cursor` or update entry notes.83- After a successful API response, append each recorded auto decision to the84 notes file `## Entry notes` table.8586### 5. Present ambiguous entries8788Show email, roles, flags, proposed decision, rationale. Record only after89explicit user confirmation.9091### 6. Checkpoint9293Update notes: `last_cursor`, session log, `updated_at`. Ask to continue if94`next_cursor` is set.9596## Hard rules9798- Never call `closeAccessReviewCampaign` or campaign setup mutations unless99 the user explicitly requests setup work outside this skill.100- Never invent entry IDs or decisions — use MCP responses only.101- Never record non-`APPROVED` without `decision_note`.