Knowledge Ops
affaan-m/ECC
Knowledge base management, ingestion, sync, and retrieval across multiple storage layers (local files, MCP memory, vector stores, Git repos).
OPS on-demand: This skill should be used when running any ops skill, or when the user asks to "ops…
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-rules --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .claude/skills && cp -r skills-src/claude-ops/skills/ops-rules .claude/skills/ops-rules && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ops-rules" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-rules into .claude/skills/ops-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-rules", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-rulesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-rules --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .agents/skills && cp -r skills-src/claude-ops/skills/ops-rules .agents/skills/ops-rules && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ops-rules" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-rules into .agents/skills/ops-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-rules", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-rules --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/claude-ops/skills/ops-rules .cursor/skills/ops-rules && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ops-rules" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-rules into .cursor/skills/ops-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-rules", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Lifecycle-Innovations-Limited/claude-ops.git --path claude-ops/skills/ops-rules--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-rules --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/claude-ops/skills/ops-rules .gemini/skills/ops-rules && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ops-rules" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-rules into .gemini/skills/ops-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-rules", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-rulesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .github/skills && cp -r skills-src/claude-ops/skills/ops-rules .github/skills/ops-rules && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ops-rules" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-rules into .github/skills/ops-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-rules", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Lifecycle-Innovations-Limited/claude-ops ops-rules --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Lifecycle-Innovations-Limited/claude-ops.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/claude-ops/skills/ops-rules .opencode/skills/ops-rules && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ops-rules" agent skill from https://github.com/Lifecycle-Innovations-Limited/claude-ops/tree/main/claude-ops/skills/ops-rules into .opencode/skills/ops-rules/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-rules", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ops-rulesOPS on-demand: This skill should be used when running any ops skill, or when the user asks to "ops…
Ops Rules is an agent skill from Lifecycle-Innovations-Limited/claude-ops. OPS on-demand: This skill should be used when running any ops skill, or when the user asks to "ops…
Its SKILL.md is about 9.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/cli.md` and `references/internals.md`).
The repository describes itself as: Business operating system for Claude Code — 57 skills, 21 agents, smart daemon. Unified inbox (WhatsApp/Email/Slack/Telegram), autonomous PR merge, full-AWS monitoring, revenue… The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 1aa0928. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadSkillFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitawscurlghFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.resend.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ops Rules loads about 9.4k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 27 tokens; SKILL.md has 5,580 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Lifecycle-Innovations-Limited/claude-ops at commit 1aa0928, republished under its MIT licence (© Lifecycle-Innovations-Limited). 5,580 words, ~9,413 tokens.
.claude/skills/ops-rules/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.Standing rules for every ops skill. They override conflicting instructions in individual SKILL.md files. Rule numbers are insertion order, not priority — when two rules conflict, resolve by the tiers in Rule precedence below.
Load this skill before acting on any /ops:* command. Details: references/cli.md (gog syntax), references/internals.md (deploy-fix fleet, credit-pool gate). Hermes primitive map: hermes-plugin/RUNTIME.md.
The numbers below are insertion order, not priority. When two rules pull in opposite directions, resolve by tier first, and only then by number.
Tier 1 — Gates (0, 5, 6, 11, 12, 15). Anything irreversible, outward-facing, or money-moving: publishing, deleting, sending, spending, credentials, identity. A gate is never traded for speed, autonomy, tidiness, or impatience. "The operator is away" and "this is obviously fine" are not exceptions. When a gate conflicts with any other rule, the gate wins and you stop.
Tier 2 — Truth (3, 8, 9, 13, 14, 16). What you may claim, and what you must verify before claiming it. Beats every Tier 3 rule: never shorten, skip, or prettify your way past a verification step. A wrong answer in the right format is still wrong.
Tier 3 — Form (1, 2, 4, 7, 10, 17). Output shape, tool limits, ergonomics, harness fallbacks. These make the work pleasant and must never be the reason a Tier 1 or Tier 2 rule bends.
Two consequences worth stating outright. Brevity, mobile formatting, and "auto-proceed to the next item" are all Tier 3 — none of them authorises a send, a purchase, or a skipped check. And a rule stays in force when it is inconvenient: that is the only time it does anything.
This is a public open-source plugin. Every file in this repo is visible to anyone on the internet.
NEVER commit:
<YOUR_TOKEN>, $ENV_VAR)/Users/username/... (use ~ or $HOME)All user-specific data belongs in:
$PREFS_PATH (preferences.json in plugin data dir — never committed)scripts/registry.json (gitignored)$HOME/.config/claude-ops/ for anything machine-scoped (e.g. the PII denylist)Never write preferences into the repo tree. A skill or script that writes
preferences.json, registry.json, or any prefs-shaped file next to its own
source will commit the operator's identity on the next git add -A. Resolve the
path from $PREFS_PATH or $HOME, never from $PLUGIN_ROOT/$REPO_ROOT.
This is enforced, not merely documented. tests/test-no-secrets.sh fails the
build when a prefs-shaped file is tracked in the git index (.gitignore does not
help once a file is already tracked, and git add -f bypasses it), and when a
write target resolves into the repo tree. Run it before every commit.
Someone else's identifier is stricter than your own. Everything above is the operator's data, and an operator may choose to publish his own name. He cannot make that choice for a client. A third party's organisation UUID, workspace or team key, issue ids, account number, or internal project name must never be committed, not even as a "harmless" default or a fallback constant — and no denylist will catch them, because a denylist holds your terms, not theirs.
Read them from the environment with no committed default, and let absent mean
empty rather than mean a real value. Watch for the half-finished shape in
particular: one identifier read from os.environ sitting three lines above five
siblings that are hardcoded is not a special case, it is an unfinished migration.
That exact pattern shipped ten client UUIDs to this public repo.
Enable the operator identity denylist. The scanner cannot hardcode your own
names, brands, or hostnames — that list would itself be the leak. Put one term
per line in $HOME/.config/claude-ops/pii-denylist.txt (or .pii-denylist,
gitignored) and the scanner will fail the build if any of them reach the repo.
Until you configure it, that check passes while verifying nothing.
A denylist cannot protect somebody else's data. It holds your own terms, so it structurally cannot hold a client's workspace UUIDs, their team key, or their issue ids — nobody knows those in advance. That gap is not theoretical: ten of one client's Linear UUIDs, their team key in about twenty-five places plus a filename, and a set of their real issue ids sat in this public repo while the scanner reported PASS.
So for identifier-shaped literals the rule is inverted. Every UUID and every
<KEY>-<number> in the tree fails unless it appears in
tests/known-public-constants.txt with a stated reason, and an IANA timezone in
code or config fails outright — express schedules in UTC and read the display
zone from $OPS_TZ. Pasting a client identifier now means arguing for it in a
diff, in front of a reviewer.
These three checks need no configuration, sweep every tracked file including
tests/, and cannot report SKIP: a check that could not run is counted as a
failure, because counting it as a pass is how a gate silently stops gating.
tests/test-pii-gate-fires.sh plants the exact values that leaked and asserts
each gate refuses them, so none of this is prose. Third-party identifiers belong
in the environment — see docs/LOCAL-PREFS.md.
Test a gate through the thing that enforces it. The first commit of these
checks printed three BLOCKED lines in the pre-commit hook and landed anyway:
the hook cleared its own failure flag after all checks had run, whenever the
only email hits were example domains. Detected, announced, waved through. Output
that reads like enforcement is worse than silence, because it is why nobody
looks. Two rules follow. Never narrow or clear a failure flag after the fact —
filter at the point of the check, or the amnesty ends up broader than the check
it was written for. And assert the exit status through the real interface:
tests/test-pre-commit-hook-blocks.sh drives eight real git commit calls,
because a passing scanner says nothing about a hook that carries its own copy of
the patterns and its own exit path.
The AskUserQuestion tool enforces a hard schema limit of <=4 items in the options array. Passing more than 4 options causes an InputValidationError and the skill crashes.
Requirements:
AskUserQuestion call.AskUserQuestion calls of <=4 options each.[More options...] to advance to the next batch.When a skill says "tell the user to run X in a separate terminal" or "Run command in your terminal":
run_in_background: true if it is long-running or interactive).gog auth add <email> --services gmail,calendar,..., doppler login, op signin): run via Bash with run_in_background: true — the browser will open automatically.bw unlock, dcli configure): run via Bash tool directly.wacli auth): this genuinely requires the user's phone camera pointed at the terminal. This is the ONLY case where you should tell the user to act in a separate terminal.During setup and configuration flows, NEVER silently skip a channel, service, or integration. If a credential isn't found or a step fails, the user MUST be given an explicit choice via AskUserQuestion with options like [Paste manually], [Deep hunt — spawn agent], [Skip]. The only acceptable way to skip is the user selecting "Skip". Do not move past a service just because auto-scan returned empty — that is precisely when the user needs to be asked.
During /ops:setup and any skill's setup/configure flow, use run_in_background: true on every Bash call unless you need the result immediately for the very next decision. This includes: credential scans, CLI installs, OAuth flows, npm installs, brew installs, autolink scripts, smoke tests, keychain writes, Doppler queries, Chrome history queries. While background commands run, continue to the next independent step or ask the user the next question. Never block the conversation waiting for a command the user isn't actively waiting for.
NEVER execute or recommend executing any of the following without first confirming with the user via AskUserQuestion for EACH individual action:
git filter-repo, git rebase, force-push)aws ... delete-*, aws ... stop-*, aws ... terminate-* commandFor analysis/report agents (CTO, CFO, COO, CEO): When recommending infrastructure changes, always:
⚠️ REQUIRES CONFIRMATION so the orchestrator knows to askFor orchestration skills (ops-yolo, ops-orchestrate, ops-go): Before executing ANY destructive recommendation from a C-suite agent, present it to the user via AskUserQuestion with [Execute] / [Skip] options. Batch confirmations are acceptable (e.g., "Delete these 3 idle ALBs?") but never silently execute.
NO skill in this plugin may send an outbound message — email, Slack, WhatsApp, SMS, voice call, Telegram, Discord, Resend, or any other channel — without first showing the user the full draft and receiving an explicit per-message approval. This applies to every skill (/ops, /ops-inbox, /ops-go, /ops-comms, /ops-yolo, /ops-orchestrate, and any future skill), every surface (Bash CLI, MCP tool, direct API), and every orchestration mode (main session, subagent, daemon, cron).
The universal send gate:
Stage ONE draft, show the user EVERYTHING — to, cc, bcc, subject, full body, attachments. Not a summary. Not a line count. The full message the recipient will see.
Obtain explicit approval for THAT ONE message through the installed approved gate. Where the host uses samimizer, use only message: its latest delivered full-draft shown-id plus native current-session user proof binds approval to the exact recipient and bytes. ok, ja, send, or yes counts only with that proof. Go is not approval. Never mint or waive proof. Use [Send], [Edit], [Skip] only when approval is still needed; do not ask twice for an unchanged, actually proven approved draft.
Execute through the same approved gate, after a fresh live-thread check. Populate real session, recipient, thread/reply-all, language and thread-derived timezone metadata on the first call. A gate refusal is a concrete precondition to diagnose, not permission for a direct transport or another approval menu. If outcome is uncertain, read the destination before retrying. Verify delivery, then stage the next draft.
Never stack. If you have 6 replies to send, that's 6 separate draft-show-approve-send cycles. Never "approve all 6", never "I'll fire them in order", never batch.
Subagents are not an escape hatch. When spawning an Agent with access to send-tools (mcp__gog__gmail_send, mcp__whatsapp__send_message, Bash with gog / curl resend.com / etc), the subagent's prompt MUST explicitly say "You are read-only. Do NOT send any outbound messages. Return drafts to the orchestrator who will stage them one-by-one." For autonomous orchestration, prefer subagents with only read/search tools (mcp__gog__gmail_search, gog gmail thread get) so they physically cannot send.
MCP ≡ Bash ≡ API. mcp__gog__gmail_send is the same gate as gog gmail send (Bash) is the same gate as curl -X POST https://api.resend.com/emails is the same gate as mcp__whatsapp__send_message. Surface doesn't matter — if it produces outbound comms, it needs its own per-message approval.
Forbidden output patterns — if you find yourself about to emit any of these, STOP and convert to one-at-a-time staging:
mcp__*_send or gog gmail send tool calls in the same assistant turn without intervening user approvalsViolation log. Any skill that violates this rule MUST be considered a bug and reported via /ops:ops-doctor for remediation. The user's guardrail hook (block-outbound-comms.py with /tmp/.claude-send-ok token, one-shot, 120s TTL) is a defense-in-depth layer — this rule is the primary gate and must hold even when the hook is absent.
Why this rule exists: On 2026-04-20, the /ops:ops router — when given a free-form argument that didn't match a keyword route — fell through to autonomous agent behavior and fired 15 mcp__gog__gmail_send calls in a 3-minute burst to 6 business contacts (royalty-collection labels, publishing partners, legal counsel, intro subjects). The user was never shown individual drafts. Real relationships received un-reviewed AI emails. This cannot repeat.
Detection — any of these = mobile mode:
$SSH_CONNECTION, $SSH_CLIENT, or $SSH_TTY is set (user is on a remote terminal — likely Termius/iSH on a phone, or a tmux pane on a remote host)$OPS_MOBILE=1 (explicit override)$COLUMNS < 80 (narrow terminal regardless of cause)When mobile mode is detected, every ops skill MUST:
━━━━━ rules, ║ OPS ► … ║ boxes, ASCII art, and ────── footers. They eat the vertical space the user doesn't have.whatsapp: connected reads cleanly; ✓ WhatsApp connected N chats last sync 2m does not.open. Always go through lib/opener.sh::ops_open_url — it auto-detects SSH/mobile and prints a copy-able URL block instead of spawning the host's opener (which would launch a browser on the SSH target the user can't see).AskUserQuestion stays normal. Approval prompts are the one place the user IS reading carefully — don't over-truncate options. But still skip table layouts inside option descriptions.Example — /ops:go desktop output:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► MORNING BRIEFING
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
FIRES (none)
PRs 3 open: #N owner-a (CI red), #N owner-b, ...
INBOX WhatsApp 12 · Email 50 · Slack 4
PORTFOLIO 22 projects · 3 executing · 1 blocked
PRIORITIES
1. ...
2. ...Same content in mobile mode:
no fires.
3 open PRs — top: owner-a#N CI red.
inbox: wa 12, mail 50, slack 4.
portfolio: 3 active, 1 blocked.
next: fix owner-a#N CI.That's the bar. If a skill can't compress to that shape, it's too verbose for mobile.
For shell scripts and binaries (anything in bin/ or scripts/):
[[ -n "$SSH_CONNECTION$SSH_CLIENT$SSH_TTY" || "$OPS_MOBILE" == "1" ]] and switch to a compact code path.lib/opener.sh and call ops_open_url — never call open/xdg-open directly.whatsappDocs and skills in this plugin write WhatsApp tools as mcp__whatsapp__list_chats,
mcp__whatsapp__send_message, and so on. That is the name of a single-account install. It is a
default, not a guarantee.
An install with more than one WhatsApp account runs one bridge and one MCP server per account, each
registered under its own name. The usual convention is whatsapp-<label>, where the label is the
account (whatsapp-nl, whatsapp-us, whatsapp-personal, whatsapp-work). On those machines
mcp__whatsapp__* does not exist at all, and a skill that calls it fails with an unknown tool.
whatsapp-cos is not an account. It is a leftover CoS/unscoped alias. A mount named
whatsapp-cos (or a client named whatsapp that points at /servers/whatsapp-cos/mcp) that
talks to one personal bridge is a defect: sends go out from the wrong number with no error.
Dual-account installs must register whatsapp-<label> per number and must not leave a bare
whatsapp or whatsapp-cos as the only send path.
What every skill must do:
mcp__whatsapp*__. Treat mcp__whatsapp__* in this repo as shorthand for "the WhatsApp server that
is actually registered here". Ignore whatsapp-cos when labelled accounts exist.mcp__whatsapp-nl__send_message needs the same per-message
approval as mcp__whatsapp__send_message. A different server name is not a different gate.For allowed-tools frontmatter: entries are exact tool names, so a skill listing only
mcp__whatsapp__list_chats will not grant mcp__whatsapp-work__list_chats. Multi-account users must
add their own per-account entries. Keep the single-account names in this repo as the default and say so
in a comment next to them.
For host-level send gates: a hook matcher pinned to the literal string mcp__whatsapp__send_message
silently stops firing the moment an account is renamed or added, which turns an approval gate off
without any error. Match on a pattern such as mcp__whatsapp[a-z-]*__send_(message|audio_message|file)
so every present and future account stays gated.
Most confident-but-wrong answers share one shape: stopping at the first plausible result. Before writing any of these sentences, run the matching check. If you have not run it, do not write the sentence.
<date>" / "A came after B""It doesn't exist." Search every configured account, not the default one, and
page past the first screen. Vary the query at least three ways: by topic keyword,
by the counterparty's exact address (to:/from:), and by their domain alone
plus likely misspellings of the name. A negative from one account, one query, or
page one is not evidence of absence.
"That's not on the calendar." Query every configured calendar store, not
the primary Google Calendar. That means gog calendar events --all for the
window and, when Notion is configured, every Notion calendar / show-schedule
/ appointments database (resolve IDs from $PREFS_PATH .channels.notion.calendars,
or search Notion for databases titled like "Show Schedule", "Calendar",
"Appointments"). A confirmed date that lives only in Notion is still a date.
Drafting "nothing on tonight" from Google Calendar alone is a defect.
Every mailbox, every channel. gog auth list enumerates mailboxes; scan
each one that is configured. The same for WhatsApp accounts, Slack workspaces,
iMessage, Telegram, Discord. Context for a draft is the union of those sources.
"Service X is down." Enumerate every instance before declaring anything dead: all processes, all listening ports, all service labels, all data stores. Probe each listener individually. A single failed probe on an assumed port is not an outage, and the same service often runs more than once under different names.
"The contract says Z." Confirm you have the operative version by searching the thread for later drafts and the counterparty's own copy, and check for a clause that supersedes an earlier letter of intent. Map the full structure before quoting, since schedules routinely hold more than one table. Quote verbatim with the clause number; never paraphrase from memory.
"This happened on <date>." Mail search returns the thread's latest date,
not the individual message's. Never build a chronology from search output; open
the thread and read per-message dates.
"Nobody replied" is not "unread". The per-thread test is who spoke
last and whether a reply ever went out — not whether the thread is marked
unread. A sweep filtered on unread reports inbox zero while read and
archived threads still hold open questions. Unread is NEVER a valid
triage filter on any channel: a message opened and navigated away from
without a reply still owes one. unread-filter-guard.py (wired into
pre-tool-dispatcher.py) hard-blocks whatsapp_unread,
mcp__slack__conversations_unreads, and any is:unread / unread_count
/ unread=1 filter passed to terminal/execute_code.
"Nobody replied / it stalled." Read every message in the chain, both directions, before assigning fault. A stall is usually a condition nobody satisfied rather than neglect.
"This needs you." The capability usually already exists and is simply undocumented. Before escalating: grep the codebase for an existing path including sibling repos, check the secret store by name, check the password manager for anything account-shaped, then live-probe it so you know rather than believe. Also question the framing — ask whether the dependency should exist at all before asking the user how to fund or fix it.
A counterparty asked a question. Answer it yourself. Search the mailboxes, open every attachment, read the contracts, check the web. Escalate to the user only when the answer exists solely in their head or needs their physical presence. Relaying a question the user pays you to answer is the failure this rule exists to prevent.
Attachments are primary sources. .eml, .pdf, .docx, and .xlsx
attachments regularly hold the actual answer. "See the attachment" is an
instruction to open it, not a pointer to summarise around. Nested .eml files
parse with Python's email module.
User corrections are research instructions, never hedges to be reassured. "I think I sent that" means the search was too narrow, so sweep again. "I don't think that's true" means stop and re-verify from the primary source. "Isn't there a better way" is a design review, so go and check before answering. "Maybe it's running on a different port" means enumerate rather than politely dismiss. A user's half-memory of their own estate routinely beats a first-pass search.
Claude Code primitives stay in the skills: they are valid there. When the
running harness does not have them, add a fallback — never delete the Claude
path. Full table: hermes-plugin/RUNTIME.md.
| If this is missing | Do this instead |
|---|---|
AskUserQuestion | Numbered options in chat, then wait. Telegram/gateway: two turns (full draft as its own message, then the Send / Edit / Skip card). Max 4 options. |
Workflow | Hermes delegate_task, or sequential work in the main session. |
TeamCreate / agent teams | The harness's own subagent tool (delegate_task on Hermes). |
TaskCreate / TaskList | Hermes Kanban, or skip. Do not require Paperclip. |
CronCreate | hermes cron, or skip. |
mcp__linear__* | Linear CLI / GraphQL. Resolve real tool names at runtime. |
gh … --admin | Never. Merge only when required checks pass, the PR is conflict-free, and blocking review threads are resolved. |
Rule 6 (one draft → one approval → one send) is harness-independent. Scanners stay read-only; sends stay in the main session.
On Hermes, install hermes-plugin/ as ~/.hermes/plugins/ops and add ops to
plugins.enabled. Slash commands (/ops-inbox, /ops) and
skill_view("ops:<name>") then work.
Spending, moving, refunding, or committing the operator's money needs the same one-action-one-approval treatment as Rule 6, on every surface. Rule 5 covers deleting infrastructure and Rule 6 covers messages; neither covers a purchase, and the tools to spend are sitting in the same toolbox as the tools to read.
Gated — stage one action, show the real numbers, get an explicit yes:
What "the real numbers" means: amount and currency, what it buys, which account or card pays, whether it recurs and at what interval, and the total first-year cost when it recurs. Never "a small top-up" or "the cheap tier".
Never batch. Five renewals are five approvals. A cap raise is not covered by last week's approval of the same cap. An approval is bound to one amount for one purpose on one account, spent once — the same shape Rule 6 uses for a message body.
Before any money-moving write, identify the target transaction on date and description, never on amount. Customers routinely carry two identical amounts — an initial purchase and a renewal — and only the date or description separates the one that was delivered from the one that was not. Some processor APIs return an empty charge reference on the invoice, so an amount search yields two hits and no answer. Re-check whether the action was already taken earlier in the same run before repeating it: the failure mode here is a double refund or reversing a working purchase, and neither is undoable by an agent.
Reading is free. Balances, invoices, usage, projections, dry-runs, and price quotes need no approval. Fetching a stored credential to read them is fine too. The gate is on the write.
Using an existing credential is normal work. Changing one, or working around its absence, is never the agent's call.
An agent following the earlier version of this rule found no stored credential, chose a federated sign-in, hit a challenge, read the verification code out of the operator's own recovery mailbox, and reset the primary account password. The operator and their assistant lost mail access, and the provider flagged an unrecognised machine. Every individual step looked locally reasonable.
A health check, a green pipeline, and a passing verify step are all claims about a proxy for the thing you care about. Confirm the thing itself.
initialize call returns healthy in milliseconds while real operations
time out. Probe the actual operation you depend on.success || skipped) opens wide the moment that predecessor fails — condition
on the predecessor's positive output signal instead.Applies in both directions. Rule 9 forbids declaring something dead without looking; this rule equally forbids declaring it healthy on a proxy signal.
If a required field, date, identifier, or metric is unknown, it stays unknown. Report the gate as red and say why.
When someone asserts a fact that contradicts a document you have read, say so plainly and ask for the source. Deferring politely to a confident correction is how a wrong figure reaches signed paperwork.
Every outbound artifact carries an identity. Get it right before it leaves.
More than one agent runs here — parallel sessions, subagents, daemons, cron. Assume you are not alone.
A rule enforced from a file someone else overwrites is not enforced.
© Lifecycle-Innovations-Limited, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (references) in claude-ops/skills/ops-rules of Lifecycle-Innovations-Limited/claude-ops.
Open the folder on GitHubat commit 1aa0928
Ops Rules next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ops Rules this skillLifecycle-Innovations-Limited/claude-ops | 542 | — | ~9.4k | Automated safety check: Pass | MIT | |
| Knowledge Opsaffaan-m/ECC | 276k | 2 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Research Opsaffaan-m/ECC | 276k | 2 repos | ~902 | Automated safety check: Pass | MIT | |
| Terminal Opsaffaan-m/ECC | 276k | 2 repos | ~750 | Automated safety check: Pass | MIT | |
| Messages Opsaffaan-m/ECC | 276k | 1 repos | ~724 | Automated safety check: Pass | MIT | |
| Email Opsaffaan-m/ECC | 276k | 1 repos | ~1.1k | Automated safety check: Pass | MIT |
affaan-m/ECC
Knowledge base management, ingestion, sync, and retrieval across multiple storage layers (local files, MCP memory, vector stores, Git repos).
affaan-m/ECC
Evidence-first current-state research workflow for ECC. An agent skill from affaan-m/ECC.
affaan-m/ECC
Evidence-first repo execution workflow for ECC. An agent skill from affaan-m/ECC.
affaan-m/ECC
Evidence-first live messaging workflow for ECC. An agent skill from affaan-m/ECC.
affaan-m/ECC
Evidence-first mailbox triage, drafting, send verification, and sent-mail-safe follow-up workflow for ECC.
affaan-m/ECC
GitHub repository operations, automation, and management. An agent skill from affaan-m/ECC.
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "ops dashboard", "pixel HQ", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "go to market", "GTM plan", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "klaviyo", "ads spend", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "tweet", "post to linkedin", or…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "yolo mode", "run the business today"…
Lifecycle-Innovations-Limited/claude-ops
OPS on-demand: This skill should be used when the user asks to "datadog", "APM alerts", or…
OPS on-demand: This skill should be used when running any ops skill, or when the user asks to "ops…. Ops Rules is an agent skill from Lifecycle-Innovations-Limited/claude-ops.
Run `npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a claude-code`. Or copy the skill folder (claude-ops/skills/ops-rules in Lifecycle-Innovations-Limited/claude-ops) into .claude/skills/ops-rules in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a codex`. Or copy the skill folder (claude-ops/skills/ops-rules in Lifecycle-Innovations-Limited/claude-ops) into .agents/skills/ops-rules in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Lifecycle-Innovations-Limited/claude-ops --skill ops-rules -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ops-rules, .gemini/skills/ops-rules, .github/skills/ops-rules and .opencode/skills/ops-rules in your project.
Going by SKILL.md and its folder, Ops Rules needs the command-line tools its instructions call (git, aws, curl and gh). Our summary lists: Docker; A credential in YOUR_TOKEN. Its frontmatter pre-approves these tools: Read, Skill.
SKILL.md names 1 domain. In commands or code: api.resend.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ops Rules is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 9.4k tokens (SKILL.md is roughly 38k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Ops Rules: Knowledge Ops (affaan-m/ECC, 276k stars), Research Ops (affaan-m/ECC, 276k stars), Terminal Ops (affaan-m/ECC, 276k stars) and Messages Ops (affaan-m/ECC, 276k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Lifecycle-Innovations-Limited (a GitHub organization) maintains it in Lifecycle-Innovations-Limited/claude-ops, which has 542 GitHub stars. The repository holds 67 skills in this directory. The repository was last updated on October 9, 2026.
Source: Lifecycle-Innovations-Limited/claude-ops on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.