ops-linear — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ops-linear (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Before executing, load available context:
$LINEAR_API_KEY env varmcp__doppler__*) — if Doppler MCP server is configureddoppler secrets get LINEAR_API_KEY --plain (if doppler CLI configured in prefs)password_manager_config.query_cmd from ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json${CLAUDE_PLUGIN_DATA_DIR}/preferences.json for secrets_manager / doppler config.| Command | Usage | Output |
|---|---|---|
curl -X POST https://api.linear.app/graphql -H "Authorization: $LINEAR_API_KEY" -H "Content-Type: application/json" -d '{"query":"{ issues(filter: {state: {type: {in: [\"started\",\"unstarted\"]}}}) { nodes { id title state { name } priority assignee { name } } } }"}' | Active issues | JSON |
curl -X POST https://api.linear.app/graphql -H "Authorization: $LINEAR_API_KEY" -H "Content-Type: application/json" -d '{"query":"{ cycles(filter: {isActive: {eq: true}}) { nodes { id number startsAt endsAt } } }"}' | Current cycles | JSON |
Run in parallel:
mcp__linear__list_teams — get all team IDsmcp__linear__list_issues — get issues with cycle filter (use GraphQL fallback for cycle queries if needed)Then fetch issues for the current cycle: mcp__linear__list_issues filtered to current cycle ID.
$ARGUMENTS| Argument | Action |
|---|---|
| (empty), sprint | Show current sprint board |
| backlog | Show unassigned/unscheduled issues |
| create [title] | Create a new issue (prompt for details) |
| update [id] | Update issue by ID |
| sync | Sync GSD phases to Linear issues |
| [issue-id] | Show and edit that specific issue |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LINEAR ► SPRINT [N] — [start] → [end]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
IN PROGRESS
[id] [priority] [title] [assignee] [estimate]
TODO
[id] [priority] [title] [assignee] [estimate]
DONE THIS SPRINT
[id] [title] [completed date]
BLOCKED / CANCELLED
[id] [title] [reason]
──────────────────────────────────────────────────────
Sprint velocity: [done points] / [total points] ([%])
──────────────────────────────────────────────────────Use batched AskUserQuestion calls (max 4 options each):
AskUserQuestion call 1:
[Create new issue]
[Update issue status]
[Move issue to/from sprint]
[More...]AskUserQuestion call 2 (only if "More..."):
[View backlog]
[Sync with GSD phases]Collect from user (or parse from $ARGUMENTS):
Use mcp__linear__create_issue to create. Confirm: Created [id]: [title]
Read all active GSD STATE.md files across projects. For each active phase:
Update Linear issues to match GSD phase completion status.
Use AskUserQuestion after displaying any view to get the next action.
When the user starts working on a Linear issue, use TaskCreate to track it locally. Update with TaskUpdate as the issue progresses. This bridges Linear state with local session state.
When Linear MCP tools hit quota limits or fail, fall back to WebFetch with the Linear GraphQL API:
WebFetch(url: "https://api.linear.app/graphql", method: "POST", headers: {"Authorization": "$LINEAR_API_KEY"}, body: '{"query":"{ issues(filter: {cycle: {id: {eq: \"<id>\"}}}}) { nodes { id title state { name } } } }"}')CLAIM_KEY: linear:issue:<identifier> (e.g. linear:issue:HEA-123)
CLAIM_KEY="linear:issue:<identifier>"
ledger query --claim-key "$CLAIM_KEY" --since=-PT24HIf in_progress or done exists, skip — another session or Perplexity already acted on this issue. Surface awaiting_sam entries as "update already staged."
# Claim when creating, updating, or triaging a Linear issue
ledger write \
--claim-key "$CLAIM_KEY" \
--kind "file" \
--status "in_progress" \
--title "Linear: <identifier> — <title>" \
--ttl-sec 3600
# Resolve after Linear state is updated
ledger write \
--claim-key "$CLAIM_KEY" \
--kind "file" \
--status "done" \
--title "Linear: <identifier> — <title>" \
--context "status→<new_state> | assignee→<assignee>"~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.