Documentation Index
Fetch the complete documentation index at: https://docs.trytrellis.app/llms.txt
Use this file to discover all available pages before exploring further.
Understanding Trellis Through Kubernetes
If you’re familiar with Kubernetes, this document will help you quickly grasp Trellis’s design philosophy.
This article was written in the Trellis 0.4.x era. Some named concepts have changed since: the
Ralph Loop, dispatch / plan / debug agents, and the Multi-Agent Pipeline were all removed
during the 0.5.0 prerelease. The high-level K8s analogy still applies; read specific agent / hook
names here as historical references.
Table of Contents
- K8s Core Concepts Overview
- Trellis and K8s Analogy
- Reconciliation Mechanism Deep Dive
- Complete Workflow
- Why This Design
1. K8s Core Concepts Overview
Imperative vs Declarative
Imperative: Describe “how to do it”
# Step-by-step instructions for the system
current_pods=$(kubectl get pods -l app=nginx --no-headers | wc -l)
if [ $current_pods -lt 3 ]; then
kubectl run nginx --image=nginx:1.19
fi
Declarative: Describe “what you want”
# Just state the desired end state
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx:1.19
| Dimension | Imperative | Declarative |
|---|
| Focus | Process (How) | Result (What) |
| Executor | User orchestrates each step | System auto-reconciles |
| Idempotency | Requires extra handling | Naturally idempotent |
| Error Recovery | Requires user intervention | Self-healing |
Control Loop
The core of K8s is the Control Loop:
Desired State Actual State
(User declares) (System observes)
| |
+---> Controller <----+
|
Observe → Diff → Act → Repeat
Power in action:
I declare: I want 3 nginx Pods
A Pod gets accidentally deleted → Controller detects 2 ≠ 3 → Auto-creates 1
I modify declaration to 5 → Controller detects 3 ≠ 5 → Auto-creates 2
No manual intervention needed. System auto-detects, auto-recovers, auto-adapts.
2. Trellis and K8s Analogy
Architecture Mapping
┌─────────────────────────────────────────────────────────────┐
│ Kubernetes │
│ │
│ YAML Manifest ──> Controller ──> Actual State │
│ (Desired State) (Reconcile) (Actual State) │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ Trellis │
│ │
│ Task Dir ──> Dispatch + Ralph Loop ──> Compliant Code │
│ (Desired State) (Reconcile) (Actual State) │
└─────────────────────────────────────────────────────────────┘
Core Component Mapping
| Kubernetes | Trellis | Description |
|---|
| YAML Manifest | Task Directory | Declares desired state |
| Controller | Dispatch | Orchestrates phase execution |
| Reconciliation Loop | Ralph Loop | Loops until verification passes |
| Pod/Container | Agent | Actual execution unit |
| ConfigMap | jsonl + Hook | Injects config/context |
| Actual State | Final Code | Product after reconciliation |
Key Insight
K8s solves: Infrastructure complexity — Uses declarative to abstract away details, Controller handles reconciliation.
Trellis solves: AI development uncertainty — Uses declarative to define expectations (prd.md + guidelines), Ralph Loop handles reconciliation.
Common ground:
- Users only declare “what they want”, don’t worry about “how to do it”
- System continuously reconciles until actual state matches desired
- Auto-repairs when deviations occur
Next, Chapter 3 details the reconciliation mechanism (Hook + Ralph Loop), and Chapter 4 expands on the complete workflow (Phase 1-4).
3. Reconciliation Mechanism Deep Dive
Trellis reconciliation is achieved through two mechanisms working together: Hook Injection and Ralph Loop.
Hook Injection
Timing: Automatically triggered each time a Subagent is called
Function: Injects file contents referenced in jsonl into the Agent’s context
Plan/Research Agent finds needed files in advance
│
▼
Writes to implement.jsonl / check.jsonl
│
▼
Dispatch calls Subagent
│
▼
Hook intercepts, reads jsonl, injects file contents
│
▼
Subagent receives complete context, starts working
jsonl file example:
{"file": ".trellis/spec/backend/index.md", "reason": "Backend guidelines"}
{"file": "src/api/auth.ts", "reason": "Existing auth pattern"}
Why this design:
- Prevents context overload (Context Rot) — Only injects what’s needed for current phase
- Traceable — jsonl records what context each task used
- Decoupled — Agent doesn’t need to search, focuses on execution
Ralph Loop
Essence: A programmatic quality gate that intercepts Agent stop requests and forces continuation if verification fails.
Trigger timing: When Check Agent attempts to stop
Flow:
Check Agent attempts to stop
│
▼
SubagentStop Hook triggers ralph-loop.py
│
▼
Has verify config?
│
┌────┴────┐
Yes No
│ │
▼ ▼
Run verify Check completion
commands markers
(pnpm lint) (parse from output)
│ │
▼ ▼
┌──┴──┐ ┌──┴──┐
│Pass │ │Complete│
│ │ │ │
▼ ▼ ▼ ▼
allow block allow block
(stop) (continue) (stop) (continue)
Max 5 iterations, then force allow
verify config example (worktree.yaml):
verify:
- pnpm lint
- pnpm typecheck
Why use programmatic verification instead of letting AI judge:
- Programmatic verification is reliable — lint pass means pass, doesn’t depend on AI’s judgment
- Configurable — Different projects can configure different verification commands
- Prevents infinite loops — Max 5 iterations, then force allow
Limitations:
- Complex architectural issues or logic bugs may require human intervention
- Depends on guideline quality; unclear guidelines lead to limited check effectiveness
4. Complete Workflow
Phase Overview
Task Directory
├── prd.md (Task requirements)
├── implement.jsonl (Implementation phase context)
├── check.jsonl (Check phase context)
└── task.json (Metadata)
│
▼
┌───────────────────────────────────────────────┐
│ Phase 1: implement │
│ ───────────────── │
│ Agent: Implement Agent │
│ Injects: prd.md + files from implement.jsonl │
│ Task: Write code based on requirements │
└───────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────┐
│ Phase 2: check │
│ ───────────────── │
│ Agent: Check Agent │
│ Injects: Guideline files from check.jsonl │
│ Task: Check code compliance, fix issues │
│ Reconcile: Ralph Loop verifies, loops if fail│
└───────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────┐
│ Phase 3: finish │
│ ───────────────── │
│ Agent: Check Agent (with [finish] flag) │
│ Injects: finish-work.md (Pre-Commit List) │
│ Task: Pre-commit completeness check │
│ - lint/typecheck/test passing │
│ - Documentation in sync │
│ - API/DB changes complete │
│ Reconcile: Skips Ralph Loop (already verified)│
└───────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────┐
│ Phase 4: create-pr │
│ ───────────────── │
│ Task: Create Pull Request │
└───────────────────────────────────────────────┘
│
▼
Compliant Code + PR
Exception Path
If Check Agent reports unfixable issues, Dispatch can call Debug Agent for deep analysis. This is not the default flow, but exception handling.
5. Why This Design
One-Click Complete Workflow
/trellis:start or /trellis:parallel (Claude Code only) launches with one click, AI completes the entire flow:
Plan → Implement → Check → Finish → PR
Users don’t need to guide step-by-step. What to do at each phase, which guidelines to reference — it’s all predefined.
Continuous Accumulation of Development Guidelines
Guidelines stored in .trellis/spec/
│
▼
AI executes with guidelines ──> Finds issues ──> Updates guidelines
│ │
└────────────────────────────────────┘
Guidelines improve over time
Thinking Guides help discover “didn’t think of that” problems.
Preventing Context Rot
Too much context causes LLM to:
- Distraction — Gets sidetracked by irrelevant information
- Confusion — Information contradicts itself
- Clash — Old and new information conflict
Trellis injects by phase:
- implement phase: Requirements + related code
- check phase: Development guidelines
- finish phase: Pre-commit checklist
Each phase’s Agent only receives context relevant to its task.
Programmatic Quality Control
Traditional approach:
"Please check code quality" ──> AI says "I checked" ──> Did it really?
Trellis approach:
Ralph Loop runs pnpm lint ──> Pass to proceed ──> Programmatically guaranteed
Doesn’t rely on AI’s self-judgment, uses programmatic enforcement.
Traceability
| Record | Content |
|---|
| jsonl | What context each task used |
| workspace | Work content of each session |
| task.json | Complete task lifecycle |
When issues arise, you can trace back to which file was missing, or which guideline was unclear.
Summary
| Concept | K8s | Trellis |
|---|
| Desired State | YAML Manifest | Task Directory (prd.md + jsonl) |
| Execution Unit | Pod/Container | Agent |
| Reconciliation Loop | Controller | Dispatch + Ralph Loop |
| Config Injection | ConfigMap | Hook + jsonl |
| Final Product | Running Pods | Compliant Code |
Core philosophy aligned: Declare desired → System reconciles → Eventually consistent.