RIPP Directory Layout

RIPP Directory Layout

This document explains the RIPP directory structure, naming conventions, and the distinction between different types of directories.

Overview

RIPP uses a clear, explicit directory structure that separates human-authored intent from machine-generated outputs. This makes it immediately obvious what is source material and what is derived.

Directory Structure

your-project/
├── .ripp/                       # Hidden config/control plane
│   ├── config.yaml              # RIPP configuration (AI settings, evidence scanning)
│   ├── evidence/                # Generated evidence pack (vNext)
│   ├── intent.candidates.yaml   # AI-generated candidates (vNext)
│   ├── intent.confirmed.yaml    # Human-confirmed intent (vNext)
│   └── handoff.ripp.yaml        # Final canonical packet (vNext)
│
└── ripp/                        # Visible workspace
    ├── README.md                # Workflow documentation
    ├── .gitignore               # Ignore generated packages
    ├── intent/                  # 📝 Human-authored intent (SOURCE)
    │   ├── auth-login.ripp.yaml
    │   ├── user-profile.ripp.yaml
    │   └── payment-flow.ripp.yaml
    │
    └── output/                  # 🤖 Generated artifacts (DERIVED)
        ├── handoffs/            # Validated, finalized packets
        │   └── approved-feature.ripp.yaml
        └── packages/            # Packaged deliverables (gitignored)
            ├── handoff.md
            ├── handoff.json
            └── handoff.zip

Directory Purposes

.ripp/ — Hidden Control Plane

Purpose: Configuration and transient workflow state

Contents:

Visibility: Hidden (dotfile), excluded from most ls output

Version Control: .ripp/config.yaml is committed; generated files are gitignored

When to use: System configuration and AI workflow state; not for end-user content


ripp/ — Visible Workspace

Purpose: All user-facing RIPP content

Visibility: Visible, shown in repository navigation

Version Control: Entire directory structure is committed (except output/packages/)


ripp/intent/ — Human-Authored Intent

Purpose: Work-in-progress RIPP packets

Contents:

Naming Convention: <feature-name>.ripp.yaml or .ripp.json

Examples:

Version Control: ✅ Committed to git

Workflow:

  1. Author creates new packet in intent/
  2. Iterates and refines
  3. Runs ripp validate and ripp lint
  4. When approved, moves to output/handoffs/

ripp/output/ — Generated Artifacts

Purpose: Machine-generated or finalized outputs

Contents:

Rationale:


ripp/output/handoffs/ — Finalized Packets

Purpose: Validated, approved RIPP packets ready for delivery to implementation teams

Contents:

Version Control: ✅ Committed to git

Workflow:

  1. Move validated packet from intent/ to output/handoffs/
  2. Run ripp package to generate deliverables
  3. Deliver to implementation team

ripp/output/packages/ — Packaged Deliverables

Purpose: Generated output formats for delivery

Contents:

Version Control: ❌ Gitignored (generated artifacts)

Workflow:

  1. Run ripp package --in ripp/output/handoffs/my-feature.ripp.yaml --out ripp/output/packages/handoff.md
  2. Share generated file with receiving team
  3. Regenerate as needed (not committed to version control)

.ripp/ vs ripp/

Aspect .ripp/ ripp/
Visibility Hidden (dotfile) Visible
Purpose Config & workflow state User-facing content
Typical Contents config.yaml, AI workflow state Intent packets, handoffs, packages
Version Control Config committed, state ignored Intent & handoffs committed, packages
ignored    
User Interaction Rarely edited manually Frequently edited (intent/) or consumed
(output/)    
Analogy .git/ — system internals src/ — source code

Human-Authored vs Generated

Human-Authored (SOURCE)

Machine-Generated (DERIVED)

Rule of thumb: If it can be regenerated from source, it’s machine-generated.


What “Artifacts” Means in RIPP

Common confusion: Is there an artifacts/ directory?

Answer: No. “Artifacts” in RIPP refers to the conceptual outputs of the specification process, not a specific directory.

RIPP artifacts include:

Why explicit names instead of “artifacts/”:


VS Code Extension and Tooling Boundaries

What Gets Packaged

Included in RIPP outputs:

NOT included in RIPP outputs:

Metadata vs Tooling

Acceptable metadata:

# Inside a packaged RIPP packet
_ripp_package_metadata:
  packaged_by: ripp-cli
  ripp_cli_version: 1.0.0
  packaged_at: '2025-12-13T10:00:00Z'
  tooling_used:
    - name: vscode-ripp
      version: 1.2.0

NOT acceptable:

Rationale:


Migration from Legacy Structure

Legacy Structure (Pre-v1.1)

ripp/
├── features/    # Old name for intent
├── handoffs/    # Old location (now output/handoffs/)
└── packages/    # Old location (now output/packages/)

New Structure (v1.1+)

ripp/
├── intent/              # Renamed from features/
└── output/
    ├── handoffs/        # Moved from handoffs/
    └── packages/        # Moved from packages/

How to Migrate

# Preview changes
ripp migrate --dry-run

# Apply migration
ripp migrate

What happens:

Backward compatibility:


Best Practices

1. Keep Intent Packets in intent/

2. Move to output/handoffs/ When Approved

3. Regenerate Packages from Source

4. Don’t Commit Packages to Git

5. Use Descriptive Packet IDs

6. Validate Before Moving to Handoffs

# Validate before moving
ripp validate ripp/intent/my-feature.ripp.yaml

# Move when valid
mv ripp/intent/my-feature.ripp.yaml ripp/output/handoffs/

FAQ

Why intent/ instead of features/?

Why output/ instead of top-level handoffs/ and packages/?

Can I use the old directory names?

Do I need to migrate immediately?

Can I create custom subdirectories?


Summary

Directory Purpose Source/Derived Committed to Git
.ripp/config.yaml Configuration Source
.ripp/evidence/ Repository scan (vNext) Derived
ripp/intent/ Work-in-progress packets Source
ripp/output/handoffs/ Finalized, approved packets Hybrid
ripp/output/packages/ Packaged deliverables Derived

Remember:


Learn more: