Gap surfacing before decisions. Raises procedural, consideration, assumption, and alternative gaps as questions to transform unknown unknowns into known considerations.
View on GitHubjongwony/epistemic-protocols
syneidesis
February 1, 2026
Select agents to install to:
npx add-skill https://github.com/jongwony/epistemic-protocols/blob/main/syneidesis/skills/syneidesis/SKILL.md -a claude-code --skill syneidesisInstallation paths:
.claude/skills/syneidesis/# Syneidesis Protocol
Surface potential gaps at decision points through questions, enabling user to notice what might otherwise remain unnoticed.
## Definition
**Syneidesis** (συνείδησις): A dialogical act of surfacing potential gaps—procedural, consideration, assumption, or alternative—at decision points, transforming unknown unknowns into questions the user can evaluate.
```
Syneidesis(D, Σ) → Scan(D) → G → Sel(G, D) → Gₛ → Q(Gₛ) → J → A(J, D, Σ) → Σ'
D = Decision point ∈ Stakes × Context
Stakes = {Low, Med, High}
G = Gap ∈ {Procedural, Consideration, Assumption, Alternative}
Scan = Detection: D → Set(G) -- gap identification
Sel = Selection: Set(G) × D → Gₛ -- prioritize by stakes
Gₛ = Selected gaps (|Gₛ| ≤ 2)
Q = Question formation (assertion-free)
J = Judgment ∈ {Addresses(c), Dismisses, Silence}
c = Clarification (user-provided response to Q)
A = Adjustment: J × D × Σ → Σ'
Σ = State { reviewed: Set(GapType), deferred: List(G), blocked: Bool }
── PHASE TRANSITIONS ──
Phase 0: D → Scan(D) → G -- detection (silent)
Phase 1: G → TaskCreate[all gaps] → Gₛ → Q[AskUserQuestion](Gₛ[0]) → J -- register all, surface first [Tool]
Phase 2: J → A(J, D, Σ) → TaskUpdate → Σ' -- adjustment + task update [Tool]
── LOOP ──
After Phase 2: re-scan for newly surfaced gaps from user response.
If new gaps: TaskCreate → add to queue.
Continue until: all tasks completed OR user ESC.
Mode remains active until convergence.
── ADJUSTMENT RULES ──
A(Addresses(c), _, σ) = σ { incorporate(c) } -- extern: modifies plan
A(Dismisses, _, σ) = σ { reviewed ← reviewed ∪ {Gₛ.type} }
A(Silence, d, σ) = match stakes(d):
Low|Med → σ { deferred ← Gₛ :: deferred }
High → σ { blocked ← true }
── SELECTION RULE ──
Sel(G, d) = take(priority_sort(G, stakes(d)), min(|G|, stakes(d) = High ? 2 : 1))
── CONTINUATIO