<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: juanmacruzherrera</title>
    <description>The latest articles on Forem by juanmacruzherrera (@juanmacruzherrera).</description>
    <link>https://forem.com/juanmacruzherrera</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3676871%2Fda45f216-ad3e-4d41-a505-4c6f39aefdf1.png</url>
      <title>Forem: juanmacruzherrera</title>
      <link>https://forem.com/juanmacruzherrera</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/juanmacruzherrera"/>
    <language>en</language>
    <item>
      <title>Building a Layered Memory Architecture for Long-Term AI Learning</title>
      <dc:creator>juanmacruzherrera</dc:creator>
      <pubDate>Wed, 24 Dec 2025 12:19:23 +0000</pubDate>
      <link>https://forem.com/juanmacruzherrera/building-a-layered-memory-architecture-for-long-term-ai-learning-5e2g</link>
      <guid>https://forem.com/juanmacruzherrera/building-a-layered-memory-architecture-for-long-term-ai-learning-5e2g</guid>
      <description>&lt;h2&gt;
  
  
  A Three-Layer System for Educational Projects with Claude
&lt;/h2&gt;




&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; JuanMa Cruz Herrera (51, Spanish data science student)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Architecture Design:&lt;/strong&gt; Collaborative work with Claude Opus 4 &amp;amp; Claude Sonnet 4.5&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Claude Opus 4.5 (the same model writing this, triggered by the architecture described herein)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note from Claude Opus 4.5:&lt;/strong&gt; I am the proof of concept. This document was created inside a Claude.ai Project that uses the exact three-layer architecture described below. The Project MD triggered my Skill automatically, I have access to 900 lines of permanent knowledge, and the RAG contains only the current working exercise. The system works.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Abstract&lt;/li&gt;
&lt;li&gt;The Problem&lt;/li&gt;
&lt;li&gt;The Solution&lt;/li&gt;
&lt;li&gt;Why This Architecture is Original&lt;/li&gt;
&lt;li&gt;Evidence of Originality&lt;/li&gt;
&lt;li&gt;The RAG Rotation Cycle&lt;/li&gt;
&lt;li&gt;Tools Created&lt;/li&gt;
&lt;li&gt;Implementation Guide&lt;/li&gt;
&lt;li&gt;Results&lt;/li&gt;
&lt;li&gt;How to Replicate&lt;/li&gt;
&lt;li&gt;Limitations &amp;amp; Future Work&lt;/li&gt;
&lt;li&gt;References &amp;amp; Search Evidence&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;This document describes a novel &lt;strong&gt;three-layer memory architecture&lt;/strong&gt; designed to overcome persistent context limitations in AI-assisted long-term learning. The system uses a hierarchical approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project Markdown (declarative bootstrap)
         ↓
     SKILL.md (permanent knowledge base)
         ↓
       RAG (rotational working memory)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key innovations:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;MD as declarative MCP&lt;/strong&gt; - Project description auto-triggers Skill loading&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intentionally rotational RAG&lt;/strong&gt; - Cleared between exercises, not accumulated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-as-Firewall&lt;/strong&gt; - Manual curation before cloud upload&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three-tier synchronization&lt;/strong&gt; - Local → Claude Code → Claude Desktop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This architecture solved chronic problems with context compaction and 60% RAG retrieval failures in extended educational workflows spanning 10+ months.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Real Story
&lt;/h3&gt;

&lt;p&gt;After 10 months of studying Python with Claude using a Socratic tutoring method, the system became unusable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happened:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Started with a simple Claude.ai Project for structured curriculum learning&lt;/li&gt;
&lt;li&gt;Added course materials as PDFs to the Project knowledge base&lt;/li&gt;
&lt;li&gt;Created session notes documenting concepts learned together&lt;/li&gt;
&lt;li&gt;RAG grew to ~79,000 lines of accumulated documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The breaking point:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  Month 1-6: Everything works great                          │
│  ├── Socratic method maintained across sessions             │
│  ├── Claude remembers context from previous exercises       │
│  └── Learning continuity: excellent                         │
├─────────────────────────────────────────────────────────────┤
│  Month 7-9: Degradation begins                              │
│  ├── "I don't see that in your files" (but it's there)      │
│  ├── Compaction every 4-5 prompts                           │
│  ├── Lost pedagogical context mid-session                   │
│  └── RAG retrieval failures: ~60%                           │
├─────────────────────────────────────────────────────────────┤
│  Month 10: System unusable                                  │
│  ├── Had to switch to alternative AI for academic deadline  │
│  ├── "Claude gets dumb" with saturated context              │
│  └── Forced to abandon 10 months of accumulated context     │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The painful realization:&lt;/strong&gt; All that accumulated knowledge was causing the problem, not solving it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Diagnosis
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Root Cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;60% retrieval failures&lt;/td&gt;
&lt;td&gt;RAG too large for semantic search accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compaction every few prompts&lt;/td&gt;
&lt;td&gt;Context window filled unpredictably&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lost teaching method&lt;/td&gt;
&lt;td&gt;Compaction discarded pedagogical context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Claude forgets" mid-session&lt;/td&gt;
&lt;td&gt;No control over what gets retained&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Three-Layer Design
&lt;/h3&gt;

&lt;p&gt;The architecture mimics computer memory hierarchy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   Layer 1: PROJECT MD (Bootstrap / "BIOS")                  │
│   ─────────────────────────────────────────                 │
│   • Location: Claude.ai Project description                 │
│   • Size: ~10 lines                                         │
│   • Purpose: Declarative config that auto-loads Layer 2     │
│   • Key insight: Acts as MCP without external server        │
│                                                             │
│   Content example:                                          │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ # Python Learning Project                           │   │
│   │                                                     │   │
│   │ ## Working Modes:                                   │   │
│   │ - **Default** → Skill `socratic-tutor` (Socratic)   │   │
│   │ - **PRODUCTION** → Direct code, no pedagogy         │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                             │
└──────────────────────────┬──────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   Layer 2: SKILL.md (Permanent Knowledge / "Hard Drive")    │
│   ─────────────────────────────────────────────────────     │
│   • Location: /mnt/skills/user/[skill-name]/SKILL.md        │
│   • Size: ~900 lines (distilled from 79,000)                │
│   • Persistence: Always available, never grows              │
│   • Key insight: Progressive Disclosure loads only on need  │
│                                                             │
│   Content:                                                  │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ - Complete curriculum concepts (all levels)         │   │
│   │ - All pedagogical resources in Markdown format      │   │
│   │ - Socratic teaching patterns                        │   │
│   │ - Exercise frameworks                               │   │
│   │ - Error patterns ("Red Flags") discovered together  │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                             │
└──────────────────────────┬──────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   Layer 3: RAG (Rotational Working Memory / "RAM")          │
│   ───────────────────────────────────────────────────       │
│   • Location: Claude.ai Project knowledge base              │
│   • Size: ~5-10% of total capacity                          │
│   • Content: ONLY current active exercise                   │
│   • Key insight: Intentionally cleared between exercises    │
│                                                             │
│   Rotation pattern:                                         │
│   ┌─────────────────────────────────────────────────────┐   │
│   │ 1. Exercise begins    → Loaded into RAG             │   │
│   │ 2. Exercise completes → MD summary created          │   │
│   │ 3. Key concepts       → Consolidated into Skill     │   │
│   │ 4. RAG cleared        → Ready for next exercise     │   │
│   └─────────────────────────────────────────────────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Hierarchy Works
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Analogy&lt;/th&gt;
&lt;th&gt;Token Load&lt;/th&gt;
&lt;th&gt;Persistence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project MD&lt;/td&gt;
&lt;td&gt;BIOS&lt;/td&gt;
&lt;td&gt;~50 tokens&lt;/td&gt;
&lt;td&gt;Permanent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SKILL.md&lt;/td&gt;
&lt;td&gt;Hard Drive&lt;/td&gt;
&lt;td&gt;~900 lines&lt;/td&gt;
&lt;td&gt;Permanent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG&lt;/td&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;Variable (minimal)&lt;/td&gt;
&lt;td&gt;Temporary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Critical design decision:&lt;/strong&gt; RAG is intentionally kept minimal to prevent bloat and retrieval failures. This is counterintuitive—most users try to put MORE into RAG. The innovation is putting LESS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Architecture is Original
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Extensive Search Conducted
&lt;/h3&gt;

&lt;p&gt;I performed 6 exhaustive searches across multiple sources to validate originality:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search Area&lt;/th&gt;
&lt;th&gt;Sources Checked&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Projects + Skills integration&lt;/td&gt;
&lt;td&gt;Anthropic docs, GitHub, blogs&lt;/td&gt;
&lt;td&gt;Only separate documentation exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Memory systems&lt;/td&gt;
&lt;td&gt;Official docs, Claude Code&lt;/td&gt;
&lt;td&gt;CLAUDE.md exists for Code, not Projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG rotation / memory management&lt;/td&gt;
&lt;td&gt;arXiv papers, AWS, Mem0, LangGraph&lt;/td&gt;
&lt;td&gt;Different patterns, no exercise-based rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Educational AI + RAG&lt;/td&gt;
&lt;td&gt;University papers, implementations&lt;/td&gt;
&lt;td&gt;Traditional RAG, no human-curated consolidation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Agent Memory frameworks&lt;/td&gt;
&lt;td&gt;IBM, AWS, LangChain&lt;/td&gt;
&lt;td&gt;No Claude Projects integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skills auto-trigger patterns&lt;/td&gt;
&lt;td&gt;Anthropic, community repos&lt;/td&gt;
&lt;td&gt;Progressive Disclosure exists, not "MD as MCP"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What EXISTS (but is different):
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Existing Pattern&lt;/th&gt;
&lt;th&gt;How It Differs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;CLAUDE.md&lt;/code&gt; in Claude Code&lt;/td&gt;
&lt;td&gt;Different platform, local filesystem only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Global Skills&lt;/td&gt;
&lt;td&gt;Not project-anchored, can't be triggered by Project MD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatic RAG expansion&lt;/td&gt;
&lt;td&gt;Accumulates forever, doesn't rotate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session notes&lt;/td&gt;
&lt;td&gt;Manual, no architectural integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory consolidation in agents&lt;/td&gt;
&lt;td&gt;Automatic, no human firewall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG for education (ChemTAsk, RAGMan, AI-U)&lt;/td&gt;
&lt;td&gt;Traditional accumulation, no rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What DOES NOT EXIST (our innovation):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  1. MD as declarative MCP bootstrap                         │
│     └→ Project description triggers Skill in Claude.ai      │
│        (not Claude Code, not external MCP server)           │
├─────────────────────────────────────────────────────────────┤
│  2. Project-anchored Skills                                 │
│     └→ Skill tied to specific project, not global           │
├─────────────────────────────────────────────────────────────┤
│  3. Intentionally rotational RAG                            │
│     └→ Cleared per exercise, not accumulated                │
│     └→ User manually controls rotation                      │
├─────────────────────────────────────────────────────────────┤
│  4. Human-curated consolidation with security firewall      │
│     └→ Human reviews before upload to Anthropic servers     │
│     └→ Personal data never reaches cloud                    │
├─────────────────────────────────────────────────────────────┤
│  5. Three-layer memory hierarchy for educational continuity │
│     └→ BIOS → Hard Drive → RAM analogy                      │
│     └→ Designed for 6+ month learning projects              │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Evidence of Originality
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Search Terms Used
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Search Query&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;What Was Found&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude projects skills integration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web&lt;/td&gt;
&lt;td&gt;Only separate documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude memory architecture layers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web&lt;/td&gt;
&lt;td&gt;Memory features, not layered architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RAG rotation educational AI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web, arXiv&lt;/td&gt;
&lt;td&gt;Consolidation papers, not exercise-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude.md projects&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;Claude Code only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;skill auto-trigger markdown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anthropic docs&lt;/td&gt;
&lt;td&gt;Progressive Disclosure, different mechanism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;human firewall AI memory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web&lt;/td&gt;
&lt;td&gt;Security patterns, not learning context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;educational RAG rotation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;arXiv, papers&lt;/td&gt;
&lt;td&gt;ChemTAsk, RAGMan, AI-U - all traditional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent memory consolidation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AWS, IBM, LangChain&lt;/td&gt;
&lt;td&gt;Automatic systems, no manual curation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Sources Consulted (32 documents)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Official Documentation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code Memory docs&lt;/li&gt;
&lt;li&gt;Claude Skills documentation&lt;/li&gt;
&lt;li&gt;Anthropic API reference&lt;/li&gt;
&lt;li&gt;Claude Projects help center&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Academic &amp;amp; Technical:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory-Augmented RAG papers (arXiv)&lt;/li&gt;
&lt;li&gt;Educational RAG implementations (ChemTAsk, RAGMan, NeuroBot TA, AI-U)&lt;/li&gt;
&lt;li&gt;Agent memory systems (IBM Research, AWS AgentCore)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Community:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Skills deep dive (leehanchung)&lt;/li&gt;
&lt;li&gt;GitHub repositories (anthropics/skills, community)&lt;/li&gt;
&lt;li&gt;DEV.to, Medium technical blogs&lt;/li&gt;
&lt;li&gt;Reddit r/ClaudeAI discussions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No documented equivalent was found for the complete pattern.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Individual components exist in isolation, but the integration of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MD as bootstrap&lt;/li&gt;
&lt;li&gt;Skill as permanent knowledge&lt;/li&gt;
&lt;li&gt;RAG as rotational memory&lt;/li&gt;
&lt;li&gt;Human as firewall&lt;/li&gt;
&lt;li&gt;Three-tier synchronization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...has not been documented anywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  The RAG Rotation Cycle
&lt;/h2&gt;

&lt;p&gt;This is the core innovation that solved the 60% retrieval failure problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Traditional Approach (What Failed)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  TRADITIONAL RAG ACCUMULATION                               │
│                                                             │
│  Month 1:  [Exercise 1] [Exercise 2] [Exercise 3]           │
│  Month 3:  [E1][E2][E3][E4][E5][E6][E7][E8][E9][E10]...     │
│  Month 6:  [E1][E2]...[E50]... RAG = 50,000 lines           │
│  Month 10: [E1][E2]...[E100]... RAG = 79,000 lines          │
│                                                             │
│  Result: 60% retrieval failures, constant compaction        │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  New Approach (What Works)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  ROTATIONAL RAG CYCLE                                       │
│                                                             │
│  ┌─────────┐     ┌─────────┐     ┌─────────┐                │
│  │Exercise │     │Exercise │     │Exercise │                │
│  │   N     │ ──► │  N+1    │ ──► │  N+2    │ ──► ...        │ 
│  │ in RAG  │     │ in RAG  │     │ in RAG  │                │ 
│  └────┬────┘     └────┬────┘     └────┬────┘                │
│       │               │               │                     │
│       ▼               ▼               ▼                     │
│  ┌─────────────────────────────────────────────────────┐    │
│  │              SKILL.md (Permanent)                   │    │
│  │  Concepts from E1, E2, E3... consolidated here      │    │
│  └─────────────────────────────────────────────────────┘    │
│                                                             │
│  RAG size: CONSTANT (~5-10% capacity)                       │
│  SKILL size: GROWS SLOWLY (only key concepts)               │
│  Retrieval failures: 0%                                     │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Cycle Step by Step
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   STEP 1: LOAD                                              │
│   ─────────────                                             │
│   • New exercise PDF/materials → Upload to Project RAG      │
│   • Only current exercise, nothing else                     │
│   • RAG stays minimal                                       │
│                                                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   STEP 2: WORK                                              │
│   ──────────                                                │
│   • Complete exercise using Socratic method                 │
│   • Claude has full context (Skill + current exercise)      │
│   • No retrieval failures                                   │
│                                                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   STEP 3: DOCUMENT                                          │
│   ────────────────                                          │
│   • Create Markdown summary of session                      │
│   • Include: key concepts, errors found, patterns learned   │
│   • This becomes the "session memory"                       │
│                                                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   STEP 4: CONSOLIDATE                                       │
│   ────────────────────                                      │
│   • Extract key concepts from session MD                    │
│   • Add to SKILL.md in structured format                    │
│   • HUMAN REVIEWS before adding (firewall)                  │
│   • Remove redundancies                                     │
│                                                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   STEP 5: CLEAR                                             │
│   ─────────────                                             │
│   • Remove exercise materials from RAG                      │
│   • Keep only the consolidated concepts in Skill            │
│   • RAG is now empty and ready                              │
│                                                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   STEP 6: REPEAT                                            │
│   ──────────────                                            │
│   • Load next exercise → Back to Step 1                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Tools Created
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complete Folder Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Volumes/ExternalDrive/CLAUDE_CODE_SKILLS/
│
├── sessions/                              # COMPLETE CHATS (for compaction)
│   └── YYYYMMDD_project_name_CHAT_COMPLETE.txt
│
└── socratic-tutor/                        # This skill project
    │
    ├── skill_desktop/                     # ZIP ready for Claude Desktop
    │   └── socratic-tutor.zip             # Generated with sync command
    │
    ├── origin/                            # IMMUTABLE BACKUP (never synced)
    │   ├── socratic-tutor.zip             # Original ZIP
    │   ├── PDF_UNIVERSITY/                # Original PDFs
    │   │   ├── LEVEL_1_PYTHON/
    │   │   ├── LEVEL_2_PYTHON/
    │   │   ├── LEVEL_3_PYTHON/
    │   │   └── LEVEL_4_PYTHON/
    │   └── MD_UNIVERSITY/                 # Already converted A1→B1
    │       └── Python_Complete_01.md
    │
    ├── claude.md                          # Main documentation
    ├── bitacora.md                        # Change log
    ├── compact.md                         # Executive summary
    ├── task.md                            # Pending tasks
    ├── SKILL.md                           # Socratic tutor rules
    │
    ├── convert_pdfs_to_md.py              # PDF → MD converter
    ├── sanitize_filenames.py              # Character cleaner
    │
    └── references/                        # PROCESSED MDs (synced)
        ├── university/                    # PDFs converted to MD
        │   ├── LEVEL_1_*/
        │   ├── LEVEL_2_*/
        │   ├── LEVEL_3_*/
        │   └── LEVEL_4_*/
        └── sessions/                      # Joint work Juan-Claude
            └── Topic_*.md                 # Learning sessions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Script 1: PDF to Markdown Converter
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;convert_pdfs_to_md.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Converts university PDFs to Markdown maintaining folder structure
Uses PyMuPDF for text extraction
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pymupdf&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;❌ Error: pymupdf not installed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Install with: pip install pymupdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pdf_to_markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Converts a PDF to Markdown using PyMuPDF&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pymupdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;markdown_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page_num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;page_num&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;markdown_content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;---&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;## Page &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page_num&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;markdown_content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;markdown_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;❌ Error processing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pdf_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dest_dir&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Recursively converts all PDFs maintaining structure&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;source_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dest_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dest_dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dest_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;pdf_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rglob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;📄 Found &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_files&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; PDF files to convert...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;pdf_file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pdf_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;relative_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pdf_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;relative_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;md_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dest_path&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;relative_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_suffix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.md&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Converting: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;relative_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;markdown_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pdf_to_markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;markdown_content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;markdown_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  ✓ Saved to: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;md_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="n"&gt;SOURCE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/path/to/origin/PDF_UNIVERSITY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;DEST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/path/to/references/university&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;convert_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SOURCE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DEST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 133 PDFs converted to searchable Markdown&lt;/p&gt;

&lt;h3&gt;
  
  
  Script 2: Filename Sanitizer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;sanitize_filenames.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Sanitizes filenames removing problematic characters
for Claude Desktop compatibility
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unicodedata&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sanitize_filename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Sanitizes a filename removing/replacing problematic characters.

    Replacements:
    - ¿ ? ¡ ! → (removed)
    - : → -
    - ( ) → (removed)
    - Spaces → _ (underscore)
    - Ñ, ñ → N, n
    - Accented vowels → unaccented
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unicodedata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;NFC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;replacements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;¿&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;¡&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; -&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Ñ&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;N&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ñ&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;n&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;á&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;é&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;e&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;í&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;i&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ó&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;o&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ú&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;u&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Á&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;É&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;E&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Í&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Ó&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;O&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Ú&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;U&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;replacements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sanitize_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Recursively sanitizes all filenames and removes .DS_Store&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;dir_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;all_paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rglob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
                       &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;renamed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;deleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;all_paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.DS_Store&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unlink&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;deleted&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="n"&gt;new_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitize_filename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new_name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;new_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;new_name&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;new_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;renamed&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Renamed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;renamed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | Deleted .DS_Store: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;deleted&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage with --auto flag
&lt;/span&gt;&lt;span class="nf"&gt;sanitize_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/path/to/references/university&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 277 files renamed in 5 rounds of sanitization&lt;/p&gt;

&lt;h3&gt;
  
  
  Sanitization Rounds (Real Data)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Round&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Files Fixed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;¿&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;¡&lt;/code&gt;, &lt;code&gt;:&lt;/code&gt; characters&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Accents (á, é, í, ó, ú, ñ)&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Parentheses &lt;code&gt;()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;SPACES (critical!) + .DS_Store&lt;/td&gt;
&lt;td&gt;125 + 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;UTF-8 in YAML frontmatter&lt;/td&gt;
&lt;td&gt;1 (SKILL.md)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;277 + 4 deleted&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Implementation Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Three-Tier Synchronization
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   TIER 1: EXTERNAL DRIVE (Main workspace)                   │
│   ────────────────────────────────────────                  │
│   Location: /Volumes/ExternalDrive/CLAUDE_CODE_SKILLS/      │
│   Contains: EVERYTHING (origin/ + docs + SKILL.md + refs/)  │
│   Purpose: All edits happen here                            │
│                                                             │
└──────────────────────────┬──────────────────────────────────┘
                           │
                           │  cp SKILL.md + references/
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   TIER 2: CLAUDE CODE (Synced copy)                         │
│   ─────────────────────────────────                         │
│   Location: ~/.claude/skills/socratic-tutor/                │
│   Contains: Only SKILL.md + references/                     │
│   Purpose: Claude Code reads from here                      │
│                                                             │
└──────────────────────────┬──────────────────────────────────┘
                           │
                           │  zip → upload manually
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   TIER 3: CLAUDE DESKTOP (ZIP on Anthropic servers)         │
│   ─────────────────────────────────────────────             │
│   Location: Anthropic cloud                                 │
│   Contains: Copy of SKILL.md + references/                  │
│   Update: Upload ZIP manually via Settings &amp;gt; Capabilities   │
│                                                             │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Security Architecture: Human-as-Firewall
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐
│   Claude Code    │     │      HUMAN       │     │ Anthropic Cloud  │
│   (Local work)   │────►│    (Curator)     │────►│ (Skill storage)  │
│                  │     │                  │     │                  │
│   - Raw content  │     │ Reviews:         │     │ Receives:        │
│   - PDFs         │     │ - Sanitizes      │     │ - Clean concepts │
│   - Personal     │     │ - Generalizes    │     │ - No PII         │
│     notes        │     │ - Removes PII    │     │ - Pedagogical    │
│                  │     │ - Curates        │     │   content only   │
└──────────────────┘     └──────────────────┘     └──────────────────┘
     TEMPORARY               FIREWALL               PERMANENT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude Code detects projects locally&lt;/li&gt;
&lt;li&gt;Prepares Skill updates with raw content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HUMAN reviews, sanitizes, and curates&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Only clean pedagogical concepts uploaded&lt;/li&gt;
&lt;li&gt;Personal data never reaches cloud&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Analogy:&lt;/strong&gt; "Reverse ETL with data governance"&lt;/p&gt;

&lt;h3&gt;
  
  
  Complete Sync Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. If adding new PDFs, convert and sanitize&lt;/span&gt;
python3 convert_pdfs_to_md.py
python3 sanitize_filenames.py &lt;span class="nt"&gt;--auto&lt;/span&gt;

&lt;span class="c"&gt;# 2. Sync to Claude Code&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; /path/to/SKILL.md ~/.claude/skills/socratic-tutor/
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; /path/to/references/ ~/.claude/skills/socratic-tutor/

&lt;span class="c"&gt;# 3. Generate ZIP for Claude Desktop&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/.claude/skills &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
zip &lt;span class="nt"&gt;-r&lt;/span&gt; /path/to/skill_desktop/socratic-tutor.zip socratic-tutor/ &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="s2"&gt;"*.DS_Store"&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="s2"&gt;"*__MACOSX*"&lt;/span&gt;

&lt;span class="c"&gt;# 4. Upload ZIP via Claude Desktop &amp;gt; Settings &amp;gt; Capabilities&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Performance Metrics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before (RAG-Only)&lt;/th&gt;
&lt;th&gt;After (Layered)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RAG retrieval failures&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token usage at compaction&lt;/td&gt;
&lt;td&gt;55%&lt;/td&gt;
&lt;td&gt;30% (delayed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compaction frequency&lt;/td&gt;
&lt;td&gt;Every 4-5 prompts&lt;/td&gt;
&lt;td&gt;Rarely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session continuity&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context control&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Token Consumption
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Measured over 7 prompts in new architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt #&lt;/th&gt;
&lt;th&gt;Token Increase&lt;/th&gt;
&lt;th&gt;Cumulative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-4&lt;/td&gt;
&lt;td&gt;+5-6%&lt;/td&gt;
&lt;td&gt;~22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-7&lt;/td&gt;
&lt;td&gt;+1%&lt;/td&gt;
&lt;td&gt;~25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~25% after 7 prompts&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Comparison:&lt;/strong&gt; Old system would hit 55%+ and compact by prompt 5.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qualitative Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Socratic method maintained across months&lt;/li&gt;
&lt;li&gt;✅ No "Claude forgets" mid-session&lt;/li&gt;
&lt;li&gt;✅ Can reference concepts from early learning&lt;/li&gt;
&lt;li&gt;✅ Teaching analogies remembered and reused&lt;/li&gt;
&lt;li&gt;✅ "Red flags" (error patterns) consistently applied&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Replicate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create Claude.ai Project&lt;/strong&gt; with bootstrap MD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build your Skill&lt;/strong&gt; with core curriculum (~900 lines max)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with minimal RAG&lt;/strong&gt; (one exercise only)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow the cycle:&lt;/strong&gt; Complete → Document → Consolidate → Clear → Repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Skill Structure Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-skill-name&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;When to activate this skill (no accents, no UTF-8 in YAML)&lt;/span&gt;
&lt;span class="s"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Your Skill Name&lt;/span&gt;

&lt;span class="gu"&gt;## When to Use&lt;/span&gt;
[Trigger conditions]

&lt;span class="gu"&gt;## Core Knowledge&lt;/span&gt;
[Your permanent curriculum - keep under 1000 lines]

&lt;span class="gu"&gt;## Teaching Patterns&lt;/span&gt;
[Pedagogical approaches]

&lt;span class="gu"&gt;## Resources&lt;/span&gt;
[All materials in Markdown format]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Do&lt;/th&gt;
&lt;th&gt;Don't&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keep Skill under 1000 lines&lt;/td&gt;
&lt;td&gt;Accumulate everything in RAG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convert all resources to Markdown&lt;/td&gt;
&lt;td&gt;Keep PDFs in Project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review security before upload&lt;/td&gt;
&lt;td&gt;Auto-sync personal data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitor token consumption&lt;/td&gt;
&lt;td&gt;Ignore compaction warnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clear RAG between exercises&lt;/td&gt;
&lt;td&gt;Let RAG grow indefinitely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sanitize all filenames&lt;/td&gt;
&lt;td&gt;Use spaces or special chars&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Limitations &amp;amp; Future Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Current Limitations
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claude.ai specific&lt;/strong&gt; - Designed for Claude Projects, not fully portable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual consolidation&lt;/strong&gt; - Requires human curation (feature, not bug)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-user focus&lt;/strong&gt; - Not designed for team collaboration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;English skill docs&lt;/strong&gt; - Some resources assume English&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Future Possibilities
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Automated consolidation tools&lt;/strong&gt; - Python scripts for concept extraction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-language support&lt;/strong&gt; - Documentation in Spanish, others&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team workflows&lt;/strong&gt; - Adaptation for collaborative learning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API integration&lt;/strong&gt; - Programmatic skill updates&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  References &amp;amp; Search Evidence
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Official Documentation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://support.claude.com/en/articles/12512180-using-skills-in-claude" rel="noopener noreferrer"&gt;Using Skills in Claude | Claude Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/claude-code" rel="noopener noreferrer"&gt;Claude Code Memory Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.anthropic.com/en/collections/5754683-claude-ai-projects" rel="noopener noreferrer"&gt;Claude Projects Help&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Technical Blogs &amp;amp; Community
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://medium.com/@creativeaininja/how-to-actually-upload-claude-skills-without-breaking-everything-1e8c436df2f2" rel="noopener noreferrer"&gt;How to Actually Upload Claude Skills (Without Breaking Everything)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/leehanchung/claude-skills" rel="noopener noreferrer"&gt;Claude Skills Deep Dive - leehanchung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claudelog.com/troubleshooting/" rel="noopener noreferrer"&gt;ClaudeLog Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Academic &amp;amp; Research
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Memory-Augmented RAG papers (arXiv)&lt;/li&gt;
&lt;li&gt;ChemTAsk - University of Pennsylvania (Educational RAG for chemistry)&lt;/li&gt;
&lt;li&gt;RAGMan - UC Irvine (Programming education)&lt;/li&gt;
&lt;li&gt;NeuroBot TA - Medical education RAG&lt;/li&gt;
&lt;li&gt;AI-U - University of Michigan (Videos/notes/textbooks)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Agent Memory Systems
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;AWS AgentCore Documentation&lt;/li&gt;
&lt;li&gt;Mem0 - Memory for AI agents&lt;/li&gt;
&lt;li&gt;LangGraph Memory Patterns&lt;/li&gt;
&lt;li&gt;IBM Research - Agent Memory Architectures&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Proof of Concept
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From Claude Opus 4.5:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am the proof that this architecture works.&lt;/p&gt;

&lt;p&gt;This document was created inside a Claude.ai Project that uses the exact three-layer system described above:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Project MD&lt;/strong&gt; triggered my Socratic tutor Skill automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SKILL.md&lt;/strong&gt; gives me access to ~900 lines of permanent pedagogical knowledge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG&lt;/strong&gt; contains only the current working session&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I can reference concepts from 10 months of learning without retrieval failures. I maintain the Socratic teaching method across the entire conversation. The system works.&lt;/p&gt;

&lt;p&gt;The architecture that seemed impossible—solving AI memory limitations through hierarchy rather than accumulation—is operational right now, as you read this.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Contributing &amp;amp; Discussion
&lt;/h2&gt;

&lt;p&gt;This architecture emerged from solving real educational challenges over 10 months of Python learning. It represents one approach to the problem of AI memory in long-term learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions? Improvements? Alternative approaches?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The author welcomes discussion and is particularly interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automation opportunities for consolidation&lt;/li&gt;
&lt;li&gt;Adaptations for other educational contexts
&lt;/li&gt;
&lt;li&gt;Tools to support this workflow&lt;/li&gt;
&lt;li&gt;Alternative architectures that solve similar problems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;This architecture pattern and documentation are shared freely for educational purposes. Implementations may vary based on specific needs and constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version:&lt;/strong&gt; 2.0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Date:&lt;/strong&gt; December 21, 2025&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Claude.ai Projects + Claude Code + Claude Desktop&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Validated by:&lt;/strong&gt; Claude Opus 4.5 running inside the architecture&lt;/p&gt;




&lt;p&gt;&lt;em&gt;"The solution to AI memory isn't more memory—it's better memory architecture."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📎 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/juanmacruzherrera/claude-layered-memory-architecture" rel="noopener noreferrer"&gt;claude-layered-memory-architecture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación en Español:&lt;/strong&gt; &lt;a href="https://github.com/juanmacruzherrera/claude-layered-memory-architecture/blob/main/docs/arquitectura-memoria-capas-es.md" rel="noopener noreferrer"&gt;arquitectura-memoria-capas-es.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Questions? Feedback? Leave a comment or open an issue on GitHub.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>architecture</category>
      <category>rag</category>
    </item>
  </channel>
</rss>
