diff --git a/.agents/skills/signer-slack-msg/SKILL.md b/.agents/skills/signer-slack-msg/SKILL.md deleted file mode 100644 index 9c5d086..0000000 --- a/.agents/skills/signer-slack-msg/SKILL.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -name: signer-slack-msg -description: Write the Slack message that accompanies a Safe msig batch for Nest signers — max-decoded call list, intent-first one-line description, expected SafeTxHash, and Transaction/Simulation placeholders. Use when generating slack.md for any msig batch artifact. ---- - -# Signer Slack message - -Audience: Safe signers reviewing before signing. The decoded calls ARE the documentation — the prose states INTENT only, never re-explains individual calls. Follow the curated style of `generated/nBASIS-timelock-migration-v2/56/slack.md` and nCREDIT v2 equivalents. - -**Grammar version: `nest-signer-message/1`.** The normative specification is [`docs/signer-message-grammar.md`](../../../docs/signer-message-grammar.md); SafeVerify (`plume-hub:packages/safe-verify/GRAMMAR.md`) reads a byte-identical copy, and both repositories pin its SHA-256. Generated messages MUST declare the pragma and MUST carry an explicit `op=`, `value=` and `sig=` on every call — a message without `op=`/`value=` is parsed under legacy defaults (`op=call value=0`) and mismatches whenever the batch actually delegatecalls or sends value, and one without `sig=` pins no selector, so an overload of the same name reads identically. `sig=` is the canonical ABI signature (`setUserRole(address,uint8,bool)`); the verifier derives its selector and compares it byte-for-byte. Run `pnpm check:signer-grammar` after editing either file. - -## Structure (exactly this shape) - -```` -:signed: @nestowners - on () — . - -*Queue 1 — one Safe batch, op Safe (0xa08a…a982), calls* -``` -grammar: nest-signer-message/1 -[0] (=