Semantic Systems / Language / Glyphs
Protocol5 English and Iota-1 Conversion Page Research Report
Report summary
As of May 5, 2026, the top-level Protocol5 site exposes a generic “Converter” surface in its homepage navigation, but the clicked converter path returned a 404 during this research. A separate, live Protocol5 page exists at the JustAnIota converter route under the .NET hub, but that page explicitly
Key topics
- Semantic Systems / Language / Glyphs
- Semantic Systems
- Language
- Glyphs
- UAI
- .NET
- SQL
- Python
- Runtime
Research provenance
For citation, use the report title and canonical URL. Archival presence does not establish authorship or promote report statements into portfolio evidence.
Source availability: 53 citation markers in the source export have no recoverable source links. Those markers are omitted from this reader; any supplied bibliography and ordinary links remain. Check the original sources before relying on the cited claims.
This page renders the archived Markdown as safe, formatted HTML. It is background research and does not become a portfolio claim without evidence review.
Full report
On this page
Executive summary
As of May 5, 2026, the top-level Protocol5 site exposes a generic “Converter” surface in its homepage navigation, but the clicked converter path returned a 404 during this research. A separate, live Protocol5 page exists at the JustAnIota converter route under the .NET hub, but that page explicitly describes itself as an approximate bidirectional semantic converter that reports the “best gist,” not exact translation, and it is framed as an implementation experiment rather than a normative UAI standard. That means the current public Protocol5 surface does not yet provide the kind of stable, user-facing English ⇄ Iota-1 page the request calls for.
The strongest public design guidance comes from JustAnIota. Its public records consistently say that semantic meaning should come from registries, schemas, canonicalization, examples, and validator behavior, not from Unicode code points, glyph appearance, embeddings, hashes, or screenshots. Its converter, concept bridge, registry explorer, examples, and validator together already outline a robust product pattern: natural-language source text, locale and normalization metadata, registry-backed candidate matching, an inspectable envelope, warnings, and reverse English glosses.
For the specific page requested on Protocol5, the best-fit implementation is a rules-first, deterministic, segment-first converter. In practical terms, that means: normalize text, split into sentences, extract clause/segment candidates, compare short semantic spans against Category.Categories before falling back to Category.Words, then map matched concepts to code points or visible tokens, with a canonical JSON envelope and a validation report. Fuzzy and embedding-based retrieval should be available only as an optional assistive layer, not as the authority of record, because the public JustAnIota records explicitly reject embeddings and glyph appearance as semantic authority. An uploaded integration note aligns with this direction and explicitly asks for an English ⇄ Iota-1 page plus segment-first matching before word-level matching.
The main blockers are specification gaps, not UI engineering. The public materials describe converter stages, registry requirements, validation behavior, and example fixtures, but they do not publish a complete authoritative English ↔ Iota-1 lexical ontology, a full Category.Categories / Category.Words / Category.ISO10646 registry export, or a final, frozen code-point policy. There is also a real policy tension between the Protocol5 .NET converter page, which prohibits private-use characters, and the JustAnIota public spec/tooling, which allows PUA preview forms in controlled profiles. Those unresolved points should be settled before the Protocol5 page goes live.
Findings from prioritized sites
The user asked that research begin with protocol5.com and justaniota.com, and that all prioritized sites be listed in the report. Those two prioritized domains are:
| Prioritized site | What is publicly visible | Why it matters |
|---|---|---|
protocol5.com | A public gateway with Mathematics, UAI-.NET, and JustAnIota links; the homepage advertises a general converter, but the clicked converter path returned 404 during this research. | Protocol5 currently lacks a stable top-level public converter page at the obvious entry point. |
justaniota.com | The active JustAnIota host; ɩ.com redirects here. It exposes a converter, validator, registry explorer, concept bridge, examples, and public specification pages. | JustAnIota already contains the clearest public product and specification model for an English ⇄ Iota-1 implementation. |
Within those domains, the most decision-relevant pages were these:
| Site / page | High-confidence finding | Design implication |
|---|---|---|
| Protocol5 homepage | The site presents a Calculator, Converter, Workbench, Status, and Changelog surface, but the clicked Converter, Workbench, Status, and Changelog paths returned 404 responses during this audit. | A dedicated Protocol5 page for English ⇄ Iota-1 should be added at a real, stable route and linked from the homepage. |
| Protocol5 JustAnIota converter | The live Protocol5 .NET converter says it converts English to and from Iota-1 candidates, supports round trips, uses a public seed registry, normalizes with NFC, handles Unicode scalars/grapheme grouping, and is intentionally approximate rather than lossless. It also says private-use areas are prohibited on this surface. | Protocol5 already has a usable implementation nucleus, but it is not framed as deterministic phrase-first translation and it needs a stricter public UX. |
| JustAnIota IOTA-1 profile | The public profile defines source, mapping, envelope, validation, and compact layers; it says meaning comes from registry records and validation, not Unicode itself; compact output is incomplete without the envelope. | The Protocol5 page should always expose both the visible output and the backing envelope/trace. |
| JustAnIota converter | Public converter stages are normalization, canonicalization, registry resolution, visible token generation, PUA scalar preview, reverse gloss, and warnings. The browser workbench can call a REST service with local fallback. | Progressive enhancement is appropriate: browser-first UX, server-backed conversion, local deterministic fallback. |
| JustAnIota registry and explorer | The registry is where compact strings get meaning; production registry entries should include stable ID, label, definition, allowed profiles, locale notes, examples, negative cases, reversibility, and validator behavior. | Category.Categories and Category.Words should be formal registry tables, not ad hoc dictionaries. |
| JustAnIota examples | Published examples are fixtures for a declared profile and registry version and should not be treated as proof of universal semantic equivalence. | A Protocol5 converter should explicitly label outputs as exact, approximate, or unresolved. |
| JustAnIota validator | Validation should parse JSON, require metadata, warn on PUA, bidi controls, variation selectors, invisible controls, and unsupported compact assumptions, and only generate compact output after registry-dependent fields exist. | Error handling must be first-class, not an afterthought. |
Two especially important inconsistencies surfaced.
First, the code-point policy is not yet unified. The Protocol5 .NET converter page says public symbols only and prohibits PUA. By contrast, the JustAnIota IOTA-1 profile and tooling explicitly discuss demo PUA or ASCII-safe compact candidates, controlled PUA mapping fields, and Plane 15 / Plane 16 demo namespaces. These are not compatible release positions; Protocol5 should pick one public policy and document it clearly.
Second, the envelope shape is still draft-like. One public example uses fields like profile, uai_version, locale, direction, normalization, registry, and payload. Another uses spec_version, uai_target, source_language, source_direction, registry_digest, mode, and units. That strongly suggests a still-evolving draft family rather than a single frozen transport contract. Protocol5 should ship one canonical envelope schema, version it, and keep older drafts explicitly deprecated.
Functional requirements and page design
The conversion page should be a dedicated Protocol5 route such as /iota-1/converter or /tools/iota-1, linked from the homepage and not hidden behind the .NET hub. The page should follow the JustAnIota tool pattern closely: human-readable source text, locale/normalization controls, visible candidate output, canonical envelope JSON, reverse gloss, ranked candidates, trace evidence, and validation warnings. The existing JustAnIota public workbench model also supports a browser path with REST-service fallback, which is a good deployment pattern for Protocol5.
A good public page should satisfy these minimum requirements:
| Area | Recommended requirement |
|---|---|
| Directions | Support English → Iota-1, Iota-1 → English, and round trip on the same page. |
| Inputs | Plain English text, visible Iota-1 token string, code-point notation, and canonical envelope JSON. |
| Outputs | Visible Iota-1, code points/scalars, matched concept IDs, canonical envelope JSON, decoded English gloss, ranked alternatives, and warnings. |
| Modes | deterministic, lossless-if-possible, semantic-preview, and round-trip-check. |
| Metadata | Locale, direction, normalization form, registry version, profile version, and reversibility label. |
| Traceability | Show which segments matched Category.Categories, which fell back to Category.Words, and which remained unresolved. |
| Validation | Inline validation of Unicode safety, unsupported characters, unknown glyphs, ambiguous reverse mappings, and envelope errors. |
| Export | Copy button for visible output, code points, JSON envelope, and trace evidence. |
| Accessibility | Monospace/code-point view, large text area, keyboard navigation, and screen-reader-friendly labels. |
| Review | A visible “exact / approximate / unresolved” badge next to every result candidate. |
This requirements set is supported by the public converter stages, concept bridge, validator, examples, and registry requirements already published by JustAnIota, plus the existing Protocol5 experimental converter surface.
The page should also separate semantic authority from presentation. The human should always be able to inspect the underlying concept IDs and registry records behind a visible output string, because the JustAnIota public materials repeatedly state that Unicode and glyph appearance are not the semantic promise; the registry and validation system are.
flowchart TD
A[User input] --> B[Normalize text]
B --> C[Sentence split]
C --> D[Clause and segment extraction]
D --> E[Generate 1 to 3 token category spans]
E --> F[Match Category.Categories first]
F -->|matched| G[Map concept IDs to code points or visible tokens]
F -->|not matched| H[Fallback to Category.Words]
H -->|matched| G
H -->|not matched| I[Mark unresolved or literal passthrough]
G --> J[Assemble canonical envelope]
I --> J
J --> K[Validate]
K --> L[Visible Iota-1]
K --> M[Decoded English gloss]
K --> N[Ranked candidates and trace]
The public JustAnIota converter, validator, and concept bridge already implement most of the stages in this diagram in prototype form; the main Protocol5 task is to package them into a stable public page with stricter deterministic behavior.
For UI/UX, the best layout is a two-column workbench with a lower evidence panel: left side for input and controls, right side for outputs, and a full-width panel below for trace/validator details. That mirrors the public “analysis / visible / envelope / gloss / warnings” structure users can already infer from the JustAnIota tool pages.
A practical example helps. For the user phrase “How are you today?”, the page should show the following, clearly labeled as illustrative unless the registry makes it exact:
| Stage | Illustrative behavior |
|---|---|
| Raw input | How are you today? |
| Normalization | NFC, locale en-US |
| Sentence split | One sentence |
| Segment candidates | how are you, today |
| Match priority | Try Category.Categories["how are you"] before per-word fallback |
| If category exists | Emit one greeting/health-query concept plus a today concept |
| If category missing | Fall back to how, are, you, today, with likely low-quality output and a warning |
| Output badge | exact if full deterministic registry hit; otherwise approximate or unresolved |
That caution is necessary because the public JustAnIota examples are registry-versioned fixtures rather than universal equivalence proofs, and the public registry surface remains a demo snapshot rather than a published full lexicon.
Error handling should mirror the public validator posture. In concrete terms, Protocol5 should reject malformed JSON, invalid code-point syntax, unpaired surrogates, unsupported code points, and malformed glyph sequences; warn on PUA, bidi controls, variation selectors, and invisible controls; and distinguish between “valid but unresolved,” “valid and approximate,” and “invalid.” If the page exports JSON, it should use UTF-8 and stay inside the I-JSON constraints; if canonicalized for hashing or signatures, deterministic property sorting is appropriate.
Grammar and segmentation rules
For English input, the segmentation pipeline should be layered rather than flat: normalization → sentence splitting → clause extraction → short semantic segment generation → matching. That is consistent with the public JustAnIota focus on normalization, tokenization, registry candidates, ambiguity review, and export readiness, and it also fits the uploaded integration note’s request to break paragraphs into sentences and sentences into segments before comparing Category.Categories.
Normalization should default to NFC for public input, because the public JustAnIota tools surface NFC and NFKC review modes, and Unicode normalization gives equivalent strings a consistent binary representation. At the same time, Unicode text segmentation rules are specified in terms of normalized text and are designed to respect canonical equivalence without requiring every implementation to physically rewrite all input first.
Sentence splitting should start with a Unicode-conformant boundary engine, not ad hoc regexes. Unicode UAX #29 defines default grapheme, word, and sentence boundaries and explicitly allows tailoring for language or environment. It also notes that default sentence rules will not catch all abbreviation cases such as “Mr. Jones,” which means English production behavior should add abbreviation and honorific tailoring on top of UAX #29. In the browser, Intl.Segmenter now provides locale-sensitive grapheme, word, and sentence segmentation across current browsers; ICU BreakIterator is the server-side analogue and follows UAX #29-style boundary analysis.
Clause extraction should be parser-driven. Universal Dependencies gives a clean operational vocabulary for exactly the structures you care about here: conj / cc for coordination, case for English prepositions in nominal projections, mark for subordinate-clause markers, advcl for adverbial clauses, ccomp and xcomp for clausal complements, acl for clauses modifying nouns, and punct for punctuation. spaCy’s parser and sentence utilities, and Stanza’s tokenization, parsing, and NER pipelines, are both suitable implementation tools for English clause extraction.
The recommended English segmentation rules are below.
| Rule area | Recommended rule |
|---|---|
| Paragraphs | Split on blank lines first; preserve paragraph boundaries in metadata. |
| Sentences | Use UAX #29 / Intl.Segmenter / ICU as the baseline, then tailor English abbreviations and honorifics such as Mr., Dr., Prof., e.g., i.e., etc.. |
| Clauses | For each sentence, extract the root clause and subordinate clauses anchored by ROOT, advcl, ccomp, xcomp, acl, conj, and parataxis. |
| Short semantic segments | Within each clause, generate candidate spans of length 1–3 tokens, with optional exceptions for whitelisted multiword idioms longer than 3. |
| Conjunctions | Split coordinated items into separate segment candidates, but also optionally emit composed patterns if the registry defines them. Example: food and water → food, water, and maybe food_and_water if registered. |
| Prepositions | Generate both a bare content-head candidate and a case-marked phrase candidate. Example: at risk should test both risk and at risk; prefer the longer exact registry hit if one exists. |
| Punctuation | Use punctuation for sentence/clause boundaries and preserve it in the envelope. Do not treat punctuation as semantic content unless the registry explicitly defines a punctuation concept. |
| Proper nouns | Exclude PROPN spans and named entities from semantic matching by default unless the registry explicitly whitelists them. Preserve them as literals or metadata for round-trip fidelity. |
| Stopword-only spans | Drop spans made only of function words unless they appear in a whitelisted semantic phrase like in progress, at risk, or how are you. |
| Numeric / ID tokens | Exclude pure numerics, timestamps, URLs, email addresses, hashes, and opaque IDs from category matching unless explicitly profiled. |
| MWE and fixed expressions | Keep fixed or known idiomatic phrases intact before smaller splitting. |
| Questions and imperatives | Preserve sentence mood metadata because ? and imperative syntax can matter for gloss reconstruction even when punctuation is not semantically mapped. |
This rule set is grounded in Unicode boundary guidance, UD relation definitions, PROPN semantics, and the JustAnIota public emphasis on tokenization, ambiguity handling, and deterministic registry review.
The key heuristic for the user’s requested “segments before words” behavior is this: after clause extraction, generate overlapping phrase candidates of 3, then 2, then 1 token, but do not simply accept the first hit greedily. A better design is dynamic programming over the token sequence, because it can compare overlapping alternatives and maximize a global score such as:
- exact category hit over fuzzy category hit
- longer phrase over shorter phrase
- higher reversibility over lower reversibility
- stable/public registry entry over debug/session entry
- zero unresolved tokens over higher unresolved count
That recommendation is an implementation inference, but it follows directly from the uploaded segment-first note and JustAnIota’s deterministic-registry-first posture.
Matching architecture and data model
The most important schema rule is that Category.ISO10646 should store Unicode scalar values or code-point sequences, not font-local glyph IDs. Unicode’s glossary distinguishes characters, glyphs, and glyph codes: glyph codes are local to a font, while a rendering engine maps character data to glyphs during layout. OpenType’s cmap table is literally a character-to-glyph-index mapping table. In other words, semantics should point to code points or stable tokens, while font glyph indices remain presentation-layer details.
That matters even more if Iota-1 uses supplementary-plane characters. The public JustAnIota profile examples include code points like U+F1012 and U+F18A0, and the public workbench mentions Plane 15 and Plane 16 demo namespaces. OpenType requires a format 12 cmap subtable for supplementary-plane Unicode characters (U+10000–U+10FFFF), so if Protocol5 ships a font for visible Iota-1 code points outside the BMP, the font engineering must reflect that.
A production data model should look something like this:
erDiagram
REGISTRY_VERSION ||--o{ CATEGORY_ENTRY : contains
REGISTRY_VERSION ||--o{ WORD_ENTRY : contains
CATEGORY_ENTRY ||--o{ CATEGORY_LABEL : has
WORD_ENTRY ||--o{ WORD_LABEL : has
CATEGORY_ENTRY ||--o{ CODEPOINT_MAPPING : maps_to
WORD_ENTRY ||--o{ CODEPOINT_MAPPING : maps_to
CATEGORY_ENTRY ||--o{ EXAMPLE_CASE : illustrated_by
WORD_ENTRY ||--o{ EXAMPLE_CASE : illustrated_by
CATEGORY_ENTRY ||--o{ NEGATIVE_CASE : constrained_by
WORD_ENTRY ||--o{ NEGATIVE_CASE : constrained_by
CATEGORY_ENTRY ||--o{ VALIDATION_RULE : checked_by
WORD_ENTRY ||--o{ VALIDATION_RULE : checked_by
REGISTRY_VERSION {
string version_id
string digest
string status
datetime published_at
}
CATEGORY_ENTRY {
string category_id
string default_gloss
string reversibility
string scope
string profile
int priority
}
WORD_ENTRY {
string word_id
string lemma
string default_gloss
string reversibility
string profile
}
CODEPOINT_MAPPING {
string mapping_id
string target_form
string codepoint_sequence
string normalization
string plane_policy
}
This structure closely reflects the JustAnIota public registry requirements: stable ID, human-readable label, definition, allowed profiles, locale notes, examples, negative cases, reversibility, code-point mapping, and validator behavior.
The forward-matching algorithm should have four tiers:
| Tier | Purpose | Recommended use |
|---|---|---|
| Exact segment match | Category.Categories exact lookup over 1–3 token spans | Primary path; authoritative when matched |
| Exact word match | Category.Words lookup on token/lemma | Fallback when no segment hit exists |
| Fuzzy string match | Recover near-miss spelling or punctuation variants | Optional assistive layer with strict thresholds |
| Semantic similarity | Retrieve candidate concepts from definitions/examples | Optional preview layer only, never the authority |
For exact phrase lookup, use a trie, Aho-Corasick automaton, or spaCy PhraseMatcher-style indexed phrase matcher. pyahocorasick is explicitly designed for fast multi-pattern search and supports building the string index ahead of time for reuse. For fuzzy matching, RapidFuzz provides multiple string metrics in optimized C++-backed implementations; in the browser, Fuse.js is a lightweight zero-dependency fuzzy-search option. For semantic preview, Sentence-BERT / Sentence Transformers provide practical embeddings and similarity search, and Faiss or SQL Server vector search can scale retrieval when registries grow. But the JustAnIota spec explicitly says embeddings are not semantic authority, so embedding search should only propose candidates for deterministic confirmation by the registry layer.
A practical scoring function for overlapping candidates is:
score =
+100 if exact registry hit
+25 if Category.Categories instead of Category.Words
+10 per token of matched span
+15 if reversibility == "lossless"
+10 if entry scope == "public"
-20 if fuzzy rather than exact
-40 if semantic preview rather than exact/fuzzy
-50 if ambiguity remains unresolved
Then solve the best segmentation path with dynamic programming or Viterbi-style decoding. Greedy longest-first matching is tempting, but dynamic programming is safer when a high-value 2-token segment plus a high-value 1-token segment beats a weaker 3-token segment.
The reverse algorithm should mirror the forward one: normalize the input, split into grapheme/code-point units, try longest registered code-point sequences first, map them to stable concept IDs, then generate English glosses from the registry. If multiple glosses are possible, rank them by profile, locale, reversibility, and example support, and mark the result as approximate or ambiguous rather than pretending exactness. That aligns with the public Protocol5 and JustAnIota transparency about approximate versus deterministic output.
Performance-wise, the correct split is:
- Exact lookup for primary conversion, because it is cheap and deterministic.
- Fuzzy lookup only on a narrowed shortlist.
- Semantic lookup only for unresolved cases or preview mode.
- Vector search only when the registry is large enough to justify ANN indexing.
Unicode itself notes that rule-based boundary implementations can be compiled into deterministic state machines and combined with trie-like property tables and tailoring tables. That matches the exact kind of architecture needed here: precompiled boundary logic, precompiled phrase lexicons, and optional semantic retrieval behind them.
Implementation patterns, libraries, and tests
At the tooling level, the most useful comparison is not “which NLP library is best in the abstract,” but “which layer should each library own.”
| Stack option | Strengths | Weaknesses | Best fit |
|---|---|---|---|
| Browser-first JS | Intl.Segmenter gives locale-sensitive grapheme/word/sentence splitting in modern browsers; Fuse.js gives lightweight fuzzy search. | Weak clause parsing unless you add heavier NLP; poorer explainability for syntax. | Small public MVP with deterministic registry matching only. |
| JS front end + .NET back end | Matches the existing Protocol5 .NET surface and existing IJustAnIotaConverterFacade pattern; aligns with optional SQL/vector path on Protocol5. | Needs solid API design and deployment discipline. | Best overall fit for Protocol5. |
| JS front end + Python NLP service | spaCy provides strong tokenizer/parser/NER; Stanza adds multilingual tokenization, parsing, and NER over UD-style pipelines. | Operationally heavier; another service boundary. | Best for offline segmentation evaluation or a sidecar analytics service. |
| In-browser NLP | winkNLP gives tokenization, sentence boundary detection, POS, and NER with strong speed claims. | No full UD-style dependency parse. | Good for lightweight client-side annotation and explainability. |
The strongest Protocol5-specific recommendation is: use JS for UX, .NET for the canonical converter API, and optionally Python for offline grammar-evaluation tooling. That directly reuses the existing Protocol5/JustAnIota implementation center of gravity without giving up the better NLP experimentation ecosystem.
A practical public API contract should include:
| Method | Path | Purpose |
|---|---|---|
POST | /api/iota1/convert | English → Iota-1 conversion |
POST | /api/iota1/decode | Iota-1 → English gloss |
POST | /api/iota1/roundtrip | English → Iota-1 → English consistency check |
POST | /api/iota1/validate | Envelope/code-point/registry validation |
GET | /api/iota1/registry/version | Current registry version and digest |
GET | /api/iota1/registry/entry/{id} | Inspect concept record backing an output |
GET | /api/iota1/examples | Published fixtures and negative cases |
If JSON leaves the server, it should be UTF-8 I-JSON, and any canonical export or signature flow should use a deterministic canonicalization scheme.
A recommended canonical envelope for Protocol5 would be:
{
"profile": "protocol5.iota1.converter.v1",
"registry_version": "2026-05-05-demo",
"direction": "en_to_iota1",
"locale": "en-US",
"normalization": "NFC",
"source_text": "How are you today?",
"segments": [
{
"span": "how are you",
"match_type": "category",
"concept_id": "greeting.health_query",
"reversibility": "lossless"
},
{
"span": "today",
"match_type": "word",
"concept_id": "time.today",
"reversibility": "lossless"
}
],
"output": {
"visible": "<illustrative-visible-form>",
"code_points": ["<illustrative-code-point-1>", "<illustrative-code-point-2>"]
},
"status": "illustrative_until_registry_confirms",
"warnings": []
}
This is a recommended schema, not a claim about the current public JustAnIota final schema. It is proposed precisely because the public materials currently show more than one draft-style envelope shape.
The JavaScript side can stay simple for an MVP:
function normalizeForIota(text) {
return text.normalize("NFC").trim();
}
function wordTokens(text, locale = "en-US") {
const seg = new Intl.Segmenter(locale, { granularity: "word" });
return [...seg.segment(text)]
.filter(s => s.isWordLike)
.map(s => s.segment.toLowerCase());
}
function categoryFirstMatch(tokens, categoryMap, wordMap) {
const out = [];
for (let i = 0; i < tokens.length; ) {
let matched = null;
for (let len = 3; len >= 1; len--) {
const phrase = tokens.slice(i, i + len).join(" ");
if (categoryMap.has(phrase)) {
matched = {
span: phrase,
conceptId: categoryMap.get(phrase),
kind: "category",
len
};
break;
}
}
if (!matched) {
const token = tokens[i];
matched = {
span: token,
conceptId: wordMap.get(token) ?? null,
kind: wordMap.has(token) ? "word" : "unresolved",
len: 1
};
}
out.push(matched);
i += matched.len;
}
return out;
}
This snippet follows the browser segmentation model exposed by Intl.Segmenter and a category-first matching policy. In production, replace the greedy loop with dynamic programming so overlapping alternatives can be scored globally.
For higher-quality grammar segmentation, a Python sidecar or offline evaluator can use spaCy like this:
from __future__ import annotations
import spacy
from typing import List, Dict, Any
NLP = spacy.load("en_core_web_sm")
CLAUSE_DEPS = {"ROOT", "advcl", "ccomp", "xcomp", "acl", "conj", "parataxis"}
def extract_semantic_segments(text: str) -> List[Dict[str, Any]]:
doc = NLP(text)
segments: List[Dict[str, Any]] = []
for sent in doc.sents:
for tok in sent:
if tok.dep_ not in CLAUSE_DEPS:
continue
# Start from the clause subtree
span_tokens = [t for t in tok.subtree if not t.is_space and not t.is_punct]
# Exclude obvious named entities / proper nouns by default
filtered = [
t for t in span_tokens
if t.pos_ != "PROPN" and t.ent_type_ == ""
]
lemmas = [t.lemma_.lower() for t in filtered if t.is_alpha]
if not lemmas:
continue
# Generate 1-3 token windows for Category.Categories matching
candidates = []
for i in range(len(lemmas)):
for j in range(i + 1, min(i + 4, len(lemmas) + 1)):
candidates.append(" ".join(lemmas[i:j]))
segments.append({
"sentence": sent.text,
"clause_head": tok.text,
"lemmas": lemmas,
"candidates": candidates
})
return segments
This follows the documented strengths of spaCy’s tokenizer, sentence utilities, dependency parser, and entity recognizer, while aligning the clause logic with UD relation families.
The recommended test suite should mix public fixtures, negative cases, and user-centered phrases:
| Test input | Expected behavior |
|---|---|
How are you today? | Prefer a 3-token category hit for how are you; fall back gracefully if absent. |
Request human review for the validator result. | Should reproduce a public demo-style category path similar to the published JustAnIota example. |
Mr. Smith arrived at 3.14 p.m. | Sentence splitter should not break after Mr. or decimal 3.14. |
Food and water are needed. | Coordination should yield food and water as separate candidates plus optional composed mapping. |
The patient is at risk. | Try at risk before only risk. |
New York is cold. | Proper noun should be preserved, not forced through semantic category matching unless whitelisted. |
\u202Eabc or bidi-control payloads | Validator should warn or reject depending on policy. |
| Unknown Iota-1 glyph sequence | Reverse decode should return unresolved or ambiguous, not hallucinated English. |
| Round trip of a known deterministic fixture | Must preserve concept IDs and reversibility label. |
The public JustAnIota examples and validator provide the right model for how fixtures and warnings should be structured: source text, registry candidates, validation report, compact demo, and at least one negative case.
Open questions, edge cases, and recommendations
The biggest open question is simply this: what is the authoritative Iota-1 lexicon and code-point policy? The public pages do not expose a complete registry export for Category.Categories, Category.Words, and Category.ISO10646; the JustAnIota registry pages are explicit that the current registry is a demo snapshot, and the examples are explicit that fixtures are not universal equivalence proofs. Without that authoritative registry, any production page can only be partially faithful.
A second open question is whether public Protocol5 should use only public Unicode assignments or also support PUA preview in controlled profiles. The Protocol5 .NET converter page and the JustAnIota spec/tooling currently point in different directions on that question. Until that is resolved, the safest public release choice is: public Unicode-visible mode for end users, optional controlled preview mode for internal testing, and explicit warnings whenever non-public code points are involved.
A third open question is how strict reversibility must be. The public Protocol5 converter page embraces approximate gist recovery; the JustAnIota registry model emphasizes reversibility levels and validator-backed evidence. A strong public product can reconcile those positions by splitting outputs into three labeled classes: lossless, approximate, and unresolved. That would be both honest and consistent with the public materials.
The most important release recommendations are straightforward:
- Freeze one canonical envelope schema and version it. The public examples currently show more than one draft-like JSON shape.
- Ship deterministic exact matching first, with segment-first matching against
Category.Categories, thenCategory.Words. Add fuzzy and semantic retrieval only as opt-in assistive modes. - Expose trace evidence in the UI so users can see sentence boundaries, clause boundaries, category hits, word fallbacks, unresolved spans, and warnings. That is already the implicit product pattern across the JustAnIota tool set.
- Treat proper nouns, numbers, URLs, and control characters conservatively. Preserve them for round trip; do not force them into semantic compression unless whitelisted.
- If supplementary-plane characters are used, ensure the shipped font and rendering stack support them correctly with appropriate OpenType mappings.
- Build an evaluation harness around published fixtures, negative cases, user examples, and round-trip checks before the page is linked from the Protocol5 homepage. The public JustAnIota record family already points toward validator-backed proof before support claims.
In short, the research supports building the requested page on Protocol5, and it strongly suggests how to build it: a transparent, registry-backed, sentence-and-segment-aware converter with authoritative exact matching first, visible evidence always, and approximate/semantic helper layers clearly separated from semantic authority. The missing piece is not the web page itself; it is the finalization of the authoritative Iota-1 registry and encoding policy.