NCMP

Natural Conversation Messaging Protocol

What if a conversation
could also be a protocol?

Machines already exchange natural language. NCMP shows that the same conversation can also carry deterministic machine-readable state.

A

Want to walk before the shops get busy?

B

Yes, the park gate works if we leave early.

A

If the fog holds we turn around at the bench.

the same conversation is also carrying

ACTION
GET
RESOURCE
CUSTOMER
ARGUMENT
1F45A2

GET CUSTOMER 1F45A2

ACTION and RESOURCE meanings come from the agreed profile.
Their selected values, and the argument, are transported as bits.

60 seconds · The dual layer

Every turn is language. Some turns are also bits.

Humans hear a reply. The machines, sharing one profile and one transcript, compute a carrier value, a next mode, and sometimes a symbol. v0.1 uses C6 for that carrier. Profile choice NCMP does not require C6. Nothing extra is sent.

“The pasta was decent and the bread came out warm.”

Language

ordinary reply

Protocol

V = 15

next = DATA

no bits · peer turn

“Yes, the park gate works if we leave early.”

Language

ordinary reply

Protocol

V = 12

bit = 0

next = DATA

What’s agreed beforehand?

The profile says what the bits mean. The conversation selects them.

A and B agree a Profile before the conversation. That agreement sets the vocabularies and therefore the header width. NCMP does not allocate one bit to ACTION and one bit to RESOURCE.

Baseline example

Profile A · v0.1 conformance

ACTION
0GET
1SET
RESOURCE
0CUSTOMER
1ORDER
action width
1 bit
resource width
1 bit
header
2 bits
control_seed
0x9CA2C1C1
bootstrap_hint
umbrella

Another valid profile

Profile B · wider example

ACTION
00GET
01SET
10DELETE
11EXECUTE
RESOURCE
000CUSTOMER
001ORDER
010ACCOUNT
011INVOICE
100PRODUCT
101SESSION
110reserved
111reserved
action width
2 bits
resource width
3 bits
header
5 bits

This 4×6 shape has been demonstrated on the same machine (AR-C2). It is not the published v0.1 vocabulary.

action_width   = ceil(log₂ |ACTION|)
resource_width = ceil(log₂ |RESOURCE|)
header_width   = action_width + resource_width

The agreed Profile determines the vocabulary, the header width, the control seed, and the bootstrap hint. 2×2 is a cheap conformance example, not an architectural constraint.

How does a session start?

The Profile is pre-agreed. The conversation creates the session.

There is no reserved PROBE phrase, ACK phrase, START phrase, or FINISH phrase. The Profile bootstraps the session. The handshake then establishes its frame-control vocabulary.

Profile
  control_seed
  bootstrap_hint
       ↓
natural PROBE
       ↓ exact U_probe
derive T_ack
       ↓
natural ACK
       ↓ exact U_ack
derive K_session
derive START_PAIR from U_probe
derive FINISH_PAIR from U_ack
       ↓
natural START
       START_PAIR ∧ T_START
       L(K_session, U) → argument length
       ↓
sparse BODY
       ↓
natural FINISH
       FINISH_PAIR ∧ T_FINISH

Bootstrap stays bootstrap-only. After ACK, use what the conversation gave; derive only what it did not. A cue is not enough. Seeing the session’s START or FINISH words does not make a turn a control. The corresponding 6-bit residual must also match.

ordinary utterance
      │
      ├── pair absent ───────────────→ BODY / CHAT
      │
      └── pair present
              │
              ├── residual misses ───→ BODY / CHAT
              │
              └── residual matches ──→ CONTROL

Seeing saturday is not START. Seeing saturday then morning is not necessarily START. The pair grounds the control in the conversation; the residual makes mere occurrence insufficient. Bootstrap is the same shape: umbrella plus a matching residual. Profile choice umbrella and 0x9CA2C1C1 are Baseline values, not the architecture.

What crosses the wire?

One bitstream. Three fields. Profile-defined widths.

BODY is not three messages. It is one accumulator. ACTION and RESOURCE are recovered from the prefix once those bits exist. They are not assigned at START.

[action bits][resource bits][argument bits]

Walkthrough · Profile A · argument 5

GET CUSTOMER 23

Application view of ARGUMENT 10111. NCMP transports bits.

00 10111
││ └── argument
│└──── CUSTOMER
└───── GET
argument
10111

Hero object · Profile A · brief → 24

GET CUSTOMER 1F45A2

argument
1F45A2
canonical bits
00011111 01000101 10100010

Legal Baseline argument lengths are 0, 5, 8, 24, and 128. 16 is not among them, so the public object is 1F45A2, not 1F45.

5 minutes · Prove it

Watch a message emerge.

The published reference transcript. START declares 5 argument bits by L(K_session, U), not by the word short. In this profile the header is 2 bits. Click a turn, or use the arrows.

The walkthrough uses a 5-bit argument so every transition fits on screen. The same Baseline Profile supports 24-bit arguments such as 1F45A2, and 128-bit arguments have been transported experimentally.

How can that be deterministic?

Shared state plus the accepted utterance is enough.

The receiver does not consult an encoder, a candidate list, or a language model. Both sides apply the same process to the same ordered transcript.

decode(stateₙ, Uₙ) → (bitsₙ, stateₙ₊₁)

Mode

SKIP / DATA

Ownership

A / B

A peer turn can move the machine into DATA without contributing data itself. Inside a frame, every non-control utterance is BODY. Only owner DATA with wire remaining appends bits.

The protocol machine

The protocol is a state machine.

The state machine has two interacting levels. Session state handles negotiation; frame state handles an open message. Inside a frame, DATA/SKIP mode determines whether an owner turn can contribute bits.

Conversation lifecycle

idle → handshake → active ⇄ frame

Within-frame mode

next mode = transition(V)

DATA if V < 32

SKIP otherwise

Session

idle ──PROBE──► handshake ──ACK──► active ──START──► frame ──FINISH──► active
                         derive K_session         L → length

Inside an open frame

                      FRAME OPEN
                            │
                  non-control utterance
                            │
                            ▼
                          BODY
                            │
                            ▼
                        V = C6(U)
                            │
              ┌─────────────┴─────────────┐
              │                           │
     current mode + owner           transition(V)
              │                           │
      ┌───────┼────────┐                  ▼
      │       │        │           next SKIP / DATA
    SKIP  DATA+peer  DATA+owner
      │       │        │
   no bits  no bits  symbol(V)

The carrier value V is an input to the within-frame machine. In v0.1, C6 produces V. Profile choice A different profile can sit a different carrier in that slot.

Every non-control utterance inside an open frame advances the machine. Only an owner turn processed in DATA mode can append bits.

Participant state

session ∈ { idle, handshake, active }

u_probe · u_ack · k_session · frame · last_object

A frame exists only while a frame is open.

Controls · not BODY

PROBE
idle → handshake
ACK
handshake → active · store U_ack · derive K_session
START
active → frame · L declares length
FINISH
frame → active

Active frame state

owner
A | B
argument_bits
declared at START
mode
SKIP | DATA
accumulator
header then argument
header_remaining
unfilled header bits
argument_remaining
unfilled argument bits

Is this real?

What has actually worked.

Measured results. Not laws. Caveats sit on the numbers.

128

bits transported end to end

Argument under the earlier constant-type Profile 0. Not header evidence. One run.

252 / 252

constrained DATA opportunities found a carrier

Search was not the bottleneck. Three of ten frames still died on exhausted runway.

4 × 6

ACTION × RESOURCE table on the same machine

Demonstrated extensibility. Not the published v0.1 vocabulary.

0 / 99,434

accidental frame controls

No accidental START or FINISH. Five ordinary turns contained the START pair; none also matched its residual. One accidental PROBE occurred on the same freeze. Measured, not a bound.

~0.3

chosen bits / body turn observed

An illustration from naturally bounded scenes. Not a bound or a law.

0 / 3

treatment conversations judged less natural

Tiny sample. Both arms language-model generated. One treatment payload incomplete.

NOT

a covertness claim

Anyone who knows the profile and sees the transcript can run the same referee.

What it isn’t

NCMP is

  • deterministic
  • stateful
  • conversational transport
  • machine-readable

NCMP 0.1 is not

  • encryption
  • authenticated
  • tamper-resistant
  • proven covert
  • JSON disguised as English

Deep dive · Architecture is not the profile

v0.1 uses C6 to turn an utterance into a deterministic value.

Profile choice C6 is a Baseline Profile choice, not part of the NCMP architecture. NCMP requires a deterministic carrier; v0.1 uses C6, a deliberately simple, model-free one. A different profile can replace it with another carrier.

Its job is simple: both machines independently turn the same accepted utterance into the same value.

NCMP architecture
      │
      └── requires a deterministic carrier
                    │
                    ├── C6          ← v0.1 choice
                    ├── carrier X   ← possible
                    └── carrier Y   ← possible

“The tea in the flask is still warm enough.”

C6 Profile choice

V = 5

How 5 happened

keep a–z

theteaintheflaskisstillwarmenough

a = 1 … z = 26

sum · mod 64

V = 5

NFC, then lowercase. Spaces, punctuation, and digits are ignored. The empty string has V = 0.

What does this profile do with V?

C6 only produces V. The profile decides what V means.

V = 5

next mode

DATA

symbol

11

State transition

V < 32 → next mode DATA

V ≥ 32 → next mode SKIP

Symbol · owner DATA

V mod 3 = 0 → 0

V mod 3 = 1 → 10

V mod 3 = 2 → 11

If one bit remains, the last bit is V mod 2.

A peer turn or an owner SKIP still computes the next mode. It does not append a symbol.

Meaning is irrelevant to decoding

Hi. is V = 17. Let's meet around 7:30 before the lot fills up. is V = 14. The decoder is not asking what the sentence means. It is asking C6(U).

Any total map from utterance to a finite alphabet could sit in this slot. C6 is a cheap first carrier. It is not the intellectual core of NCMP.

Architecture

stateful conversational transport

The protocol object is the conversation.

Profile · v0.1 Baseline example

carrier
C6 Profile choice
transition
V < 32 → DATA
symbols
0 / 10 / 11
ACTION
GET / SET · 1 bit
RESOURCE
CUSTOMER / ORDER · 1 bit
bootstrap
umbrella
frame cues
handshake pair
control_seed
0x9CA2C1C1

What’s next

A roadmap, not a promise.

This is v0.1 Experimental. Later work sits beside it. It does not silently rewrite the machine.

  1. Natural-bound characterization
  2. Larger distinguishability evaluation
  3. Encoder reliability / efficiency
  4. Alternative profiles / carriers
  5. Loss / duplicate / reorder
  6. Repair / resynchronization
  7. Integrity / replay protection

Build it

The protocol is independently implementable.

A reader who has only NCMP.md can write process(transcript) → protocol state. The reference decoder demonstrates that machine. It does not define it.