/verify
Verify changes to the claude-for-msft-365-install admin scripts and commands by driving them against an isolated fake $HOME.
$ npx -y skills add anthropics/financial-services --skill verify --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/verify
Context preview
The summary Claude sees to decide when to auto-load this skill.
Verify changes to the claude-for-msft-365-install admin scripts and commands by driving them against an isolated fake $HOME.
SKILL.md
verify.SKILL.mdname: verify
description: Verify changes to the claude-for-msft-365-install admin scripts and commands by driving them against an isolated fake $HOME.
Verifying claude-for-msft-365-install
This plugin is **admin CLI tooling**, not an app. There is nothing to build and no server to boot. The surface is the terminal: `scripts/*.sh` on macOS, `scripts/*.ps1` on Windows.
Lint gate
python3 scripts/check.py # from the REPO ROOT, not the plugin dir
bash -n claude-for-msft-365-install/scripts/<script>.sh
`check.py` lints every manifest and self-installs the pre-commit hook that patch-bumps `.claude-plugin/plugin.json`. Run it before committing.
Drive the scripts against a fake $HOME
Every macOS script resolves Office paths from `$HOME`, so overriding it gives a throwaway sandbox — you can exercise the destructive `--apply` paths without touching real Office data.
S=<scratchpad>/sandbox
for app in Excel Word Powerpoint; do
mkdir -p "$S/Library/Containers/com.microsoft.$app/Data/Documents/wef"
done
printf '<x/>' > "$S/Library/Containers/com.microsoft.Excel/Data/Documents/wef/aaaaaaaa-1111-1111-1111-111111111111.manifest-a.xml"
HOME=$S ./scripts/clear-addin-cache.sh # list
HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> # dry-run
HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> --apply # destructive
Seed at least **two IDs across two apps**, with **mixed upper/lowercase**. Both properties have caught real bugs: cross-app blast radius, and a case-sensitive glob that reported "already clear" and sent admins to a folder-wide wipe.
Prove storage is retained
The load-bearing claim of this plugin is that clearing a manifest never touches the user's chat history. Verify it by snapshot-diffing both trees around the operation, against the **real** `$HOME`:
snap() {
for app in Excel Word Powerpoint; do
find "$HOME/Library/Containers/com.microsoft.$app/Data/Library/WebKit/WebsiteData" \
-type f -exec stat -f '%N %z %m' {} \; 2>/dev/null
find "$HOME/Library/Containers/com.microsoft.$app/Data/Documents/wef" \
-type f -exec stat -f 'WEF %N %z' {} \; 2>/dev/null
done | sort
}
snap > before.txt; <run the script>; snap > after.txt; diff before.txt after.txtManifests live in `Data/Documents/wef`; storage lives in `Data/Library/WebKit/WebsiteData`. Different subtrees — the diff should show only the manifest you removed. **Restore any planted files and re-diff to confirm you left the machine as you found it.**
Gotchas
- **The Bash tool runs zsh.** Scripts are `#!/usr/bin/env bash`; test bash-only
behaviour (`shopt`, glob semantics) inside `bash <<'EOF' … EOF`, not inline.
- **`PRAGMA integrity_check` and `SELECT count(*)` fail on exported IndexedDB
files** with `no such collation sequence: IDBKEY`. That is WebKit's custom collation, not corruption — it fails on the source file too. Verify completeness with `SELECT sum(length(value)) FROM Records;` on both sides.
- **Never claim the `.ps1` scripts work without running them on Windows.**
macOS has no PowerShell, so a `.ps1` change verified only here is unverified. Run it on a real Windows host against Windows PowerShell 5.1, and always include a **parse check** before the behavioural ones:
$e = $null
[System.Management.Automation.PSParser]::Tokenize(
(Get-Content -Raw .\clear-addin-cache.ps1), [ref]$e) | Out-Null
if ($e.Count) { $e | ForEach-Object { $_.Message } } else { 'parse ok' }A file can be perfectly fine on macOS and fail to parse outright on Windows (see the ASCII note below), so parsing is the first thing to establish.
- **`.ps1` files must be pure ASCII** (enforced by `scripts/check.py`).
Windows PowerShell 5.1 reads a BOM-less `.ps1` as ANSI, so an em dash decodes to mojibake containing `"`, which terminates a string and breaks the parse. `clear-addin-cache.ps1` shipped broken this way and no macOS check caught it.
- Probe the arg parser. `--flag` as the final argument makes `shift 2` fail
under `set -e` and exits 1 with **no output**; each flag needs a `[ $# -ge 2 ]` guard.
Read more
name: verify description: Verify changes to the claude-for-msft-365-install admin scripts and commands by driving them against an isolated fake $HOME.
Verifying claude-for-msft-365-install
This plugin is **admin CLI tooling**, not an app. There is nothing to build and no server to boot. The surface is the terminal: `scripts/*.sh` on macOS, `scripts/*.ps1` on Windows.
Lint gate
python3 scripts/check.py # from the REPO ROOT, not the plugin dir bash -n claude-for-msft-365-install/scripts/<script>.sh
`check.py` lints every manifest and self-installs the pre-commit hook that patch-bumps `.claude-plugin/plugin.json`. Run it before committing.
Drive the scripts against a fake $HOME
Every macOS script resolves Office paths from `$HOME`, so overriding it gives a throwaway sandbox — you can exercise the destructive `--apply` paths without touching real Office data.
S=<scratchpad>/sandbox for app in Excel Word Powerpoint; do mkdir -p "$S/Library/Containers/com.microsoft.$app/Data/Documents/wef" done printf '<x/>' > "$S/Library/Containers/com.microsoft.Excel/Data/Documents/wef/aaaaaaaa-1111-1111-1111-111111111111.manifest-a.xml" HOME=$S ./scripts/clear-addin-cache.sh # list HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> # dry-run HOME=$S ./scripts/clear-addin-cache.sh --id <GUID> --apply # destructive
Seed at least **two IDs across two apps**, with **mixed upper/lowercase**. Both properties have caught real bugs: cross-app blast radius, and a case-sensitive glob that reported "already clear" and sent admins to a folder-wide wipe.
Prove storage is retained
The load-bearing claim of this plugin is that clearing a manifest never touches the user's chat history. Verify it by snapshot-diffing both trees around the operation, against the **real** `$HOME`:
snap() {
for app in Excel Word Powerpoint; do
find "$HOME/Library/Containers/com.microsoft.$app/Data/Library/WebKit/WebsiteData" \
-type f -exec stat -f '%N %z %m' {} \; 2>/dev/null
find "$HOME/Library/Containers/com.microsoft.$app/Data/Documents/wef" \
-type f -exec stat -f 'WEF %N %z' {} \; 2>/dev/null
done | sort
}
snap > before.txt; <run the script>; snap > after.txt; diff before.txt after.txtManifests live in `Data/Documents/wef`; storage lives in `Data/Library/WebKit/WebsiteData`. Different subtrees — the diff should show only the manifest you removed. **Restore any planted files and re-diff to confirm you left the machine as you found it.**
Gotchas
- **The Bash tool runs zsh.** Scripts are `#!/usr/bin/env bash`; test bash-only
behaviour (`shopt`, glob semantics) inside `bash <<'EOF' … EOF`, not inline.
- **`PRAGMA integrity_check` and `SELECT count(*)` fail on exported IndexedDB
files** with `no such collation sequence: IDBKEY`. That is WebKit's custom collation, not corruption — it fails on the source file too. Verify completeness with `SELECT sum(length(value)) FROM Records;` on both sides.
- **Never claim the `.ps1` scripts work without running them on Windows.**
macOS has no PowerShell, so a `.ps1` change verified only here is unverified. Run it on a real Windows host against Windows PowerShell 5.1, and always include a **parse check** before the behavioural ones:
$e = $null
[System.Management.Automation.PSParser]::Tokenize(
(Get-Content -Raw .\clear-addin-cache.ps1), [ref]$e) | Out-Null
if ($e.Count) { $e | ForEach-Object { $_.Message } } else { 'parse ok' }A file can be perfectly fine on macOS and fail to parse outright on Windows (see the ASCII note below), so parsing is the first thing to establish.
- **`.ps1` files must be pure ASCII** (enforced by `scripts/check.py`).
Windows PowerShell 5.1 reads a BOM-less `.ps1` as ANSI, so an em dash decodes to mojibake containing `"`, which terminates a string and breaks the parse. `clear-addin-cache.ps1` shipped broken this way and no macOS check caught it.
- Probe the arg parser. `--flag` as the final argument makes `shift 2` fail
under `set -e` and exits 1 with **no output**; each flag needs a `[ $# -ge 2 ]` guard.
Reference agents, skills, and data connectors for the financial-services workflows we see most — investment banking, equity research, private equity, and wealth management.
Other skills on financial-services.
- /audit-xls
Audit a spreadsheet for formula accuracy, errors, and common mistakes. Scopes to a selected range, a single sheet, or the entire model (including financial-model integrity checks like BS balance, cash tie-out, and logic sanity). Triggers on "audit this sheet", "check my
Open skill - /earnings-analysis
Create professional equity research earnings update reports (8-12 pages, 3,000-5,000 words) analyzing quarterly results for companies already under coverage. Fast-turnaround format focusing on beat/miss analysis, key metrics, updated estimates, and revised thesis. Includes 1-3
Open skill - /earnings-preview
Build pre-earnings analysis with estimate models, scenario frameworks, and key metrics to watch. Use before a company reports quarterly earnings to prepare positioning notes, set up bull/bear scenarios, and identify what will move the stock. Triggers on "earnings preview", "what
Open skill - /model-update
Update financial models with new data — quarterly earnings, management guidance, macro changes, or revised assumptions. Adjusts estimates, recalculates valuation, and flags material changes. Use after earnings, guidance updates, or when assumptions need refreshing. Triggers on
Open skill - /morning-note
Draft concise morning meeting notes summarizing overnight developments, trade ideas, and key events for coverage stocks. Designed for the 7am morning meeting format — tight, opinionated, actionable. Triggers on "morning note", "morning meeting", "what happened overnight", "trade
Open skill - /xlsx-author
Produce a .xlsx file on disk (headless) instead of driving a live Excel workbook — for managed-agent sessions with no open Office app.
Open skill

