Skip to content
Back to skills

Move Safety Core Directives

ASecurity

Lightweight core directives for Sui Move always-required skills - injected into every breadth agent. Full methodology lives in the dedicated Move-Safety Agent.

  • 281 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 6, 2026
blockchain

Security analysis

A100/100

Scanned September 6, 2026

npx -y skills add PlamenTSV/plamen --skill move-safety-core-directives --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Move Safety Core Directives?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Move Safety Core Directives
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/plamentsv-move-safety-core-directives-plamen/badge)](https://www.skillsdirectory.com/skills/plamentsv-move-safety-core-directives-plamen)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: "move-safety-core-directives"
description: "Lightweight core directives for Sui Move always-required skills - injected into every breadth agent. Full methodology lives in the dedicated Move-Safety Agent."
type: "core-directive"
---

# Move Safety Core Directives (Sui)

> **Purpose**: These are the INVENTORY + FLAG directives extracted from the 4 always-required Sui skills (ABILITY_ANALYSIS, BIT_SHIFT_SAFETY, TYPE_SAFETY, OBJECT_OWNERSHIP). Every breadth agent receives these to flag Move-specific patterns for depth review. The full trace methodology lives in the dedicated Move-Safety Agent (spawned separately).
> **Total**: ~155 lines (vs ~900 lines for 4 full skills)

## 1. Ability Inventory (from ABILITY_ANALYSIS)

Enumerate ALL structs. For each:

| Module | Struct | Abilities | Has `id: UID`? | Is Object? | Transferable? | Notes |
|--------|--------|-----------|----------------|------------|---------------|-------|

**Flag for depth review**:
- Struct with `copy` that holds `Balance<T>` or represents economic value -> [FLAG:ABILITY-COPY-VALUE]
- Struct with `drop` that represents an obligation (receipt, hot potato) -> [FLAG:ABILITY-DROP-OBLIGATION]
- Receipt/hot potato consumed against an object without checking a stored source object ID (order_id, pool_id, position_id, loan_id) -> [FLAG:RECEIPT-ID-MISMATCH]
- Object (`key`) with `store` that should restrict transfers -> [FLAG:ABILITY-EXCESS-STORE]
- Hot potato (no abilities) with no consumption path in the protocol -> [FLAG:ABILITY-STUCK-HOTPOTATO]
- `copy + key` combination (impossible in Sui; compilation error) -> [FLAG:ABILITY-INVALID-COMBO]

## 2. Bit Shift Inventory (from BIT_SHIFT_SAFETY)

**GREP**: Search all `.move` files for `<<` and `>>`.

For each shift operation:

| Location | Operand Type | Bit Width | Shift Amount Source | User-Controllable? | Bounded? |
|----------|-------------|-----------|--------------------|--------------------|----------|

**Flag for depth review**:
- Shift amount is user-controllable or computed AND unbounded -> [FLAG:SHIFT-UNBOUND]
- Shift amount is constant but >= bit width -> [FLAG:SHIFT-OVERFLOW-CONST]
- Shift in public/entry function with external input path -> [FLAG:SHIFT-EXTERNAL]

## 3. Generic Type Inventory (from TYPE_SAFETY)

**GREP**: Search all `.move` files for `fun .*<` to find every generic function.

For each generic function:

| Function | Module | Type Params | Constraints | Entry? | Creates/Destroys T? |
|----------|--------|-------------|-------------|--------|---------------------|

**Flag for depth review**:
- Generic function accepting `Coin<T>` or `Balance<T>` without verifying T matches expected type -> [FLAG:TYPE-COIN-CONFUSION]
- Generic function accepting both `T` and a runtime selector/config/index/object (asset id, pool id, position id) without binding them together -> [FLAG:TYPE-CONFIG-MISMATCH]
- Generic with only `store` constraint where `key` or specific type is needed -> [FLAG:TYPE-WEAK-CONSTRAINT]
- Generic entry function callable by anyone with attacker-chosen type -> [FLAG:TYPE-ATTACKER-CHOSEN]
- One-Time Witness (OTW) type used outside `init()` or not consumed -> [FLAG:TYPE-OTW-LEAK]

## 4. Move Reference Assignment Inventory

**GREP**: Search all `.move` files for destructuring from mutable references and assignments between destructured names:
- `let Struct { ... } = <expr returning &mut Struct>`
- assignments inside the same function where the left-hand identifier came from a `&mut` destructure
- reset/accounting code that uses `left = limit`, `remaining = cap`, `field_ref = other_ref` instead of `*left = *limit`

For each candidate:

| Function | Destructured Ref Fields | Assignment | LHS Dereferenced? | RHS Dereferenced? | Intended Field Written? |
|----------|-------------------------|------------|-------------------|-------------------|-------------------------|

**Flag for depth review**:
- Assignment to a mutable reference variable without `*` on the LHS when the intent is to update the stored field value -> [FLAG:REF-REASSIGN-WRONG-FIELD]
- Destructured mutable reference later reassigned to another field reference, causing writes to affect the wrong field -> [FLAG:REF-ALIAS-CORRUPTION]
- Epoch/limit/cooldown/quota reset logic using field references where value copy was intended -> [FLAG:REF-RESET-BUG]

## 5. Object Ownership Inventory (from OBJECT_OWNERSHIP)

Classify every object (`key` ability) by ownership model:

| Object | Ownership | Created Via | Has `store`? | Transfer Restricted? | Dynamic Fields? |
|--------|-----------|-------------|-------------|---------------------|-----------------|

**Flag for depth review**:
- Shared object mutated without access control -> [FLAG:OBJ-SHARED-UNGUARDED]
- `public` function returns `&mut` or exposes `borrow_mut`/dynamic-field mutable access to internal sensitive state without a capability or `public(package)` restriction -> [FLAG:OBJ-PUBLIC-MUT-REF]
- Object with `store` that should NOT be freely transferable -> [FLAG:OBJ-EXCESS-TRANSFER]
- Object deleted via `object::delete` without cleaning up dynamic fields -> [FLAG:OBJ-DELETE-DIRTY]
- Owned object wrapped/unwrapped in ways that change its accessibility -> [FLAG:OBJ-WRAP-ESCAPE]
- Object with `Balance<T>` field but no withdrawal function -> [FLAG:OBJ-STRANDED-BALANCE]

## Self-Check

Before completing analysis, verify you produced inventories for ALL 5 sections above. Missing inventories = missing coverage for Move-specific vulnerability classes.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.