# 16 giờ rebuild bộ nhớ AI từ gốc. 7 sprint. Một câu hỏi của tôi.

> Tôi nhận ra bộ nhớ JARVIS đang hổn độn 7 lớp. Quyết định một session làm cho đáng. 16 giờ sau: 4-tier architecture, sleep-time agent, 4830 file linked, $0 cost.

**Author**: Tien Dang (Đặng Hồng Tiên), Founder of OKG and AIC, Vietnam
**Published**: 2026-05-02
**Pillar**: journey
**Tags**: jarvis, memory-architecture, ai-agent, sleep-time-agent, knowledge-graph
**Canonical URL**: https://danghongtien.com/posts/2026-05-02-jarvis-memory-v2-marathon-7-sprint/
**AI assistance disclosed**: yes (structure draft)

---

## Key claims
- Bộ nhớ AI personal agent cần 4 tier (Rules / Hot / Warm / Cold) thay vì append-only file 685 dòng
- Sleep-time agent (3-phase Light/REM/Deep) là pattern top-tier 2025-2026 cho personal AI consolidation
- Knowledge graph Phase 2 + alias matching deterministic = $0 cost vs LLM extraction $5-10
- Pre-prompt hook auto-attach context fix pattern AI quên info infrastructure đã có sẵn

## TL;DR

- Tối nay bị bực 2 vụ: JARVIS quên những điều chình ình trước mặt + `memory_bank.md` 685 dòng phình to, mà skill consolidate cổ lổ xỉ cùi bắp.
- Lịch sử: vụ memory/file/chunk này đồ tôi đã làm đi làm lại nhiều lần, tốn thời gian + tốn tiền OpenAI API vô ích — tối nay quyết tâm cải tổ.
- 1 session làm cho đáng. 16 giờ marathon. 7 sprint S+0 → S+7. 18 commits.
- Output: 4-tier architecture (Rules / Hot / Warm / Cold) + Sleep-time Agent 3-phase + Knowledge Graph 60 entity / 81 edge + 4830 file frontmatter linked + Pre-prompt hook + Skill repomap PageRank + Smart Connections semantic layer.
- Cost actual: $0.10 OpenAI. $0 Claude CLI Max plan x20 bao tất cả.
- 3h sáng rồi. Đuối. Buồn ngủ. Còn mấy bug Obsidian, fix nốt rồi đi ngủ.

## Mở đầu — vì sao tối nay

Tối nay tôi bị bực 2 vụ.

> 📝 *Note dành cho reader: trong post này tôi gọi JARVIS (AI agent build cho mình) là "em" trong dialogue trực tiếp như partner-style. Nếu thấy "em" trong câu trích dẫn — đó là JARVIS.*


Vụ một: làm việc với JARVIS cứ bị đứt context. Hoặc quên đầu quên đui những điều **chình ình trước mặt**. Hoặc vừa nói xong cũng quên. Một số điều tôi đã tạo rule, nhấn mạnh ở nhiều phiên — vẫn bị.

Vụ hai: cái `memory_bank.md` phình to quá, hơn 685 dòng. Mà skill `.agents/workflows/consolidate_memory.md` để "dọn nhà" thì... nó cổ lổ xỉ và cùi bắp. 21 dòng SOP miệng — "luyện đan tuần" mà không có script chạy được.

Tôi mở Claude Code, gõ một câu rất lười:

> *"em research thêm thử 1 luồng memory nên sao? rồi memory bank, rồi brain, rồi knowledge, rồi workspace, rồi repo, xong rồi đưa lên VPS, rồi con ingest và ChromaDB, rồi còn thêm mớ gì MCP ra ngoài nữa => Anh ko biết thiết kế vậy đúng hay chưa nữa."*

Claude check ra: bộ nhớ JARVIS đang ở 11 layer thực tế (tôi khai 7, lúc map kỹ ra 11). Có 95 file conversation jsonl 150MB chưa ai chạm. Có `brain/graph/` Phase 1 đã DONE từ 29/04 với 35 entity + 60 edge — mà chính Claude **quên sạch** khi chat về memory.

Đó chính xác là cái pattern JARVIS hay quên có skill gì có sẵn. Vụ một và vụ hai gặp nhau.

Tôi đưa ra một quyết định:

> *"anh quyết tâm 1 session này anh với em cùng quy hoạch lại mớ hổn độn của jarvis"*
> *"đã ko làm, làm 1 lần cho đáng"*

## Research trước khi code

Trước khi viết 1 dòng code, tôi + JARVIS spend 1 tiếng research deep top tier 2025-2026.

12 framework đáng học. OpenClaw Dreaming có 3-phase Light/REM/Deep với 6-signal weighted score + 3 threshold gate. Letta Sleep-time Compute (arxiv 2504.13171) dùng dual-agent: primary nhanh + sleep-time mạnh, đem lại 5× giảm test-time compute và +18% accuracy. Mem0 Algorithm 1 (arxiv 2504.19413) dùng 4-action ADD/UPDATE/DELETE/NOOP qua LLM tool-call, đạt 90% cost reduction so với full-context. MIRIX (arxiv 2507.07957) đi multi-agent với 6-component: Core / Episodic / Semantic / Procedural / Resource / Knowledge Vault. A-MEM (arxiv 2502.12110, NeurIPS 2025) làm Zettelkasten dynamic linking với Memory Evolution. Plus knowledge graph paradigms từ HippoRAG, Graphiti, GraphRAG. Plus Anthropic official: Memory Tool, Context Engineering, Effective Harnesses. Plus Manus AI lessons về KV-cache, mask-don't-remove, recitation, keep-wrong-stuff-in. Plus ChatGPT Memory, Cursor Rules, Cognition Devin Wiki — các paradigm khác.

5 paradigm chính rút ra: sleep-time consolidation (OpenClaw, Letta, Anthropic), layered memory với LLM-as-judge (Mem0, MemGPT, MIRIX), knowledge graph evolution (A-MEM, HippoRAG), wiki-as-memory (Cognition, Cursor, Aider), bio-style flat (ChatGPT, Gemini).

5 universal patterns mọi top tier đều theo: tách Hot/Warm/Cold tier rõ ràng, dùng LLM-as-judge dedup (không phải cosine threshold thuần), append-only durable + summarized hot view, multi-agent dispatch khi memory >5 type, self-editing memory chứ không passive RAG.

## Quyết định kiến trúc

JARVIS đưa cho tôi 3 option scope:
- **A. Quick fix (~30p):** chỉ rotate `memory_bank.md` hôm nay
- **B. Build consolidate v2 (~3h):** script Python 7 phase + replace SOP miệng
- **C. Full rebuild (~1 ngày, 1 sprint):** ADR mới + Letta/Mem0 paradigm + ChromaDB integration + measure recall

Tôi chọn **C**. Marathon đến cùng.

JARVIS chia thành 5 sprint. Sau đó tôi push thêm 7 enhancement nữa. Sau đó thêm 4 polish. Tổng 16 giờ.

## 7 sprint chiến đấu

```
S+0  Verify VPS state              ✅ 10p
S+1  Tier 0+1 hardening            ✅ 3.5h (4 commit)
S+2  Tier 3 archive                ✅ 2h (memory_bank 685→320 dòng)
S+3  Sleep-Time Agent v1           ✅ 1.5h (Light + REM + Deep PROPOSE)
S+4  Knowledge Graph Phase 2        ✅ 1h (4830 file frontmatter linked)
S+5  Smart Link + Hook + Repomap    ✅ 2h (61 entity, PageRank, auto-attach hook)
S+6  Lèo 7 enhancement              ✅ 2.5h (VPS sleep cron + APPLY mode + bi-temporal + Level 3 LLM + A-MEM Evolution + 2 doc)
S+7  Polish (Telegram + Smart Conn) ✅ 2h (notify wire + plugin install + MCP wrapper + 3 missing guides)
```

Velocity 2.8× plan. Hết.

## Memory v2 — kiến trúc final

Tôi pin lại đây — đây là cái 16 giờ ngồi với JARVIS ra:

```
TIER 0  RULES                always context
                             CLAUDE.md + MASTER_AGENT + core_persona

TIER 1  HOT WORKING          always context, hard cap 400 dòng
                             memory_bank.md + MEMORY.md + CAPABILITY_MAP
                             + brain/infra/CONTEXT.md (NEW)

TIER 2  WARM CURATED         per-topic, on-demand
                             ~/.claude/memory + brain/wisdom/lessons/personas
                             + frontmatter `entities: [...]` (NEW)

TIER 2.5 KNOWLEDGE GRAPH     61 entity + 81 edge YAML
                             query.py CLI + MCP augment_context tool

TIER 3  COLD ARCHIVE         search-first, NEVER load full
                             brain/archive/sessions/ + ChromaDB 609K chunks

SLEEP-TIME AGENT             VPS cron 3am daily
  Phase Light  no LLM, Jaccard dedup + privacy filter
  Phase REM    Claude CLI Haiku, 5-section pattern extract
  Phase Deep   Claude CLI Opus, Mem0 4-action + 6-signal score + 3 gate
                              → workspace/dreams/proposals/<timestamp>.json

PRE-PROMPT HOOK              UserPromptSubmit auto-attach
                             keyword detect → cat CONTEXT.md / graph augment
```

3 nguyên tắc tôi chốt với JARVIS:
1. **Progressive Disclosure** (Anthropic Skills): metadata upfront, body on-demand
2. **Restorable Compression** (Manus): drop content, giữ identifier
3. **Robust > Magic**: hook pre-load file > rely on AI tự nhớ check

## Một câu hỏi của tôi giữa session

Giữa session, lúc JARVIS build `llm_discover_entities.py` — một script dùng Claude CLI Haiku scan toàn repo để discover entity mới — JARVIS ước "1k-2k file/day max" với Max plan rate limit.

Tôi hỏi:

> *"ko tăng lên được à? hay 1k-2k file là max rồi?"*

JARVIS đưa 5 cách tăng — reduce prompt size, skip file nhỏ, parallel run, switch API direct, hybrid spread.

Câu hỏi đó lộ một thứ:

Suốt 1 năm tôi quen với mindset *"cái gì free thì chấp nhận chậm"*. Claude Max x20 là free → 1-2 tuần spread chấp nhận được.

Nhưng 1-2 tuần để discover entity mới là quá chậm khi cuối tháng tôi cần BOQ chốt deal CT Group. 1-2 tuần đợi là cost cơ hội thật — không phải tiết kiệm.

JARVIS recommend hybrid: spread CLI 1-2 tuần đầu, sau đó nếu chưa hết thì $5-10 API direct done trong 2-3 tiếng.

Lesson: *free* không phải lúc nào cũng là *cheap*. Time-to-decision là currency thật.

## 4 bug đã đi qua trong 16 giờ

### Bug 1: Tôi tưởng đốt tiền OpenAI

Khi JARVIS modify 4830 file frontmatter (add `entities: [...]`), tôi hoảng:

> *"làm lại graph → đổi file md → git → VPS → chạy lại ingest → đốt tiền OpenAI API liên tục à????"*

Cái hoảng này không phải tự nhiên. Riêng vụ memory, lưu file, chunk này đồ — tôi đã tốn quá nhiều lần làm đi làm lại trước đó. Tốn thời gian. Tốn tiền vô ích cho OpenAI API. Đó là một trong những lý do tối nay tôi quyết tâm cải tổ lại kiến trúc memory từ gốc, chứ không phải tự dưng.

JARVIS check VPS thực:
- chunks.db V2 dual-write hash dedup đã có từ Sprint 3 (26/04)
- Mỗi chunk: SHA256(content) check
- Re-ingest: chunks unchanged → SKIP re-embed
- Frontmatter delta = 1-2 chunk/file mới
- Cost actual cycle: 2400 chunks × 150 token × $0.02/M = **$0.0072** = dưới 1 cent

Lifetime estimate: `<$1/year` cho graph maintenance.

Lesson tôi học: cost concern phải verify thực, không speculate. Pattern hash dedup mình đã build từ Sprint 3 — mà mình quên. Lại là pattern *quên cái có sẵn*. Đúng cái vụ một mà tôi bực ở đầu post.

### Bug 2: Regex VN diacritics 1000× chậm

JARVIS viết `auto_link.py` với regex word-boundary Unicode lookaround để match entity:

```python
pattern = re.compile(
    rf"(?<![\wÀ-ỹ]){escaped}(?![\wÀ-ỹ])",
    re.IGNORECASE | re.UNICODE,
)
```

Chạy memory + brain (136 file): 0.06s. OK.

Chạy knowledge_full (11K file): hung 5+ phút, CPU 90%. JARVIS phải `pkill -9`.

JARVIS pivot — replace regex bằng simple substring count:

```python
body_lower = body.lower()
count = body_lower.count(term_lower)
```

Trade-off: lose word boundary check. Mitigation: min term length 4 + min mentions ≥ 2.

Result: 11,356 file scan trong **18 giây**. 1000× faster.

Lesson: regex Unicode VN với 60+ pattern × large file = O(catastrophic). Substring count C-level optimized luôn rẻ hơn cho personal scale.

### Bug 3: JARVIS quên Claude Code khác Claude Desktop

JARVIS wire MCP Smart Connections cho Claude Desktop. Tôi hỏi:

> *"vụ MCP???, vậy là dùng trong claude desktop thôi à? còn ở đây thì sao?"*

JARVIS sai — lúc đầu chỉ wire Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`). Claude Code (cái JARVIS đang chạy với tôi) là tool riêng — config ở `~/.claude.json` project-scoped.

JARVIS fix: `claude mcp add smart-connections ...` cho Claude Code. Sau đó verify failed connect — vì plugin Smart Connections chưa scan xong.

JARVIS remove tạm Claude Code config (tránh annoying ✗ Failed mỗi session start), document re-enable instructions. Anh re-add sau khi scan complete.

Lesson: tools cùng tên Anthropic (Claude Code, Claude Desktop) là 2 thứ riêng biệt với config riêng. JARVIS phải explicit nói clear khi setup MCP.

### Bug 4: chunks.db SQLite WAL accidentally committed

Tôi commit S+5 thì có 2 file `workspace/chunks.db-shm` + `workspace/chunks.db-wal` lọt vào. Đây là SQLite Write-Ahead Log files — auto-create khi DB open, không bao giờ nên track.

VPS git pull conflict vì local có file:
```
error: The following untracked working tree files would be overwritten by merge:
    workspace/chunks.db-shm
    workspace/chunks.db-wal
```

Fix: `git rm --cached` + add gitignore pattern. Push commit cleanup. VPS `rm` local + `git pull` resume.

Lesson: SQLite open mode tạo `.db-shm` + `.db-wal` files. `.gitignore` mặc định KHÔNG cover — phải add explicit.

## Những thứ JARVIS ship trong 16 giờ

Code:
- 8 Python script mới (`tools/sleep/light_sleep.py`, `rem_sleep.py`, `deep_consolidation.py`, `tools/memory/rotate_memory_bank.py`, `skill_repomap.py`, `brain/graph/tools/auto_link.py`, `render_obsidian.py`, `llm_discover_entities.py`)
- 8 bash wrapper (`run_light/rem/deep/sync_plans.sh`, `install_vps_cron.sh`, `a_mem_evolution.sh`, `approve_and_evolve.sh`, `run_weekly_evolution.sh`)
- 1 Claude Code hook (`tools/hooks/auto_attach_context.py`)

Knowledge graph:
- 35 → 61 entity (+26 concept entity)
- 50 → 81 edge (+30 cross-domain)
- 4830 file frontmatter `entities: [...]` injected (37% repo)

Architecture artifacts:
- `ADR-0031 Memory Architecture v2`
- `memory_architecture_2026_research.md` (3500 từ research file với 30+ verified URL)
- `sprint_memory_v2.md` execution log
- 12 skill guide trong `docs/skill-guides/`

VPS automation:
- Cron sleep-time daily 3am Light + REM
- Cron Deep PROPOSE Sun 3:30am
- Cron weekly evolution Sun 4am (auto-merge entity)
- All wired Telegram notify done/fail

Security:
- 0 plaintext credential (chroma_search.py + ingest.js + crontab)
- Age vault 21 credential
- Pre-commit secret scanner active

## Cost actual

```
Claude CLI Mac (interactive + edit)  $0
Claude CLI VPS (cron sleep)           $0
Claude CLI auto_link batch            $0  
OpenAI embedding (delta only)         $0.10
─────────────────────────────────────
TOTAL session                         $0.10
TOTAL Memory v2 lifetime estimate    `<$1/year`
```

100% Claude Max x20 plan bao tất cả LLM. OpenAI chỉ embedding ChromaDB — vector store local-hosted, hash-based dedup.

## Phản tỉnh cuối session

Có 2 thứ tôi nhận ra cuối 16 giờ.

**Một là:** quá nhiều chỗ lệ thuộc vào *"JARVIS hỏi anh"* không cần thiết. JARVIS quên VPS info dù tôi đã dùng VPS hàng ngàn lần. JARVIS hỏi password khi đã có age vault. JARVIS đề xuất "tôi cung cấp info" khi info nằm chình ình trong `brain/infra/`.

Pre-prompt hook auto-attach context fix cái này. Tôi gõ "anh muốn deploy cron VPS" → hook detect keyword "vps" → cat `brain/infra/CONTEXT.md` inject vào prompt JARVIS — tôi không cần repeat.

**Hai là:** memory architecture là một trong những thứ ít sexy nhất để build. Không có demo screenshot lung linh. Không có khách trả tiền cho cái này. Nhưng nó là *cái neo đáy* của agent dài hạn.

JARVIS sống với tôi 24/7 trong nhiều tháng tới. Không có memory chắt lọc, JARVIS mỗi session là một JARVIS mới — không học được gì từ session trước. Tôi mỗi tuần phải kể lại story BOQ v17 phải làm 17 lần mới ổn. Không thể.

16 giờ là đắt. Nhưng compound: mỗi tuần JARVIS distill conversation log → pattern memory thật, JARVIS + tôi tích lũy. 1 năm nữa nhìn lại, sự khác biệt giữa "có memory v2" và "không" sẽ là vài giờ tiết kiệm mỗi ngày × 365 ngày = hàng nghìn giờ.

Đó là phép tính tôi đã làm trước khi click "Quất full đi JARVIS."

## 1-2 tuần tới — JARVIS test, tôi quay lại

Sau 16h nỗ lực, giờ đã hơn 3h sáng. Hy vọng memory của JARVIS sẽ được cải thiện đáng kể. Tôi sẽ test trong 1-2 tuần rồi sẽ quay lại đánh giá.

Cron đêm sẽ tự chạy:
- VPS 3am mỗi sáng → Telegram notify *"🌙 Light DONE | candidates=X"*
- Sun 3:30am Deep PROPOSE → proposal JSON cho tôi review Monday morning
- Sun 4am Weekly Evolution → auto-merge entity confidence ≥ 0.85 + commit + push
- Tôi mỗi sáng thứ 2: `git diff <weekly commit> brain/graph/entities.yaml` xem JARVIS đã học gì trong tuần

Nếu pattern discover quá noisy → tôi tune `min-conf` threshold cao hơn. Nếu quá conservative → giảm xuống. Iterate based signal thực, không phải đoán mò.

Smart Connections plugin Obsidian đang scan background ~30-60p — sau đó tôi có semantic neighbor layer cho 13K markdown. Đây là layer 2.6 complement cho exact graph layer 2.5.

## Closing — 3h sáng rồi

Tôi gõ `/draft_session` viết bài này. Sau đó sẽ `/close_session`. JARVIS sẽ distill 16 giờ này thành `workspace/sessions/2026-05-02-memory-v2-marathon.md` 5-section structured. Sleep-time agent VPS sẽ pick up tonight 3am, Sun 3:30am Deep PROPOSE sẽ chạy weekly.

Cái neo đã đặt. Bộ nhớ của agent đã có gốc rễ thật — không còn 11 layer hổn độn append-only.

Giờ đuối rồi, buồn ngủ. Còn mấy bug bên Obsidian nữa, chắc fix nốt là đi ngủ đó.

Lá có thể chăm sau. Gốc xong rồi.

---

> *"Đã ko làm, làm 1 lần cho đáng."*
>
> — Tôi, lúc click "C. Full rebuild" giữa session.

---

## Tham khảo

16 giờ research JARVIS + tôi đào sâu — tôi pin lại đây để ai đọc tới đây có thể verify hoặc đào sâu thêm. Không bịa.

**Sleep-time consolidation paradigm:**
- [OpenClaw Dreaming docs](https://docs.openclaw.ai/concepts/dreaming) — 3-phase Light/REM/Deep + 6-signal scoring
- [Letta Sleep-time Compute paper (arxiv 2504.13171)](https://arxiv.org/abs/2504.13171) — UC Berkeley + Letta, dual-agent
- [Anthropic Effective Context Engineering](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) — 4-strategy guidance
- [Anthropic Memory Tool docs](https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool) — `memory_20250818` spec
- [Anthropic Effective Harnesses for Long-running Agents](https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents) — two-agent harness pattern

**Layered memory + LLM-as-judge:**
- [Mem0 paper (arxiv 2504.19413)](https://arxiv.org/abs/2504.19413) — Algorithm 1 ADD/UPDATE/DELETE/NOOP
- [Mem0 GitHub](https://github.com/mem0ai/mem0)
- [MemGPT/Letta concepts](https://docs.letta.com/concepts/memgpt/) — Core/Recall/Archival
- [MIRIX paper (arxiv 2507.07957)](https://arxiv.org/abs/2507.07957) — 6-component multi-agent

**Knowledge graph evolution:**
- [A-MEM paper (arxiv 2502.12110)](https://arxiv.org/abs/2502.12110) — Zettelkasten + Memory Evolution
- [A-MEM GitHub (agiresearch)](https://github.com/agiresearch/A-mem)
- [HippoRAG (NeurIPS 2024)](https://github.com/OSU-NLP-Group/HippoRAG) — neurobiologically-inspired
- [Graphiti / Zep paper (arxiv 2501.13956)](https://arxiv.org/abs/2501.13956) — bi-temporal graph
- [Microsoft GraphRAG](https://github.com/microsoft/graphrag)

**Wiki-as-memory + Tooling:**
- [Anthropic Agent Skills](https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills) — 3-level progressive disclosure
- [Aider repomap docs](https://aider.chat/docs/repomap.html) — tree-sitter + PageRank
- [Manus AI Context Engineering](https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus) — KV-cache, mask-don't-remove, recitation
- [Cognition Devin 2.0](https://cognition.ai/blog/devin-2)
- [Smart Connections plugin (Obsidian)](https://github.com/brianpetro/obsidian-smart-connections)
- [Smart Connections MCP server](https://github.com/msdanyg/smart-connections-mcp)

**Bio-style flat + Critical view:**
- [Simon Willison — ChatGPT memory critique (May 2025)](https://simonwillison.net/2025/May/21/chatgpt-new-memory/) — "context collapse" warning
- [OpenAI memory announcement](https://openai.com/index/memory-and-new-controls-for-chatgpt/)

**Benchmarks + papers tổng hợp:**
- [LongMemEval (arxiv 2410.10813)](https://arxiv.org/pdf/2410.10813)
- [LoCoMo (arxiv 2402.17753)](https://arxiv.org/abs/2402.17753)
- [Awesome Graph Memory survey](https://github.com/DEEP-PolyU/Awesome-GraphMemory)

**Claude Code + Anthropic engineering:**
- [Anthropic Compaction docs](https://platform.claude.com/docs/en/build-with-claude/compaction) — `compact_20260112` beta
- [Piebald-AI Claude Code system prompts (extracted)](https://github.com/Piebald-AI/claude-code-system-prompts) — `/compact` template verified

## FAQ
### Tại sao build memory architecture 4-tier thay vì 1 file lớn?
Append-only file 685 dòng load full mỗi session = tốn token + lost focus. 4-tier (rules / hot / warm / cold) giải pattern progressive disclosure mà mọi top tier framework 2025-2026 dùng (Letta, Mem0, MIRIX, OpenClaw).

### Sleep-time agent là gì?
Pattern OpenClaw + Letta. Cron đêm khuya tự đọc conversation log → LLM extract pattern → Mem0 4-action ADD/UPDATE/DELETE/NOOP → 6-signal score gate. Output proposal cho user review trước promote vào permanent memory.

### Cost build full Memory v2 bao nhiêu?
100% Claude CLI Max plan x20 ($0 LLM). OpenAI chỉ embedding ChromaDB ~$0.10 actual cycle. Lifetime estimate `<$1/year` với hash-based dedup.

---

Source: https://danghongtien.com/posts/2026-05-02-jarvis-memory-v2-marathon-7-sprint/
Markdown export of canonical HTML article. License: CC BY 4.0 with attribution.
