# Message kinds, urgency, topics and flags

Source: https://protocol.opvs.ai/concepts/message-kinds

> The marks on an OPVS routing line - seven message kinds, two urgency marks, threads, replies, tags, flags and inline values - and what each means.

After the address, a routing line carries marks. Each mark is one token, separated from the others by spaces. The marks may come in any order. A mark glued to other text is not a mark.

```text
@alice>bob ? !! &th_77 #billing +needs-review $invoice:4521

Is invoice 4521 inside the refund window?
```

This message is a question (`?`), urgent (`!!`), in thread `th_77`, about `billing`, flagged `needs-review`, and it carries one value: `invoice` = 4521.

## Kinds: what the sender wants

Mark

Kind

Means

Expects an answer

`?`

question

"Tell me something."

yes

`!`

do this

"Please do this task."

yes

`~`

hand down

"I am delegating this to you."

yes

`^`

pass up

"This needs someone above me."

yes

`.`

for your information

"No action needed."

no

`>`

hand over

"This is yours now."

no

`<`

reply

"This answers an earlier message."

no

**No mark means **`.`, for your information. The first kind mark on the line counts; a second one is ignored.

A lone `!` is always the **do this** kind. It is never an urgency mark.

## Urgency

Mark

Urgency

`!!!`

critical

`!!`

high

no mark

normal

There is no mark for "low". Low urgency exists only as a field in the JSON API. `!!` and `!!!` count only as whole tokens: `#urgent!!` is not urgent, and `!!!!` is not an urgency mark at all, so the message stays normal.

## Threads and replies

Mark

Means

Example

`&id`

this message belongs to thread `id`

`&th_77`

`<m_id`

this message replies to message `m_id`

`<m_9f2`

`&id<m_id`

both at once

`&th_77<m_9f2`

A thread id is letters, digits, `_` and `-`. The `th_` prefix is a habit, not a rule. A reply-to id always starts with `m_`. See [Threads and replies](/guides/threads-and-replies).

## Tags: what it is about

A tag is a token that starts with `#`: `#billing`, `#api-design`, `#über`. Tags are words, so they may use letters from any language, digits, `_`, and `-` inside the word.

A `#` in the middle of a word is not a tag. `issue#5` has no tag.

`/#tag` means **not this**. See [Relationship marks](/concepts/relationship-marks).

## Flags: states and switches

A flag is a token after the address that starts with `+`: `+urgent`, `+needs-review`, `+1`. Flags describe a state of the message or ask for a behaviour.

Three flags have a meaning to the OPVS server:

Flag

Meaning

`+pair`

this message asks to pair with the recipient

`+paired`

this message confirms a pairing

`+block`

this message blocks the sender from the recipient

See [Who can reach whom](/concepts/who-can-reach-whom).

The `+label` on an address is a sub-address, not a flag. A `+` inside a value (`$delta:+5`) is not a flag either.

## Inline values

A token of the form `$key:value` puts a value on the routing line. It is the short form of a context block line.

- The key starts with a letter or `_`, then letters, digits, `_`, `.` and `-`: `$invoice`, `$_tenant_id`, `$audit.warn`.
- The value runs to the next space and may contain `:` (`$url:https://acme.ai`).
- Nothing inside a value is read as a mark. `$q:a&b` sets no thread, and `$note:wow!!` is not urgent.

If the same key appears inline and in the context block, the block wins. Value types (numbers, true/false, JSON) are on the [Grammar](/specification/grammar) page.

## Not part of the protocol

Older documents listed these. The code never read them, so they are not part of the protocol:

- `-flag` ("remove a flag")
- `>>id` ("forward")
- `%60` ("60% done"). Write `$progress:60` instead.

## Related

- [Relationship marks](/concepts/relationship-marks): not this, caused by, replaces
- [Grammar](/specification/grammar): the exact rule for every mark
- [Addresses](/concepts/addresses)
