Complete end-to-end multi-glyph resonance enabling simultaneous analysis of multiple glyphs with cross-glyph resonance metrics, guardrails, and comprehensive telemetry. ## Phase 1: XIC Layer - Context Accumulation ### XICContext Enhancement - Added glyph_contexts: list field for accumulating glyph IDs ### New Operations - PUSH_GLYPH_CONTEXT: accumulate glyph with guardrail enforcement - CLEAR_GLYPH_CONTEXT: reset context for new analysis chains ### Enhanced Existing Operations - CALL_GLYPH: detects populated glyph_contexts, passes glyph_ids to pipeline - RUN_PROMPT: supports multi-glyph context via glyph_ids parameter - STREAM: supports multi-glyph context via glyph_ids parameter ### Guardrail Integration - max_resonance_glyphs (default 10, configurable) - enable_resonance_guardrails (default True) - Enforced at PUSH_GLYPH_CONTEXT to prevent exceeding limit ## Phase 2: Symbolic Pipeline - Multi-Glyph Support ### Extended Signature - run_symbolic_pipeline now accepts glyph_ids parameter - Multi-glyph mode detection and routing - glyph_ids takes precedence over glyph_id if both provided ### Multi-Glyph Processing - SymbolicStep(kind="multi_glyph_resonance") for glyph_ids - SymbolicStep(kind="guardrail") when truncation needed - Guardrail enforcement with pipeline-level truncation to max_resonance_glyphs ### Null-Safety Fixes - extract_glyph_resonances: handles None resonance_map - get_dominant_glyphs: handles None resonance_map - format_glyph_resonance_report: handles None resonance_map ## Phase 3: LAIN Cognitive Kernel - Resonance Computation ### New Method: compute_multi_glyph_resonance - Takes glyph_ids list and execution result - Computes 5-dimensional metrics per glyph: - weight: relative importance [0.0, 1.0] - lineage_score: symbolic ancestry [0.0, 1.0] - contributor_score: contribution to fusion [0.0, 1.0] - frequency_score: occurrence frequency [0.0, 1.0] - grammar_score: structural alignment [0.0, 1.0] - Returns global_resonance_score as weighted average ### Enhanced execute_symbolic - Detects context["glyph_ids"] for multi-glyph mode - Post-processes LAIN result via compute_multi_glyph_resonance - Merges multi-glyph metrics into fused_symbol - Maintains backward compatibility (single-glyph unaffected) ## Phase 4: Guardrails & Telemetry ### Guardrail Enforcement - PUSH_GLYPH_CONTEXT rejects pushes exceeding max_resonance_glyphs - run_symbolic_pipeline truncates glyph_ids if needed - Guardrail step recorded in pipeline with reason message ### Telemetry Collection - ctx._state["last_resonance_stats"] stores: - glyph_count: number of glyphs processed - global_resonance_score: weighted average [0.0, 1.0] - guardrails_triggered: list of guardrail messages - timestamp: execution time ## Phase 5: Validation Suite ### 12 Comprehensive Tests (all passing) 1. New operations in OP_TABLE 2. XICContext.glyph_contexts field 3. PUSH_GLYPH_CONTEXT accumulation 4. CLEAR_GLYPH_CONTEXT reset 5. Guardrail enforcement on PUSH 6. run_symbolic_pipeline signature 7. compute_multi_glyph_resonance method 8. Multi-glyph resonance structure 9. execute_symbolic multi-glyph processing 10. Single-glyph backward compatibility 11. Demo programs validity 12. Multi-glyph demo structure ### Test File: test_multi_glyph_resonance.py - Unit tests for all components - Integration tests for data flow - Backward compatibility validation - Mock-based testing for isolated units ## Phase 6: Documentation ### Updated XIC_SEMANTICS_v1_5.md - Added PUSH_GLYPH_CONTEXT instruction semantics - Added CLEAR_GLYPH_CONTEXT instruction semantics - Added comprehensive Multi-Glyph Resonance section with: - Context accumulation model diagram - Complete workflow documentation - Guardrail specifications - Telemetry format definition - Three-glyph analysis example with JSON/Python output ### Created demo_multi_glyph_resonance.gx.json - Two-chain demonstration program - Chain 1: 3-glyph analysis (compression, entropy, information) - Chain 2: 4-glyph analysis (cognition, language, symbol, meaning) - Shows complete resonance query pipeline - Demonstrates context clearing and reset ### Created XIC_MULTI_GLYPH_RESONANCE_REPORT.md - Comprehensive implementation documentation - All 6 phases detailed with code examples - Architecture overview and data flow diagrams - Design decisions with rationale - Backward compatibility guarantees - Usage examples (CLI, JSON, programmatic) - Future enhancement suggestions ## Key Features ✅ Explicit context accumulation (PUSH_GLYPH_CONTEXT) ✅ Automatic multi-glyph detection in CALL_GLYPH/RUN_PROMPT/STREAM ✅ Guardrails prevent exceeding max_resonance_glyphs ✅ Telemetry tracking for analytics ✅ Full backward compatibility maintained ✅ Single-glyph mode unaffected ✅ Comprehensive validation suite (12/12 tests passing) ✅ Complete formal specification updates ✅ Demo program showcase ## Backward Compatibility - All XIC v1 programs work unchanged - Single-glyph CALL_GLYPH still works identically - Empty glyph_contexts → single-glyph behavior - .gx binary format unchanged - No breaking changes to APIs Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
19 KiB
XIC Instruction Semantics v1.5
Version: 1.5
Date: 2026-05-21
Status: Formal Specification
Overview
XIC v1.5 is a symbolic and compressed execution virtual machine. It provides:
- Dual execution modes: Compressed (via execute_gx) and symbolic (via symbolic pipeline)
- Explicit instruction set semantics: Formal definitions of preconditions, postconditions, and side effects
- Glyph-aware symbolic processing: Integration with LAIN 8-lane cognition and glyph metadata
- Context propagation: Symbolic context flows through chains of operations
Architecture
XICContext (model_path, mode, params, context, symbolic_mode, _state)
↓
XIC Instructions (9 ops in OP_TABLE)
↓
Dual paths:
- Compressed: execute_gx() → decompresses .gx → execs Python
- Symbolic: run_symbolic_pipeline() → LAIN 8 lanes → fused_symbol
XICContext Model
Fields
| Field | Type | Meaning |
|---|---|---|
model_path |
Optional[str] | Path to .gx model file. Set by LOAD_MODEL. |
mode |
str | Execution mode: "chat", "eval", "benchmark", "symbolic". Default: "chat". |
params |
Dict[str, Any] | Execution parameters (temperature, trace, profile, use_gpu, etc.). |
context |
Dict[str, Any] | (In params["context"]) Symbolic/cognitive context metadata (domain, style, glyph_id, etc.). |
symbolic_mode |
bool | True if mode == "symbolic". Controls routing in RUN_PROMPT/STREAM/CALL_GLYPH. |
_state |
Dict[str, Any] | Internal state: last_result, last_symbolic_result, last_symbolic_pipeline, glyph_* keys. |
Context Propagation
SET_CONTEXT <key> <value>adds/updates keys inctx.params["context"].- Context is passed to
run_symbolic_pipeline(context=...)in symbolic operations. - Glyph operations add
glyph_idto context automatically.
Instruction Semantics (12 Instructions)
1. LOAD_MODEL
Signature
{ "op": "LOAD_MODEL", "args": ["<path_to_gx_file>"] }
Preconditions
- Argument must be a valid string (path).
Postconditions
ctx.model_path = path
Side effects
- Prints
[XIC] Model loaded: <path>
Symbolic behavior
- No effect on
ctx.symbolic_mode.
Compressed behavior
ctx.model_pathis used by RUN_PROMPT/STREAM to load the .gx file.
2. SET_MODE
Signature
{ "op": "SET_MODE", "args": ["<mode>"] }
Preconditions
mode∈ {"chat", "eval", "benchmark", "symbolic", ...}
Postconditions
ctx.mode = mode- If
mode == "symbolic":ctx.symbolic_mode = True - If
mode != "symbolic":ctx.symbolic_mode = False
Side effects
- Prints
[XIC] Mode set to: <mode>
Remarks
- Setting mode to "symbolic" enables routing through symbolic pipeline (run_symbolic_pipeline).
- All other modes use compressed execution (execute_gx).
3. SET_PARAM
Signature
{ "op": "SET_PARAM", "args": ["<key>", <value>] }
Preconditions
- Arguments: key (str), value (any).
Postconditions
ctx.params[key] = value
Side effects
- Prints
[XIC] Parameter <key> = <value>
Remarks
use_gpu,trace,profileare reserved parameter names.- Parameters are passed to execute_gx (if used).
4. SET_CONTEXT
Signature
{ "op": "SET_CONTEXT", "args": ["<key>", <value>] }
Preconditions
- Arguments: key (str), value (any).
Postconditions
ctx.params["context"][key] = value- If
ctx.params["context"]doesn't exist, it is created.
Side effects
- Prints
[XIC] Context <key> = <value>
Usage
- Build symbolic context metadata:
SET_CONTEXT "domain" "ai",SET_CONTEXT "style" "analytic". - Context is passed to symbolic operations (RUN_PROMPT, STREAM, CALL_GLYPH).
5. RUN_PROMPT
Signature
{ "op": "RUN_PROMPT", "args": ["<prompt>"] }
Preconditions
- Argument: prompt (str).
Postconditions
- If
ctx.symbolic_mode == True:ctx._state["last_symbolic_result"] = output_textctx._state["last_symbolic_pipeline"] = SymbolicPipelineResult
- If
ctx.symbolic_mode == False:- Requires
ctx.model_pathto be set (LOAD_MODEL must be called first). ctx._state["last_result"] = ExecutionContext
- Requires
Symbolic behavior (ctx.symbolic_mode=True)
- Calls
run_symbolic_pipeline(prompt, context=ctx.params.get("context")). - Routes through LAIN 8-lane cognition kernel.
- Prints
[XIC-SYMBOLIC] <output_text> - Stores full SymbolicPipelineResult for inspection (steps, fused_symbol).
Compressed behavior (ctx.symbolic_mode=False)
- Calls
execute_gx(ctx.model_path, trace=ctx.params.get("trace"), profile=ctx.params.get("profile")). - Decompresses .gx binary and executes Python code.
- Prints
[XIC] Execution completeand result.
Remarks
- The prompt argument is informational in compressed mode (not used).
- In symbolic mode, the prompt is the primary input to LAIN cognition.
6. STREAM
Signature
{ "op": "STREAM", "args": ["<prompt>"] }
Preconditions
- Argument: prompt (str).
Postconditions
- Same as RUN_PROMPT, but output is streamed line-by-line.
Symbolic behavior
- Calls
run_symbolic_pipeline(prompt, context=...). - Streams output_text line-by-line with
[XIC-STREAM]prefix. - Stores pipeline result in
ctx._state["last_symbolic_pipeline"].
Compressed behavior
- Calls
execute_gx(...). - Streams result line-by-line with
[XIC-STREAM]prefix.
Side effects
- Multiple print statements (one per line).
7. CHAIN
Signature
{ "op": "CHAIN", "args": ["<label>"] }
Preconditions
- Argument: label (str).
Postconditions
ctx.params["chain_label"] = label
Side effects
- Prints
[XIC-CHAIN] Entering chain: <label>
Remarks
- CHAIN is a control marker for human readability and logging.
- It does not affect execution but allows grouping operations into named chains.
- Chain label is preserved in
ctx.paramsfor inspection.
8. CALL_GLYPH
Signature
{ "op": "CALL_GLYPH", "args": ["<glyph_id>", "<payload>"] }
Preconditions
- Arguments: glyph_id (str), payload (str, optional).
Postconditions
- Stores result in
ctx._state[f"glyph_{glyph_id}"]with:output_text: Final text from cognitionfused_symbol: Fused symbolic representation (if produced)steps: List of pipeline steps taken
Symbolic behavior
- Calls
run_symbolic_pipeline(prompt=payload, context=glyph_context, glyph_id=glyph_id). glyph_context = ctx.params.get("context", {}) | {"glyph_id": glyph_id}- Routes through symbolic pipeline with explicit glyph_id parameter.
- The glyph_id is injected into LAIN context for glyph-aware transformations.
- Prints
[XIC-GLYPH] <output_text>
Compressed behavior
- Not applicable. CALL_GLYPH is only used in symbolic mode.
- If called in compressed mode, raises error (or gracefully falls back to symbolic).
Remarks
- CALL_GLYPH enables glyph-aware cognition: the symbolic pipeline explicitly marks the operation as glyph-driven.
- The LAIN kernel can use glyph_id to apply glyph-specific transformations or select glyph metadata.
9. LOG
Signature
{ "op": "LOG", "args": ["<message>"] }
Preconditions
- Argument: message (str, optional).
Postconditions
- None (pure side effect).
Side effects
- Prints
[XIC-LOG] <message>
Remarks
- LOG is a no-op from an execution standpoint; purely for instrumentation and debugging.
10. PUSH_GLYPH_CONTEXT
Signature
{ "op": "PUSH_GLYPH_CONTEXT", "args": ["<glyph_id>"] }
Preconditions
glyph_idmust be a valid string identifier.
Postconditions
glyph_idis appended toctx.glyph_contextslist (if not already present).- If
ctx.glyph_contextsreachesmax_resonance_glyphs(default 10), further pushes are rejected by guardrails.
Side effects
- Prints
[XIC-MULTI-GLYPH] Pushed glyph context: <glyph_id> (total: N) - If guardrail triggered: prints
[XIC-GUARDRAIL] Resonance glyph count at limit (N)
Remarks
- Used to accumulate glyphs for multi-glyph resonance computation.
- Duplicates are ignored (idempotent).
- Works only in symbolic mode.
11. CLEAR_GLYPH_CONTEXT
Signature
{ "op": "CLEAR_GLYPH_CONTEXT", "args": [] }
Preconditions
- None.
Postconditions
ctx.glyph_contextslist is emptied.
Side effects
- Prints
[XIC-MULTI-GLYPH] Cleared glyph context (N glyphs removed)
Remarks
- Use to reset context before starting a new multi-glyph analysis chain.
- No effect if context is already empty.
12. GET_GLYPH_RESONANCE
Signature
{ "op": "GET_GLYPH_RESONANCE", "args": ["<glyph_id>", "<metric>"] }
Preconditions
glyph_idmust have been previously used in a CALL_GLYPH operation.metricis optional. Valid values: "report", "global", "dominant", "weight", "lineage", "contributor", "frequency", "grammar".
Postconditions
- Prints formatted resonance data based on requested metric.
- Stores result in
ctx._state[f"resonance_query_{glyph_id}_{metric}"].
Behavior by metric:
| Metric | Output | Description |
|---|---|---|
<none> or "report" |
Human-readable resonance report | Formatted report with global score and top 5 glyphs by weight |
"global" |
Global resonance score (float) | Single float value representing overall resonance |
"dominant" |
List of top 5 glyphs by weight | List of (glyph_id, weight) tuples sorted descending |
"weight" |
Weight metric (float) | Weight component of resonance (relative importance) |
"lineage" |
Lineage score (float) | Score representing symbolic lineage and ancestry |
"contributor" |
Contributor score (float) | Score representing contribution to fusion |
"frequency" |
Frequency score (float) | Score representing occurrence frequency in cognition |
"grammar" |
Grammar score (float) | Score representing grammatical/structural alignment |
Side effects
- Prints
[XIC-RESONANCE] ...with requested data. - Stores result in
ctx._statefor programmatic access.
Remarks
- GET_GLYPH_RESONANCE requires prior CALL_GLYPH execution to populate glyph resonance data.
- If glyph_id not found, prints error and stores None.
- Queries access the full SymbolicPipelineResult stored by CALL_GLYPH.
Glyph Resonance Structure
FusedSymbol Data Structure
The fused_symbol in SymbolicPipelineResult contains:
@dataclass
class FusedSymbol:
summary: str # Text summary of fused cognition
glyph_ids: List[str] # List of glyph IDs engaged in fusion
resonance_map: GlyphResonanceMap # Resonance metrics for each glyph
GlyphResonanceMap
Maps glyph IDs to their resonance metrics:
@dataclass
class GlyphResonanceMap:
resonances: Dict[str, GlyphResonanceMetrics] # glyph_id → metrics
global_resonance_score: float # Overall fusion quality score [0.0, 1.0]
Methods:
get_glyph_resonance(glyph_id: str) → Optional[GlyphResonanceMetrics]: Retrieve metrics for a specific glyph.get_top_glyphs(n: int = 5) → List[tuple[str, GlyphResonanceMetrics]]: Get top N glyphs by weight.get_average_resonance() → float: Get average resonance across all glyphs.
GlyphResonanceMetrics
Per-glyph resonance metrics capturing multiple dimensions of symbolic activity:
@dataclass
class GlyphResonanceMetrics:
weight: float # Relative importance of glyph in fusion [0.0, 1.0]
lineage_score: float # Symbolic lineage and ancestry score [0.0, 1.0]
contributor_score: float # Contribution to overall fusion [0.0, 1.0]
frequency_score: float # Occurrence frequency in cognition [0.0, 1.0]
grammar_score: float # Grammatical/structural alignment [0.0, 1.0]
Example Structure
{
"fused_symbol": {
"summary": "Compression and information theory are foundational to cognition...",
"glyph_ids": ["glyph://compression_theory", "glyph://entropy", "glyph://coding"],
"resonance_map": {
"global_resonance_score": 0.847,
"resonances": {
"glyph://compression_theory": {
"weight": 0.95,
"lineage_score": 0.82,
"contributor_score": 0.89,
"frequency_score": 0.76,
"grammar_score": 0.88
},
"glyph://entropy": {
"weight": 0.73,
"lineage_score": 0.68,
"contributor_score": 0.71,
"frequency_score": 0.65,
"grammar_score": 0.75
}
}
}
}
}
Accessing Resonance Data
From XIC programs:
- CALL_GLYPH stores result in
ctx._state[f"glyph_{glyph_id}"]including resonance_metrics and global_resonance_score. - GET_GLYPH_RESONANCE queries the stored data with various metric filters.
- Access pipeline result object via
ctx._state[f"glyph_{glyph_id}_pipeline_result"]for direct FusedSymbol manipulation.
Multi-Glyph Resonance
Context Accumulation Model
Multi-glyph resonance enables simultaneous analysis of multiple glyphs with cross-glyph resonance metrics:
PUSH_GLYPH_CONTEXT "glyph://a"
PUSH_GLYPH_CONTEXT "glyph://b"
PUSH_GLYPH_CONTEXT "glyph://c"
↓
ctx.glyph_contexts = ["glyph://a", "glyph://b", "glyph://c"]
↓
CALL_GLYPH "glyph://unified" "prompt"
↓
run_symbolic_pipeline(prompt, glyph_ids=["glyph://a", "glyph://b", "glyph://c"])
↓
LAIN computes multi-glyph resonance metrics
↓
fused_symbol contains:
- glyph_ids: ["glyph://a", "glyph://b", "glyph://c"]
- resonance_map: {glyph_id → GlyphResonanceMetrics}
- global_resonance_score: weighted average across all glyphs
Workflow
- PUSH_GLYPH_CONTEXT: Accumulate glyph IDs in
ctx.glyph_contexts - CALL_GLYPH: Detects populated context, passes
glyph_idsto pipeline - run_symbolic_pipeline: Routes to multi-glyph mode (glyph_ids parameter)
- execute_symbolic: Computes multi-glyph resonance via
compute_multi_glyph_resonance() - fused_symbol: Contains metrics for all glyphs in unified resonance space
- CLEAR_GLYPH_CONTEXT: Reset context for new analysis
Guardrails
max_resonance_glyphs: Default 10, configurable via SET_PARAMenable_resonance_guardrails: Default True, set via SET_PARAM- If
len(glyph_ids) > max_resonance_glyphs:- Truncated to first N glyphs
- SymbolicStep(kind="guardrail") recorded
- Message printed:
[XIC-GUARDRAIL] ...
Telemetry
When multi-glyph CALL_GLYPH executes, telemetry stored in:
ctx._state["last_resonance_stats"] = {
"glyph_count": len(multi_glyph_ids),
"global_resonance_score": float,
"guardrails_triggered": [list of strings],
"timestamp": float,
}
Example: Three-Glyph Analysis
{
"op": "SET_MODE",
"args": ["symbolic"]
}
{
"op": "PUSH_GLYPH_CONTEXT",
"args": ["glyph://compression"]
}
{
"op": "PUSH_GLYPH_CONTEXT",
"args": ["glyph://entropy"]
}
{
"op": "PUSH_GLYPH_CONTEXT",
"args": ["glyph://information"]
}
{
"op": "CALL_GLYPH",
"args": ["glyph://unified", "How do these three glyphs relate?"]
}
{
"op": "GET_GLYPH_RESONANCE",
"args": ["glyph://unified", "report"]
}
{
"op": "CLEAR_GLYPH_CONTEXT",
"args": []
}
Result in ctx._state["glyph_glyph://unified"]:
{
"multi_glyph": True,
"output_text": "...",
"fused_symbol": {
"summary": "...",
"glyph_ids": ["glyph://compression", "glyph://entropy", "glyph://information"]
},
"resonance_metrics": {
"glyph://compression": {"weight": 0.95, "lineage_score": 0.82, ...},
"glyph://entropy": {"weight": 0.73, "lineage_score": 0.68, ...},
"glyph://information": {"weight": 0.81, "lineage_score": 0.75, ...},
},
"global_resonance_score": 0.83,
}
Symbolic Pipeline Semantics
run_symbolic_pipeline() Entrypoint
def run_symbolic_pipeline(
prompt: str,
context: Dict[str, Any] | None = None,
glyph_id: str | None = None,
) -> SymbolicPipelineResult
Behavior:
- Creates SymbolicStep for initial_prompt.
- If glyph_id is provided:
- Adds glyph_id to context.
- Creates SymbolicStep for glyph_call.
- Compresses prompt via GXCompressor.compress().
- Builds minimal manifest/segments.
- Calls CognitiveKernel.execute_symbolic(manifest, segments, payload, mode="symbolic", context=context).
- Extracts output_text and fused_symbol from result.
- If fused_symbol is present:
- Creates SymbolicStep for fusion.
- Returns SymbolicPipelineResult(steps, output_text, fused_symbol).
SymbolicPipelineResult
@dataclass
class SymbolicPipelineResult:
steps: List[SymbolicStep] # Execution steps taken
output_text: str # Final text output
fused_symbol: Optional[Dict] # Fused symbolic representation
SymbolicStep
@dataclass
class SymbolicStep:
name: str # Step name (e.g., "initial_prompt", "glyph:xyz", "fusion")
kind: str # Step kind ("prompt", "glyph_call", "fused_symbol")
payload: Any # Step data (prompt text, fused_symbol dict, etc.)
context: Dict[str, Any] # Context at this step
Execution Paths
Compressed Path (ctx.symbolic_mode=False)
RUN_PROMPT or STREAM
↓
Check ctx.model_path
↓
execute_gx(path, trace=..., profile=...)
↓
Load .gx binary → decompress via GSZ3 → compile → exec Python
↓
Store result in ctx._state["last_result"]
Symbolic Path (ctx.symbolic_mode=True)
RUN_PROMPT or STREAM or CALL_GLYPH
↓
run_symbolic_pipeline(prompt, context, glyph_id)
↓
Compress prompt → build manifest/segments
↓
CognitiveKernel.execute_symbolic()
↓
LAIN 8-lane cognition (structural, semantic, compression, metadata, hints, predictive, imprint, epoch)
↓
Fuse lanes → produce output_text and fused_symbol
↓
Store SymbolicPipelineResult in ctx._state["last_symbolic_pipeline"]
Context Flow
Example: Glyph-Aware Cognition
SET_CONTEXT "domain" "ai"
SET_CONTEXT "style" "analytical"
CALL_GLYPH "glyph://knowledge_integration" "How do compression and knowledge integrate?"
Flow:
- SET_CONTEXT adds
context = {"domain": "ai", "style": "analytical"}toctx.params["context"]. - CALL_GLYPH reads
contextand addsglyph_id = "glyph://knowledge_integration". run_symbolic_pipeline(prompt, context={"domain": "ai", "style": "analytical", "glyph_id": "..."}, glyph_id="...")is called.- Symbolic pipeline creates SymbolicStep(glyph_call, ...) with the full context.
- LAIN kernel executes with context, allowing glyph-aware transformations.
- Result (output_text, fused_symbol) is stored in
ctx._state["glyph_glyph://knowledge_integration"].
Backward Compatibility
- All v1 XIC programs continue to work unchanged.
- RUN_PROMPT behavior in compressed mode (symbolic_mode=False) is identical to v1.
- New symbolic pipeline is additive and does not affect compressed execution.
- run_symbolic_prompt() in glyphos/cognitive_kernel.py is a thin wrapper around the pipeline.
Summary of Changes from v1
| Change | v1 | v1.5 |
|---|---|---|
| Symbolic pipeline abstraction | Inline in run_symbolic_prompt | Separate glyphos/symbolic_pipeline.py |
| Glyph-aware transformations | Manual context manipulation | Explicit glyph_id parameter in run_symbolic_pipeline |
| Pipeline introspection | Limited (just output_text) | Full SymbolicPipelineResult (steps, fused_symbol) |
| Formal semantics | Implicit (docstrings) | Explicit (XIC_SEMANTICS_v1_5.md) |
End of Specification