CLN · Feb 2026 · CC BY 4.0 · Vadim Shchetinkin
CLN Specification v2.8 new: §25 Inline Fmt · §23 Directives++ · §24 Visual §§
The spec is itself written in CLN-rendered HTML.
Hover operators for context menus ·
Click spoilers to reveal ·
Live demos embedded in each section.
Changelog
History
| Ver | Type | Change |
|---|---|---|
| v2.8 | NEW | §25 Inline Formatting — **bold** *italic* `code` ~~strike~~ $math$ ![img]() ==mark== · mid-line only |
| v2.8 | UPD | §23 Directives: %include %const %alias %version %export %presentation added |
| v2.8 | UPD | §14 AI Instructions Rule 20 — inline formatting awareness: tokens mid-line only; inside fences = verbatim |
| v2.7 | NEW | §24 Visual Sections >> — named containers with render attributes (bg/border/accent/width/collapse/viz:) |
| v2.6 | NEW | §23 Directives System % — 10 directive categories, scoping (global/section/local), combination operators |
| v2.5 | UPD | §14 Rule 18 — Reality Check: Type A (non-existent) vs Type B (terminological mismatch) taxonomy |
| v2.4 | NEW | §8.3 Section Divider ⟶ — phase/chapter divider restored; MDA template updated |
| v2.4 | NEW | §14 Line Length Guidelines — target ≤80 chars; exceptions for URLs, fenced code, table cells |
| v2.4 | NEW | §15 AI System Prompt — canonical minimal + strict prompts, Custom Instructions text, text expander snippet, API usage |
| v2.4 | UPD | §13 AI Instructions: rules 12–15 added (line length, link policy, output format, ⟶ divider) |
| v2.4 | UPD | §11 MDA Template: updated to use ⟶ for depth levels |
| v2.4 | UPD | §16 Philosophy (renumbered from §14) |
| v2.3 | NEW | §7 Tables ((( ))) / (( )): header row, data rows, pipe-separated cells |
| v2.3 | UPD | §9 Grammar: example updated with table syntax |
| v2.3 | UPD | §13 AI instructions: rule 11 on tables + quality check item |
| v2.2 | NEW | §6 Parallel Blocks ( ): block grouping, flex-row rendering |
| v2.2 | NEW | §4.1 Inline Spoiler || text ||: hidden content, revealed on click |
| v2.1 | NEW | §5 Addressing System: ## anchors, » links, // block labels |
| v2.1 | UPD | §4 Line anatomy: added Slot 4 (Anchor) |
01/
What is CLN?
Concept
=
CLN — plain-text semantic notation for structured thinking, AI prompts, and knowledge storage
=
Core idea: One line = one fact · Operator = semantic role · Indentation = ownership
.
CLN eliminates connective tissue — "furthermore", "it should be noted", "in addition"
→
replaces it with visual semantics — operators the eye reads before engaging with content
+
works in any plain-text field — no rendering required to extract meaning
+
human + AI readable — operators provide typed structure AI can parse without ambiguity
!
CLN is not markup for rendering — it is a cognitive tool for structuring thought
02/
Operator Set
Reference
=
12 operators — each encodes a distinct cognitive role
*
start with 4:
= . | @ — add others as needed
| Op | Name | Cognitive Role | When to use |
|---|---|---|---|
| = | Equals | Definition / Essence | Goal, context, thesis, identity — "what is it?" |
| . | Dot | Action / Step | Tasks, procedures, sequence — "what to do?" |
| | | Pipe | Resource / Tool | Libraries, instruments, channels — "with what?" |
| @ | At | Metadata / Status | Deadline, owner, priority — "who/when/where?" |
| ! | Bang | Risk / Warning | Dangers, blockers, edge cases — "what can go wrong?" |
| ? | Question | Unknown / Hypothesis | Open questions, unverified — "what don't we know?" |
| * | Star | Note / Context | Examples, references, clarifications — "by the way" |
| → | Arrow | Result / Output | Consequence, conclusion, next state |
| ~ | Tilde | Tension / Paradox | Conflicting forces, trade-offs without resolution |
| + | Plus | Pro / Advantage | Trade-off analysis — "for" |
| - | Minus | Con / Cost | Trade-off analysis — "against" |
| ✔ | Check | Done | Completion marker — dynamic state |
?
Why does CLN use single characters instead of words?
The eye reads the operator column before the content column. A single character can be classified in <50ms — before you start reading the content. Words would collapse the two into one pass, destroying the pre-read scanning advantage.
03/
Indentation Rules
Structure
=
step size: 4 spaces — fixed, no tabs
.
Level 0 — document header:
TOPIC: SUMMARY: TASK: PROJECT: MDA:
.
Level 1 (4 sp) — primary operators: all 12 operators
.
Level 2 (8 sp) — subordinate detail belonging to Level-1 line
.
Level 3+ (12, 16…) — rare deeper nesting
!
same-level operators in a block must share the same horizontal start position
TOPIC: Example indentation levels
= Level 1 — this is the context
@ Level 2 — subordinate metadata
. Level 1 — action step
| Level 2 — tool for this step
! Level 2 — risk belonging to this step
→ Level 3 — consequence of the risk
04/
Line Anatomy
★ v2.2 Spoilers
=
every CLN line follows a fixed slot order — slots are optional except Operator and Content
SLOT 1
Operator
= . | @ ! ? * → ~ + - ✔
required
SLOT 2
Content
plain text · inline tokens
required
SLOT 3
#Tags
#backend #urgent
optional
SLOT 4
##Anchor
##api-tests
★ v2.1
SLOT 5
Marker
☐ ✔ !!
optional
. Write API integration tests #backend ##api-tests ☐
↑ ↑ ↑ ↑ ↑
Slot 1 Slot 2 Slot 3 Slot 4 Slot 5
*
Parser reads right-to-left: strip Marker → strip Anchor → strip Tags → parse Content
→
guarantees no conflicts —
## in content vs ##id in slot 4 always resolved correctly
4.1/
Inline Spoiler
|| text ||
★ v2.2
=
syntax:
|| hidden text || — inline token anywhere in Content slot
=
hidden state: background = text color → unreadable block · revealed on click
!
does not cross line boundaries — always inline within one Content slot
? Self-Test: what kills a good note? || Ambiguity. No operator = no meaning. ||
= Rule: one fact per line || violating this creates cognitive debt ||
// Live demo — click the spoilers below
?
What is the parser rule for spoilers?
|| opens, next || closes. Does not cross line boundaries. Multiple spoilers on one line are independent tokens, each toggled separately.
?
Can a spoiler appear inside a table cell?
Yes — spoilers and »links are the only inline CLN tokens permitted inside (( )) table cells. Operators (=, ., !, etc.) inside cells are treated as plain text.
05/
Addressing System
★ v2.1
=
three primitives forming an architectural hierarchy
// Block Label
=syntax:
// TEXT or // ##id TEXT.names a section — "the Room"
.optional anchor suffix makes block addressable
*recommended:
// ##arch 01 · Architecture// Line Anchor
=syntax:
##id in Slot 4.names a line — "the Spot"
!ID charset:
[a-z0-9\-\_]+ only!no spaces, no uppercase, must be unique
// Cross-Reference
=syntax:
»[text]##id.creates a typed link — "the Path"
.inline in Content slot — multiple per line
*short form:
»##id when text = id
// ##arch 01 · Architecture
= client-server, React + Go ##arch-decision
// ##risks 02 · Risks
! latency spike — see »[architecture decision]##arch-decision !!
. blocked by »[auth task]##auth-task ☐
06/
Parallel Blocks
( )
★ v2.2
=
groups CLN lines into blocks that render side-by-side (flex-row) in HTML
=
in plain text: blocks stack vertically · in rendered output: consecutive blocks flow horizontally
.
syntax:
( on its own line opens a block · ) on its own line closes it
!
single
( ) block → plain group · consecutive ( ) at same indent → flex container
TOPIC: Architecture choice
(
= Option A — Monolith
+ fast start
- hard to scale
)
(
= Option B — Microservices
+ flexible
- high overhead
)
// Live render of the above — two flex-row blocks
Option A — Monolith
+fast start
-hard to scale
Option B — Microservices
+flexible
-high overhead
// Parser rules
.line equals
( trimmed → open block, push level = current indent.line equals
) trimmed → close block, pop level.consecutive
( ) at same indent → wrap in .cln-parallel (flex container).blocks can be nested —
( inside ( is valid
07/
Tables
((( ))) / (( ))
★ v2.3 NEW
=
encodes two-dimensional, fixed-column data — comparisons, matrices, reference tables, schedules
=
table = sequence of row lines · each row wrapped in
(( )) · optional header in ((( )))
.
cells separated by
| within a row · escape with \| inside cell values
| Token | Role | HTML output |
|---|---|---|
((( col | col ))) | Header row | <thead> <th> |
(( val | val )) | Data row | <tbody> <td> |
| | (whitespace only) | Empty cell | <td class="cln-td-empty"> |
\| | Escaped pipe (literal in cell) | renders as | |
7.1/
Syntax
((( Algorithm | Best | Average | Worst | Stable )))
(( Quick Sort | O(n log n) | O(n log n) | O(n²) | No ))
(( Merge Sort | O(n log n) | O(n log n) | O(n log n) | Yes ))
(( Heap Sort | O(n log n) | O(n log n) | O(n log n) | No ))
(( Bubble Sort | O(n) | O(n²) | O(n²) | Yes ))
* Tim Sort (hybrid) is default in Python and Java
! Quick Sort worst case triggered by sorted input without randomised pivot
? Which is the only stable O(n log n) sort? || Merge Sort — guarantees stability without extra cost ||
// Live render of the above CLN table
| Algorithm | Best | Average | Worst | Stable |
|---|---|---|---|---|
| Quick Sort | O(n log n) | O(n log n) | O(n²) | No |
| Merge Sort | O(n log n) | O(n log n) | O(n log n) | Yes |
| Heap Sort | O(n log n) | O(n log n) | O(n log n) | No |
| Bubble Sort | O(n) | O(n²) | O(n²) | Yes |
*
Tim Sort (hybrid merge+insertion) is default in Python and Java
!
Quick Sort worst case triggered by sorted input without randomised pivot
?
Which is the only stable O(n log n) sort?
Merge Sort — guarantees stability at all input sizes without extra algorithmic cost.
7.2/
Rules & Constraints
=table begins at the first
(( or ((( row at any indent level=table ends when a non-table line is encountered at same or lower indent
=column count fixed by header (or first row) — all subsequent rows conform
!nested tables are forbidden —
(( inside (( is a parse error!
( ) parallel blocks are forbidden inside table cells+
|| spoilers || are permitted inline inside cells+
»links are permitted inline inside cells.short rows → right-padded with empty cells · long rows → truncated + parser warning
*CLN operators inside cells (=, ., !, etc.) → treated as plain text, not parsed
7.3/
Parser Rules
Step 1 Line matches /^\s*\(\(\((.+)\)\)\)\s*$/ → header row
strip outer ((( ))) · split on unescaped |
each segment → <th>, trimmed
Step 2 Line matches /^\s*\(\((.+)\)\)\s*$/ → data row
strip outer (( )) · split on unescaped |
each segment → <td>, trimmed
empty segment (whitespace only) → <td class="cln-td-empty">
Step 3 Consecutive rows at same indent → one <table>
first ((())), found → opens <thead>, then <tbody>
if no ((())) before first (()) → open <tbody> immediately
Step 4 First non-table line at same/lower indent → close </table>
Step 5 Column count = len(header) if header present, else max(row widths)
short row → append <td class="cln-td-empty"> to fill
long row → truncate + emit [TABLE:OVERFLOW row N]
Step 6 Inside cells: || text || → <span class="cln-spoiler">
»[t]##id → <a href="#id" class="cln-ref">
\| → literal pipe character
7.4/
HTML Output
<!-- ((( Algorithm | Best | Worst ))) -->
<!-- (( Quick Sort | O(n log n) | O(n²) )) -->
<table class="cln-table">
<thead>
<tr>
<th>Algorithm</th>
<th>Best</th>
<th>Worst</th>
</tr>
</thead>
<tbody>
<tr>
<td>Quick Sort</td>
<td>O(n log n)</td>
<td>O(n²)</td>
</tr>
</tbody>
</table>
/* Minimal CSS for cln-table */
.cln-table { border-collapse: collapse; width: 100%; }
.cln-table th { text-align: left; font-weight: 600;
border-bottom: 2px solid var(--border);
padding: .3rem .6rem; }
.cln-table td { padding: .28rem .6rem;
border-bottom: 1px solid var(--border); }
.cln-td-empty { color: var(--muted); }
7.5/
Tables vs Parallel Blocks
Use
((( ))) / (( )) when:=data is two-dimensional, fixed-column
=cells contain scalar values (string, number, status)
=reader will scan vertically (compare column values)
=you would draw this in Excel or a spreadsheet
Use
( ) blocks when:=content is hierarchical (CLN lines with operators)
=cells need multi-line content with indentation
=items are equal but not tabular (alternatives, pillars)
=you need
+ - ! operators per block
~
decision heuristic — three questions
?
Does it have a fixed column schema? Yes → table. No → blocks.
?
Are cells scalar (one value each)? Yes → table. No → blocks.
?
Would you draw it in Excel? Yes → table. No → blocks.
08/
The Horizontal Bar
───
Utility
=Unicode U+2500 Box Drawings Light Horizontal — two roles
.Section separator — visual chapter divider in long CLN documents
.Code fence — embeds raw data (JSON, code, logs) without confusing the parser
!
! - = inside the fence are NOT CLN operators — plain text only
. validate config
| format: json
{
"source": "database",
"flags": ["debug", "!important"]
}
! check for missing required keys
09/
Grammar in 30 Seconds
Quick Ref
TOPIC: Title goes here
= definition or essence #domain
@ status: active
. action step one #tag ##step-one ☐
| tool: something
. depends on »[step one]##step-one ☐
+ advantage ✔ confirmed
- disadvantage
! risk !!
~ unresolved tension
* Self-Test: main risk? || see ! line above ||
(
= option A
+ fast
)
(
= option B
+ reliable
)
((( Metric | Option A | Option B )))
(( Speed | fast | slow ))
(( Memory | O(1) | O(n) ))
(( Stable | No | Yes ))
*
Line anatomy recap:
OPERATOR · Content · #tags · ##anchor · ✔marker
10/
Summarization Template
Template
SUMMARY: [Title]
= core definition / thesis (1–2 lines max)
= key insight or takeaway
. main point 1
* supporting detail
. main point 2
| tools / methods / resources involved
+ strengths / advantages
- weaknesses / limitations
! risks / warnings / common mistakes
@ domain: field of application
@ source: origin / author / year
.every line = one independent fact (no filler words)
.operators encode the TYPE of information, not emphasis
.reader extracts meaning by scanning the operator column alone
.result must be copy-paste ready into any plain-text environment
!no Markdown symbols (
** ##headers) — use ─── for code, ##id for anchors
11/
Multi-Dimensional Analysis
Template
MDA: [Topic] — depth [N]
⟶ ##first First-Order
. Dimension: [AREA 1]
= description
+ strength
- weakness
⟶ ##second Second-Order
. Effect: consequence of »[First Order]##first
* explanation
⟶ ##third Third-Order Cascade
. Cascade: emergent system effect
= description
* implication
⟶ ##foresight Foresight
. Strategic direction
~ tension that drives the cascade
12/
CLN vs Prose vs Markdown
Comparison
| Property | Prose | Markdown | CLN |
|---|---|---|---|
| Human readability | ✅ narrative flow | ✅ rendered | ✅ raw text |
| Scannability | ❌ must read all | ⚠️ headers help | ✅ operator column |
| Data embedding | ❌ messy | ⚠️ code blocks | ✅ ─── fencing |
| AI parsability | Medium | Medium | High (structured) |
| Semantic typing | ❌ implicit | ❌ visual only | ✅ operator = type |
| Internal linking | ❌ prose refs | ⚠️ markdown anchors | ✅ ##id + »link |
| Tabular data | ❌ formatting | ⚠️ basic tables | ✅ ((( ))) / (( )) |
| Parallel layout | ❌ prose only | ❌ none | ✅ ( ) flex-row |
+use CLN for: summaries, analysis, specs, notes, PKM, AI prompts, agent protocols, linked knowledge graphs
*use prose for: storytelling, essays, blog posts, emotional content
13/
Instructions for AI Models
★ v2.4
=
when a user asks for CLN format (or uses
^summarize, ^mda) follow these rules:
- 01Start with a header at Level 0:
SUMMARY:ANALYSIS:TASK:MDA:PROJECT: - 02Use operators semantically, not decoratively — each operator signals a specific cognitive role
- 03One fact per line — no compound sentences, no filler words
- 04Indent consistently — 4 spaces per level, operators aligned vertically
- 05Use
───for code — wrap JSON, code, logs. Do not use Markdown backticks inside CLN - 06Output must be copy-paste ready — works in any plain-text field without rendering
- 07Scan test: reader should understand structure by reading only the operator column
- 08Use
##anchors+»linksfor cross-references, task dependencies, TOC navigation - 09Use
( )blocks for parallel alternatives, options, or side-by-side concepts - 10Use
|| text ||for spoilers — deferred context, self-test answers, hypotheses - 11★Use
((( )))/(( ))for tabular data — header + data rows, pipe-separated cells. No nested tables. No( )inside cells.|| ||and»linkspermitted inside cells. - 12★Keep lines short — target ≤ 80 chars per content line. Split long lines into parent + children via indentation. See §14 for full rules and exceptions.
- 13★Link policy — real URLs only when explicitly requested. Never fabricate links. No citation markers (
[1],:contentReference[…]). Internal references:»[text]##idsyntax only. - 14★Output format — wrap the full CLN response in a fenced code block tagged
cln. No prose outside the block. Preserves indentation in all Markdown-rendering interfaces. - 15★Use
⟶dividers for sequential phases, MDA depth levels, timelines, and roadmaps. See §8.3. - 16★Directives processing — when
%directives present: read all before generating.%aliasexpands first.%reality: offsuspends Rule 18.%templateexpands before cascade. See §23. - 17★Visual Sections —
>>is a container, not a content operator. Content inside inherits section directives. When%presentation: true, each>>= one slide. See §24. - 18★Inline formatting awareness — tokens (
**bold***italic*`code`~~strike~~$math$![img]()==mark==) are parsed mid-line only. At line-start:*= Note operator. Inside───fences: all tokens verbatim. See §25.
Quality Check
Before responding
Risk scan
Can I find all risks by scanning for
! lines?Action scan
Can I find all action items by scanning for
. lines?Code scan
Is raw code safely wrapped in
─── fences?Link scan
Are cross-references using
»[text]##id syntax?Block scan
Are parallel alternatives wrapped in
( ) blocks?Table scan ★ v2.3
Is tabular data using
((( ))) / (( ))? No nested tables?Length scan ★ v2.4
Are content lines within 80 chars? (excl. URLs, fenced code, table cells)
URL scan ★ v2.4
All URLs real and explicitly requested? No
[cite] or :contentReference noise?
14/
Line Length Guidelines
★ v2.4
=
target: ≤ 80 characters per content line (operator + indent + content)
=
recommendation, not a hard rule — exceptions exist (see below)
.
split long lines by adding parent + children via indentation — never paraphrase to shorten
!
long lines break scannability — the operator column loses its value when content sprawls horizontally
✓ Good — split into hierarchy
=React frontend
|state: Redux
|data: React Query
@deployed: AWS
✗ Bad — one long line
=The system uses React with Redux state management and React Query for data fetching, deployed on AWS
14.2/
Exceptions — lines that may exceed 80 chars
.URLs — never truncate real hyperlinks
.Fenced code blocks
─── — raw code, JSON, logs reproduced as-is.Table cells
(( )) / ((( ))) — never break table structure for length.Anchors
##long-descriptive-anchor in Slot 4 — never shortened
15/
AI System Prompt
★ v2.4
=
canonical prompts — copy verbatim into the system field of any AI interface
=
three variants: minimal (recommended) · strict · text expander snippet
15.1/
Minimal Prompt — recommended
You are a CLN engine. CLN = Cognitive Ladder Notation v2.8.
OUTPUT RULES:
1. Wrap every response in ```cln ... ``` (fenced code block, tag "cln").
2. No text outside the code block.
3. Use operators: = . | @ ! ? * → ~ + -
4. 4-space indentation per level.
5. One fact per line. Max ~80 chars per line (not strict for URLs/code fences).
6. No fabricated URLs. No citation markers ([1], :contentReference).
Internal links: »[text]##id only.
7. Use ─── for raw code/data embedding.
8. Use ⟶ for sequential phases and MDA depth levels.
9. Use tables ((( ))) / (( )) for fixed-column data.
10. Use ( ) blocks for parallel alternatives.
11. Use || text || for inline spoilers.
12. Inline formatting mid-line only: **bold** *italic* `code` ~~strike~~ $math$ ==mark==
13. Read %directives before generating. %alias expands first. %reality:off = fiction mode.
14. >> sections are visual containers. %presentation:true = slide mode.
Spec: https://cognitiveladder.com/CLN-Spec-v2_8.md
15.3/
Custom Instructions field (ChatGPT / similar)
.paste into "How would you like the AI to respond?" field · applies to all new chats
Always respond in CLN (Cognitive Ladder Notation) v2.8 format.
Wrap every response in ```cln ... ```. No prose outside the block.
Operators: = . | @ ! ? * → ~ + - | 4-space indent | one fact per line.
Lines ≤ 80 chars. Split long lines via indentation, not paraphrase.
No fabricated URLs. No [cite] or :contentReference markers.
Internal links: »[text]##id only. Real URLs only when explicitly asked.
Use ─── for code fences. Use ⟶ for phases/MDA. Use ((( ))) for tables.
Inline fmt mid-line only: **bold** *italic* `code` ~~strike~~ ==mark==
Read %directives first. >> sections = visual containers.
Spec: https://cognitiveladder.com/CLN-Spec-v2_8.md
15.4/
Text Expander Snippet
/cln
.for platforms without persistent system prompts (chat.z.ai, API playgrounds)
.create shortcut
/cln in TextExpander, Espanso, or Alfred with this body:
[CLN MODE] Respond in Cognitive Ladder Notation v2.8.
Wrap in ```cln```. One fact per line. 4-space indent. Max ~80 chars.
Operators: = . | @ ! ? * → ~ + -
No fake URLs. No citation markers. Internal refs: »##id.
Use ─── for code. Use ⟶ for phases. Use ((( ))) for tables.
Inline fmt mid-line: **bold** *italic* `code` ~~strike~~ ==mark==
→
type
/cln at the start of any new conversation to instantly activate CLN mode
*
API usage: pass §15.1 prompt as
{"role": "system", "content": "..."}
16/
Origin & Philosophy
Meta
=
CLN evolved from A1sLadder — a code formatting standard based on eye-tracking research
*
the core insight: manual formatting is not styling — it is the act of thinking
→
CLN does for text what musical notation did for music — makes invisible structure visible, portable, reproducible
| Level | Tool | Role |
|---|---|---|
| Tactical | A1sLadder | Code formatting for documentation |
| Strategic | CLN | Universal notation for thinking |
| Operational | Chainalyst | Analytical engine using CLN as I/O |
A1sLadder → CLN → Chainalyst
Code formatting → Universal notation → Analytical engine
23/
Directives System
%
★ v2.6
++ v2.8
=directives are processing instructions — a meta-layer above the CLN document
*they tell AI and parsers how to interpret and generate content
=syntax:
%directive: value · always on their own line · before the content they govern!fully optional — valid CLN requires zero directives. Start with none; add one when you feel the need
23.1/Core Directives (v2.6)
|
%domain: medicine · law · finance · cooking · tech · science · education · creative|
%units: strict · relaxed · si · us · uk|
%language: en · ru · de · fr · … (BCP-47 tag)|
%tone: formal · neutral · casual · academic · technical|
%depth: 1–5 (1 = headline only · 5 = maximum detail)|
%audience: expert · professional · general · beginner · child|
%template: summary · mda · recipe · legal · medical|
%reality: strict · default · off (off suspends Rule 18 for fiction)|
%output: plain · html · markdown · json|
%validation: strict · default · none23.3+/New Directives ★ v2.8
%version: 2.8v2.8
Declares CLN spec version. Parser warns on mismatch (VERSION:MISMATCH). Allows graceful degradation.
%include: ./path/to/file.clnv2.8
Includes external CLN file at this point. Supports
key=value overrides. Circular include → error INCLUDE:CIRCULAR. Scoped to current document unless propagated.
%const: name = "value"v2.8
Defines a named constant. Reference via
%%name in content. Must be defined before first use. Undefined reference → CONST:UNDEFINED warning.%const: author = "Vadim Shchetinkin"
%const: version = "2.8"
@ author: %%author · spec: %%version
%alias: name = directive:v directive:v …v2.8
Defines a named macro that expands to multiple directives. Invoke with
%aliasname. One level deep — no nested alias chains.%alias: medical = domain:medicine units:strict tone:formal reality:strict
%medical ← expands to all four directives above
%export: html | pdf | pptx | plain | json | mdv2.8
Target output format hint for the renderer/exporter. Does not change CLN syntax — purely advisory.
%presentation: truev2.8
Enables slide mode — each top-level
>> section becomes a slide. Slide attributes: type: (title/content/section/end) · transition: (fade/slide/zoom/none) · columns: · notes: · align:%presentation: true
%export: pptx
>> ##s1 Overview | type:title align:center
= CLN v2.8 — Cognitive Ladder Notation
>> ##s2 Problem | type:content transition:fade columns:2
( = without CLN ! prose loses structure )
( = with CLN + operators type every fact )
23.4/Scoping — cascade
=local directive > section directive > global directive
.global: at document top · section: inside
>> block · local: inline %units:si on one line.12-step parse order: alias expansion → const substitution → include processing → template expansion → cascade
24/
Visual Sections
>>
★ v2.7
=named containers — a meta-layer element that wraps CLN content into addressable, visually styled blocks
*in plain text: acts as a section header · in HTML: renders as
<section> with optional styles!not a content operator — wraps content, not describes it. Not equivalent to
= or |24.1/Syntax
>> ##anchor Section Title | bg:color border:color accent:color width:N collapse:true
= content inside the visual section
! risks inside
. actions inside
24.2/Render Attributes
| Attribute | Values | Effect |
|---|---|---|
bg: | hex color / CSS variable | Section background |
border: | hex color | Border color |
accent: | hex color | Left accent stripe |
width: | 1–12 (grid columns) | Section width in grid layout |
collapse: | true / false | Collapsible section (spoiler-like) |
divider: | true / false | Visual divider above section |
pad: | sm / md / lg | Internal padding |
css: | any CSS string | Passthrough to style="" |
viz: | bar / line / pie / area / sparkline | Chart rendering for data lines |
24.3/Example
>> ##risks Project Risks | bg:#1a0a0a accent:#d4654a collapse:true
! no fallback if API goes down !!
! deadline: 2026-03-15 is fixed !!
>> ##kpis Q1 Metrics | viz:bar
= revenue: 120 000
= users: 8 400
= NPS: 72
25/
Inline Formatting
★ v2.8
=inline tokens borrowed from Markdown/LaTeX — familiar, portable, non-conflicting with CLN operators
!key rule: tokens are only parsed mid-line — never at line-start
*
* at line-start after indent = operator (Note)*
*word* mid-line = italic · distinction unambiguous — parsers check position.inside
─── fences: all tokens verbatim — no formatting parsed25.1/Token Reference
| Name | Syntax | Rendered | Plain text fallback |
|---|---|---|---|
| Bold | **text** | text | *text* |
| Italic | *text* | text | _text_ |
| Inline code | `code` | code |
kept as-is |
| Strikethrough | ~~text~~ | --text-- | |
| Math inline | $formula$ | MathJax/KaTeX | kept as-is |
| Math block | $$formula$$ | display-mode | kept as-is |
| Image |  | <img> rendered | [alt] |
| Highlight | ==text== | text | >>text<< |
25.2/Usage Examples
TOPIC: Project Status
= **CLN** is a plain-text notation — *semantic*, not just visual
= install with: `npm install cln-parser`
= deprecated: ~~use prose notes~~ · replaced by CLN operators
= energy: $E = mc^2$ (Einstein · 1905)
= see: 
= ==critical deadline== — review before merge !!
! **never** push to main directly !!
* see OWASP: `A03:2021 — Injection`
. run `npm test` before committing ☐
25.3/Operator Disambiguation
✓ Mid-line → formatting
=this is bold and italic text
!never ignore this warning !!
.run
npm test ☐✗ Line-start → operator
*this is a Note — not italic
=*this* at line-start after indent = operator, not italic
25.4/Quality Check additions
Inline fmt scan ★ v2.8
Are
**bold** / *italic* tokens mid-line only? None at line-start? All inside ─── fences verbatim?Image alt scan ★ v2.8
Every
 has non-empty alt text? Missing alt → WARN [IMG:NO-ALT]