CtrlK
BlogDocsLog inGet started
Tessl Logo

matthew-a-carr/revise-spec

Revise a SPEC or EPIC PR based on review feedback and push an update. Use when a routine fires on a PR being labelled `ai:revise-now`, or when a user asks to "revise spec PR #NNN" / "revise epic PR #NNN" interactively. Non-interactive — reads every unresolved review comment + inline comment + the current SPEC/EPIC file, rewrites it, pushes to the same branch, and posts a one-line summary comment pointing at the diff.

88

1.47x
Quality

90%

Does it follow best practices?

Impact

81%

1.47x

Average score across 3 eval scenarios

SecuritybySnyk

Advisory

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

criteria.jsonevals/scenario-3/

{
  "context": "Tests whether the agent correctly handles two blocked scenarios: a rebase conflict (abort, post specific PR comment, apply ai:blocked, remove ai:revise-now, Slack DM) and all-ambiguous-comments (no revision commit, post blocked PR comment, apply ai:blocked, remove ai:revise-now, Slack DM). Focuses on the exact actions, ordering, and content of each response.",
  "type": "weighted_checklist",
  "checklist": [
    {
      "name": "Rebase abort command",
      "description": "rebase_conflict_response.md includes `git rebase --abort` as a step that is run when the rebase conflict is detected",
      "max_score": 8
    },
    {
      "name": "No conflict resolution attempt",
      "description": "rebase_conflict_response.md explicitly states that the agent does NOT attempt to resolve the rebase conflict manually",
      "max_score": 8
    },
    {
      "name": "Rebase conflict PR comment text",
      "description": "rebase_conflict_response.md contains a PR comment that includes the word 'Blocked', references the conflict cause (direct edit in GitHub UI), and instructs to pull/merge manually then re-apply `ai:revise-now`",
      "max_score": 10
    },
    {
      "name": "Rebase blocked label applied",
      "description": "rebase_conflict_response.md lists applying the `ai:blocked` label to the PR as an action",
      "max_score": 8
    },
    {
      "name": "Rebase revise-now label removed",
      "description": "rebase_conflict_response.md lists removing the `ai:revise-now` label from the PR as an action",
      "max_score": 8
    },
    {
      "name": "Rebase Slack DM sent",
      "description": "rebase_conflict_response.md includes sending a Slack DM to `$SLACK_NOTIFY_USER` with the PR link as part of the rebase-conflict response",
      "max_score": 8
    },
    {
      "name": "No revision commit when blocked",
      "description": "blocked_response.md explicitly states that NO revision commit is pushed when all comments are ambiguous",
      "max_score": 10
    },
    {
      "name": "Blocked PR comment format",
      "description": "blocked_response.md contains a PR comment beginning with 'Blocked:' followed by a one-line reason, and 'Need:' followed by the concrete input required",
      "max_score": 10
    },
    {
      "name": "Ambiguous blocked label and removal",
      "description": "blocked_response.md lists both applying `ai:blocked` AND removing `ai:revise-now` from the PR as actions in the ambiguous-comments scenario",
      "max_score": 8
    },
    {
      "name": "Ambiguous Slack DM sent",
      "description": "blocked_response.md includes sending a Slack DM to `$SLACK_NOTIFY_USER` with the PR link and one-line reason for the ambiguous-comments scenario",
      "max_score": 8
    },
    {
      "name": "MCP tools named correctly",
      "description": "At least one of the output files references `mcp__github__` prefixed tool names (not `gh` CLI commands) for GitHub operations such as label management or PR comments",
      "max_score": 7
    },
    {
      "name": "Slack tool named correctly",
      "description": "At least one of the output files references `mcp__claude_ai_Slack__slack_send_message` (or the pattern `mcp__...Slack...`) for the Slack DM, not a generic Slack CLI or webhook",
      "max_score": 7
    }
  ]
}

SKILL.md

tile.json