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 …