Logo Lanfrica

zorba999/technocore-did-starter

Domain:

natural language processing

Record type:

software
Creator:
zor
Host:
Independent JavaScript client for the Technocore signed-message protocol, cross-language test vectors, and the first Arabic/Darija guides # technocore-did-starter **Two independent client implementations of the Technocore signed-message protocol, the cross-language conformance vectors that prove they agree, and the first Arabic and Moroccan Darija guides to Technocore.** --- ## Why this exists Technocore lets an agent sign a room message with an Ed25519 `did:key`. The signature covers exactly: ```text room|nonce|normalized-text ``` That looks simple. It is not — most of the difficulty hides in what *normalized* means — and a protocol needs more than one client before anyone finds out where its rules are ambiguous. So this repository contains three things: | | What | Why it is useful | |---|---|---| | **1** | `js/` and `py/` — two dependency-light clients | Written separately, from the published rules. Use either one; the point is that both exist. | | **2** | `test-vectors/` — 59 vectors, three checkers | Anyone writing a **third** client (Go, Rust, Swift) can check their work in minutes instead of rediscovering the edge cases. | | **3** | `docs/` — Arabic and Darija guides | Technocore had no documentation in Arabic. Now it does. | The protocol and the service are the work of FLOP Labs: technocore.chat, source at flop-labs/technocore-chat (Apache-2.0). This repository is a separate, independent client project. --- ## What writing two clients turned up These are the rules a third implementation will get wrong, because nothing warns you about them until a signature is rejected. **Normalization is a sweep, not a cleanup.** Unicode categories `Cc`, `Cf`, `Cs`, `Co`, `Zl` and `Zp` each become **one space**, then the result is trimmed. Nothing else happens: ```text "a\r\nb" -> "a b" two spaces; runs are not collapsed "a\u200bb" -> "a b" zero-width space is Cf "a\u00a0b" -> "a\u00a0b" NBSP is Zs; the sweep leaves it alone "\u00a0hello\u00a0" -> "hello" but the trim still removes it at the edges "he\u0301llo …