unimsg provisional

examples/spatial-arm.umsg

%unimsg 0 spatial/arm/v0 · 292 lines · 10070 bytes of text · 4910 bytes canonical · the raw file

Point at anything below — a sigil, a literal, a brace — and the card says what it is. Keyboard: tab through the document. Every explanation is also printed in full beneath the source.

%unimsg 0 spatial/arm/v0


-- A six-axis robot arm, hand-authored in @vocab/spatial/v0.

--

-- The vocabulary was read off sixteen formats and no file, and docs/42 tested

-- it by transcribing five specifications rather than converting five files.

-- This is the other test, and the one @vocab/vocabulary/v0's landing checklist

-- asks for: small, written by hand, and exercising the thing the whole design

-- rests on — a frame graph acting as a kinematic chain.

--

-- WHAT IT DELIBERATELY STRAINS. A joint per frame, with limits in a unit that

-- is not the frame's. A measured frame beside authored ones, so :tolerance and

-- :measurement are both used rather than described. A collision instance

-- alongside the visual ones, which is the URDF construct docs/42 found had

-- nowhere to go. A morph target driven by a declared parameter, which is the

-- glTF construct that broke the motion sketch. And a body carrying mass and an

-- inertia tensor, which is a fact and not a simulation.

--

-- Every pose here is a translation and an identity rotation, and that is not

-- laziness: a rest pose is where the mechanism sits with every joint at zero,

-- and the interesting rotations belong in a take — which is the SECOND BLOCK of

-- this same document, not a second file.


spatial @spatial/arm/v0 {
  title  "Six-axis arm at rest"
  status :draft
  at     2026-08-30

  description "A six-axis industrial arm in its zero configuration: a base
               column, two link shells, a wrist ball and a gripper blade, with
               a coarse collision hull over the upper arm and a camera mounted
               on the base."

  -- A micrometre, on a machine tool. The number is a fact about how finely

  -- this document records and the transcript is rounded onto it.

  precision {
    length   mm 0.001
    unitless 0.000001
    rounding :half-even
  }

  canonical-frame -> @frames.base

  measurement {
    instrument "Faro Vantage tracker"
    at         2026-08-30
    method     "the camera mount surveyed against the base flange; every other
                frame is authored from the drawing"
  }

  frames {
    base {
      unit       :m
      handedness :right
      up         :z
    }

    shoulder {
      parent -> @frames.base
      pose   { translate [ 0, 0, 0.1625 ] }
      joint  {
        kind  :revolute
        axis  [ 0, 0, 1 ]
        limit { lower deg -180, upper deg 180 }
        effort   nm 150
        velocity 3.15
      }
    }

    upper-arm {
      parent -> @frames.shoulder
      pose   { translate [ 0, 0.138, 0 ] }
      joint  {
        kind  :revolute
        axis  [ 0, 1, 0 ]
        limit { lower deg -150, upper deg 150 }
      }
    }

    forearm {
      parent -> @frames.upper-arm
      pose   { translate [ 0, -0.131, 0.425 ] }
      joint  {
        kind  :revolute
        axis  [ 0, 1, 0 ]
        limit { lower deg -150, upper deg 150 }
      }
    }

    wrist {
      parent -> @frames.forearm
      pose   { translate [ 0, 0, 0.392 ] }
      joint  {
        kind  :revolute
        axis  [ 0, 1, 0 ]
        limit { lower deg -180, upper deg 180 }
      }
    }

    tool-flange {
      parent -> @frames.wrist
      pose   { translate [ 0, 0.127, 0 ] }
      joint  { kind :fixed }
    }

    -- The one frame in this document that was measured rather than drawn, and

    -- the reason :measurement is present at all.

    camera-mount {
      parent    -> @frames.base
      pose      { translate [ 0.3, -0.25, 0.9 ] }
      tolerance { position mm 2 }
    }
  }

  parameters {
    gripper-open {
      doc     "how far the blade is spread, from closed to fully open"
      default 0
      lower   0
      upper   1
    }
  }

  materials {
    steel   { base-colour "#8a8f98", metallic 1, roughness 0.4 }
    warning { base-colour "#d9a441", metallic 0, roughness 0.6 }
  }

  geometry {
    base-column     { cylinder { radius 0.075, length 0.1625 } }
    upper-arm-shell { box { extent [ 0.09, 0.09, 0.425 ] } }
    forearm-shell   { box { extent [ 0.08, 0.08, 0.392 ] } }
    wrist-ball      { sphere { radius 0.045 } }
    collision-hull  { box { extent [ 0.1, 0.1, 0.45 ] } }

    -- A five-vertex blade, and the only mesh here. Its :targets entry is what

    -- a declared parameter is for: the tips spread and nothing else moves.

    gripper-blade {
      mesh {
        positions [ -0.02, -0.02, 0,
                     0.02, -0.02, 0,
                     0.02,  0.02, 0,
                    -0.02,  0.02, 0,
                     0,     0,    0.06 ]
        indices [ 0, 1, 2,
                  0, 2, 3,
                  0, 1, 4,
                  1, 2, 4,
                  2, 3, 4,
                  3, 0, 4 ]
        attributes {
          face { kind :uv, values [ 0, 0, 1, 0, 1, 1, 0, 1, 0.5, 0.5 ] }
        }
        targets {
          open {
            deltas [ -0.01, -0.01, 0,
                      0.01, -0.01, 0,
                      0.01,  0.01, 0,
                     -0.01,  0.01, 0,
                      0,     0,    0 ]
            parameter -> @parameters.gripper-open
          }
        }
      }
    }
  }

  bodies {
    forearm-body {
      doc            "the forearm casting, weighed rather than modelled"
      frame          -> @frames.forearm
      mass           kg 3.7
      centre-of-mass [ 0, 0, 0.196 ]
      inertia        [ 0.0666, 0.0666, 0.0047, 0, 0, 0 ]
    }
  }

  scene [
    { geometry -> @geometry.base-column,     frame -> @frames.base,        purpose :visual,    material -> @materials.steel }
    { geometry -> @geometry.upper-arm-shell, frame -> @frames.upper-arm,   purpose :visual,    material -> @materials.steel }
    { geometry -> @geometry.forearm-shell,   frame -> @frames.forearm,     purpose :visual,    material -> @materials.steel, body -> @bodies.forearm-body }
    { geometry -> @geometry.wrist-ball,      frame -> @frames.wrist,       purpose :visual,    material -> @materials.steel }
    { geometry -> @geometry.gripper-blade,   frame -> @frames.tool-flange, purpose :visual,    material -> @materials.warning }
    { geometry -> @geometry.collision-hull,  frame -> @frames.upper-arm,   purpose :collision }
  ]

  -- The arm at rest, asserted rather than described. The flange sits at

  -- y = 0.138 - 0.131 + 0.127 and z = 0.1625 + 0.425 + 0.392, which is the

  -- kind of sum a reader should not have to do and a checker should.

  checks [
    {
      doc    "the tool flange sits where the drawing says, with every joint at zero"
      assert :position-of
      of     -> @frames.tool-flange
      in     -> @frames.base
      expect [ 0, 0.134, 0.9795 ]
    }
    {
      doc    "the camera sees the base from where it was surveyed"
      assert :position-of
      of     -> @frames.camera-mount
      in     -> @frames.base
      expect [ 0.3, -0.25, 0.9 ]
    }
    {
      doc    "nothing was silently dropped: five visual instances and one collision hull"
      assert :entry-count
      of     -> @spatial/arm/v0
      expect 6
    }
  ]
}

-- The take that drives it, BESIDE it rather than in a second file. It carries

-- no :binds and no digest: two blocks in the same bytes cannot drift apart, so

-- there is nothing for a pin to defend against. See

-- a-take-belongs-beside-its-scene in @vocab/motion/v0.


motion @motion/arm-sweep/v0 {
  title  "Arm sweep, one second"
  status :draft
  at     2026-08-30
  doc    "the shoulder sweeps 45 degrees while the forearm drops 30 and the
          blade opens, in one second at ten hertz"


  interval [ 0, 1 ]
  rate     Hz 10

  channels [
    -- the shoulder sweeps 45 degrees about its own axis

    {
      drives        -> @frames.shoulder
      interpolation :linear
      rotate [
        0.00000000, 0.00000000, 0.00000000, 1.00000000,
        0.00000000, 0.00000000, 0.03925982, 0.99922904,
        0.00000000, 0.00000000, 0.07845910, 0.99691733,
        0.00000000, 0.00000000, 0.11753740, 0.99306846,
        0.00000000, 0.00000000, 0.15643447, 0.98768834,
        0.00000000, 0.00000000, 0.19509032, 0.98078528,
        0.00000000, 0.00000000, 0.23344536, 0.97236992,
        0.00000000, 0.00000000, 0.27144045, 0.96245524,
        0.00000000, 0.00000000, 0.30901699, 0.95105652,
        0.00000000, 0.00000000, 0.34611706, 0.93819134,
        0.00000000, 0.00000000, 0.38268343, 0.92387953,
      ]
    }
    -- and the forearm drops 30 degrees while it does

    {
      drives        -> @frames.forearm
      interpolation :linear
      rotate [
        0.00000000, -0.00000000, 0.00000000, 1.00000000,
        0.00000000, -0.02617695, 0.00000000, 0.99965732,
        0.00000000, -0.05233596, 0.00000000, 0.99862953,
        0.00000000, -0.07845910, 0.00000000, 0.99691733,
        0.00000000, -0.10452846, 0.00000000, 0.99452190,
        0.00000000, -0.13052619, 0.00000000, 0.99144486,
        0.00000000, -0.15643447, 0.00000000, 0.98768834,
        0.00000000, -0.18223553, 0.00000000, 0.98325491,
        0.00000000, -0.20791169, 0.00000000, 0.97814760,
        0.00000000, -0.23344536, 0.00000000, 0.97236992,
        0.00000000, -0.25881905, 0.00000000, 0.96592583,
      ]
    }
    -- the blade opens across the whole sweep. A parameter, not a frame

    {
      drives        -> @parameters.gripper-open
      interpolation :linear
      values [ 0.00000000, 0.10000000, 0.20000000, 0.30000000, 0.40000000, 0.50000000, 0.60000000, 0.70000000, 0.80000000, 0.90000000, 1.00000000 ]
    }
  ]

  checks [
    {
      doc    "the blade is fully open at the end"
      assert :value-at
      of     -> @parameters.gripper-open
      at     1
      expect 1
    }
    {
      doc    "every sample of the shoulder is inside the limit the scene declares"
      assert :limit-holds
      of     -> @frames.shoulder
      at     0
      expect true
    }
  ]
}

The canonical encoding

Produced by the reference encoder when this page was built. Decoding these bytes and printing them in the text form returns the document above, byte for byte — that round trip is the claim the whole format rests on.

a2 66 6d 6f 74 69 6f 6e da 00 01 11 d5 82 81 da 00 01 11 d6 73 6d 6f 74
69 6f 6e 2f 61 72 6d 2d 73 77 65 65 70 2f 76 30 a8 62 61 74 da 00 01 11
da 6a 32 30 32 36 2d 30 38 2d 33 30 63 64 6f 63 78 74 74 68 65 20 73 68
6f 75 6c 64 65 72 20 73 77 65 65 70 73 20 34 35 20 64 65 67 72 65 65 73
20 77 68 69 6c 65 20 74 68 65 20 66 6f 72 65 61 72 6d 20 64 72 6f 70 73
20 33 30 20 61 6e 64 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 62
6c 61 64 65 20 6f 70 65 6e 73 2c 20 69 6e 20 6f 6e 65 20 73 65 63 6f 6e
64 20 61 74 20 74 65 6e 20 68 65 72 74 7a 64 72 61 74 65 da 00 01 11 d5
82 81 da 00 01 11 d4 62 48 7a 0a 65 74 69 74 6c 65 75 41 72 6d 20 73 77
65 65 70 2c 20 6f 6e 65 20 73 65 63 6f 6e 64 66 63 68 65 63 6b 73 82 a5
62 61 74 01 62 6f 66 da 00 01 11 d7 77 70 61 72 61 6d 65 74 65 72 73 2e
67 72 69 70 70 65 72 2d 6f 70 65 6e 63 64 6f 63 78 22 74 68 65 20 62 6c
61 64 65 20 69 73 20 66 75 6c 6c 79 20 6f 70 65 6e 20 61 74 20 74 68 65
20 65 6e 64 66 61 73 73 65 72 74 da 00 01 11 d4 68 76 61 6c 75 65 2d 61
74 66 65 78 70 65 63 74 01 a5 62 61 74 00 62 6f 66 da 00 01 11 d7 6f 66
72 61 6d 65 73 2e 73 68 6f 75 6c 64 65 72 63 64 6f 63 78 43 65 76 65 72
79 20 73 61 6d 70 6c 65 20 6f 66 20 74 68 65 20 73 68 6f 75 6c 64 65 72
20 69 73 20 69 6e 73 69 64 65 20 74 68 65 20 6c 69 6d 69 74 20 74 68 65
20 73 63 65 6e 65 20 64 65 63 6c 61 72 65 73 66 61 73 73 65 72 74 da 00
01 11 d4 6b 6c 69 6d 69 74 2d 68 6f 6c 64 73 66 65 78 70 65 63 74 f5 66
73 74 61 74 75 73 da 00 01 11 d4 65 64 72 61 66 74 68 63 68 61 6e 6e 65
6c 73 83 a3 66 64 72 69 76 65 73 da 00 01 11 d7 6f 66 72 61 6d 65 73 2e
73 68 6f 75 6c 64 65 72 66 72 6f 74 61 74 65 98 2c c4 82 27 00 c4 82 27
00 c4 82 27 00 c4 82 27 1a 05 f5 e1 00 c4 82 27 00 c4 82 27 00 c4 82 27
1a 00 3b e7 de c4 82 27 1a 05 f4 b3 d8 c4 82 27 00 c4 82 27 00 c4 82 27
1a 00 77 b8 16 c4 82 27 1a 05 f1 2c d5 c4 82 27 00 c4 82 27 00 c4 82 27
1a 00 b3 59 0c c4 82 27 1a 05 eb 4d 5e c4 82 27 00 c4 82 27 00 c4 82 27
1a 00 ee b3 37 c4 82 27 1a 05 e3 17 c2 c4 82 27 00 c4 82 27 00 c4 82 27
1a 01 29 af 28 c4 82 27 1a 05 d8 8f 40 c4 82 27 00 c4 82 27 00 c4 82 27
1a 01 64 35 98 c4 82 27 1a 05 cb b8 00 c4 82 27 00 c4 82 27 00 c4 82 27
1a 01 9e 2f 6d c4 82 27 1a 05 bc 97 14 c4 82 27 00 c4 82 27 00 c4 82 27
1a 01 d7 85 c3 c4 82 27 1a 05 ab 32 74 c4 82 27 00 c4 82 27 00 c4 82 27
1a 02 10 21 fa c4 82 27 1a 05 97 90 fe c4 82 27 00 c4 82 27 00 c4 82 27
1a 02 47 ed b7 c4 82 27 1a 05 81 ba 71 6d 69 6e 74 65 72 70 6f 6c 61 74
69 6f 6e da 00 01 11 d4 66 6c 69 6e 65 61 72 a3 66 64 72 69 76 65 73 da
00 01 11 d7 6e 66 72 61 6d 65 73 2e 66 6f 72 65 61 72 6d 66 72 6f 74 61
74 65 98 2c c4 82 27 00 c4 82 27 00 c4 82 27 00 c4 82 27 1a 05 f5 e1 00
c4 82 27 00 c4 82 27 3a 00 27 f1 5e c4 82 27 00 c4 82 27 1a 05 f5 5b 24
c4 82 27 00 c4 82 27 3a 00 4f db bb c4 82 27 00 c4 82 27 1a 05 f3 c9 a9
c4 82 27 00 c4 82 27 3a 00 77 b8 15 c4 82 27 00 c4 82 27 1a 05 f1 2c d5
c4 82 27 00 c4 82 27 3a 00 9f 7f 6d c4 82 27 00 c4 82 27 1a 05 ed 85 1e
c4 82 27 00 c4 82 27 3a 00 c7 2a ca c4 82 27 00 c4 82 27 1a 05 e8 d3 26
c4 82 27 00 c4 82 27 3a 00 ee b3 36 c4 82 27 00 c4 82 27 1a 05 e3 17 c2
c4 82 27 00 c4 82 27 3a 01 16 11 c0 c4 82 27 00 c4 82 27 1a 05 dc 53 f3
c4 82 27 00 c4 82 27 3a 01 3d 3f 80 c4 82 27 00 c4 82 27 1a 05 d4 88 e8
c4 82 27 00 c4 82 27 3a 01 64 35 97 c4 82 27 00 c4 82 27 1a 05 cb b8 00
c4 82 27 00 c4 82 27 3a 01 8a ed 30 c4 82 27 00 c4 82 27 1a 05 c1 e2 c7
6d 69 6e 74 65 72 70 6f 6c 61 74 69 6f 6e da 00 01 11 d4 66 6c 69 6e 65
61 72 a3 66 64 72 69 76 65 73 da 00 01 11 d7 77 70 61 72 61 6d 65 74 65
72 73 2e 67 72 69 70 70 65 72 2d 6f 70 65 6e 66 76 61 6c 75 65 73 8b c4
82 27 00 c4 82 27 1a 00 98 96 80 c4 82 27 1a 01 31 2d 00 c4 82 27 1a 01
c9 c3 80 c4 82 27 1a 02 62 5a 00 c4 82 27 1a 02 fa f0 80 c4 82 27 1a 03
93 87 00 c4 82 27 1a 04 2c 1d 80 c4 82 27 1a 04 c4 b4 00 c4 82 27 1a 05
5d 4a 80 c4 82 27 1a 05 f5 e1 00 6d 69 6e 74 65 72 70 6f 6c 61 74 69 6f
6e da 00 01 11 d4 66 6c 69 6e 65 61 72 68 69 6e 74 65 72 76 61 6c 82 00
01 67 73 70 61 74 69 61 6c da 00 01 11 d5 82 81 da 00 01 11 d6 6e 73 70
61 74 69 61 6c 2f 61 72 6d 2f 76 30 ae 62 61 74 da 00 01 11 da 6a 32 30
32 36 2d 30 38 2d 33 30 65 73 63 65 6e 65 86 a4 65 66 72 61 6d 65 da 00
01 11 d7 6b 66 72 61 6d 65 73 2e 62 61 73 65 67 70 75 72 70 6f 73 65 da
00 01 11 d4 66 76 69 73 75 61 6c 68 67 65 6f 6d 65 74 72 79 da 00 01 11
d7 74 67 65 6f 6d 65 74 72 79 2e 62 61 73 65 2d 63 6f 6c 75 6d 6e 68 6d
61 74 65 72 69 61 6c da 00 01 11 d7 6f 6d 61 74 65 72 69 61 6c 73 2e 73
74 65 65 6c a4 65 66 72 61 6d 65 da 00 01 11 d7 70 66 72 61 6d 65 73 2e
75 70 70 65 72 2d 61 72 6d 67 70 75 72 70 6f 73 65 da 00 01 11 d4 66 76
69 73 75 61 6c 68 67 65 6f 6d 65 74 72 79 da 00 01 11 d7 78 18 67 65 6f
6d 65 74 72 79 2e 75 70 70 65 72 2d 61 72 6d 2d 73 68 65 6c 6c 68 6d 61
74 65 72 69 61 6c da 00 01 11 d7 6f 6d 61 74 65 72 69 61 6c 73 2e 73 74
65 65 6c a5 64 62 6f 64 79 da 00 01 11 d7 73 62 6f 64 69 65 73 2e 66 6f
72 65 61 72 6d 2d 62 6f 64 79 65 66 72 61 6d 65 da 00 01 11 d7 6e 66 72
61 6d 65 73 2e 66 6f 72 65 61 72 6d 67 70 75 72 70 6f 73 65 da 00 01 11
d4 66 76 69 73 75 61 6c 68 67 65 6f 6d 65 74 72 79 da 00 01 11 d7 76 67
65 6f 6d 65 74 72 79 2e 66 6f 72 65 61 72 6d 2d 73 68 65 6c 6c 68 6d 61
74 65 72 69 61 6c da 00 01 11 d7 6f 6d 61 74 65 72 69 61 6c 73 2e 73 74
65 65 6c a4 65 66 72 61 6d 65 da 00 01 11 d7 6c 66 72 61 6d 65 73 2e 77
72 69 73 74 67 70 75 72 70 6f 73 65 da 00 01 11 d4 66 76 69 73 75 61 6c
68 67 65 6f 6d 65 74 72 79 da 00 01 11 d7 73 67 65 6f 6d 65 74 72 79 2e
77 72 69 73 74 2d 62 61 6c 6c 68 6d 61 74 65 72 69 61 6c da 00 01 11 d7
6f 6d 61 74 65 72 69 61 6c 73 2e 73 74 65 65 6c a4 65 66 72 61 6d 65 da
00 01 11 d7 72 66 72 61 6d 65 73 2e 74 6f 6f 6c 2d 66 6c 61 6e 67 65 67
70 75 72 70 6f 73 65 da 00 01 11 d4 66 76 69 73 75 61 6c 68 67 65 6f 6d
65 74 72 79 da 00 01 11 d7 76 67 65 6f 6d 65 74 72 79 2e 67 72 69 70 70
65 72 2d 62 6c 61 64 65 68 6d 61 74 65 72 69 61 6c da 00 01 11 d7 71 6d
61 74 65 72 69 61 6c 73 2e 77 61 72 6e 69 6e 67 a3 65 66 72 61 6d 65 da
00 01 11 d7 70 66 72 61 6d 65 73 2e 75 70 70 65 72 2d 61 72 6d 67 70 75
72 70 6f 73 65 da 00 01 11 d4 69 63 6f 6c 6c 69 73 69 6f 6e 68 67 65 6f
6d 65 74 72 79 da 00 01 11 d7 77 67 65 6f 6d 65 74 72 79 2e 63 6f 6c 6c
69 73 69 6f 6e 2d 68 75 6c 6c 65 74 69 74 6c 65 74 53 69 78 2d 61 78 69
73 20 61 72 6d 20 61 74 20 72 65 73 74 66 62 6f 64 69 65 73 a1 6c 66 6f
72 65 61 72 6d 2d 62 6f 64 79 a5 63 64 6f 63 78 31 74 68 65 20 66 6f 72
65 61 72 6d 20 63 61 73 74 69 6e 67 2c 20 77 65 69 67 68 65 64 20 72 61
74 68 65 72 20 74 68 61 6e 20 6d 6f 64 65 6c 6c 65 64 64 6d 61 73 73 da
00 01 11 d5 82 81 da 00 01 11 d4 62 6b 67 c4 82 20 18 25 65 66 72 61 6d
65 da 00 01 11 d7 6e 66 72 61 6d 65 73 2e 66 6f 72 65 61 72 6d 67 69 6e
65 72 74 69 61 86 c4 82 23 19 02 9a c4 82 23 19 02 9a c4 82 23 18 2f 00
00 00 6e 63 65 6e 74 72 65 2d 6f 66 2d 6d 61 73 73 83 00 00 c4 82 22 18
c4 66 63 68 65 63 6b 73 83 a5 62 69 6e da 00 01 11 d7 6b 66 72 61 6d 65
73 2e 62 61 73 65 62 6f 66 da 00 01 11 d7 72 66 72 61 6d 65 73 2e 74 6f
6f 6c 2d 66 6c 61 6e 67 65 63 64 6f 63 78 45 74 68 65 20 74 6f 6f 6c 20
66 6c 61 6e 67 65 20 73 69 74 73 20 77 68 65 72 65 20 74 68 65 20 64 72
61 77 69 6e 67 20 73 61 79 73 2c 20 77 69 74 68 20 65 76 65 72 79 20 6a
6f 69 6e 74 20 61 74 20 7a 65 72 6f 66 61 73 73 65 72 74 da 00 01 11 d4
6b 70 6f 73 69 74 69 6f 6e 2d 6f 66 66 65 78 70 65 63 74 83 00 c4 82 22
18 86 c4 82 23 19 26 43 a5 62 69 6e da 00 01 11 d7 6b 66 72 61 6d 65 73
2e 62 61 73 65 62 6f 66 da 00 01 11 d7 73 66 72 61 6d 65 73 2e 63 61 6d
65 72 61 2d 6d 6f 75 6e 74 63 64 6f 63 78 33 74 68 65 20 63 61 6d 65 72
61 20 73 65 65 73 20 74 68 65 20 62 61 73 65 20 66 72 6f 6d 20 77 68 65
72 65 20 69 74 20 77 61 73 20 73 75 72 76 65 79 65 64 66 61 73 73 65 72
74 da 00 01 11 d4 6b 70 6f 73 69 74 69 6f 6e 2d 6f 66 66 65 78 70 65 63
74 83 c4 82 20 03 c4 82 21 38 18 c4 82 20 09 a4 62 6f 66 da 00 01 11 d7
6e 73 70 61 74 69 61 6c 2f 61 72 6d 2f 76 30 63 64 6f 63 78 4a 6e 6f 74
68 69 6e 67 20 77 61 73 20 73 69 6c 65 6e 74 6c 79 20 64 72 6f 70 70 65
64 3a 20 66 69 76 65 20 76 69 73 75 61 6c 20 69 6e 73 74 61 6e 63 65 73
20 61 6e 64 20 6f 6e 65 20 63 6f 6c 6c 69 73 69 6f 6e 20 68 75 6c 6c 66
61 73 73 65 72 74 da 00 01 11 d4 6b 65 6e 74 72 79 2d 63 6f 75 6e 74 66
65 78 70 65 63 74 06 66 66 72 61 6d 65 73 a7 64 62 61 73 65 a3 62 75 70
da 00 01 11 d4 61 7a 64 75 6e 69 74 da 00 01 11 d4 61 6d 6a 68 61 6e 64
65 64 6e 65 73 73 da 00 01 11 d4 65 72 69 67 68 74 65 77 72 69 73 74 a3
64 70 6f 73 65 a1 69 74 72 61 6e 73 6c 61 74 65 83 00 00 c4 82 22 19 01
88 65 6a 6f 69 6e 74 a3 64 61 78 69 73 83 00 01 00 64 6b 69 6e 64 da 00
01 11 d4 68 72 65 76 6f 6c 75 74 65 65 6c 69 6d 69 74 a2 65 6c 6f 77 65
72 da 00 01 11 d5 82 81 da 00 01 11 d4 63 64 65 67 38 b3 65 75 70 70 65
72 da 00 01 11 d5 82 81 da 00 01 11 d4 63 64 65 67 18 b4 66 70 61 72 65
6e 74 da 00 01 11 d7 6e 66 72 61 6d 65 73 2e 66 6f 72 65 61 72 6d 67 66
6f 72 65 61 72 6d a3 64 70 6f 73 65 a1 69 74 72 61 6e 73 6c 61 74 65 83
00 c4 82 22 38 82 c4 82 22 19 01 a9 65 6a 6f 69 6e 74 a3 64 61 78 69 73
83 00 01 00 64 6b 69 6e 64 da 00 01 11 d4 68 72 65 76 6f 6c 75 74 65 65
6c 69 6d 69 74 a2 65 6c 6f 77 65 72 da 00 01 11 d5 82 81 da 00 01 11 d4
63 64 65 67 38 95 65 75 70 70 65 72 da 00 01 11 d5 82 81 da 00 01 11 d4
63 64 65 67 18 96 66 70 61 72 65 6e 74 da 00 01 11 d7 70 66 72 61 6d 65
73 2e 75 70 70 65 72 2d 61 72 6d 68 73 68 6f 75 6c 64 65 72 a3 64 70 6f
73 65 a1 69 74 72 61 6e 73 6c 61 74 65 83 00 00 c4 82 23 19 06 59 65 6a
6f 69 6e 74 a5 64 61 78 69 73 83 00 00 01 64 6b 69 6e 64 da 00 01 11 d4
68 72 65 76 6f 6c 75 74 65 65 6c 69 6d 69 74 a2 65 6c 6f 77 65 72 da 00
01 11 d5 82 81 da 00 01 11 d4 63 64 65 67 38 b3 65 75 70 70 65 72 da 00
01 11 d5 82 81 da 00 01 11 d4 63 64 65 67 18 b4 66 65 66 66 6f 72 74 da
00 01 11 d5 82 81 da 00 01 11 d4 62 6e 6d 18 96 68 76 65 6c 6f 63 69 74
79 c4 82 21 19 01 3b 66 70 61 72 65 6e 74 da 00 01 11 d7 6b 66 72 61 6d
65 73 2e 62 61 73 65 69 75 70 70 65 72 2d 61 72 6d a3 64 70 6f 73 65 a1
69 74 72 61 6e 73 6c 61 74 65 83 00 c4 82 22 18 8a 00 65 6a 6f 69 6e 74
a3 64 61 78 69 73 83 00 01 00 64 6b 69 6e 64 da 00 01 11 d4 68 72 65 76
6f 6c 75 74 65 65 6c 69 6d 69 74 a2 65 6c 6f 77 65 72 da 00 01 11 d5 82
81 da 00 01 11 d4 63 64 65 67 38 95 65 75 70 70 65 72 da 00 01 11 d5 82
81 da 00 01 11 d4 63 64 65 67 18 96 66 70 61 72 65 6e 74 da 00 01 11 d7
6f 66 72 61 6d 65 73 2e 73 68 6f 75 6c 64 65 72 6b 74 6f 6f 6c 2d 66 6c
61 6e 67 65 a3 64 70 6f 73 65 a1 69 74 72 61 6e 73 6c 61 74 65 83 00 c4
82 22 18 7f 00 65 6a 6f 69 6e 74 a1 64 6b 69 6e 64 da 00 01 11 d4 65 66
69 78 65 64 66 70 61 72 65 6e 74 da 00 01 11 d7 6c 66 72 61 6d 65 73 2e
77 72 69 73 74 6c 63 61 6d 65 72 61 2d 6d 6f 75 6e 74 a3 64 70 6f 73 65
a1 69 74 72 61 6e 73 6c 61 74 65 83 c4 82 20 03 c4 82 21 38 18 c4 82 20
09 66 70 61 72 65 6e 74 da 00 01 11 d7 6b 66 72 61 6d 65 73 2e 62 61 73
65 69 74 6f 6c 65 72 61 6e 63 65 a1 68 70 6f 73 69 74 69 6f 6e da 00 01
11 d5 82 81 da 00 01 11 d4 62 6d 6d 02 66 73 74 61 74 75 73 da 00 01 11
d4 65 64 72 61 66 74 68 67 65 6f 6d 65 74 72 79 a6 6a 77 72 69 73 74 2d
62 61 6c 6c a1 66 73 70 68 65 72 65 a1 66 72 61 64 69 75 73 c4 82 22 18
2d 6b 62 61 73 65 2d 63 6f 6c 75 6d 6e a1 68 63 79 6c 69 6e 64 65 72 a2
66 6c 65 6e 67 74 68 c4 82 23 19 06 59 66 72 61 64 69 75 73 c4 82 22 18
4b 6d 66 6f 72 65 61 72 6d 2d 73 68 65 6c 6c a1 63 62 6f 78 a1 66 65 78
74 65 6e 74 83 c4 82 21 08 c4 82 21 08 c4 82 22 19 01 88 6d 67 72 69 70
70 65 72 2d 62 6c 61 64 65 a1 64 6d 65 73 68 a4 67 69 6e 64 69 63 65 73
92 00 01 02 00 02 03 00 01 04 01 02 04 02 03 04 03 00 04 67 74 61 72 67
65 74 73 a1 64 6f 70 65 6e a2 66 64 65 6c 74 61 73 8f c4 82 21 20 c4 82
21 20 00 c4 82 21 01 c4 82 21 20 00 c4 82 21 01 c4 82 21 01 00 c4 82 21
20 c4 82 21 01 00 00 00 00 69 70 61 72 61 6d 65 74 65 72 da 00 01 11 d7
77 70 61 72 61 6d 65 74 65 72 73 2e 67 72 69 70 70 65 72 2d 6f 70 65 6e
69 70 6f 73 69 74 69 6f 6e 73 8f c4 82 21 21 c4 82 21 21 00 c4 82 21 02
c4 82 21 21 00 c4 82 21 02 c4 82 21 02 00 c4 82 21 21 c4 82 21 02 00 00
00 c4 82 21 06 6a 61 74 74 72 69 62 75 74 65 73 a1 64 66 61 63 65 a2 64
6b 69 6e 64 da 00 01 11 d4 62 75 76 66 76 61 6c 75 65 73 8a 00 00 01 00
01 01 00 01 c4 82 20 05 c4 82 20 05 6e 63 6f 6c 6c 69 73 69 6f 6e 2d 68
75 6c 6c a1 63 62 6f 78 a1 66 65 78 74 65 6e 74 83 c4 82 20 01 c4 82 20
01 c4 82 21 18 2d 6f 75 70 70 65 72 2d 61 72 6d 2d 73 68 65 6c 6c a1 63
62 6f 78 a1 66 65 78 74 65 6e 74 83 c4 82 21 09 c4 82 21 09 c4 82 22 19
01 a9 69 6d 61 74 65 72 69 61 6c 73 a2 65 73 74 65 65 6c a3 68 6d 65 74
61 6c 6c 69 63 01 69 72 6f 75 67 68 6e 65 73 73 c4 82 20 04 6b 62 61 73
65 2d 63 6f 6c 6f 75 72 67 23 38 61 38 66 39 38 67 77 61 72 6e 69 6e 67
a3 68 6d 65 74 61 6c 6c 69 63 00 69 72 6f 75 67 68 6e 65 73 73 c4 82 20
06 6b 62 61 73 65 2d 63 6f 6c 6f 75 72 67 23 64 39 61 34 34 31 69 70 72
65 63 69 73 69 6f 6e a3 66 6c 65 6e 67 74 68 da 00 01 11 d5 82 81 da 00
01 11 d4 62 6d 6d c4 82 22 01 68 72 6f 75 6e 64 69 6e 67 da 00 01 11 d4
69 68 61 6c 66 2d 65 76 65 6e 68 75 6e 69 74 6c 65 73 73 c4 82 25 01 6a
70 61 72 61 6d 65 74 65 72 73 a1 6c 67 72 69 70 70 65 72 2d 6f 70 65 6e
a4 63 64 6f 63 78 36 68 6f 77 20 66 61 72 20 74 68 65 20 62 6c 61 64 65
20 69 73 20 73 70 72 65 61 64 2c 20 66 72 6f 6d 20 63 6c 6f 73 65 64 20
74 6f 20 66 75 6c 6c 79 20 6f 70 65 6e 65 6c 6f 77 65 72 00 65 75 70 70
65 72 01 67 64 65 66 61 75 6c 74 00 6b 64 65 73 63 72 69 70 74 69 6f 6e
78 f8 41 20 73 69 78 2d 61 78 69 73 20 69 6e 64 75 73 74 72 69 61 6c 20
61 72 6d 20 69 6e 20 69 74 73 20 7a 65 72 6f 20 63 6f 6e 66 69 67 75 72
61 74 69 6f 6e 3a 20 61 20 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 20
20 20 20 20 20 20 63 6f 6c 75 6d 6e 2c 20 74 77 6f 20 6c 69 6e 6b 20 73
68 65 6c 6c 73 2c 20 61 20 77 72 69 73 74 20 62 61 6c 6c 20 61 6e 64 20
61 20 67 72 69 70 70 65 72 20 62 6c 61 64 65 2c 20 77 69 74 68 0d 0a 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 20 63 6f 61 72 73 65 20 63
6f 6c 6c 69 73 69 6f 6e 20 68 75 6c 6c 20 6f 76 65 72 20 74 68 65 20 75
70 70 65 72 20 61 72 6d 20 61 6e 64 20 61 20 63 61 6d 65 72 61 20 6d 6f
75 6e 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e
20 74 68 65 20 62 61 73 65 2e 6b 6d 65 61 73 75 72 65 6d 65 6e 74 a3 62
61 74 da 00 01 11 da 6a 32 30 32 36 2d 30 38 2d 33 30 66 6d 65 74 68 6f
64 78 72 74 68 65 20 63 61 6d 65 72 61 20 6d 6f 75 6e 74 20 73 75 72 76
65 79 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 62 61 73 65 20 66 6c
61 6e 67 65 3b 20 65 76 65 72 79 20 6f 74 68 65 72 0d 0a 20 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d 65 20 69 73 20 61 75 74 68
6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 64 72 61 77 69 6e 67 6a 69 6e
73 74 72 75 6d 65 6e 74 74 46 61 72 6f 20 56 61 6e 74 61 67 65 20 74 72
61 63 6b 65 72 6f 63 61 6e 6f 6e 69 63 61 6c 2d 66 72 61 6d 65 da 00 01
11 d7 6b 66 72 61 6d 65 73 2e 62 61 73 65
canonical CBOR for examples/spatial-arm.umsg 4910 bytes

Every construct on this page

The formal columns are read from the specification when this page is generated. The last column is this site's plain-language gloss and is not normative — where they differ, the specification is right.

constructglyphcarriesexamplegloss
:annotationA bare name qualifying the value after it—for example a language tag or a unit such as kg. It is not a value itself; a bare name with nothing after it is an error, not a guess.
:array^type, or type:shape; then [ elements ]^f64 [ 1.5, 2.5 ] or ^i16:2x3 [ … ]A packed, homogeneous numeric array. The ^ marker gives every element its type and may also give the row-major shape: ^f64:2x3 [ … ].
:array-elementOne element of a typed array. Its type comes from the ^ marker, so 1.5 inside ^f64 is binary64 rather than an exact decimal.
:array-missingA missing position in a typed array. null here is not an element value: it adds a validity mask while preserving the array's shape.
:blockA block: named pairs, in braces. Its keys are sorted in the encoding and shown here as written.
:bytes~encoding:data~hex:ff00 or ~b64:iVBORw0KGgo=Raw octets, carried as octets. No base64 tax, no pretending they are text.
:comment--to end of line-- a noteA note for people. It travels with the pair it precedes and never reaches the bytes.
:decimalAn exact decimal. 19.99 is nineteen and ninety-nine hundredths, not the nearest double to it.
:extension!name, then value!acme/hint { zone 4 }A qualifier this reader may not know. It survives the round trip intact, and stays legible on the way past — the rule that separates an extension from a private convention.
:floatA binary float, marked so it can never be mistaken for the exact decimal beside it.
:hash#algorithm:hex#sha256:deadbeefThe digest of some content, with the algorithm said out loud so it is still meaningful in ten years.
:header%unimsg only%unimsg 0 labelDeclares the format version and what this document is. Optional, and useful exactly when a file arrives without context.
:identifier@word@ord-88213Gives this value a name, so another document can point at it without copying it.
:integerA whole number of any size. Past 2^53 it is still exact, which is the whole reason this is not JSON.
:keyA field name: the first thing in a pair. It is bare when possible and quoted when needed, and names the content without becoming part of the value.
:reference->an identifier or a path-> @cust-4471, -> @lexicon.entries.kitābPoints at a name. Nothing follows it while reading — resolution is somebody else's job, deliberately.
:reserved-literalOne of six bare words that are values rather than names. The list is fixed, so no value is coerced by what it looks like.
:sequenceAn ordered list. Order is preserved and is meaning.
:stringText. May span lines, so prose does not have to be escaped into one.
:symbol:word:dispatchedA name from a fixed vocabulary, not free text. :high is a value someone chose; "high" is a phrase someone typed.
:table-row|cells| sku qtyOne record of a table. A table is sugar for a sequence of blocks with the same keys, and encodes identically to the longhand.
:timestampA temporal value at the precision written. 2026-08 stays a month, and 03:52 stays a wall-clock time; neither is widened into an invented instant.