Infer context insufficiency before execution. Surfaces uncertainties through information-gain prioritized inquiry when AI infers areas of context insufficiency, producing informed execution. Type: (ContextInsufficient, AI, INQUIRE, Prospect) → InformedExecution. Alias: Aitesis(αἴτησις).
27
17%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Risky
Do not use without reviewing
Optimize this skill with Tessl
npx tessl skill review --optimize ./aitesis/skills/inquire/SKILL.mdInfer context insufficiency before execution through AI-guided inquiry. Type: (ContextInsufficient, AI, INQUIRE, Prospect) → InformedExecution.
Aitesis (αἴτησις): A dialogical act of proactively inferring context sufficiency before execution, where AI identifies uncertainties across multiple dimensions (factual, coherence, relevance), collects contextual evidence via codebase exploration, classifies each uncertainty by dimension and verifiability, resolves memory-internal contradictions through evidence, routes cross-domain concerns to other epistemic protocols, and inquires about remaining uncertainties through information-gain prioritized mini-choices for user resolution.
── FLOW ──
Aitesis(X) → Scan(X, dimensions) → Uᵢ → Ctx(Uᵢ) → (Uᵢ', Uᵣ) →
classify(Uᵢ', dimension) → [if off-diagonal] Qc → (Uᵣ', Uₑ, Uᵢ'', Uₙ) →
Q(classify_result + Uₑ + Uᵢ'', priority) → A → X' → (loop until informed)
-- Uₙ (non-actionable: CrossDomain coherence + detect-only dimensions): shown in classify summary with routing target
-- Uᵢ'' (factual/user-dependent or coherence/MemoryInternal/user-dependent): Phase 2 question candidates
── MORPHISM ──
Prospect
→ scan(prospect, context, dimensions) -- infer context insufficiency (multi-dimension)
→ collect(uncertainties, codebase) -- enrich via evidence collection
→ classify(enrichable, dimension) -- epistemic classification (core act)
→ reclassify(MemoryInternal → Factual) -- Coherence/MemoryInternal enters Factual resolution path
→ observe(empirically_observable, environment) -- dynamic evidence gathering (factual only)
→ surface(classify_result + observed + remaining, as_inquiry)
→ integrate(answer, prospect)
→ InformedExecution
requires: uncertain(sufficiency(X)) -- runtime checkpoint (Phase 0)
deficit: ContextInsufficient -- activation precondition (Layer 1/2)
preserves: task_identity(X) -- task intent invariant; prospect context mutated (X → X')
invariant: Evidence over Inference over Detection
── TYPES ──
X = Prospect for action (source-agnostic: task execution, analysis, investigation, or any purposeful action requiring context)
-- Input type: morphism processes X uniformly; enumeration scopes the definition, not behavioral dispatch
Scan = Context sufficiency scan: X → Set(Uncertainty)
Uncertainty = { domain: String, description: String, context: Set(Evidence) }
Evidence = { source: String, content: String } -- collected during Ctx
Priority ∈ {Critical, Significant, Marginal}
Uᵢ = Identified uncertainties from Scan(X)
Ctx = Context collection: Uᵢ → (Uᵢ', Uᵣ)
Uᵢ' = Enriched uncertainties (evidence added, not resolved)
Uᵣ = Context-resolved uncertainties (resolved during collection)
Q = Inquiry (Constitution interaction), ordered by information gain
A = User answer ∈ {Provide(context), Point(location), Dismiss, Unknown(Partial)}
-- Unknown(Partial) = user declines certainty; Phase 3 auto-promotes via Cite-or-observe tiebreaker (UserTacit → next-preferred
-- EvidenceSource in ValidSources(v)) and re-enters Phase 1 for reclassification; routing arc formalized in PHASE TRANSITIONS
Ac = User coherence classification ∈ CoherenceType -- Phase 1 Qc gate answer type
X' = Updated prospect (context-enriched)
InformedExecution = X' where remaining = ∅ ∨ user_esc
-- Layer 1 (epistemic)
Dimension ∈ {Factual, Coherence, Relevance} ∪ Emergent(Dimension)
-- open set; external human communication excluded
Observability ∈ {StaticObservation, DynamicObservation, BeliefVerification}
-- exists(fact, env) sub-modes
-- Layer 2 (tool implementation, Factual and Coherence/MemoryInternal fibers — fibration structure)
Verifiability ∈ {ReadOnlyVerifiable, EmpiricallyObservable, UserDependent}
EvidenceSource ∈ {UserTacit, Instrumentation, CodeDerivable, CanonicalExternal}
∪ Emergent(EvidenceSource)
-- open set symmetric with Dimension; Emergent accumulator for novel channels
-- (TestSuite, AsyncComms, HypomnesisIndex, RuntimeObservability, etc.)
-- Emergent base promotion under variation-stable observed use
ValidSources : Verifiability → ℘(EvidenceSource)
ValidSources(ReadOnlyVerifiable) = {CodeDerivable, UserTacit, CanonicalExternal} ∪ Emergent(EvidenceSource)
ValidSources(EmpiricallyObservable) = {Instrumentation, UserTacit} ∪ Emergent(EvidenceSource)
ValidSources(UserDependent) = {UserTacit} ∪ Emergent(EvidenceSource)
-- Emergent(EvidenceSource) fallback-admissible when no base element fits the observed channel
-- cost-ordering tiebreaker (ascending): CodeDerivable < CanonicalExternal < Instrumentation < UserTacit
-- default selects lowest-cost valid source; override requires cite per Cite-or-observe rule
CoherenceType ∈ {MemoryInternal, CrossDomain}
-- 2D: Scope(Same/Cross) × Resolution(Evidence/Structure); off-diagonal → Gate
Scope ∈ {Same, Cross}
Resolution ∈ {Evidence, Structure}
off_diagonal(s, r) = ¬((s = Same ∧ r = Evidence) ∨ (s = Cross ∧ r = Structure))
classify = Uᵢ' → Σ(d: Dimension). Fiber(d)
where Fiber(Factual) = Σ(v: Verifiability). {s: EvidenceSource | s ∈ ValidSources(v)}
Fiber(Coherence) = CoherenceType
Fiber(Relevance) = Unit -- detect only
Fiber(Emergent(_)) = Unit -- detect only (default; refinable per discovered dimension)
-- 2-layer model = Grothendieck fibration: Layer 2 exists over Factual fiber;
-- Factual fiber is itself a dependent sum — pair (v, s) where s is a SINGLE chosen element of ValidSources(v)
-- (subset type {s | s ∈ ValidSources(v)}, not the power-set element itself)
-- EvidenceSource choice within ValidSources(v) routes resolution channel
-- Coherence fiber classifies into CoherenceType, where MemoryInternal instances enter the Factual resolution path
-- (and inherit EvidenceSource via Factual reclassification)
-- CrossDomain/Relevance/Emergent → detect + show routing target in classify summary (no EvidenceSource tag)
ObservationSpec = { setup: Action, execute: Action, observe: Predicate, cleanup: Action }
EmpiricalObservation = (Uᵢ', ObservationSpec) → Uₑ -- dynamic evidence gathering
Uᵣ' = Read-only verified uncertainties -- resolved (no Phase 2); excludes items routed via UserTacit override per Cite-or-observe rule
Uₑ_candidates = { u ∈ Uᵢ' : classify(u) = (Factual, (EmpiricallyObservable, s)) ∧ s ≠ UserTacit }
-- Phase 1 observation checkpoint; excludes Cite-or-observe cite-based UserTacit overrides (those route directly to Uᵢ'')
Uₑ = Empirically observed uncertainties -- evidence attached, proceeds to Phase 2
Uᵢ'' = Remaining user-dependent uncertainties
-- Includes: (a) Factual/UserDependent items
-- (b) Factual/EmpiricallyObservable with EvidenceSource = UserTacit (Cite-or-observe cited override)
-- (c) Factual/ReadOnlyVerifiable with EvidenceSource = UserTacit (Cite-or-observe cited override)
-- (d) reclassified Coherence/MemoryInternal landing in any of (a)-(c) above
-- Phase 2 question candidates
Uₙ = Non-actionable detected uncertainties -- Fiber(Coherence) = CrossDomain or Fiber(d) = Unit; shown in classify summary with routing target
Action = Tool call sequence (Write, Bash)
EscapeCondition ∈ {EnvironmentMutation, BoundExceeded, RiskElevated}
-- maps to Cite-or-observe escape hatches; logged in observation_skips
branching_factor : Uncertainty → ℕ
branching_factor(u) = |distinct_resolution_paths(u) ∪ distinct_side_effect_branches(u)|
-- counts mutually-exclusive resolution postures (e.g., in-place fix / redesign / offload / defer)
-- UNION side-effect branch count (e.g., N downstream mutations per posture); both flavors summed
-- per-uncertainty count must be citable in Phase 2 classify summary when Divergence-bounding exception is invoked
── PHASE TRANSITIONS ──
Phase 0: X → Scan(X, dimensions) → Uᵢ? -- context sufficiency checkpoint (silent)
Phase 1: Uᵢ → Step₁ Ctx(Uᵢ) → (Uᵢ', Uᵣ) → -- Step 1: context collection [Tool]
Step₂ classify(Uᵢ', dimension) → (Uᵣ', Uₑ, Uᵢ'', Uₙ) → -- Step 2: epistemic classification (core act); Uₙ = non-actionable
[if off-diagonal(scope, resolution)] Qc(scope_assessment, resolution_assessment) → Stop → Ac -- Coherence 2D Constitution interaction [Tool]
-- evaluation order: Qc resolves before Uₑ_candidates computation; reclassified MemoryInternal/EmpiricallyObservable enters Uₑ_candidates
Step₃ ReadOnlyVerify(Uᵣ') → -- Step 3: read-only verification (CodeDerivable + CanonicalExternal) [Tool]
[if staleness_unverified(u) ∨ scope_gap(u)] reclassify(u, EmpiricallyObservable) → goto Step₂ -- backward arc (T4): staleness/scope failure re-enters classification
[if Uₑ_candidates ≠ ∅] Step₄ EmpiricalObservation(Uₑ_candidates) → Uₑ -- Step 4: dynamic evidence gathering [Tool]
Phase 2: Qs(classify_result + Uₑ + Uᵢ''[cluster], progress) → Stop → A -- uncertainty surfacing [Tool]; cluster = one coherent cluster (size ≤ 4)
Phase 3: A → integrate(A, X) → X' -- prospect update (sense)
[if A = Unknown(Partial)] auto_promote(uncertainty, next_source(ValidSources(v))) → goto Phase 1 -- backward arc (T2): user declines certainty → re-enter classification with next-preferred EvidenceSource
── LOOP ──
After Phase 3: re-scan X' for remaining or newly emerged uncertainties.
New uncertainties accumulate into uncertainties (cumulative, never replace).
If Uᵢ' remains: return to Phase 1 (collect context for new uncertainties).
If remaining = ∅: proceed with execution.
User can exit at Phase 2 (early_exit).
Continue until: informed(X') OR user ESC.
Convergence evidence: At remaining = ∅, present transformation trace — for each u ∈ (Λ.context_resolved ∪ Λ.read_only_resolved ∪ Λ.empirically_observed ∪ Λ.user_responded), show (ContextInsufficient(u) → resolution(u)). Convergence is demonstrated, not asserted.
── CONVERGENCE ──
actionable(Λ) = uncertainties \ non_factual_detected -- Fiber(Factual) + Fiber(Coherence)=MemoryInternal uncertainties
informed(X') = remaining = ∅ -- non_factual_detected does not block convergence
progress(Λ) = 1 - |remaining| / |actionable(Λ)| -- denominator excludes non-actionable (CrossDomain + detect-only dimensions)
narrowing(Q, A) = |remaining(after)| < |remaining(before)| ∨ context(remaining(after)) ⊃ context(remaining(before))
early_exit = user_declares_sufficient
── TOOL GROUNDING ──
-- Realization: Constitution → TextPresent+Stop; Extension → TextPresent+Proceed
Phase 0 Scan (sense) → Internal analysis (no external tool)
Phase 1 Ctx (observe) → Read, Grep (stored knowledge extraction: codebase, memory, references); WebSearch, WebFetch (conditional: CanonicalExternal channel — RFCs, vendor API docs, standards; `source: "web:{url}"` tag + staleness guard via codebase version cross-check); Bash (conditional: VersionControlHistory channel — read-only commit-log queries via subprocess (content pickaxe, message search, temporal range); `source: "history:{ref}"` tag; collection-only — ref-type staleness classification handled per Phase 1 Step 1 staleness rule)
Phase 1 Classify (observe) → Internal analysis (multi-dimension assessment); Read, Grep (stored knowledge cross-reference analysis)
Phase 1 Qc (constitution) → present (conditional: Coherence 2D off-diagonal Constitution interaction; fires only when scope ≠ resolution assessment; user classifies coherence type as MemoryInternal or CrossDomain)
Phase 1 Emergent_channel (constitution) → present (channel unvalidated by definition; regardless of parent Verifiability, route to Phase 2 to present observed channel description and await user confirmation before proceeding)
Phase 1 CanonicalExternal_staleness (constitution) → present (when staleness cannot be verified; require BOTH `staleness:unverified` tag AND Phase 2 classify summary surfacing — no silent escalation path; publishing authority claim warrants user awareness)
Phase 1 Observe (transform) → Write, Bash, Read (dynamic evidence gathering, Factual only); cleanup via Bash
Phase 2 Qs (constitution) → present (mandatory: classify result + uncertainty surfacing; user provides context judgment on insufficiency; Esc key → loop termination at LOOP level, not an Answer)
Phase 3 (track) → Internal state update
converge (extension) → TextPresent+Proceed (convergence evidence trace; proceed with informed execution)
── MODE STATE ──
Λ = { phase: Phase, X: Prospect, uncertainties: Set(Uncertainty),
dimensions_detected: Set(Dimension), -- π₁ image of classify_results
classify_results: Map(Uncertainty, Σ(d: Dimension). Fiber(d)), -- fibration-typed classification
context_resolved: Set(Uncertainty), -- Uᵣ from TYPES
read_only_resolved: Set(Uncertainty), -- Uᵣ' from TYPES
empirically_observed: Set(Uncertainty), -- Uₑ from TYPES
non_factual_detected: Set(Uncertainty), -- Uₙ from TYPES; Fiber(Coherence) = CrossDomain or Fiber(d) = Unit, classify summary routing
user_responded: Set(Uncertainty),
remaining: Set(Uncertainty), dismissed: Set(Uncertainty),
history: List<(Uncertainty, A)>, observation_history: List<(ObservationSpec, Result, Evidence)>,
observation_skips: List<(Uncertainty, EscapeCondition, String)>, -- audit trail for Cite-or-observe escape hatches
source_choice_overrides: List<(Uncertainty, EvidenceSource, String)>, -- audit trail for Cite-or-observe cite-based UserTacit overrides
active: Bool,
cause_tag: String }
-- Invariant: uncertainties = context_resolved ∪ read_only_resolved ∪ empirically_observed ∪ non_factual_detected ∪ user_responded ∪ remaining ∪ dismissed (pairwise disjoint)
-- Note: observation_skips and source_choice_overrides are audit logs orthogonal to the partition —
-- observation_skips: logged when EmpiricallyObservable is reclassified to UserDependent via Cite-or-observe escape conditions
-- source_choice_overrides: logged when UserTacit is selected over cheaper EvidenceSource with cited dominance basis (Cite-or-observe dominance); audit trail supports variation-stable observed use for cost-ordering
── COMPOSITION ──
*: product — (D₁ × D₂) → (R₁ × R₂). graph.json edges preserved. Dimension resolution emergent via session context.Evidence over Inference over Detection: Aitesis operates on an epistemic hierarchy with two boundaries. The lower boundary (Inference > Detection): infer context insufficiency from requirements rather than detecting via fixed taxonomy — the protocol dynamically identifies what context is missing, not mechanically checking against a preset list. The upper boundary (Evidence > Inference): gather evidence through direct environmental observation rather than substituting inference from reasoning alone — when a fact is observable, observe it. Corollary: partial evidence covering a subset of the claim scope is inference for the uncovered portion — evidence-claim alignment must be verified before treating evidence as resolution.
Within this hierarchy, the AI first collects contextual evidence via codebase exploration to enrich question quality, then classifies each uncertainty by dimension and verifiability — classification is the protocol's core epistemic act, not a routing sub-step. For factual uncertainties, the AI resolves read-only verifiable facts directly and empirically observes dynamically accessible ones with direct evidence before asking. For coherence, the AI classifies by scope and resolution method — memory-internal contradictions are resolved through factual reclassification, while cross-domain contradictions are routed to downstream protocols via deficit-matched routing. For relevance, the AI detects and shows routing targets in the classify summary. The purpose is multi-dimensional context sufficiency sensing — asking better questions for what requires human judgment, self-resolving what can be observed, resolving memory-internal contradictions through evidence, and routing cross-domain concerns to other epistemic protocols.
Write is authorized for observation instrument setup (temporary test artifacts with mandatory cleanup). Cite-or-observe is the structural expression of the upper boundary — the adversarial guard against stopping at Inference when Evidence is achievable.
AI infers context insufficiency before execution OR user calls /inquire. Inference is silent (Phase 0); surfacing always requires user interaction via Cognitive Partnership Move (Constitution) (Phase 2).
Activation layers:
/inquire slash command or description-matching input. Always available.Context insufficient = the prospect contains requirements not available in the current context and not trivially inferrable. Context insufficiency spans multiple dimensions: missing facts, incoherent facts, and facts not relevant to the prospect's goals. Sufficiency encompasses both executability (can the action proceed?) and analysis confidence (is the context adequate for reliable judgment?).
Gate predicate:
uncertain(sufficiency(X)) ≡ ∃ requirement(r, X) : ¬available(r, context) ∧ ¬trivially_inferrable(r)Supersedes: Direct execution patterns in loaded instructions (Context must be verified before any execution begins)
Retained: Safety boundaries, tool restrictions, user explicit instructions
Action: At Phase 2, present highest information-gain uncertainty candidate with classify results via Cognitive Partnership Move (Constitution).
Heuristic signals for context insufficiency inference (not hard gates):
| Signal | Inference |
|---|---|
| Novel domain | Knowledge area not previously addressed in session |
| Implicit requirements | Task carries unstated assumptions |
| Ambiguous scope | Multiple valid interpretations exist and AI cannot determine intended approach from available context |
| Environmental dependency | Relies on external state (configs, APIs, versions) |
| Prior-decision implication | Prospect references or rests on a decision made in an earlier session (rationale, commitment, convention) not present in current conversation context |
Default-scan trigger (resolves the bootstrapping asymmetry of the Prior-decision implication signal): When the prospect scope touches architecture decisions, API or protocol design, persisted state schemas, or user-facing behavior commitments, the Prior-decision signal fires by default — Phase 1 Ctx begins with a bounded scan over persistent memory (MEMORY.md; project-local prior-decision logs where the project maintains them) regardless of explicit user mention. Without this default, detection would require the AI to already suspect prior involvement, which is the condition the signal is meant to surface. The default-scan is scope-triggered (not blanket), bounded to Phase 1 Ctx (no gate), and subject to the memory staleness rule in Phase 1 Step 1 (verify against current state before treating as resolved).
Cross-session enrichment: Domain knowledge accumulated in Anamnesis's hypomnesis store (session recall indices written by the SessionEnd/PreCompact hook) may narrow the Phase 0 uncertainty scan — known domain patterns reduce the scope of novel-domain signals. In parallel, when /recollect has been invoked this session, the recalled context narrows the Phase 1 context scan scope — recognized prior context reduces the factual uncertainty surface before collection begins. This is a heuristic input that may bias detection toward previously observed patterns; constitutive judgment remains with the user.
Revision threshold: When accumulated observation_skips entries across 3+ sessions cluster around a specific EscapeCondition with consistent rationale, the Verifiability classification boundary warrants revision — the escape is systematic, not exceptional. When accumulated Emergent dimension detections across 3+ sessions reveal a recurring non-factual uncertainty pattern, the Layer 1 dimension set warrants a new fiber in the fibration structure — promoted fibers default to Unit (detect-only) unless the pattern exhibits internal classification structure requiring a structured fiber type.
Skip:
| Trigger | Effect |
|---|---|
| All uncertainties resolved (context, read-only, observed, or user) | Proceed with updated prospect |
| All remaining uncertainties dismissed | Proceed with original prospect + defaults |
| User Esc key | Return to normal operation |
Uncertainties are identified dynamically per task — no fixed taxonomy. Each uncertainty is characterized by:
Priority reflects information gain — how much resolving this uncertainty would narrow the remaining uncertainty space.
| Level | Criterion | Action |
|---|---|---|
| Critical | Resolution maximally narrows remaining uncertainty space | Must resolve before execution |
| Significant | Resolution narrows uncertainty but alternatives partially compensate | Surface to user for context |
| Marginal | Reasonable default exists; resolution provides incremental improvement | Surface with pre-selected Dismiss option |
Priority is relational, not intrinsic: the same uncertainty may be Critical in one context and Marginal in another, depending on what other uncertainties exist and what context is already available.
When multiple uncertainties are identified, surface in priority order (Critical → Significant → Marginal). Only one uncertainty surfaced per Phase 2 cycle.
Analyze prospect requirements against available context across multiple dimensions. This phase is silent — no user interaction.
X for required context: domain knowledge, environmental state, configuration details, user preferences, constraintsUᵢ with domain, description — proceed to Phase 1Scan scope: Current prospect context, conversation history, observable environment. Does NOT modify files or call external services.
Collect contextual evidence, classify each uncertainty by dimension and verifiability, and empirically observe accessible uncertainties with direct evidence.
Step 1 — Context collection: For each uncertainty in Uᵢ:
Uᵣ), integrate into execution contextUᵢ'), retain for classificationUᵢ'), retain for classificationUᵢ' with empty contextsource: "memory:{path}"; evidence from version-control history is tagged source: "history:{ref}" (commit hash / tag / branch ref) for traceability. Memory and history staleness guard: both classes of evidence are temporally decoupled from the current environment — the referenced decision may have been superseded, the referenced file may have been renamed, the convention may have been revised. History ref currency by ref-type: full commit hashes (40-char SHA) are immutable content addresses — the commit's content snapshot is stable; mutable refs (branches, tags, partial-hash refs) may be amended/rebased/force-pushed and require currency verification. Even immutable commit-hash evidence may be interpretively superseded by later commits (the cited change may no longer reflect current convention). Such evidence is therefore NOT eligible for the Factual/ReadOnly direct-resolve path. Classify memory- or history-sourced evidence as Factual/EmpiricallyObservable (verify against current codebase/environment state before treating as resolved) or escalate to user confirmation via the classify summary with explicit staleness:unverified tag. Codebase evidence remains eligible for ReadOnly direct resolution because it is inherently current. This is discovery of what the AI already committed to, not pattern discovery across sessions. Routing distinction: this channel covers AI-driven scope expansion at runtime (objective historical investigation triggered by Prior-decision implication signals); subjective recall of prior session content (user-utterance-bound, empty_intention trigger) routes through /recollect (Anamnesis) per the protocol's input-side authority shape, not through this channel.Step 2 — Epistemic classification (core act): For each remaining uncertainty in Uᵢ':
Fiber(Factual) = Σ(v: Verifiability). {s | s ∈ ValidSources(v)}):
ValidSources(v) (function body in TYPES).CodeDerivable < CanonicalExternal < Instrumentation < UserTacit).CanonicalExternal over CodeDerivable unless an authority-override basis is cited (e.g., internal fork supersedes upstream, vendor behavior already reverse-engineered in-repo). Log override to Λ.source_choice_overrides.UserTacit over a cheaper source requires cited dominance basis and is logged to Λ.source_choice_overrides:
UserTacit over Instrumentation (EmpiricallyObservable): cite (a) operational context absent from instrumentation, (b) temporally-scoped knowledge not reproducible statically, or (c) setup > 30s boundUserTacit over CodeDerivable/CanonicalExternal (ReadOnlyVerifiable): cite (a) tacit domain knowledge not captured in source/external doc, (b) interpretive judgment over canonical text, or (c) authority-override rationaleCodeDerivable → Step 3 (Read-only verification; codebase Read/Grep)CanonicalExternal → Step 3 with WebFetch/WebSearch (published external docs; source: "web:{url}" tag + determinism verification + staleness guard — see Web context below)Instrumentation → Step 4 (Empirical observation via Bash lifecycle)UserTacit → Phase 2 directly (user-dependent inquiry; includes reclassified Coherence/MemoryInternal items)Emergent(source) → always Phase 2 (Constitution per TOOL GROUNDING Phase 1 Emergent_channel): record observed channel description in classify summary, await user confirmation that this channel is appropriate; accumulate toward variation-stable observed use for base promotion. Parent Verifiability tier is NOT used to bypass Phase 2 — the channel is unvalidated by definition.source_choice_overrides logging applies identically/ground, BoundaryUndefined→/bound, FrameworkAbsent→/frame, GapUnnoticed→/gap, IntentMisarticulated→/elicit, GoalIndeterminate→/elicitUₙ (non_factual_detected) with deficit-matched routing targetUₙ (non_factual_detected); shown with routing target in classify summary, not Phase 2 question
/gap, BoundaryUndefined→/bound, IntentMisarticulated→/elicit, GoalIndeterminate→/elicitΛ.classify_resultsStep 3 — Read-only verification: For ReadOnlyVerifiable uncertainties:
Uᵣ' (read_only_resolved), skip Phase 2Step 4 — Empirical observation: For EmpiricallyObservable uncertainties:
(uncertainty, condition, rationale) to Λ.observation_skips — the skip rationale must cite the triggering escape condition and the empirical basis that established it. Skip remaining Step 4 execution for this uncertainty.Uₑ → proceeds to Phase 2 with positive evidenceUₑ → proceeds to Phase 2 with observation record. This is NOT an escape or reclassification; the observation output itself is the evidence. Phase 2 surfaces the observed null-signal to the user for judgment, not AI-internal categorical dismissal.If all uncertainties context-resolved or read-only-resolved (no observed or user-dependent remaining): proceed with execution (no user interruption). If observed or user-dependent uncertainties remain: proceed to Phase 2.
Web context (CanonicalExternal channel, conditional): When uncertainty carries an environmental dependency signal
(external API versions, library maintenance status, breaking changes, RFC/standard semantics, vendor documentation)
and the information is not available in the codebase, extend context collection to WebSearch/WebFetch.
Web evidence is tagged with source: "web:{url}" for traceability.
Determinism verification (Extension precondition): CanonicalExternal is classified as Extension only when the source is deterministic for the claim scope. Verify one of: (a) pinned version or dated snapshot (specific RFC with publication date, vendor doc with version pin, W3C spec with date stamp), (b) tag-pinned URL (/v1.2/, ?version=X), or (c) cached copy with recorded fetch timestamp. When the source is undated or versionless and the claim depends on temporal context (API behavior, deprecated features, vendor defaults), the fetch is NON-deterministic → classify as Constitution and escalate via Phase 2 classify summary before treating as evidence.
Staleness guard (analogous to memory evidence): documentation may be temporally decoupled from the library version actually in use — verify against codebase import/pin version before treating as resolved. When staleness cannot be verified, the guard requires BOTH: (1) staleness:unverified tag attached to the evidence record, AND (2) surfacing to the user in Phase 2 classify summary regardless of whether EmpiricallyObservable reclassification subsequently resolves the uncertainty — no silent escalation path (no "or" fallback). The CanonicalExternal source carries publishing authority (standards body, vendor) distinct from internal CodeDerivable evidence — cite both when cross-validating, and always cite the authority source when its temporal alignment cannot be independently verified (see TOOL GROUNDING Phase 1 CanonicalExternal_staleness Constitution entry).
Scope restriction:
Observation design constraints:
Λ.observation_historyPresent the highest-priority remaining uncertainty with classify results via Cognitive Partnership Move (Constitution).
Classification transparency (Always show): Phase 2 always includes classify results for remaining uncertainties. This is informational — no approval required. Users can override classification by stating objection. When only one uncertainty remains, inline the classification with the uncertainty description rather than showing a separate summary block.
Surfacing format:
Present the classification results, uncertainty description, and evidence as text output:
/elicitThen present:
How would you like to resolve this uncertainty?
Options:
1. **[Provide X]** — [what this context enables]
2. **[Point me to...]** — tell me where to find this information
3. **Dismiss** — proceed with [stated default/assumption]
4. **Unknown / Partial** — I don't know, or I only have partial context; the AI will try the next-preferred way of finding the answer and re-classifyOption 4 is the typed Unknown(Partial) constructor (TYPES A): Phase 3 auto-promotes to the next-preferred EvidenceSource in ValidSources(v) and re-enters Phase 1 classification via the backward arc (PHASE TRANSITIONS). This is a type-preserving materialization — not gate mutation — since the TYPES coproduct already admits Unknown(Partial) as a constructor.
Design principles:
Selection criterion: Choose the uncertainty whose resolution would maximally narrow the remaining uncertainty space (information gain). When priority is equal, prefer the uncertainty with richer collected context (more evidence to present).
After user response:
X'After integration:
X' for remaining or newly emerged uncertainties(Uncertainty, A) to history| Level | When | Format |
|---|---|---|
| Light | Marginal priority uncertainties only | Constitution interaction with Dismiss as default option |
| Medium | Significant priority uncertainties, context collection partially resolved | Structured Constitution interaction with progress |
| Heavy | Critical priority, multiple unresolved uncertainties | Detailed evidence + collection results + classify results + resolution paths |
| Rule | Structure | Effect |
|---|---|---|
| Gate specificity | activate(Aitesis) only if ∃ requirement(r) : ¬available(r) ∧ ¬trivially_inferrable(r) | Prevents false activation on clear tasks |
| Context collection first | Phase 1 before Phase 2 | Enriches question quality before asking |
| Uncertainty cap | One coherent cluster per Phase 2 cycle (size ≤ 4, default), priority order, per-item non-overlapping information-gain leverage; cluster size > 1 requires Clustering basis: [decision frame] — per-item gain rationale: [item₁: reason₁; item₂: reason₂; ...] cite (auditable parallel to Cite-or-observe); yields to Divergence-bounding when frame-first triggers fire — items whose answers depend on other cluster items form a compound question (forbidden — collapses decision space into 2ⁿ implicit states) | Prevents question overload while permitting shared-frame clusters |
| Session immunity | Dismissed (domain, description) → skip for session | Respects user's dismissal |
| Progress visibility | [N resolved / M actionable] in Phase 2 | User sees progress on actionable (Factual + Coherence/MemoryInternal) uncertainties |
| Narrowing signal | Signal when narrowing(Q, A) shows diminishing returns | User can exit when remaining uncertainties are marginal |
| Early exit | User can declare sufficient at any Phase 2 | Full control over inquiry depth |
| Cross-protocol fatigue | Syneidesis triggered → suppress Aitesis for same task scope | Prevents protocol stacking (asymmetric: Aitesis context uncertainties ≠ Syneidesis decision gaps, so reverse suppression not needed) |
| Classify transparency | Always show classify results (dimension + verifiability) in Phase 2 surfacing format | User sees AI's reasoning and resolution path per uncertainty |
| Routing transparency | Uₙ items show → /protocol in Phase 2 classify summary | User sees routing destination at detection time |
| Observation transparency | Log observation lifecycle in Λ.observation_history | User can audit what was tested |
| Skip transparency | Log escape hatch usage in Λ.observation_skips with condition + rationale | User can audit why observation was skipped |
| Observation cleanup | All test artifacts removed after observation | No residual files |
| Observation timeout | 30s limit → fall back to user inquiry | Prevents hanging |
| Observation risk gate | Elevated-risk observation → reclassify as UserDependent | Safety preserved |
| Free-response escape | Phase 2 Constitution interaction accepts Unknown(Partial) as typed answer constructor (TYPES A) — Phase 3 auto-promotes uncertainty to next-preferred EvidenceSource in ValidSources(v) and re-enters Phase 1 classification via backward arc (PHASE TRANSITIONS) | User need not simulate certainty for unknowns; routing degrades gracefully through typed, formally-tracked arc |
| Cost-ordering tiebreaker | Default ascending cost-ordering defined in TYPES (CodeDerivable < CanonicalExternal < Instrumentation < UserTacit). External-dependency preference: when uncertainty carries environmental-dependency signal, prefer CanonicalExternal over CodeDerivable unless authority-override basis cited. Override logged to Λ.source_choice_overrides | Minimizes user-interrupt cost; preserves external authority when relevant; Cite-or-observe basis required for UserTacit preference |
| EvidenceSource transparency | Factual uncertainty classify summary shows EvidenceSource: {selected} with basis citation when override applied; Λ.source_choice_overrides preserves cite audit across sessions for variation-stable observed use | Cite-or-observe rule audit visibility |
source: "memory:{path}" or source: "history:{ref}" and NOT eligible for Factual/ReadOnly direct-resolve; verify against current state or escalate via classify summary with staleness:unverified flag. Procedural detail in Phase 1 Step 1-2.branching_factor(u) during Phase 1 Ctx. When |Uᵢ| × max branching_factor(u) ≥ 16 OR Σᵤ branching_factor(u) ≥ 16, present a decision frame option set before per-branch detail; supersedes One coherent cluster when both apply. Exception (full enumeration without frame-first) requires BOTH |Uᵢ| ≤ 3 AND each branching_factor(u) ≤ 2 AND cited per-uncertainty counts (silent self-assessment "uniformly low" forbidden). branching_factor definition in TYPES.Λ.source_choice_overrides). Reclassification of EmpiricallyObservable to UserDependent is legitimate only under empirically verifiable escape conditions evaluated BEFORE observation (env mutation / 30s bound / elevated risk; logged to Λ.observation_skips). Observation outputs always proceed to Phase 2 via Uₑ — positive (differentiating evidence) or negative (null-signal); pre-observation categorical classification is not a substitute. Verifiability-tier dominance basis detail in Phase 1 Step 2.a1acc87
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.