visionspec

module
v0.13.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 18, 2026 License: MIT

README ΒΆ

VisionSpec

Go CI Go Lint Go SAST Docs Docs Visualization License

Multi-domain specification orchestration for humans and AI agents.

Overview

VisionSpec bridges the gap between organizational intent and executable specifications for AI coding agents. It implements Amazon's Working Backwards methodology to ensure every requirement traces back to a specific customer outcome.

Key Capabilities:

  • πŸ“£ Working Backwards flow - Start with vision (Press Release), derive requirements (PRD)
  • 🎯 Dual-methodology system - Separate requirements (WHAT) from implementation (HOW) methodologies
  • πŸ”„ AIDLC workflow - Full AWS AI-DLC integration with 12 document types across 3 phases
  • πŸ“‹ V2MOM strategic planning - Company, department, and team-level strategic alignment
  • ✍️ Domain-specific authoring - Separate specs for PM, UX, Engineering
  • βš™οΈ LLM synthesis - Generate Press, FAQ, PRD, TRD, TPD, IRD from source specs
  • πŸ“Š Structured evaluation - Per-domain LLM judges with 1-5 numeric scoring
  • πŸ”„ Reconciliation - Conflict detection and tradeoff resolution
  • πŸ“¦ Target adapters - Export to SpecKit, GSD, GasTown, GasCity, AWS AI-DLC, OpenSpec

All synthesized documents are committed to git and can be reviewed, edited, and refined by humans or collaboratively with AI assistants.

Installation

go install github.com/ProductBuildersHQ/visionspec/cmd/visionspec@v0.13.0

Quick Start

# Initialize a new project
visionspec init user-onboarding

# Or with a specific workflow methodology
visionspec init user-onboarding --workflow=aws-working-backwards/product

# Validate project structure
visionspec lint

# Check project status
visionspec status
visionspec status --format json
visionspec status --format html > status.html

Spec-Workflows Integration

VisionSpec can load workflows, templates, and rubrics from external spec-workflows repositories. This enables organizations to fork and customize methodologies.

# Clone spec-workflows (auto-discovered from ~/.config/visionspec/)
git clone https://github.com/ProductBuildersHQ/spec-workflows ~/.config/visionspec/spec-workflows

# List available workflows
visionspec workflows

# Initialize with a specific methodology
visionspec init my-product --workflow=aws-working-backwards/product
visionspec init my-feature --workflow=lean-startup/feature

Auto-discovery searches: --workflows-repo flag β†’ VISIONSPEC_WORKFLOWS_REPO env β†’ upward directory walk β†’ ~/.config/visionspec/spec-workflows/

Directory Structure

docs/specs/
β”œβ”€β”€ CONSTITUTION.md                    # Repo-level governance
β”œβ”€β”€ ROADMAP.md                         # Cross-project priorities
└── {project}/                         # kebab-case project name
    β”œβ”€β”€ source/                        # Human-authored specs
    β”‚   β”œβ”€β”€ mrd.md
    β”‚   β”œβ”€β”€ prd.md
    β”‚   └── uxd.md
    β”œβ”€β”€ gtm/                           # LLM-generated GTM docs
    β”‚   β”œβ”€β”€ press.md
    β”‚   β”œβ”€β”€ faq.md
    β”‚   └── narrative.md
    β”œβ”€β”€ technical/                     # LLM-generated technical docs
    β”‚   β”œβ”€β”€ trd.md
    β”‚   β”œβ”€β”€ tpd.md
    β”‚   └── ird.md
    β”œβ”€β”€ eval/                          # All evaluations
    β”‚   β”œβ”€β”€ mrd.eval.json
    β”‚   β”œβ”€β”€ prd.eval.json
    β”‚   └── ...
    β”œβ”€β”€ .graphize/                     # Requirement graph
    β”œβ”€β”€ spec.md                        # Reconciled execution spec
    β”œβ”€β”€ current-truth.md               # Post-ship state
    β”œβ”€β”€ status.html                    # Readiness report
    β”œβ”€β”€ index.md                       # MkDocs page
    └── visionspec.yaml                 # Configuration

Working Backwards Flow

VisionSpec implements Amazon's Working Backwards methodology. Instead of starting with requirements and hoping they lead to a good customer experience, you start with the vision and work backwards:

1. MARKET PROBLEM (human-authored)
   mrd.md
       ↓
2. WORKING BACKWARDS (synthesized, editable)
   press.md  β†’  faq.md  β†’  prd.md
   (vision)     (scope)    (requirements)
       ↓
3. STAKEHOLDER REVIEW (synthesized, editable)
   narrative-1p.md / narrative-6p.md
       ↓
4. USER EXPERIENCE (human-authored)
   uxd.md
       ↓
5. TECHNICAL SPECS (synthesized, editable)
   trd.md  β†’  tpd.md  β†’  ird.md
   (design)   (tests)    (infra)
       ↓
6. RECONCILIATION
   All approved specs β†’ spec.md
       ↓
7. AI EXECUTION
   spec.md β†’ SpecKit | GSD | GasTown | GasCity
       ↓
8. POST-SHIP ALIGNMENT
   spec.md + reality β†’ current-truth.md

Why this order? The Press Release defines the customer experience before any requirements are written. The FAQ challenges that vision and surfaces gaps. Only then is the PRD derivedβ€”grounded in a validated vision rather than abstract feature lists.

See Working Backwards for the full methodology.

CLI Commands

Full documentation: CLI Reference

Project Setup
Command Description
init <project> Initialize a new project
create <type> Scaffold a new spec from template
lint [project] Validate directory structure
status Show project status and readiness
workflow Display workflow DAG with dependencies
profiles <cmd> Manage configuration profiles
Spec Workflow
Command Description
eval [type] Evaluate specs using LLM judges
synthesize <type> Generate GTM/technical specs from sources
reconcile Generate unified execution spec
approve <type> Approve a spec for reconciliation
Export & Integration
Command Description
export <target> Export to target execution system
targets List available export targets
serve Start MCP server for AI integration
docs <cmd> Generate MkDocs documentation
rules <cmd> Export workflow rules for AI assistants
Execution Alignment
Command Description
align Check spec-to-reality alignment
drift Detect spec-to-code drift
generate tests Generate test stubs from TPD
sync <target> Sync execution state with target system
metrics View evaluation metrics dashboard
hooks <cmd> Manage Git hooks (install, uninstall, status)
Cross-Project Analysis
Command Description
search <query> Full-text search across spec files
reuse Analyze requirement reuse opportunities
patterns Detect patterns and anti-patterns
Context & Traceability
Command Description
context <cmd> Gather codebase context
graph <cmd> Manage requirement graphs
workflows List available workflows from spec-workflows repo

Status Command

The status command shows project readiness with multiple output formats:

# Terminal output with readiness gates
visionspec status -p myproject

# JSON for programmatic use
visionspec status -p myproject --format json

# HTML report with traffic light indicator
visionspec status -p myproject --format html > status.html

# Markdown for embedding in docs
visionspec status -p myproject --format markdown

# CI mode - exits non-zero if not ready
visionspec status -p myproject --ci
Readiness Gates
Gate Description
Required specs present All required source specs (mrd, prd, uxd, trd) exist
Evaluations passing No blocking evaluation findings
Approvals obtained All required specs have approvals
Execution spec generated spec.md has been created

MCP Server

VisionSpec includes an MCP (Model Context Protocol) server for integration with AI coding assistants like Claude Code and Kiro CLI.

# Run MCP server directly
visionspec-mcp
MCP Tools
Tool Description
list_projects List all visionspec projects
get_project_status Get project readiness status
start_draft Initialize a new draft
update_draft Save draft content
eval_draft Evaluate draft against rubric
finalize_draft Promote draft to final spec
get_draft Retrieve current draft
discard_draft Delete a draft
get_spec Get specification content
get_eval Get evaluation results
run_eval Run evaluation against rubric
synthesize Generate a spec
reconcile Generate execution spec
approve Approve a specification
export Export to target system
align_spec Run alignment checking
get_alignment_status Get alignment status
track_resolution Track discrepancy resolution
get_metrics Get evaluation metrics
install_hooks Install git hooks
get_hooks_status Get hooks status
get_execution_status Track requirement implementation progress
track_requirement Update requirement status with evidence

Export Targets

Target Description
speckit GitHub Spec-Kit format
gsd Get Shit Done (PLAN.md, STATE.md)
gastown GasTown formulas and beads
gascity GasCity city.toml configuration
aidlc AWS AI-DLC Workflows (vision-document.md, technical-environment.md)
openspec OpenSpec portable JSON/YAML format
github GitHub Issues (milestones, labels)
jira Jira epics/stories

Configuration Profiles

VisionSpec includes two types of profiles:

Stage-Based Profiles

For different product lifecycle stages:

Profile Required Specs Use Case
0-1 hypothesis Idea validation phase
startup prd Pre-PMF startups
growth prd, uxd, faq 1-N scaling phase
enterprise mrd, prd, uxd, trd, press, faq, spec Post-PMF enterprises
Methodology Profiles

For different organizational methodologies:

Profile Methodology Best For
aws-product Working Backwards (MRD start) New product lines (PR/FAQ, 6-pager)
aws-feature Working Backwards (OpportunitySpec start) Features on existing products
big-tech-product Multi-company best practices Enterprise products (10 methodologies)
big-tech-feature Multi-company feature workflow Enterprise features (comprehensive)
big-tech-essentials-product Streamlined best practices Growing companies (3 core methodologies)
google Design Docs + RFC Engineering-heavy orgs (OKRs, experiments)
stripe API-First Platform/API products (contract-first, DX)
lean-startup Build-Measure-Learn Early validation (hypothesis, MVP)
design-thinking Stanford d.school Human-centered design (empathy, prototyping)
jtbd Jobs to be Done Customer motivations (job statements, outcomes)
continuous-discovery Teresa Torres Continuous learning (opportunity trees)
shapeup Basecamp Fixed timelines (6-week cycles, pitches)

The aws-feature profile uses OpportunitySpec from prism-roadmap as the starting document instead of MRD, providing a 12-box canvas that combines discovery (Patton) with business case rigor (Cagan).

Using Profiles
# List available profiles
visionspec profiles list

# Show profile details
visionspec profiles show aws

# Initialize with a methodology profile
visionspec init my-product --profile aws

# Initialize with a stage profile
visionspec init my-feature --profile startup

# Export profile for customization
visionspec profiles export enterprise ./my-profile

# Initialize with custom profile directory
visionspec init my-project --profile-dir ./my-profile

Organization Customization

VisionSpec is designed for organizations to build their own prescriptive CLI tools. The open source version provides flexibility and choices; organization versions enforce standards.

Open Source vs. Organization
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Organization CLI                     β”‚
β”‚  (e.g., plexus-spec, acme-spec)                          β”‚
β”‚                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ Org            β”‚  β”‚ Org         β”‚  β”‚ Org           β”‚  β”‚
β”‚  β”‚ Templates      β”‚  β”‚ Rubrics     β”‚  β”‚ Constitutions β”‚  β”‚
β”‚  β”‚ (prescriptive) β”‚  β”‚ (strict)    β”‚  β”‚ (defaults)    β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚           β”‚                 β”‚                 β”‚          β”‚
β”‚           β–Ό                 β–Ό                 β–Ό          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚              ChainLoader (fallback)                β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                β”‚                β”‚
          β–Ό                β–Ό                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  visionspec (open source)                β”‚
β”‚                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚  β”‚ Default     β”‚  β”‚ Default     β”‚  β”‚ Built-in    β”‚       β”‚
β”‚  β”‚ Templates   β”‚  β”‚ Rubrics     β”‚  β”‚ App Types   β”‚       β”‚
β”‚  β”‚ (flexible)  β”‚  β”‚ (choices)   β”‚  β”‚ (generic)   β”‚       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Aspect Open Source Organization
Templates Choices (fill in blanks) Prescriptive (pre-filled)
Rubrics "Database choice documented" "MUST use PostgreSQL with RLS"
Constitutions None (orgs provide) Built-in org/team defaults
App Types Generic constraints Stricter requirements
Building an Organization CLI

Organizations embed their resources and use ChainLoader to try org-specific first, falling back to visionspec defaults:

import (
    "embed"
    "github.com/ProductBuildersHQ/visionspec/pkg/cli"
    "github.com/ProductBuildersHQ/visionspec/pkg/constitution"
    "github.com/ProductBuildersHQ/visionspec/pkg/templates"
)

//go:embed templates/*.md
var orgTemplates embed.FS

//go:embed constitutions/**/*.yaml
var orgConstitutions embed.FS

func main() {
    root := &cobra.Command{Use: "org-spec"}
    cfg := cli.DefaultConfig()

    // Org templates first, fall back to visionspec defaults
    cfg.TemplateLoader = templates.NewChainLoader(
        templates.NewEmbedFSLoader(orgTemplates, "templates"),
        templates.EmbeddedLoader(),
    )

    // Org constitutions define defaults projects inherit
    cfg.ConstitutionLoader = constitution.NewEmbeddedLoader(
        orgConstitutions, "constitutions",
    )

    cli.AddCommandsTo(root, cfg)
    root.Execute()
}
Constitution Hierarchy

Constitutions define organizational defaults that flow down through inheritance:

org/plexusone.yaml          # Organization defaults
    ↓ inherits
team/platform-team.yaml     # Team overrides
    ↓ inherits
project/agentos.yaml        # Project-specific + exceptions

Example organization constitution:

apiVersion: visionspec/v1
kind: Constitution
metadata:
  name: plexusone
  level: organization

technical:
  languages:
    backend:
      primary: go
      allowed: [go, rust]
  tenancy:
    model: multi-tenant
    isolation: rls

infrastructure:
  iac:
    tool: pulumi
    language: go
  availability:
    target: "99.9"

See Organization Customization Guide and examples/org-cli/ for complete examples.

Dependencies

Development

# Build
make build

# Test
make test

# Lint
make lint

# Install locally
make install

Project Status

See ROADMAP.md for detailed implementation status and CHANGELOG.md for release history.

Current Version: v0.10.0

Phase Status
Phase 0: Foundation Complete
Phase 1: Directory Structure Complete
Phase 2: Evaluation Engine Complete
Phase 3: GTM & Technical Synthesis Complete
Phase 4: Reconciliation Engine Complete
Phase 5: Target Adapters Complete
Phase 6: Claude Code Integration Complete
Phase 7: Graphize Integration Complete
Phase 8: Advanced Features Complete
Phase 9: Composability Complete
Phase 10: Platform Enhancements In Progress
Phase 11: Context Sources Complete
Phase 12: Methodology Profiles Complete
Phase 13: AI Workflow Orchestration Complete
Phase 14: Execution Integration Complete

License

MIT

Directories ΒΆ

Path Synopsis
cmd
mcp-server command
Package main is the entry point for the visionspec MCP server.
Package main is the entry point for the visionspec MCP server.
visionspec command
Package main is the entry point for the visionspec CLI.
Package main is the entry point for the visionspec CLI.
examples
0-1-product command
Example: 0-1 Product CLI using profiles
Example: 0-1 Product CLI using profiles
1-n-growth command
Example: 1-N Growth CLI using profiles
Example: 1-N Growth CLI using profiles
org-cli command
Example: Building a custom CLI with visionspec
Example: Building a custom CLI with visionspec
post-pmf-enterprise command
Example: Post-PMF Enterprise CLI using profiles
Example: Post-PMF Enterprise CLI using profiles
pre-pmf-startup command
Example: Pre-PMF Startup CLI using profiles
Example: Pre-PMF Startup CLI using profiles
internal
cli
Package cli implements the visionspec command-line interface.
Package cli implements the visionspec command-line interface.
mcp
Package mcp implements the Model Context Protocol server for visionspec.
Package mcp implements the Model Context Protocol server for visionspec.
pkg
aidlc
Package aidlc provides AIDLC document evaluation using structured-evaluation rubrics.
Package aidlc provides AIDLC document evaluation using structured-evaluation rubrics.
align
Package align provides post-ship spec-to-reality alignment checking.
Package align provides post-ship spec-to-reality alignment checking.
apptypes
Package apptypes defines application type specifications for VisionSpec.
Package apptypes defines application type specifications for VisionSpec.
cli
Package cli provides a composable CLI for visionspec.
Package cli provides a composable CLI for visionspec.
config
Package config handles configuration loading for visionspec.
Package config handles configuration loading for visionspec.
constitution
Package constitution defines the hierarchical constitution system for VisionSpec.
Package constitution defines the hierarchical constitution system for VisionSpec.
context
Package context provides context aggregation from multiple sources for grounding spec synthesis in reality.
Package context provides context aggregation from multiple sources for grounding spec synthesis in reality.
context/file
Package file provides local file context source.
Package file provides local file context source.
context/git
Package git provides git repository context source.
Package git provides git repository context source.
context/graphize
Package graphize provides graphize requirement traceability context source.
Package graphize provides graphize requirement traceability context source.
context/mcp
Package mcp provides MCP client for external context sources.
Package mcp provides MCP client for external context sources.
context/sources
Package sources provides factory functions to create context sources.
Package sources provides factory functions to create context sources.
decisions
Package decisions provides decision log persistence and rationale tracking.
Package decisions provides decision log persistence and rationale tracking.
deps
Package deps provides cross-project dependency tracking for VisionSpec.
Package deps provides cross-project dependency tracking for VisionSpec.
draft
Package draft provides draft management for spec authoring.
Package draft provides draft management for spec authoring.
drift
Package drift provides spec-to-code drift detection.
Package drift provides spec-to-code drift detection.
eval
Package eval provides evaluation orchestration for spec documents.
Package eval provides evaluation orchestration for spec documents.
hooks
Package hooks provides Git hooks management for visionspec.
Package hooks provides Git hooks management for visionspec.
lint
Package lint validates visionspec directory structure and naming conventions.
Package lint validates visionspec directory structure and naming conventions.
metrics
Package metrics provides dashboard rendering for project metrics.
Package metrics provides dashboard rendering for project metrics.
mkdocs
Package mkdocs provides MkDocs integration for visionspec.
Package mkdocs provides MkDocs integration for visionspec.
patterns
Package patterns provides specification pattern detection across projects.
Package patterns provides specification pattern detection across projects.
profiles
Package profiles provides reusable configuration profiles for visionspec.
Package profiles provides reusable configuration profiles for visionspec.
reconcile
Package reconcile provides spec reconciliation capabilities.
Package reconcile provides spec reconciliation capabilities.
reuse
Package reuse provides requirements reuse tracking across projects.
Package reuse provides requirements reuse tracking across projects.
roadmap
Package roadmap provides ROADMAP.md generation from project specifications.
Package roadmap provides ROADMAP.md generation from project specifications.
rubrics
Package rubrics provides evaluation rubrics for spec types.
Package rubrics provides evaluation rubrics for spec types.
rules
Package rules provides embedded workflow rules for AI assistant orchestration.
Package rules provides embedded workflow rules for AI assistant orchestration.
search
Package search provides full-text search across specification files.
Package search provides full-text search across specification files.
specgraph
Package specgraph provides requirement graph extraction from visionspec specs.
Package specgraph provides requirement graph extraction from visionspec specs.
status
Package status generates project status reports.
Package status generates project status reports.
synth
Package synth provides spec synthesis (generation) capabilities.
Package synth provides spec synthesis (generation) capabilities.
target
Package target provides a GitHub Issues export adapter.
Package target provides a GitHub Issues export adapter.
templates
Package templates provides embedded templates for spec types.
Package templates provides embedded templates for spec types.
testgen
Package testgen generates executable test stubs from TPD (Test Plan Document).
Package testgen generates executable test stubs from TPD (Test Plan Document).
testmap
Package testmap provides test coverage mapping between specs and code.
Package testmap provides test coverage mapping between specs and code.
types
Package types defines the core data structures for visionspec.
Package types defines the core data structures for visionspec.
version
Package version provides spec version tracking with git-like history.
Package version provides spec version tracking with git-like history.
workflow
Package workflow provides a generic workflow intermediate representation (IR) for modeling directed acyclic graphs (DAGs) of work items with dependencies.
Package workflow provides a generic workflow intermediate representation (IR) for modeling directed acyclic graphs (DAGs) of work items with dependencies.
workflow/specworkflow
Package specworkflow adapts the generic workflow package for visionspec.
Package specworkflow adapts the generic workflow package for visionspec.
workflows
Package workflows provides integration with spec-workflows repositories.
Package workflows provides integration with spec-workflows repositories.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL