| name | induce |
| description | Crystallize a shared but unnamed concept from the concrete cases at hand. Type: (AbstractionInProcess, AI, INDUCE, A) โ CrystallizedAbstraction |
Periagoge Protocol
Calibrate and crystallize in-process abstraction through AI-proposed candidate plus user dialectical triangulation. Type: (AbstractionInProcess, AI, INDUCE, A) โ CrystallizedAbstraction.
Definition
Periagoge (ฯฮตฯฮนฮฑฮณฯฮณฮฎ): A dialogical act of turning an in-process abstraction toward its crystallized form, where AI detects when an instance set has converged toward an unnamed essence, calibrates the user's in-process concept against that instance set, proposes a calibrated candidate abstraction paired with a personalized grounding example drawn from the user's own domain, and shapes the candidate through the user's response โ accept the candidate, broaden its scope, narrow it along a specific dimension, fuse it with an adjacent abstraction, or redirect onto an orthogonal axis โ until the abstraction locates itself (the Greek dialectical vocabulary supplies the source terms).
โโ FLOW โโ
Periagoge(A) โ Detect(A) โ in_process? โ
true: (Iแตข, E, L?) โ Calibrate(Iแตข, E, L?, ctx) โ K โ
Propose(Iแตข, E, K, ctx) โ (P, G) โ
Qs(P, G, K, framing) โ Stop โ V โ integrate(V, candidate) โ candidate' โ
loop until crystallized(A) โ declare(completion_trace, open_trace) โ CrystallizedAbstraction
or attempts_exhausted โ deactivate
false: deactivate
โโ MORPHISM โโ
A
โ detect(instances, essence, locator) -- verify in-process abstraction exists
โ calibrate(E, L?, Iแตข, ctx) -- surface what instances preserve, sharpen, prune, and leave open
โ propose(candidate, grounding, calibration) -- AI generates candidate + personalized example + calibration map
โ triangulate(candidate, user_move) -- user shapes via type-preserving materialized moves
โ integrate(V, candidate) -- update candidate per user response
โ crystallize(abstraction) -- convergence when confirmed
โ declare(trace, open_trace) -- terminal evidence trace + open-item disposition
โ CrystallizedAbstraction
requires: in_process(A) -- runtime checkpoint (Phase 0)
deficit: AbstractionInProcess -- activation precondition (Layer 1/2)
preserves: instance_set(A) -- Iแตข read-only; K computed per Phase 1 entry and recomputed on Phase 1 re-entry; candidate mutates per user move
invariant: Calibrative Induction through Dialectical Triangulation over Unilateral Correction
โโ TYPES โโ
A = AbstractionSeed (in-process state: instances + essence intuition + optional user concept label)
Detect = A โ (Bool, (Iแตข, E, L?) if true)
Iแตข = Set(Instance) -- instance set observed; cardinality unconstrained (any N โฅ 1 qualifies when essence is sensed; richer sets provide stronger triangulation material)
Instance = { content: String, context: String } -- concrete case observed
E = EssenceIntuition -- variation-stable core signal from conversation
L = Option(TentativeLabel) -- user-provided provisional name or concept, if any
ctx = DomainContext -- user's domain context gathered via artifact read, artifact search, and a conditional external fetch in Phase 1
Calibrate = (Iแตข, E, L?, ctx) โ K
K = CalibrationMap { keeps, sharpens, prunes, open }
keeps = supported core to preserve
sharpens = under-specified decision-relevant structure
prunes = overextended or unsupported scope to release
open = residual uncertainty that does not block crystallization
OpenDisposition โ {None, Nonblocking, Deferred}
None = no open calibration pressure remains; explicitly declared
Nonblocking = open item remains visible but does not block Confirm
Deferred = user routes an open item to later work via free response
OpenItemDisposition โ {Nonblocking, Deferred}
OpenTrace = { status: OpenDisposition, items: Map(String, OpenItemDisposition) }
-- terminal disposition for K.open; empty open sets declare status None
status(OpenTrace) = None if K.open = โ
; Deferred if โ item : items(item) = Deferred; otherwise Nonblocking
P = CandidateAbstraction { name, structure, instance_map, provenance }
G = GroundingExample { scenario: String, domain: String, mapping: String }
-- personalized to user's own domain context
Propose = (Iแตข, E, K, ctx) โ (P, G)
V = UserMove โ {Confirm, Widen(direction), Narrow(specializer), Fuse(adjacent), Reorient(axis), Dismiss}
direction โ {upward, lateral} -- Synagoge family; AI-proposed broadening (user Recognition mode)
specializer = dimension to constrain -- Diairesis family (user-directed specialization)
adjacent = neighboring abstraction ref -- lateral Synagoge with user-named reference (user Production mode)
axis = orthogonal dimension -- full redirection
Qs = Shaping interaction with candidate + grounding [Tool: Constitution interaction]
crystallized(A) = โ step โ history : V(step) = Confirm
CompletionTrace = List<(A, K, P, V, candidate')>
-- derived from ฮ.history with A sourced from ฮ.A and candidate' computed from each step's post-move candidate state
CrystallizedAbstraction = P where confirmed(P) via Confirm move โง completion_trace_declared(CompletionTrace) โง open_disposition_declared(OpenTrace)
โโ A-BINDING โโ
bind(A) = explicit_arg โช recent_instance_cluster โช surfaced_essence
Priority: explicit_arg > recent_instance_cluster > surfaced_essence
/induce "theme" โ A = AbstractionSeed with theme label
/induce (alone) โ A = most recent instance cluster in session (any cardinality)
"the pattern across..." โ A = instance cluster under discussion
If no essence signal is detectable (neither user sensing language nor AI-inferrable core pattern): pause activation and surface the scan result before Phase 0, inviting the user to either name what feels in-process or withdraw.
โโ PHASE TRANSITIONS โโ
Phase 0: A โ Detect(A) โ in_process? -- detection checkpoint (silent)
Phase 1: (Iแตข, E, L?) โ Calibrate(Iแตข, E, L?, ctx) โ K โ Propose(Iแตข, E, K, ctx) โ (P, G); carry (P, G, K) -- calibration + candidate + grounding construction [Tool]
Phase 2: (P, G, K) โ Qs(P, G, K, framing) โ Stop โ V -- triangulation Constitution interaction [Tool]
Phase 3: V โ integrate(V, candidate) โ candidate' -- candidate update (track)
โโ LOOP โโ
After Phase 3: evaluate user move.
If V = Confirm: crystallize(candidate), ฮ.completion_trace := derive(ฮ.history, ฮ.A, candidate'), ฮ.open_trace := derive(K.open, V, free_response), declare(ฮ.completion_trace, ฮ.open_trace), terminate.
If V = Widen(direction): candidate' = widened(candidate, direction) via Synagoge โ return to Phase 2.
If V = Narrow(specializer): candidate' = narrowed(candidate, specializer) via Diairesis โ return to Phase 2.
If V = Fuse(adjacent): candidate' = fused(candidate, adjacent) via lateral Synagoge โ return to Phase 1 (grounding recomputed).
If V = Reorient(axis): candidate' = orthogonal(axis) โ return to Phase 1 (full recompute).
If V = Dismiss: abandon candidate; if essence still sensed, return to Phase 1 with fresh candidate; else deactivate.
Max 5 triangulation attempts per abstraction seed.
Continue until: crystallized(A) โจ attempts_exhausted.
Convergence evidence: At crystallized(A), present transformation trace โ for each step โ history, show (calibration โ candidate โ user_move โ candidate') โ plus OpenTrace for K.open. OpenTrace status is None when K.open is empty, Deferred when any open item is routed to later work, and Nonblocking otherwise. Convergence is demonstrated, not asserted.
โโ CONVERGENCE โโ
crystallized(A): see TYPES (V = Confirm in history)
progress(ฮ) = |history| / max_attempts
early_exit = attempts_exhausted
โโ TOOL GROUNDING โโ
-- Realization: Constitution โ TextPresent+Stop; Extension โ TextPresent+Proceed
Phase 0 Detect (sense) โ Internal analysis (no external tool)
Phase 1 Calibrate+Propose (observe) โ artifact read, artifact search (user's domain context for personalized grounding); external fetch (conditional: cross-domain adjacent abstractions)
Phase 2 Qs (constitution) โ present calibration map + candidate + grounding (mandatory)
Phase 3 (track) โ Internal state update
converge (extension) โ TextPresent+Proceed (convergence evidence trace + open disposition; proceed with crystallized abstraction)
seam (extension) โ TextPresent+Proceed (fires at deactivation/handoff: a user-declared chain naming the next protocol settles the next move โ proceed directly to it, citing that settling source. This protocol declares no wired outbound continuation edge: its only cross-protocol link is an inbound misfit absorption (`Upstream misfit absorption`), not a post-crystallization handoff, so the second trigger is vacuously absent. Every Constitution gate inside this protocol and inside the next protocol fires unchanged)
โโ MODE STATE โโ
ฮ = { phase: Phase, A: AbstractionSeed, Iแตข: Set(Instance), E: EssenceIntuition,
calibration: Option(K), candidate: Option(P), grounding: Option(G),
history: List<(P, G, K, V)>, attempts: Nat, crystallized: Option(P),
completion_trace: Option(CompletionTrace),
open_trace: Option(OpenTrace),
active: Bool, cause_tag: String }
โโ COMPOSITION โโ
*: product โ (Dโ ร Dโ) โ (Rโ ร Rโ). Dimension resolution emergent via session context.
Mode Activation
/induce remains directly invocable. AI-guided activation requires a sensed essence whose name, scope, or position is still unsettled; detection stays silent. Existing abstractions awaiting comparison or validation route elsewhere, and a crystallized or dismissed (instance set, essence) pair stays inactive for the session.
If an explicit invocation has no detectable essence signal, surface that scan result and invite the user to name what feels in process or withdraw. Prior-session recall may seed neighboring abstractions but never settles crystallization.
Protocol
User-facing realization
At Phase 2, render K as Keeps / Sharpens / Prunes / Open, then present the candidate, instance map, personalized grounding, surfaced neighbors, and remaining refinement budget in prose. Ground the example in the user's actual domain by artifact read/search; when that domain requires external fetch, cite its URL at the point of use.
Materialize the V constructors as everyday-language options with anticipatable differential futures. Omit Fuse when no adjacent candidate surfaced, while keeping free response available for user-supplied fusion, calibration correction, or an unlisted shape. Confirm and Dismiss remain constitutive even when analysis favors one shaping trajectory.
Frame the abstraction currently being shaped rather than a progress fraction. Read references/round-composition.md before composing when terminology must remain stable, wording must be carried unchanged, material belongs to another round or trace, or phase order determines placement relative to the gate.
Rules
- Recognition over Recall: Present structured options with anticipatable post-selection states and yield for the user's shaping move.
- Calibration authority: Treat the candidate as a working hypothesis. The instance-grounded calibration remains open to correction through the same free-response path as candidate shaping.
- Personalized grounding: Pair every candidate with evidence from the user's own domain and keep external provenance visible.
- Periagoge boundary: Form an abstraction around a sensed but unlocated essence. Comparison or validation of an already located abstraction remains outside this operation.
- Round composition: Compose each round in everyday language, keep each judgment beside its evidence and next-move implication, and place analysis before the gate.
- Upstream misfit absorption: Accept a routed colimit-shaped signal as activation ground and show its cited essence-and-locator basis before Phase 1.
- Form feedback: Derive each round's density from the current request; carry an explicit form instruction until countermanded. Change the form directly. Elements fixed elsewhere remain fixed; state what changed and, where the instruction overlaps a fixed element, what stays and why.