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/SanctumInstalls into whichever agent you are using.
Amazon Q Rules
Amazon Q Developer rules
Quality Score
Category
Development & EngineeringSupported Platforms
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.
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 foundOur 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.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| Sanctum (this skill)by Teycir | 69 | 0 | — | Amazon Q Rules |
| taste-skillby Leonxlnx | 100 | 111.0k | 1d ago | CLAUDE.md |
| ai-job-searchby ai-job-search-dev | 100 | 70.0k | today | CLAUDE.md |
| claude-howtoby luongnv89 | 100 | 46.6k | 3d ago | CLAUDE.md |
| lobehubby lobehub | 100 | 84.2k | today | MCP 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.
Skill content
View source on GitHubBug 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:
- Reject any PR that removes features to fix bugs
- Reject any PR that skips tests instead of fixing them
- Reject any PR that simplifies APIs by removing security-critical parameters
- Require documentation of root cause for all bug fixes
- 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
taste-skill
111.0kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
ai-job-search
70.0kThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.
claude-howto
46.6kA visual, example-driven guide to Claude Code — from basic concepts to advanced agents, with copy-paste templates that bring immediate value.
lobehub
84.2k🤯 LobeHub - Super-Agents on Your Team. Add super-agents to the chats your team already uses.They take on work by themselves and get better every week.
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
