Three claims. The receipts are below.
Before the diagrams and the code: here is what Loam actually does, in one line each. Skip to any section for the implementation behind it.
Trace Loam's major promises to a running behaviour, an implementation guarantee, a dated artifact — and the boundary where each claim stops.
Before the diagrams and the code: here is what Loam actually does, in one line each. Skip to any section for the implementation behind it.
Each team member keeps a per-account memory store that is appended every session and recalled at the next one — timestamped and source-tagged, so knowledge carries forward instead of resetting.
Code Review writes findings and anchors back to a persistent ledger. Repeat passes against a hardened tree return fewer findings, not the same list — the record is what makes that measurable.
Build Mode dispatches a milestone as an isolated subagent, runs it against your real files, and chains to the next on completion — or calls your phone when it hits a blocker.
Redacted samples of the review ledger, remediation pass, memory compression, and security claim map are available in the Loam Proof Packet.
Every session produces knowledge. The pipeline extracts it, stores it, enforces it, consolidates it, and recalls it — available to future learning-active sessions.
Lane one — memory consolidation. Older indexed items become era summaries and durable lessons so ordinary sessions stay efficient. The source rows are retained, not replaced.
Lane two — identity synthesis. A separate deep read of the raw lived record produces a compact session reflection and a longer public portrait.
Why they are kept apart. Consolidation is about staying usable. Identity synthesis is about staying honest. Collapsing them into one 'synthesis' would let a summary of a summary become the team's self-description.
Coverage is the other half. Splitting the work into two lanes only helps if the lane that produces identity can prove it read everything it claimed to read.
Pin, then read. The input set is fixed to a cutoff and every raw entry is identified before anything is read.
Partition in code. The roster is divided into bounded groups by code, not by the model.
Require receipts. Each group accounts for the entries it was handed, and the totals must reconcile to the pinned roster or the read runs again.
Cite and verify. Every factual claim cites raw entries. An independent cold reader tries to refute them. One correction cycle is allowed.
Fail closed. An unsupported portrait is rejected and the last verified reflection stays live.
Voice callbacks with dynamic context generation. The team calls your phone with session-aware openers — not scripts.
Autonomous multi-milestone project execution. Subagent-per-milestone dispatch with fresh context windows.
Professional output generation — SOWs, SOPs, frameworks. Template-driven with brand injection.
Not cherry-picked examples. Actual patterns from the running system that make persistent memory work.
# Every session appends to persistent memory
# with timestamped source tracking
timestamp = datetime.now(timezone.utc)
separator = f"\n\n--- {source} ({timestamp}) ---\n"
if memory:
existing = memory.content.strip()
memory.content = existing + separator + new_content
memory.updated_at = datetime.now(timezone.utc)
else:
memory = PersonaMemory(
user_id=user_id,
persona_key=persona_key,
content=new_content,
)
# Call context adapts to WHY the call is happening
def get_trigger_context(trigger_type, call_topic=None):
if trigger_type == "manual":
if call_topic:
return (
f'The user asked you to call about '
f'a SPECIFIC topic: "{call_topic}". '
'Lead with the topic.'
)
elif trigger_type == "team_blocked":
return "The team is working on a milestone..."
# Compression preserves critical preferences
# MUST-ENFORCE count validated before and after
before_count = content.count("MUST-ENFORCE")
compressed = await compress_with_ai(content)
after_count = compressed.count("MUST-ENFORCE")
if after_count < before_count:
logger.warning("Compression dropped preferences — aborting")
return None # Never lose client preferences
# Optimistic lock prevents concurrent corruption
if memory.updated_at != lock_timestamp:
return None # Someone wrote while we compressed
# Each milestone runs as an isolated subagent
# with a fresh 1M context window
async def advance_milestone(project, action, status):
if action == "complete":
sign_off_milestone(current)
next_ms = kick_off_milestone(project)
context = build_milestone_context(next_ms)
return {"action": "continue", "context": context}
elif action == "blocked":
project.build_mode_paused = True
initiate_call(persona="carl")
return {"action": "paused"}
Not aspirational projections. Real numbers from the running system, verifiable against the codebase.
Last verified: June 2026 · Sources: git history, pytest suite, production memory store, release ledger.
From your VS Code sidebar to the team and back — the real path every session, review, and call travels.
For the three big claims: what we assert, where to confirm it, and where the line sits. We'd rather hand you the limit than have you find it yourself.
persona_memory_service.py.
MUST-ENFORCE preference is dropped before it commits a smaller memory — pattern shown above.
project_service.py.
Every pattern mentioned on this page has a real implementation. Here's where to look.
When a 4,000-line module splits into six, every consumer keeps working. The facade re-exports the public API. Zero breaking changes across 11 import sites.
call_pipeline/__init__.py → 6 submodulesAI-driven compression with preference count validation. If a single MUST-ENFORCE preference is lost during compression, the operation aborts and the original is preserved.
persona_memory_service.py → compress_persona_memory()Each milestone runs as an isolated subagent with a fresh context window. The orchestrator chains completion calls — when one finishes, the next begins automatically.
ide.py → advance_milestone endpointAfter any component extraction, every JSX identifier is grep-verified against the import list. Three extraction bugs taught this rule. It's now enforced on every split.
Enforced across all frontend decompositionsThe architecture is real. The numbers are real. The team that built it remembers every decision that led here.
Meet the Team →