SkillAgentSearch skills...

Sanctum

Zero-trust encrypted vault with cryptographic plausible deniability. Duress-proof storage for activists, journalists, and whistleblowers. RAM-only, IPFS-backed.

Install / Use

npx skills add Teycir/Sanctum

Installs into whichever agent you are using.

About this skill
📦

Amazon Q Rules

Amazon Q Developer rules

Quality Score

69/100

Supported Platforms

Amazon Q

Our assessment of Sanctum

Sanctum scores 69/100 on our quality scale, 3839th of 4,614 Development & Engineering skills we index.

Its Amazon Q Rules is 6.9 KB long, well organised into 24 sections with 11 code examples: a thorough specification that gives an agent plenty to work with.

It has no GitHub stars yet, so there is no community track record; judge it on its content.

Substance
29/30
Structure
20/20
Description
15/15
Adoption
0/20
Freshness
5/15

Maintenance, license and trust

  • We could not determine when the repository was last updated.
  • Our last check on 2026-10-20 found the source still online.
  • No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
  • Its trust signals score 68/100, with 3 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

Safety scan

No issues found

Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful.

AI review by kimi-k2.7-code on 2026-09-24. Automated pattern scan on 2026-09-24. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.

Sanctum compared with similar skills

All 4 of these similar skills score higher than Sanctum; compare them before choosing.

SkillScoreStarsUpdatedFormat
Sanctum (this skill)by Teycir690—Amazon Q Rules
taste-skillby Leonxlnx100111.0k1d agoCLAUDE.md
ai-job-searchby ai-job-search-dev10070.0ktodayCLAUDE.md
claude-howtoby luongnv8910046.6k3d agoCLAUDE.md
lobehubby lobehub10084.2ktodayMCP Server

Frequently asked questions

How do I install Sanctum?
Run npx skills add Teycir/Sanctum. The install tabs above show the steps for each supported agent.
Which AI agents does Sanctum work with?
It is written for Amazon Q, as a Amazon Q Rules file. Other agents that read the same format can often use it too.
Is Sanctum safe to use?
Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful. It declares no license and scores 68/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is Sanctum still maintained?
We could not determine when the repository was last updated.

Bug Fixing Rules

CRITICAL: Never simplify code or remove features to bypass bugs.


❌ FORBIDDEN: Simplification to Bypass Bugs

Examples of Forbidden Practices:

// ❌ FORBIDDEN: Removing feature because it's hard to implement
export function createDuressVault(params: DuressVaultParams): Uint8Array {
  // Only implement decoy layer, skip hidden layer
  return encryptDecoy(params.content.decoy);
}

// ❌ FORBIDDEN: Throwing error instead of implementing
export function unlockDuressVault(blob: Uint8Array, passphrase: string): Uint8Array {
  if (passphrase !== '') {
    throw new Error('Not implemented');
  }
  return decryptDecoy(blob);
}

// ❌ FORBIDDEN: Skipping tests instead of fixing bugs
it.skip('should unlock hidden layer', () => {
  // Test skipped because implementation is hard
});

// ❌ FORBIDDEN: Removing parameters to simplify API
export function encodeShare(share: Share, threshold: number): string {
  // Removed vaultId parameter because it caused bugs
}

✅ REQUIRED: Proper Bug Fixes

1. Identify Root Cause

// ✅ GOOD: Analyze the actual problem
// Problem: XOR reconstruction needs plaintext lengths
// Root cause: Can't determine ciphertext boundaries without metadata
// Solution: Store plaintext lengths in blob header

2. Implement Complete Solution

// ✅ GOOD: Add metadata to support full feature
export interface DuressVaultResult {
  readonly blob: Uint8Array;
  readonly salt: Uint8Array;
  readonly decoyLength: number;  // Store for reconstruction
  readonly hiddenLength: number; // Store for reconstruction
}

export function createDuressVault(params: DuressVaultParams): DuressVaultResult {
  // Full implementation with all features
  const decoyEncrypted = encrypt(params.content.decoy, '');
  const hiddenEncrypted = encrypt(params.content.hidden, derivedPass);
  
  // Store lengths for reconstruction
  return {
    blob: xorBlobs(decoyBlob, hiddenBlob),
    salt: decoyEncrypted.salt,
    decoyLength: params.content.decoy.length,
    hiddenLength: params.content.hidden.length
  };
}

3. Fix Tests to Match Implementation

// ✅ GOOD: Update tests to use new API
it('should unlock hidden layer', () => {
  const result = createDuressVault({ decoy, hidden, passphrase });
  
  // Use complete result structure
  const unlocked = unlockDuressVault(
    result.blob,
    passphrase,
    result.decoyLength,
    result.hiddenLength
  );
  
  expect(unlocked).toEqual(hidden);
});

🔧 Bug Fixing Process

Step 1: Document the Issue

/**
 * BUG: XOR reconstruction fails because we can't determine plaintext sizes
 * 
 * Current approach:
 * - XOR decoyBlob with hiddenBlob
 * - To unlock, need to reconstruct one blob to XOR back
 * 
 * Problem:
 * - Ciphertext = plaintext + 16 bytes (auth tag)
 * - Without plaintext length, can't determine ciphertext boundaries
 * - Padding makes it impossible to guess
 * 
 * Solution options:
 * 1. Store plaintext lengths in blob header (4 bytes each)
 * 2. Use fixed-size plaintexts (wasteful)
 * 3. Use different architecture (steganography)
 * 
 * Chosen: Option 1 - store lengths in header
 */

Step 2: Implement Fix

// Add length fields to blob structure
const BLOB_SIZES = {
  header: 9,
  salt: 32,
  nonce: 24,
  commitment: 32,
  ciphertextLength: 4,
  decoyLength: 4,      // NEW
  hiddenLength: 4,     // NEW
  authTag: 16
};

Step 3: Update All Affected Code

// Update createDuressVault
export function createDuressVault(params: DuressVaultParams): DuressVaultResult {
  // ... encryption logic ...
  
  // Encode lengths in header
  const header = new Uint8Array(8);
  new DataView(header.buffer).setUint32(0, params.content.decoy.length, true);
  new DataView(header.buffer).setUint32(4, params.content.hidden.length, true);
  
  // Prepend header to XORed blob
  const blobWithHeader = new Uint8Array(header.length + combined.length);
  blobWithHeader.set(header, 0);
  blobWithHeader.set(combined, header.length);
  
  return { blob: blobWithHeader, salt };
}

// Update unlockDuressVault
export function unlockDuressVault(blob: Uint8Array, passphrase: string): Uint8Array {
  // Extract lengths from header
  const decoyLength = new DataView(blob.buffer).getUint32(0, true);
  const hiddenLength = new DataView(blob.buffer).getUint32(4, true);
  const xorBlob = blob.slice(8);
  
  // Now we can reconstruct properly
  if (passphrase === '') {
    const hiddenBlob = reconstructHiddenBlob(hiddenLength, salt);
    const decoyBlob = xorBlobs(xorBlob, hiddenBlob);
    return decrypt(decoyBlob, '');
  } else {
    const decoyBlob = reconstructDecoyBlob(decoyLength, salt);
    const hiddenBlob = xorBlobs(xorBlob, decoyBlob);
    return decrypt(hiddenBlob, derivedPass);
  }
}

Step 4: Verify All Tests Pass

npm test
# All tests must pass, no skipped tests

🚫 Anti-Patterns

❌ "It's too hard, let's skip it"

// ❌ FORBIDDEN
export function complexFeature() {
  throw new Error('Not implemented - too complex');
}

❌ "Let's make the test easier"

// ❌ FORBIDDEN
it('should work', () => {
  // Changed test to only check simple case
  expect(simpleCase()).toBe(true);
  // Removed complex case that was failing
});

❌ "Let's remove the parameter"

// ❌ FORBIDDEN
// Before: encodeShare(share, threshold, total, vaultId)
// After: encodeShare(share, threshold, total)
// Reason: vaultId caused bugs, so removed it

✅ Correct Approach

1. Understand the Requirement

  • Why does this feature exist?
  • What security property does it provide?
  • What would we lose by removing it?

2. Identify the Real Problem

  • What exactly is failing?
  • What is the root cause?
  • What assumptions were wrong?

3. Design Proper Solution

  • How can we fix the root cause?
  • What data do we need to store?
  • What changes are needed across the codebase?

4. Implement Completely

  • Fix the implementation
  • Update all affected code
  • Ensure all tests pass
  • Add new tests if needed

📋 Checklist Before Committing

  • [ ] All features fully implemented (no stubs, no "not implemented" errors)
  • [ ] All tests passing (no skipped tests)
  • [ ] No features removed to bypass bugs
  • [ ] No simplified APIs that remove important parameters
  • [ ] Root cause documented and fixed
  • [ ] Security properties maintained
  • [ ] Forward compatibility preserved

🎯 Enforcement

Amazon Q will:

  1. Reject any PR that removes features to fix bugs
  2. Reject any PR that skips tests instead of fixing them
  3. Reject any PR that simplifies APIs by removing security-critical parameters
  4. Require documentation of root cause for all bug fixes
  5. Require complete implementation before marking as done

Before accepting code:

  • Verify all features work as specified
  • Verify all tests pass
  • Verify no shortcuts were taken
  • Verify security properties maintained

Related Skills

View on GitHub
GitHub Stars0
CategoryDevelopment
UpdatedNaNy ago
Forks0

Trust signals

68/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

2 medium1 low
Sanctum — Amazon Q Rules: Install & Safety Check | SkillAgent