Skip to content

AI Assistant Quickstart

Single-page orientation for AI assistants. For details, follow links to specific documentation pages.

  • CCL = Categorical Configuration Language
  • NOT like YAML/JSON - uses recursive fixed-point parsing
  • All identifiers use snake_case (never hyphens)
  • Core requirement: parse + build_hierarchy functions only
  • Everything else is optional library convenience

Use these exact terms when discussing CCL:

CategoryTerms
Core Functionsparse, build_hierarchy
Typed Accessget_string, get_int, get_bool, get_float, get_list
Processingfilter, compose
Formattingprint, canonical_format
Featurescomments, empty_keys, multiline, unicode, whitespace
Experimentalexperimental_dotted_keys (not standard)

Behaviors are not inherently mutually exclusive. Tests use a conflicts field to specify incompatible combinations.

Behavior GroupOptionsDescription
Continuation Baselinetoplevel_indent_strip vs toplevel_indent_preserveTop-level N=0 (reference) vs N=first key’s indent (simpler)
Line Endingscrlf_preserve_literal vs crlf_normalize_to_lfCRLF handling: preserve \r chars vs normalize to LF
Boolean Parsingboolean_lenient vs boolean_strictAccept “yes”/“no” vs only “true”/“false”
Tab Handlingtabs_as_content vs tabs_as_whitespacePreserve tabs literally vs treat as whitespace
Indentationindent_spaces vs indent_tabsOutput formatting style
List Accesslist_coercion_enabled vs list_coercion_disabledList access coercion behavior
Array Orderingarray_order_insertion vs array_order_lexicographicPreserve insertion order vs sort lexicographically
  • proposed_behavior - Proposed specification behavior
  • reference_compliant - OCaml reference implementation behavior

Key Concept: Recursive Fixed-Point Parsing

Section titled “Key Concept: Recursive Fixed-Point Parsing”

CCL is fundamentally different from YAML/JSON. Understanding this is critical:

database =
host = localhost
port = 5432
  1. Parse → Entry("database", "\n host = localhost\n port = 5432")
  2. Value contains = → parse recursively
  3. Result → {database: {host: "localhost", port: "5432"}}
  4. Fixed point → “localhost” and “5432” have no = → done

📖 Full details: Parsing Algorithm

PageUse When
Implementing CCLStarting a new implementation, choosing data structures
Parsing AlgorithmUnderstanding the core recursive algorithm
Syntax ReferenceLooking up syntax rules and edge cases
PageUse When
Library FeaturesAdding typed access, entry processing, or formatting
Library Features: FormattingUnderstanding print vs canonical_format
PageUse When
Test Suite GuideSetting up test filtering, understanding test format

Test Suite Repository: https://github.com/tylerbutler/ccl-test-data

  • Wrong: build-hierarchy, get-string, dotted-keys
  • Right: build_hierarchy, get_string, experimental_dotted_keys
  • source_tests/ → For test suite maintainers
  • generated_tests/For implementers (use this one)

Don’t Include Dotted Keys in Standard Progression

Section titled “❌ Don’t Include Dotted Keys in Standard Progression”
  • Dotted keys are experimental
  • Not part of standard CCL implementation path
  • CCL uses recursive fixed-point parsing
  • Fundamentally different algorithm
  • See Parsing Algorithm

Don’t Confuse print and canonical_format

Section titled “❌ Don’t Confuse print and canonical_format”
  • print → Structure-preserving: print(parse(x)) == x
  • canonical_format → Semantic-preserving: transforms to model representation
  • See Library Features: Formatting
TERMINOLOGY: Use snake_case everywhere
CORE: parse, build_hierarchy (required)
OPTIONAL: get_*, filter, compose, print, canonical_format
FEATURES: comments, empty_keys, multiline, unicode, whitespace
EXPERIMENTAL: experimental_dotted_keys (NOT standard)
TEST FORMAT: Use generated_tests/ directory (flat format)
ALGORITHM: Recursive fixed-point parsing (NOT like YAML/JSON)