@almadar/core 10.129.0 → 11.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/behavior-package.d.ts +49 -11
  2. package/dist/behavior-package.js +1 -1
  3. package/dist/{orbital-CkFdDS9f.d.ts → builders-BdgbY7Th.d.ts} +5828 -6917
  4. package/dist/builders.d.ts +6 -6
  5. package/dist/builders.js +7 -6
  6. package/dist/{bus-CcbB__oo.d.ts → bus-C0hFDNFR.d.ts} +262 -354
  7. package/dist/chunk-347APWFM.js +286 -0
  8. package/dist/chunk-347APWFM.js.map +1 -0
  9. package/dist/chunk-5WQ3U7NJ.js +2363 -0
  10. package/dist/chunk-5WQ3U7NJ.js.map +1 -0
  11. package/dist/chunk-5YTPYMPZ.js +99 -0
  12. package/dist/chunk-5YTPYMPZ.js.map +1 -0
  13. package/dist/chunk-66Q5VX2F.js +3810 -0
  14. package/dist/chunk-66Q5VX2F.js.map +1 -0
  15. package/dist/chunk-7GHJU5WI.js +39 -0
  16. package/dist/chunk-7GHJU5WI.js.map +1 -0
  17. package/dist/chunk-B4MNHGBP.js +8 -0
  18. package/dist/chunk-B4MNHGBP.js.map +1 -0
  19. package/dist/chunk-E4T2MQAV.js +24 -0
  20. package/dist/chunk-E4T2MQAV.js.map +1 -0
  21. package/dist/chunk-ENOCKYGA.js +412 -0
  22. package/dist/chunk-ENOCKYGA.js.map +1 -0
  23. package/dist/chunk-FGT5OS2Y.js +918 -0
  24. package/dist/chunk-FGT5OS2Y.js.map +1 -0
  25. package/dist/chunk-GF7KCLNR.js +3284 -0
  26. package/dist/chunk-GF7KCLNR.js.map +1 -0
  27. package/dist/chunk-PNGFWLHD.js +1567 -0
  28. package/dist/chunk-PNGFWLHD.js.map +1 -0
  29. package/dist/{chunk-X4SC7FGF.js → chunk-RGACZEYC.js} +99 -96
  30. package/dist/chunk-RGACZEYC.js.map +1 -0
  31. package/dist/{chunk-RYPVOI6H.js → chunk-SNZYN7UA.js} +2541 -433
  32. package/dist/{chunk-RYPVOI6H.js.map → chunk-SNZYN7UA.js.map} +1 -1
  33. package/dist/{chunk-KDMV222Q.js → chunk-TDNQT3M3.js} +304 -373
  34. package/dist/chunk-TDNQT3M3.js.map +1 -0
  35. package/dist/chunk-VG7BRFUD.js +152 -0
  36. package/dist/chunk-VG7BRFUD.js.map +1 -0
  37. package/dist/chunk-Z7BI7DE7.js +1293 -0
  38. package/dist/chunk-Z7BI7DE7.js.map +1 -0
  39. package/dist/{domain-Dz3jP-UM.d.ts → domain-Cpmja5ak.d.ts} +55 -55
  40. package/dist/{effect-CiEVLsZz.d.ts → effect-DZaXwSAz.d.ts} +283 -453
  41. package/dist/{effect-result-Bebwu9yT.d.ts → effect-result-1HpXgeBc.d.ts} +656 -851
  42. package/dist/{expression-D0Fs0riG.d.ts → expression-DirYKz-f.d.ts} +5 -13
  43. package/dist/factory/index.d.ts +7 -144
  44. package/dist/factory/index.js +8 -8
  45. package/dist/factory-runtime/index.d.ts +7 -6
  46. package/dist/factory-runtime/index.js +527 -8
  47. package/dist/factory-runtime/index.js.map +1 -1
  48. package/dist/fixtures.d.ts +9 -11
  49. package/dist/fixtures.js +12 -8
  50. package/dist/fixtures.js.map +1 -1
  51. package/dist/i18n/index.d.ts +15 -19
  52. package/dist/i18n/index.js +2 -1
  53. package/dist/{index-BC-Jycqj.d.ts → index-D7SxwNdv.d.ts} +34 -734
  54. package/dist/index.d.ts +92 -247
  55. package/dist/index.js +322 -986
  56. package/dist/index.js.map +1 -1
  57. package/dist/kernel-wire.d.ts +3 -3
  58. package/dist/kernel-wire.js +3 -79
  59. package/dist/kernel-wire.js.map +1 -1
  60. package/dist/language/constructs.json +22 -2
  61. package/dist/language/program-types.json +203 -22
  62. package/dist/language/protocols.json +46 -0
  63. package/dist/language/ui-vocabulary.json +1697 -0
  64. package/dist/language/validation-codes.json +1222 -1212
  65. package/dist/language/vocabulary.json +44 -8
  66. package/dist/language-data.d.ts +7 -4
  67. package/dist/language-data.js +20 -14
  68. package/dist/language-data.js.map +1 -1
  69. package/dist/patterns/component-mapping.json +11 -1
  70. package/dist/patterns/definitions.d.ts +2 -2
  71. package/dist/patterns/definitions.js +1 -1
  72. package/dist/patterns/event-contracts.json +1 -15
  73. package/dist/patterns/game-font-families.json +13 -0
  74. package/dist/patterns/index.d.ts +24 -120
  75. package/dist/patterns/index.js +3 -3
  76. package/dist/patterns/pattern-tile-geometry.json +1065 -0
  77. package/dist/patterns/patterns-registry.json +2539 -431
  78. package/dist/patterns/registry.json +2539 -431
  79. package/dist/trait-sRjIivFq.d.ts +3519 -0
  80. package/dist/types/index.d.ts +9 -10
  81. package/dist/types/index.js +11 -5
  82. package/dist/{types-DGwrltUF.d.ts → types-C6_yPMpn.d.ts} +3 -3
  83. package/fixtures/events-wire/client-effects-by-trait/response.json +0 -18
  84. package/fixtures/events-wire/client-effects-provenance/response.json +0 -18
  85. package/fixtures/events-wire/effect-results-every-kind/response.json +2 -27
  86. package/fixtures/events-wire/navigate-1/response.json +8 -5
  87. package/fixtures/events-wire/navigate-2/response.json +11 -8
  88. package/fixtures/events-wire/navigate-3/response.json +14 -11
  89. package/fixtures/events-wire/navigate-back/response.json +7 -4
  90. package/fixtures/events-wire/render-ui-3/response.json +12 -9
  91. package/fixtures/events-wire/render-ui-clear/response.json +0 -7
  92. package/fixtures/events-wire/sse-stream/response.json +0 -20
  93. package/fixtures/events-wire/sse-stream/stream.json +0 -20
  94. package/fixtures/events-wire/stateless-traits/response.json +14 -5
  95. package/fixtures/kernel-wire/golden/basic-entity.json +1687 -0
  96. package/fixtures/kernel-wire/golden/entity-rerender.json +743 -0
  97. package/fixtures/kernel-wire/golden/rollback.json +793 -0
  98. package/fixtures/kernel-wire/golden/tick-counter.json +1538 -0
  99. package/fixtures/kernel-wire/golden/two-orbital-chore.json +847 -0
  100. package/fixtures/kernel-wire/golden/two-orbital-task.json +457 -0
  101. package/fixtures/kernel-wire/played-step.json +136 -0
  102. package/fixtures/kernel-wire/scripts/basic-entity.json +28 -0
  103. package/fixtures/kernel-wire/scripts/entity-rerender.json +13 -0
  104. package/fixtures/kernel-wire/scripts/rollback.json +53 -0
  105. package/fixtures/kernel-wire/scripts/tick-counter.json +26 -0
  106. package/fixtures/kernel-wire/scripts/two-orbital-chore.json +9 -0
  107. package/fixtures/kernel-wire/scripts/two-orbital-task.json +9 -0
  108. package/package.json +28 -19
  109. package/dist/builders-DmZE5By0.d.ts +0 -2663
  110. package/dist/chunk-45I2O4SJ.js +0 -4646
  111. package/dist/chunk-45I2O4SJ.js.map +0 -1
  112. package/dist/chunk-6LR43Z5E.js +0 -3061
  113. package/dist/chunk-6LR43Z5E.js.map +0 -1
  114. package/dist/chunk-GIUA3NUJ.js +0 -809
  115. package/dist/chunk-GIUA3NUJ.js.map +0 -1
  116. package/dist/chunk-GTY53NS5.js +0 -1908
  117. package/dist/chunk-GTY53NS5.js.map +0 -1
  118. package/dist/chunk-JOHDVS6J.js +0 -1614
  119. package/dist/chunk-JOHDVS6J.js.map +0 -1
  120. package/dist/chunk-KDMV222Q.js.map +0 -1
  121. package/dist/chunk-QRHJUS3D.js +0 -23
  122. package/dist/chunk-QRHJUS3D.js.map +0 -1
  123. package/dist/chunk-QUOTJULD.js +0 -4009
  124. package/dist/chunk-QUOTJULD.js.map +0 -1
  125. package/dist/chunk-V5VNGRVU.js +0 -66
  126. package/dist/chunk-V5VNGRVU.js.map +0 -1
  127. package/dist/chunk-X4SC7FGF.js.map +0 -1
  128. package/dist/entityAccess-BPSz1i2n.d.ts +0 -80
  129. package/dist/mock/index.d.ts +0 -153
  130. package/dist/mock/index.js +0 -190
  131. package/dist/mock/index.js.map +0 -1
  132. package/dist/schema-T5RT5s6H.d.ts +0 -282
  133. package/dist/state-machine/index.d.ts +0 -359
  134. package/dist/state-machine/index.js +0 -3
  135. package/dist/state-machine/index.js.map +0 -1
@@ -1,2042 +1,2052 @@
1
1
  [
2
2
  {
3
- "code": "ORB_E_MISSING_NAME",
4
- "category": "entity",
5
- "description": "Entity is missing a name"
6
- },
7
- {
8
- "code": "ORB_E_NO_FIELDS",
9
- "category": "entity",
10
- "description": "Entity has no fields defined"
11
- },
12
- {
13
- "code": "ORB_E_INVALID_FIELD_TYPE",
14
- "category": "entity",
15
- "description": "Field has an invalid type"
16
- },
17
- {
18
- "code": "ORB_E_DUPLICATE_FIELD",
19
- "category": "entity",
20
- "description": "Duplicate field name in entity"
21
- },
22
- {
23
- "code": "ORB_E_INVALID_FIELD_NAME",
24
- "category": "entity",
25
- "description": "Field name doesn't match camelCase pattern"
26
- },
27
- {
28
- "code": "ORB_E_MISSING_COLLECTION",
29
- "category": "entity",
30
- "description": "Persistent entity missing collection property"
31
- },
32
- {
33
- "code": "ORB_E_LOCAL_REQUIRES_PERSISTENT",
34
- "category": "entity",
35
- "description": "`browser` on a non-persistent entity (ORB_E_LOCAL_REQUIRES_PERSISTENT)"
36
- },
37
- {
38
- "code": "ORB_E_IDENTITY_LOCAL",
39
- "category": "entity",
40
- "description": "`[identity]` entity declared `browser` (ORB_E_IDENTITY_LOCAL)"
41
- },
42
- {
43
- "code": "ORB_E_INSTANCE_INVALID",
44
- "category": "entity",
45
- "description": "A written-out row with an unknown field, a missing required field, or (local) no id (ORB_E_INSTANCE_INVALID)"
46
- },
47
- {
48
- "code": "ORB_E_LOCALE_INSTANCES_NOT_LOCAL",
49
- "category": "entity",
50
- "description": "`instances <lang>` on an entity whose rows are not browser-stored (ORB_E_LOCALE_INSTANCES_NOT_LOCAL)"
3
+ "code": "ORB_T_MISSING_RENDER_UI",
4
+ "category": "trait",
5
+ "description": "Interaction trait missing render_ui effects"
51
6
  },
52
7
  {
53
- "code": "ORB_E_LOCALE_INSTANCES_UNKNOWN_LOCALE",
54
- "category": "entity",
55
- "description": "`instances <lang>` for a locale the app does not declare, or for its default locale (ORB_E_LOCALE_INSTANCES_UNKNOWN_LOCALE)"
8
+ "code": "ORB_T_BEHAVIOR_REF_UNRESOLVED",
9
+ "category": "trait",
10
+ "description": "A trait-value literal (`<spec>.traits.<Trait>`) whose behavior or trait does not resolve against the installed behavior packages."
56
11
  },
57
12
  {
58
- "code": "ORB_E_LOCALE_INSTANCES_INCOMPLETE",
59
- "category": "entity",
60
- "description": "Locale rows written without the default `instances`, or missing a declared locale (ORB_E_LOCALE_INSTANCES_INCOMPLETE)"
13
+ "code": "ORB_T_BEHAVIOR_REF_NOT_LITERAL",
14
+ "category": "trait",
15
+ "description": "A `behavior/ref` whose argument is computed at run time: a behavior from data must arrive as a `behavior` value, never re-parsed from text."
61
16
  },
62
17
  {
63
- "code": "ORB_E_INVALID_RELATION",
64
- "category": "entity",
65
- "description": "Relation target entity doesn't exist"
18
+ "code": "ORB_T_UNQUOTE_OUTSIDE_QUASIQUOTE",
19
+ "category": "trait",
20
+ "description": "An `[\"unquote\", …]` call outside a quasiquote body in an `.orb` input."
66
21
  },
67
22
  {
68
- "code": "ORB_E_EMPTY_ENUM_VALUES",
69
- "category": "entity",
70
- "description": "Enum field has no values"
23
+ "code": "ORB_T_EVENT_REF_UNRESOLVED",
24
+ "category": "trait",
25
+ "description": "An event-typed config value addresses a trait the program does not have."
71
26
  },
72
27
  {
73
- "code": "ORB_E_SEMANTIC_VALUE_INVALID",
74
- "category": "entity",
75
- "description": "A literal default on a semantic-domain field does not satisfy that domain (`email : email = \"not-an-email\"`)."
28
+ "code": "ORB_T_EVENT_REF_NOT_EXTERNAL_INPUT",
29
+ "category": "trait",
30
+ "description": "An event-typed config value addresses an event its trait does not declare as an external input."
76
31
  },
77
32
  {
78
- "code": "ORB_E_MOCK_NOT_IN_ENUM",
79
- "category": "entity",
80
- "description": "An enum field's `@mock` names a candidate that is not one of its values."
33
+ "code": "ORB_T_CONFIG_SHAPE_MISMATCH",
34
+ "category": "trait",
35
+ "description": "Config field's default value doesn't match its declared structural shape (array vs scalar, object vs string, missing required, etc.). Fires after the typed-config carriers (`items` / `properties` / `values`) make the declared shape concrete enough to check against."
81
36
  },
82
37
  {
83
- "code": "ORB_E_LITERAL_UNION_DEFAULT_MISMATCH",
84
- "category": "entity",
85
- "description": "Phase F.3: an entity field declares `values: [...]` (literal-union) AND `default: <X>`, but X is not one of the declared values. Error."
38
+ "code": "ORB_T_TYPE_UNKNOWN",
39
+ "category": "trait",
40
+ "description": "A type reference names no declared type, entity or primitive"
86
41
  },
87
42
  {
88
- "code": "ORB_E_DEFAULT_TYPE_MISMATCH",
89
- "category": "entity",
90
- "description": "An entity field's `default` is structurally incompatible with its declared type — a relation field defaulting to a whole row (`seedRow : Note = {}`) instead of an id/absent, a number/boolean default on a string/enum field, etc. Rung-2 prevention: `check_field_def_shape` (`config_type.rs`) owns the one shape-vs-type check, reused here for entity defaults. Skips the string-vs-enum-membership case, which `LiteralUnionDefaultMismatch` already reports."
43
+ "code": "ORB_T_TYPE_CYCLE",
44
+ "category": "trait",
45
+ "description": "A type composition chain refers back to itself"
91
46
  },
92
47
  {
93
- "code": "ORB_T_UNDEFINED_TRAIT",
48
+ "code": "ORB_T_TYPE_KIND_MISMATCH",
94
49
  "category": "trait",
95
- "description": "Trait reference not found"
50
+ "description": "Composed types do not share a kind (all Entity, all Trait, …)"
96
51
  },
97
52
  {
98
- "code": "ORB_T_INVALID_FORMAT",
53
+ "code": "ORB_T_TYPE_COMPOSITION_CONFLICT",
99
54
  "category": "trait",
100
- "description": "Trait has invalid format"
55
+ "description": "A field is declared in more than one composed entity"
101
56
  },
102
57
  {
103
- "code": "ORB_T_NO_INITIAL_STATE",
58
+ "code": "ORB_T_TYPE_ANNOTATION_MISMATCH",
104
59
  "category": "trait",
105
- "description": "State machine has no initial state"
60
+ "description": "A type body does not match its `::` type annotation"
106
61
  },
107
62
  {
108
- "code": "ORB_T_MULTIPLE_INITIAL_STATES",
63
+ "code": "ORB_T_TYPE_UNKNOWN_PARAM",
109
64
  "category": "trait",
110
- "description": "State machine has multiple initial states"
65
+ "description": "A type alias body uses a type parameter the alias does not declare"
111
66
  },
112
67
  {
113
- "code": "ORB_T_DUPLICATE_STATE",
68
+ "code": "ORB_T_TYPE_WRONG_ARG_COUNT",
114
69
  "category": "trait",
115
- "description": "Duplicate state name in state machine"
70
+ "description": "A type alias is applied with the wrong number of type arguments"
116
71
  },
117
72
  {
118
- "code": "ORB_T_EMPTY_EVENT_NAME",
73
+ "code": "ORB_T_EVENT_TYPE_WRONG_KIND",
119
74
  "category": "trait",
120
- "description": "An event declared, emitted or transitioned on has an empty name"
75
+ "description": "An `emits` entry names a declared type that is not an Event type"
121
76
  },
122
77
  {
123
- "code": "ORB_T_INVALID_TRANSITION",
124
- "category": "trait",
125
- "description": "Transition references non-existent state"
78
+ "code": "ORB_P_UNKNOWN_PROTOCOL",
79
+ "category": "page",
80
+ "description": "A page names a protocol that is no row of the protocol table"
126
81
  },
127
82
  {
128
- "code": "ORB_T_DUPLICATE_TRANSITION",
129
- "category": "trait",
130
- "description": "Duplicate transition (same from/event without guard)"
83
+ "code": "ORB_P_ENDPOINT_GRANT_MISSING",
84
+ "category": "page",
85
+ "description": "An `http` endpoint has no covering `net` listen grant"
131
86
  },
132
87
  {
133
- "code": "ORB_T_MISSING_INIT_TRANSITION",
134
- "category": "trait",
135
- "description": "Missing INIT transition on initial state"
88
+ "code": "ORB_P_ADDRESS_INVALID",
89
+ "category": "page",
90
+ "description": "A protocol page's address does not type-check against the protocol's address record"
136
91
  },
137
92
  {
138
- "code": "ORB_T_STATE_UNREACHABLE",
139
- "category": "trait",
140
- "description": "A declared state is unreachable from the trait's initial state via any transition path. BFS from the initial state over `transitions` (skipping `from == \"*\"` wildcards and the boot `INIT` self-loop on the initial state) never reaches it — dead topology. Surfaces only as a generic \"uncovered\" in the verifier today; caught here at author time. Worked example: std-booking-system ScheduleDisplay's `displaying`/`refreshing` cluster."
93
+ "code": "ORB_RUI_INVALID_ROW_ROUTE",
94
+ "category": "render_ui",
95
+ "description": "A data-grid/data-list row action `navigatesTo` is neither a literal path nor a quoted single-row lambda."
141
96
  },
142
97
  {
143
- "code": "ORB_T_INIT_MISSING_FETCH",
144
- "category": "trait",
145
- "description": "INIT transition missing fetch effect for linked entity"
98
+ "code": "ORB_RUI_UNKNOWN_ITEM_ACTION_PROP",
99
+ "category": "render_ui",
100
+ "description": "Unknown itemAction prop (e.g., hallucinated 'condition')"
146
101
  },
147
102
  {
148
- "code": "ORB_T_MISSING_RENDER_UI",
149
- "category": "trait",
150
- "description": "Interaction trait missing render_ui effects"
103
+ "code": "ORB_RUI_BINDING_TYPE_MISMATCH",
104
+ "category": "render_ui",
105
+ "description": "L2.1 keystone: render-ui prop bound to a `@payload.X` / `@entity.X` / `@config.X` / SExpression operator whose resolved type doesn't match any of the prop's declared `types` in the patterns registry. Distinct from `RenderUIPropTypeMismatch` (literal-only); this rule uses the F3 binding resolver to walk through bindings and SExpression operator return types (sharpened by F2's `returnSemantics` for input-dependent operators). Gap #6 in `docs/Almadar_Std_Verification.md`."
151
106
  },
152
107
  {
153
- "code": "ORB_T_ENDPOINT_TRAIT_RENDERS",
154
- "category": "trait",
155
- "description": "A trait mounted only on protocol endpoints renders"
108
+ "code": "ORB_RUI_EVENT_BINDING_PAYLOAD_MISMATCH",
109
+ "category": "render_ui",
110
+ "description": "L2.2: render-ui prop with `kind: \"event-ref\"` or `kind: \"callback\"` bound to an event-name string whose declared payload schema in the trait's `emits {}` block doesn't match the component's documented bus emit shape (registry's `emitPayloadSchema` for event-ref props; `callbackArgs` for callback props). Gap #32 in `docs/Almadar_Std_Verification.md`."
156
111
  },
157
112
  {
158
- "code": "ORB_T_TRAIT_ON_ROUTE_AND_ENDPOINT",
159
- "category": "trait",
160
- "description": "One trait is listed on both a route page and a protocol endpoint"
113
+ "code": "ORB_CANCEL_CALL_NO_KEYED_CALL",
114
+ "category": "effect",
115
+ "description": "the app runs `cancel-call` but no `call-service` anywhere carries a `key`"
161
116
  },
162
117
  {
163
- "code": "ORB_T_TRAIT_UNMOUNTED",
164
- "category": "trait",
165
- "description": "A program trait is listed on no page"
118
+ "code": "ORB_CANCEL_CALL_KEY_NEVER_CALLED",
119
+ "category": "effect",
120
+ "description": "`--final`: a `cancel-call` on a `CallKey` (or a list of them) in a finished program where no keyed call has a `CallKey`-typed `key:`, so nothing the program runs is named by a key made with `as`"
166
121
  },
167
122
  {
168
- "code": "ORB_T_DEPRECATED_UI",
169
- "category": "trait",
170
- "description": "Deprecated ui property used"
123
+ "code": "ORB_PAGE_FACTS_UNREQUESTED_READ",
124
+ "category": "effect",
125
+ "description": "an event reads a page fact the `browser/page-facts` call did not request"
171
126
  },
172
127
  {
173
- "code": "ORB_T_DUPLICATE_NAME",
174
- "category": "trait",
175
- "description": "Duplicate trait name across orbitals"
128
+ "code": "ORB_TAB_REQUEST_REFUSED",
129
+ "category": "effect",
130
+ "description": "a literal `browser/tab-*` request whose keys the op declares but whose values the kernel's tab-call parser refuses"
176
131
  },
177
132
  {
178
- "code": "ORB_T_UNDEFINED_EVENT",
179
- "category": "trait",
180
- "description": "Event not defined but used in transition"
133
+ "code": "ORB_X_DISPATCH_MIXED_RESIDENCE",
134
+ "category": "effect",
135
+ "description": "one dispatch's delegated effects reach browser-stored rows and server work"
181
136
  },
182
137
  {
183
- "code": "ORB_T_BEHAVIOR_REF_UNRESOLVED",
184
- "category": "trait",
185
- "description": "A trait-value literal (`<spec>.traits.<Trait>`) whose behavior or trait does not resolve against the installed behavior packages."
138
+ "code": "ORB_EFF_SLOT_CONFLICT",
139
+ "category": "effect",
140
+ "description": "Multiple render_ui effects targeting same slot"
186
141
  },
187
142
  {
188
- "code": "ORB_T_BEHAVIOR_REF_NOT_LITERAL",
189
- "category": "trait",
190
- "description": "A `behavior/ref` whose argument is computed at run time: a behavior from data must arrive as a `behavior` value, never re-parsed from text."
143
+ "code": "ORB_EFF_NOTIFY_RETIRED",
144
+ "category": "effect",
145
+ "description": "`notify` is sugar for `render-ui toast { type: alert, … }`, desugared at `.lolo` lowering (owner ruling 2026-09-11) — the `.orb` IR never carries a `notify` effect kind. A `notify` tuple reaching L2 means a hand-authored `.orb` or a registry not yet re-emitted."
191
146
  },
192
147
  {
193
- "code": "ORB_T_UNQUOTE_OUTSIDE_QUASIQUOTE",
194
- "category": "trait",
195
- "description": "An `[\"unquote\", …]` call outside a quasiquote body in an `.orb` input."
148
+ "code": "ORB_EMIT_DECLARED_BUT_UNFIRED",
149
+ "category": "effect",
150
+ "description": "Trait declares an event in its `emits[]` block but no transition fires it via `(emit X)` or operator emit-config success/failure. Usually a copy-paste leftover or a stale declaration after a rename; gap #2 defense in `docs/Almadar_Std_Verification.md`."
196
151
  },
197
152
  {
198
- "code": "ORB_T_INVALID_SLOT_DEFAULT",
199
- "category": "trait",
200
- "description": "Config field typed `slot` has a default value not in `VALID_SLOTS`"
153
+ "code": "ORB_EFF_MISSING_REQUIRED_EMIT",
154
+ "category": "effect",
155
+ "description": "Operator declares `requiresEmitSuccess: true` in canonical-operators.json but the effect call site is missing the trailing options object or its `emit.success` event key. Applies to fetch / persist / call-service by default; any future operator can opt in via the same JSON flag."
201
156
  },
202
157
  {
203
- "code": "ORB_T_INVALID_PATTERN_DEFAULT",
204
- "category": "trait",
205
- "description": "Config field typed `pattern` has a default value not in `PATTERN_TYPES`"
158
+ "code": "SEXPR_ARITY_MISMATCH",
159
+ "category": "sexpr",
160
+ "description": "Wrong number of arguments for operator"
206
161
  },
207
162
  {
208
- "code": "ORB_T_SECRET_DEFAULT_NOT_STRING",
209
- "category": "trait",
210
- "description": "Config field typed `secret` has a non-string default — the value is a credential REFERENCE (env-var key name), never secret material (I-29)"
163
+ "code": "SEXPR_LAMBDA_ARG_POSITION",
164
+ "category": "sexpr",
165
+ "description": "A `(fn …)` form in an argument position the operator does not take its lambda in — decidable wrong argument order, e.g. `(array/reduce arr (fn …) init)`"
211
166
  },
212
167
  {
213
- "code": "ORB_T_INVALID_EVENT_DEFAULT",
214
- "category": "trait",
215
- "description": "Config field typed `event` holds a value that is not a member of the trait's post-rename event set (SCAN-EVENT-KNOB-1). Definer-position knobs (A-UNIFY) skip this membership check — their value CREATES the event name — but still land here if the default isn't a plain string."
168
+ "code": "SEXPR_EFFECT_IN_GUARD",
169
+ "category": "sexpr",
170
+ "description": "Effect operator used in guard context"
216
171
  },
217
172
  {
218
- "code": "ORB_T_EVENT_REF_UNRESOLVED",
219
- "category": "trait",
220
- "description": "An event-typed config value addresses a trait the program does not have."
173
+ "code": "ORB_X_UNRESOLVED_PATTERN_FIELD_REF",
174
+ "category": "cross",
175
+ "description": "A pattern prop tagged `kind: 'field-ref'` (scalar) or `itemKind: 'field-ref'` (array element) carries a value that does not resolve to any field on the linked entity. Error severity. See Phase 3.2/3.3 in docs/Almadar_Agent_Behaviors_Plan.md."
221
176
  },
222
177
  {
223
- "code": "ORB_T_EVENT_REF_NOT_EXTERNAL_INPUT",
224
- "category": "trait",
225
- "description": "An event-typed config value addresses an event its trait does not declare as an external input."
178
+ "code": "ORB_CONFIG_FIELD_REF_UNKNOWN",
179
+ "category": "binding",
180
+ "description": "A `field @entity` config knob names something that is not a field of the trait's bound entity"
226
181
  },
227
182
  {
228
- "code": "ORB_T_EXTERNAL_INPUT_NOT_RESTING",
229
- "category": "trait",
230
- "description": "A declared external input (`listens { EVENT -> external { … } }`) has no transition from the trait's initial state: inputs are complete commands."
183
+ "code": "ORB_CONFIG_FIELD_REF_TYPE_MISMATCH",
184
+ "category": "binding",
185
+ "description": "A `field @entity T` config knob names a field whose type is not `T`"
231
186
  },
232
187
  {
233
- "code": "ORB_T_CONFIG_SHAPE_MISMATCH",
234
- "category": "trait",
235
- "description": "Config field's default value doesn't match its declared structural shape (array vs scalar, object vs string, missing required, etc.). Fires after the typed-config carriers (`items` / `properties` / `values`) make the declared shape concrete enough to check against."
188
+ "code": "ORB_BINDING_INVALID_PATH",
189
+ "category": "binding",
190
+ "description": "Invalid binding path"
236
191
  },
237
192
  {
238
- "code": "ORB_T_CONFIG_OBJECT_ARRAY_FORBIDDEN",
239
- "category": "trait",
240
- "description": "Config field uses `[object]` as its declared type. Banned because it lowers to an untyped `Array { inner: Json }` — the same shape the strict-lint floor catches as `Record<string, FieldValue | undefined>[]`. Authors should declare a named struct alias (e.g. `type FieldConfig = { name: string, label: string, ... }`) and use `[FieldConfig]` so the catalog + codegen carry real types."
193
+ "code": "ORB_X_SET_VALUE_TYPE_MISMATCH",
194
+ "category": "effect",
195
+ "description": "`(set @entity.X ?payloadField)` writes a payload field whose declared type does not match the target entity field's declared type. The lolo crate catches this at author time for `.lolo`; this is the raw-`.orb` defense-in-depth backstop. Payload field types are sourced from the trait's `emits[].payload_schema` and `listens` payload metadata."
241
196
  },
242
197
  {
243
- "code": "ORB_T_GENERIC_TYPE_DEPRECATED",
244
- "category": "trait",
245
- "description": "A declaration uses a generic type — bare `json`, `object` (without declared `properties`), or `any` — in an entity field, config knob, type-alias member, or event payload field. Generic types are being eliminated from the language: renderable content belongs in `node`, structured data in inline `{ k: T }` shapes / named aliases / `Map K V`, and genuinely polymorphic atoms in declared type parameters. Hard error since 2026-09-01 (both behavior packages report zero occurrences)."
198
+ "code": "ORB_X_SET_RETURN_TYPE_MISMATCH",
199
+ "category": "effect",
200
+ "description": "`(set @entity.X (op …))` assigns an operator/expression value whose inferred result type is incompatible with the target field's declared type (e.g. `(set @entity.count (str/concat …))` into a `number` field). The value's type is inferred *through* the S-expression via the canonical operator `return_semantics` lattice; an unknowable result (`Json`) never rejects (Gap G-LOLO-SET-OP-RETURN)."
246
201
  },
247
202
  {
248
- "code": "ORB_T_TYPE_UNKNOWN",
249
- "category": "trait",
250
- "description": "A type reference names no declared type, entity or primitive"
203
+ "code": "ORB_X_COMPARISON_OPERAND_TYPE_MISMATCH",
204
+ "category": "effect",
205
+ "description": "An ordering comparison (`<`, `<=`, `>`, `>=`) whose operands infer to a number on one side and a string on the other. The JS runtime coerces, the compiled TypeScript does not typecheck, and Rust compares kinds — the paths disagree. Convert one side so both are the same kind."
251
206
  },
252
207
  {
253
- "code": "ORB_T_TYPE_CYCLE",
254
- "category": "trait",
255
- "description": "A type composition chain refers back to itself"
208
+ "code": "ORB_X_OPERATOR_ARG_TYPE_MISMATCH",
209
+ "category": "effect",
210
+ "description": "An operator argument whose static type contradicts the type the operator table declares for its position — `(str/upper @entity.count)` with `count: number`, `(+ \"a\" 1)`. Both evaluators raise the same typed mismatch at run time (D-12), so the program can never do what it says."
256
211
  },
257
212
  {
258
- "code": "ORB_T_TYPE_KIND_MISMATCH",
259
- "category": "trait",
260
- "description": "Composed types do not share a kind (all Entity, all Trait, …)"
213
+ "code": "ORB_OBJECT_PATH_UNDECLARED",
214
+ "category": "effect",
215
+ "description": "A literal path read through `object/get` (or another `key-of` operator) names a segment its first argument's declared type does not have: an empty segment, a record field the record does not declare, a non-numeric segment on a list or tuple, or a segment past a scalar. A Map takes any non-empty key segment. The read could only ever answer null or its default; a default does not excuse it. To read a key that contains a dot, escape the dot (`a\\.b`) or read the map with `object/pick`."
261
216
  },
262
217
  {
263
- "code": "ORB_T_TYPE_COMPOSITION_CONFLICT",
264
- "category": "trait",
265
- "description": "A field is declared in more than one composed entity"
218
+ "code": "ORB_X_OPERATOR_ARG_UNDETERMINED",
219
+ "category": "effect",
220
+ "description": "A value handed to an operator has no determined type — an unresolved expression, an expression value, json, a loose union, a list whose items share no type — so it cannot be checked against the type the operator declares (or, at a type variable, what the variable stands for and the type of the result are unknown). Narrow it with `(as value T)` (checked, null on a misfit), or give it a real type (a declared payload or entity shape, a named union alias for a list of differently-shaped items)."
266
221
  },
267
222
  {
268
- "code": "ORB_T_TYPE_ANNOTATION_MISMATCH",
269
- "category": "trait",
270
- "description": "A type body does not match its `::` type annotation"
223
+ "code": "ORB_X_ORDERING_OPTIONAL_OPERAND",
224
+ "category": "effect",
225
+ "description": "An ordering comparison (`<`, `<=`, `>`, `>=`) over an operand that can be missing or null — an optional entity field with no default, an optional payload field — that the program neither guards with a presence check (`(and (validate/required x) (< x 3))`, an `if`/`when` on presence) nor declares a default for. Both evaluators read a missing value as below any number; every push-down store fails the comparison, so the meaning is the program's to state."
271
226
  },
272
227
  {
273
- "code": "ORB_T_TYPE_UNKNOWN_PARAM",
274
- "category": "trait",
275
- "description": "A type alias body uses a type parameter the alias does not declare"
228
+ "code": "ORB_X_OPERATOR_NULL_OPERAND",
229
+ "category": "effect",
230
+ "description": "An operand that can be missing or null — an optional entity field with no default, an optional payload field — handed to a position the kernel raises on when it is null (`rejectsNull` in the operator table), with no presence check or default in front of it. The program says what a missing value means: a guard, a default, or a required field."
276
231
  },
277
232
  {
278
- "code": "ORB_T_TYPE_WRONG_ARG_COUNT",
279
- "category": "trait",
280
- "description": "A type alias is applied with the wrong number of type arguments"
233
+ "code": "ORB_X_OPERATOR_OPTION_NEWER",
234
+ "category": "effect",
235
+ "description": "A call states an operator option that the installed operator table introduces in an orb release newer than the one running (`optionSince`), so this orb would refuse or ignore it at the host. Upgrade orb, or drop the option."
281
236
  },
282
237
  {
283
- "code": "ORB_T_EVENT_TYPE_WRONG_KIND",
284
- "category": "trait",
285
- "description": "An `emits` entry names a declared type that is not an Event type"
238
+ "code": "ORB_X_SET_REQUIRED_FIELD_FROM_OPTIONAL_KNOB",
239
+ "category": "effect",
240
+ "description": "`(set @entity.X @config.<knob>)` where the value is STILL the literal `@config.<knob>` token post-inline (no default resolved it, no call-site override supplied one) and `X` is a REQUIRED entity field. The emitter has nothing honest to assign — a required TS slot gets `undefined`. Give the knob a default or make the field optional."
286
241
  },
287
242
  {
288
- "code": "ORB_RUI_NODE_FIELD_UNCHECKED_CONTENT",
289
- "category": "trait",
290
- "description": "A `node`-typed entity field receives a value the validator cannot statically check (a computed expression rather than a pattern-tree literal). Non-blocking: computed renderable content is legitimate, but its callback wiring is unchecked — prefer literal fragments (optionally via `let` bindings, which ARE resolved and checked)."
243
+ "code": "ORB_EMIT_PAYLOAD_MISSING_REQUIRED",
244
+ "category": "binding",
245
+ "description": "`(emit EVT {...})` literal payload is missing a field the event's declared payload marks as required. Error severity."
291
246
  },
292
247
  {
293
- "code": "ORB_RUI_RENDERABLE_IN_GENERIC_FIELD",
294
- "category": "trait",
295
- "description": "A render-ui pattern literal is assigned to a field NOT typed `node` — renderable content hiding in a generic/structured field escapes every render-ui check. Type the field `node` (or `[node]`). Error severity."
248
+ "code": "ORB_EMIT_PAYLOAD_EXTRA_FIELD",
249
+ "category": "binding",
250
+ "description": "`(emit EVT {...})` literal carries a field that is not declared on the event's payload schema. Error severity."
296
251
  },
297
252
  {
298
- "code": "ORB_T_CONFIG_TIER_INVALID",
299
- "category": "trait",
300
- "description": "Config field's `@tier \"...\"` annotation uses a value outside the allowed set. Allowed values: `essential`, `customization`, `advanced`, `internal`. Defense-in-depth — the parser allowlists the four values today; this L2 rule catches future regressions and any malformed `.orb` IR that bypasses the parser."
253
+ "code": "ORB_EMIT_PAYLOAD_FIELD_TYPE_MISMATCH",
254
+ "category": "binding",
255
+ "description": "`(emit EVT {...})` literal provides a value whose primitive type does not match the declared `PayloadField.field_type`. Error severity."
301
256
  },
302
257
  {
303
- "code": "ORB_T_ENTITY_NOT_REBINDABLE",
304
- "category": "trait",
305
- "description": "A trait imported from an atom carries a `linkedEntity` rebind, but the atom's binding is not marked `@rebindable`. The binding is fixed and the consumer may not redirect it. See `@rebindable` in `.lolo`."
258
+ "code": "ORB_EMIT_REPEATS_IDENTICALLY",
259
+ "category": "binding",
260
+ "description": "An `emit` repeats an earlier one of the same transition identically: the dispatch loop collapses the second."
306
261
  },
307
262
  {
308
- "code": "ORB_T_REBIND_MISSING_FIELDS",
309
- "category": "trait",
310
- "description": "A `@rebindable` rebind points at an entity that lacks fields the trait reads (its inferred `entityContract.requires`). The target would break the behavior."
263
+ "code": "ORB_X_ENTITY_PROP_CONTRACT",
264
+ "category": "render_ui",
265
+ "description": "A render-ui pattern prop typed `EntityWith<K>` declares required entity fields (`requiredFields` in the registry), but the bound entity does not provide them and no remap/field-map supplies them. The component would render blank rows. Remap-aware (runs post-inline). Error severity."
311
266
  },
312
267
  {
313
- "code": "ORB_T_REBIND_TARGET_UNRESOLVED",
314
- "category": "trait",
315
- "description": "A `linkedEntity` rebind names something that is not any orbital's primary or auxiliary entity anywhere in the schema — the §52 rebind-merge (`phases::inline::entity::merge_into_named_entity`) has nowhere to land the imported trait's fields. Retired 2026-09-19: this used to fall back to the caller's primary entity silently; it is now a hard error instead of a wrong-entity merge."
268
+ "code": "ORB_EMIT_PAYLOAD_NOT_PRODUCED",
269
+ "category": "binding",
270
+ "description": "**The payload invariant.** An event's declared payload type IS its access path: declaring `Survey` means the payload is the row (read `?name`); declaring `{ row : Survey }` means read `?row.name`. This fires when an event declares a field that the effect firing it does not actually emit — so every read of that field is `undefined` at runtime, even though `orb validate` and `orb verify` otherwise pass. Checked as width subtyping (`declared ⊆ produced`): declaring FEWER fields than are emitted is legal, declaring one that is never emitted is not. Replaces the narrower `EmitSuccessPayloadWrapped` (persist-only) and `EmitSuccessPayloadReturnMismatch` (empty-payload-only) checks. Error severity."
316
271
  },
317
272
  {
318
- "code": "ORB_T_UNRESOLVED_TYPE_PARAM",
319
- "category": "trait",
320
- "description": "A `.lolo` event alias's `(E : Entity)` type parameter — lowered to the `\"$E\"` payload sentinel by `orbital-lolo` (increment 3-I, `docs/Almadar_LOLO.md` ~line 315/1387) — survived the inline phase's substitution pass because the trait carrying the sentinel has no `linkedEntity` to monomorphize it against. Fix: bind the trait to an entity (or, once explicit application ships, apply the alias with a concrete argument)."
273
+ "code": "ORB_EFFECT_IN_LAMBDA",
274
+ "category": "binding",
275
+ "description": "An effect (`emit`, `persist`, `set`, `notify`, …) inside the `fn` body of a collection operator: a lambda is evaluated for its value, an effect there never runs. Error severity."
321
276
  },
322
277
  {
323
- "code": "ORB_T_EVENT_RENAME_UNKNOWN_KEY",
324
- "category": "trait",
325
- "description": "A call-site `events: { OLD: NEW }` rename names an OLD source key that does not exist in the imported trait's event set (its `emits[].event` ∪ `state_machine.transitions[].event`). The rename silently no-ops: nothing is renamed and the author's intent is lost. Surfaced from the inline phase where the imported trait's pre-rename event set is still visible."
278
+ "code": "CIRCUIT_DEAD_END_COMPONENT",
279
+ "category": "circuit",
280
+ "description": "Interactive component missing itemActions"
326
281
  },
327
282
  {
328
- "code": "ORB_T_CONFIG_UNKNOWN_CALL_SITE_KEY",
329
- "category": "trait",
330
- "description": "A trait Reference's call-site `config` block supplies a key that matches no declared config knob on the referenced trait — the override silently no-ops (e.g. a stale `entity=` left over from a generator regression, or a knob the atom never declared)."
283
+ "code": "ORB_GEN_INVALID_REFERENCE",
284
+ "category": "generic",
285
+ "description": "Generic invalid reference format"
331
286
  },
332
287
  {
333
- "code": "ORB_T_CONFIG_MISSING_REQUIRED_KEY",
334
- "category": "trait",
335
- "description": "A trait Reference's call site omits a key for a knob the referenced trait declares `!` (required). Any value form (literal, `@config.X` forward, `@entity.*`, payload ref) satisfies the requirement — only a fully missing key fires. The atom's own page binding is exempt."
288
+ "code": "ORB_GEN_MISSING_FIELD",
289
+ "category": "generic",
290
+ "description": "Generic missing required field"
336
291
  },
337
292
  {
338
- "code": "ORB_T_LOCAL_TRAIT_TOUCHES_SERVER",
339
- "category": "trait",
340
- "description": "A `[client]` trait's transitions contain a server-bound effect (`fetch`/`persist`/`call-service`/`ref`/`deref`/`swap`/`watch`/ `atomic`/`fetch-stream`), or a guard reading `@user.*`. `[client]` declares client-only dispatch (`OirTrait::dispatch_mode`) — a trait that actually touches the server or reads viewer identity is mis-tagged; its transitions would never await the round trip they depend on. Wave 2. Error severity."
293
+ "code": "ORB_GEN_DUPLICATE",
294
+ "category": "generic",
295
+ "description": "Generic duplicate entity/item"
341
296
  },
342
297
  {
343
- "code": "ORB_T_CLIENT_TICK_SERVER_EFFECT",
344
- "category": "trait",
345
- "description": "A tick that runs in the browser (its trait is not server-awaited; the tick is not `[background]`) carries a server effect — a server-owned data effect, or a `runsOn: server` operator. Nothing replays a tick on the server, so the effect would be dropped. Server work goes through an emitted event a server-side trait handles."
298
+ "code": "CIRCUIT_ACTION_COMPONENT_MISMATCH",
299
+ "category": "circuit",
300
+ "description": "An item action is used on a component type that does not support that action"
346
301
  },
347
302
  {
348
- "code": "ORB_T_LOCAL_ON_NON_SHARED_PERSISTENT",
349
- "category": "trait",
350
- "description": "`[client]` on a trait whose linked entity is neither `[shared]` nor `[runtime]`. `[client]` is only legal on an entity multiple traits co-mutate client-side (`[shared]`) or one that is never persisted at all (`[runtime]`) — on an ordinary persistent entity it would silently hide server-gated writes behind client-only dispatch. Wave 2. Error severity."
303
+ "code": "CIRCUIT_DEAD_END_STATE",
304
+ "category": "circuit",
305
+ "description": "A state has no outgoing transitions, so it is a dead end"
351
306
  },
352
307
  {
353
- "code": "ORB_AUTH_GUARD_CLIENT_ONLY",
354
- "category": "dispatch",
355
- "description": "A transition guard reads `@user.*` while the trait's `OirTrait::dispatch_mode()` is `RuntimeOptimistic` or `HybridClientOnly` — evaluated client-side only. An identity check that never reaches the server is not an authorization boundary: the client can construct any `@user` value it likes. Wave 2. Warning severity (the guard may still be a legitimate UX precondition; it is never a security boundary)."
308
+ "code": "CIRCUIT_DEAD_HANDLER",
309
+ "category": "circuit",
310
+ "description": "An item action fires an event into a state where no transition handles that event"
356
311
  },
357
312
  {
358
- "code": "ORB_P_MISSING_NAME",
359
- "category": "page",
360
- "description": "Page is missing a name"
313
+ "code": "CIRCUIT_DUPLICATE_EVENT",
314
+ "category": "circuit",
315
+ "description": "The same event is emitted by more than one action within a single render-ui effect"
361
316
  },
362
317
  {
363
- "code": "ORB_P_MISSING_PATH",
364
- "category": "page",
365
- "description": "Page is missing a path"
318
+ "code": "CIRCUIT_MODAL_EXIT_INCOMPLETE",
319
+ "category": "circuit",
320
+ "description": "A transition leaving a modal state does not close the modal overlay it opened"
366
321
  },
367
322
  {
368
- "code": "ORB_P_INVALID_PATH",
369
- "category": "page",
370
- "description": "Page path is invalid (must start with /)"
323
+ "code": "CIRCUIT_NO_OVERLAY_EXIT",
324
+ "category": "circuit",
325
+ "description": "A state renders into an overlay slot but has no exit transition, leaving users stuck"
371
326
  },
372
327
  {
373
- "code": "ORB_P_DUPLICATE_PATH",
374
- "category": "page",
375
- "description": "Duplicate page path"
328
+ "code": "CIRCUIT_ORPHAN_EVENT",
329
+ "category": "circuit",
330
+ "description": "An action or emit raises an event that has no transition handler"
376
331
  },
377
332
  {
378
- "code": "ORB_P_INDEX_REQUIRES_PUBLIC",
379
- "category": "page",
380
- "description": "`indexing: index` without `access: public`, a title, a description or an app `origin`"
333
+ "code": "CIRCUIT_UNREACHABLE_STATE",
334
+ "category": "circuit",
335
+ "description": "A state has no incoming transitions and cannot be reached"
381
336
  },
382
337
  {
383
- "code": "ORB_P_INDEX_PARAM_ROUTE",
384
- "category": "page",
385
- "description": "`indexing: index` on a `:param` route (concrete URL inputs are not declarable yet)"
338
+ "code": "LINT_NODE_UNCHECKED",
339
+ "category": "lint",
340
+ "description": "A lint rule met a schema node of an unexpected shape and could not check it"
386
341
  },
387
342
  {
388
- "code": "ORB_P_AUTH_NO_SIGN_IN",
389
- "category": "page",
390
- "description": "`access: authenticated` page in an app that declares no `signIn` route"
343
+ "code": "ORB_A11Y_UNNAMED",
344
+ "category": "a11y",
345
+ "description": "A render-ui control has no accessible name, so screen readers announce it as unlabeled"
391
346
  },
392
347
  {
393
- "code": "ORB_P_SIGN_IN_UNKNOWN_ROUTE",
394
- "category": "page",
395
- "description": "The app's `signIn` route is no page, or is itself `access: authenticated`"
348
+ "code": "ORB_ASSET_INLINE_URL",
349
+ "category": "asset",
350
+ "description": "A literal http(s) url sits in the config defaults or seed rows of an orbital that composes std-asset-pack."
396
351
  },
397
352
  {
398
- "code": "ORB_P_HOST_RESERVED_ROUTE",
399
- "category": "page",
400
- "description": "A page is declared on the host's own sign-in route (`/login`)"
353
+ "code": "ORB_AUTH_GUARD_CLIENT_ONLY",
354
+ "category": "auth",
355
+ "description": "A transition guards on @user but its trait dispatches client-only, so the UI transition advances before the server evaluates the guard"
401
356
  },
402
357
  {
403
- "code": "ORB_P_UNKNOWN_PROTOCOL",
404
- "category": "page",
405
- "description": "A page names a protocol that is no row of the protocol table"
358
+ "code": "ORB_BEACON_OPTION_UNKNOWN",
359
+ "category": "beacon",
360
+ "description": "A browser beacon request carries an option key that is not a known beacon request key"
406
361
  },
407
362
  {
408
- "code": "ORB_P_ENDPOINT_GRANT_MISSING",
409
- "category": "page",
410
- "description": "An `http` endpoint has no covering `net` listen grant"
363
+ "code": "ORB_BEACON_TEXT_REQUIRED",
364
+ "category": "browser",
365
+ "description": "browser/beacon needs a request carrying a text field"
411
366
  },
412
367
  {
413
- "code": "ORB_P_ADDRESS_INVALID",
414
- "category": "page",
415
- "description": "A protocol page's address does not type-check against the protocol's address record"
368
+ "code": "ORB_BEACON_URL_NOT_ABSOLUTE",
369
+ "category": "browser",
370
+ "description": "A browser beacon effect targets a URL that is not an absolute http(s) URL"
416
371
  },
417
372
  {
418
- "code": "ORB_P_TRANSLATION_DUPLICATE_LOCALE",
419
- "category": "page",
420
- "description": "One locale holds two pages of the same `translationOf` group"
373
+ "code": "ORB_BINDING_DISPATCH_ROOT_IN_TICK",
374
+ "category": "binding",
375
+ "description": "A dispatch-only binding root is read inside a tick, where a firing has no delivery"
421
376
  },
422
377
  {
423
- "code": "ORB_P_MISSING_TRAITS",
424
- "category": "page",
425
- "description": "Page is missing traits array"
378
+ "code": "ORB_BINDING_EMBED_READS_ARM_WRITE",
379
+ "category": "binding",
380
+ "description": "A transition writes a value and renders a child that reads it on mount, so the child shows the stale value"
426
381
  },
427
382
  {
428
- "code": "ORB_P_EMPTY_TRAITS",
429
- "category": "page",
430
- "description": "Page traits array is empty"
383
+ "code": "ORB_BINDING_ENTITY_FIELD_NEVER_SET",
384
+ "category": "binding",
385
+ "description": "A trait reads an entity binding field but no transition ever sets it, so it stays undefined"
431
386
  },
432
387
  {
433
- "code": "ORB_O_DUPLICATE_NAME",
434
- "category": "page",
435
- "description": "Two orbitals of one program share a name"
388
+ "code": "ORB_BINDING_ENTITY_FIELD_NOT_FOUND",
389
+ "category": "binding",
390
+ "description": "An @entity binding names a field that the linked entity does not declare"
436
391
  },
437
392
  {
438
- "code": "ORB_O_CONFIG_UNKNOWN_KEY",
439
- "category": "page",
440
- "description": "An `orbital X = Alias.orbitals.Y { config { … } } }` call-site override names a key the upstream orbital's declared `config {}` does not have (`Almadar_Orbital_Import.md` §4.5)."
393
+ "code": "ORB_BINDING_EVENT_INVALID_PATH",
394
+ "category": "binding",
395
+ "description": "An @event binding path does not follow the shape of the delivery record"
441
396
  },
442
397
  {
443
- "code": "ORB_O_OMIT_EMBEDDED_TRAIT",
444
- "category": "page",
445
- "description": "An `orbital X = Alias.orbitals.Y { omit { … } } }` call site drops a trait that a surviving trait still embeds via `@trait.<X>` — the embed token has nothing left to render."
398
+ "code": "ORB_BINDING_FROM_ENTITY_OUTSIDE_ENSURES",
399
+ "category": "binding",
400
+ "description": "@fromEntity is the row before a transition and may only be used inside an @ensures"
446
401
  },
447
402
  {
448
- "code": "ORB_O_CONFIG_DEAD_KNOB",
449
- "category": "page",
450
- "description": "A declared `Orbital.config` or `OrbitalSchema.config` knob (`Almadar_Orbital_Import.md` §4.5) that no trait in the schema forwards (`config[*].default == \"@config.<knob>\"`) — dead: nothing publishes it, so no call site can ever reach it."
403
+ "code": "ORB_BINDING_INVALID_FORMAT",
404
+ "category": "binding",
405
+ "description": "A binding string is not in a valid binding format"
451
406
  },
452
407
  {
453
- "code": "ORB_O_ROLE_TARGET_NOT_MEMBER",
454
- "category": "page",
455
- "description": "An `orbital X = Alias.orbitals.Y { roles { … } } }` target is not a member of the CONSUMER roster's vocabulary (`identity_entities` on the importing schema, post-inline)."
408
+ "code": "ORB_BINDING_NOW_NO_PATH",
409
+ "category": "binding",
410
+ "description": "The @now binding is given a path, but it returns the current timestamp directly"
456
411
  },
457
412
  {
458
- "code": "ORB_O_ROLE_UNKNOWN_UPSTREAM",
459
- "category": "page",
460
- "description": "An `orbital X = Alias.orbitals.Y { roles { … } } }` key names no value in any UPSTREAM identity field's vocabulary (or the upstream alias declares no roster at all)."
413
+ "code": "ORB_BINDING_PAYLOAD_FIELD_UNDECLARED",
414
+ "category": "binding",
415
+ "description": "A @payload binding reads a field that the triggering event does not declare in its payload"
461
416
  },
462
417
  {
463
- "code": "ORB_O_ENTITY_UNMAPPED",
464
- "category": "page",
465
- "description": "A kept trait/relation/page references an out-of-orbital entity that `obj.entities {}` never maps — the import splice has nothing to rebind it to."
418
+ "code": "ORB_BINDING_PAYLOAD_IN_TICK",
419
+ "category": "binding",
420
+ "description": "A binding reads @payload inside a tick, where a firing has no delivery"
466
421
  },
467
422
  {
468
- "code": "ORB_O_ENTITY_UNKNOWN_KEY",
469
- "category": "page",
470
- "description": "An `obj.entities {}` key names no entity in the upstream closure's out-of-orbital universe."
423
+ "code": "ORB_BINDING_PERSIST_ROW_ID_NEVER_SET",
424
+ "category": "binding",
425
+ "description": "A persist update or delete runs on an event but no transition sets the row id, so the write never touches a row"
471
426
  },
472
427
  {
473
- "code": "ORB_O_ENTITY_EXPECT_AMBIGUOUS",
474
- "category": "page",
475
- "description": "An entity an imported orbital expects of a sibling is provided by several sibling imports and no `entities {}` entry names which one it binds to."
428
+ "code": "ORB_BINDING_ROOT_NO_PATH",
429
+ "category": "binding",
430
+ "description": "A binding root that takes no path is written with a path"
476
431
  },
477
432
  {
478
- "code": "ORB_O_ENTITY_TARGET_UNKNOWN",
479
- "category": "page",
480
- "description": "An `obj.entities {}` value names no entity the consumer schema declares."
433
+ "code": "ORB_BINDING_SET_TARGET_MISSING_PATH",
434
+ "category": "binding",
435
+ "description": "A set effect targets a binding root without a field path"
481
436
  },
482
437
  {
483
- "code": "ORB_O_PAGE_UNKNOWN_PATH",
484
- "category": "page",
485
- "description": "An `obj.pages {}` / `obj.mounts {}` key names no page path the imported orbital declares."
438
+ "code": "ORB_BINDING_STATE_NO_PATH",
439
+ "category": "binding",
440
+ "description": "A binding root that returns a bare value, such as @state, is given a path"
486
441
  },
487
442
  {
488
- "code": "ORB_O_EXTEND_FIELD_COLLISION",
489
- "category": "page",
490
- "description": "An `orbital X = Alias.orbitals.Y { extend { … } } }` field name is already declared on the upstream primary entity (after `fields {}` renames), or equals a `fields {}` rename TARGET (Stage C)."
443
+ "code": "ORB_BINDING_TRAIT_CYCLE",
444
+ "category": "binding",
445
+ "description": "A cycle exists in @trait references"
491
446
  },
492
447
  {
493
- "code": "ORB_O_EXTEND_FIELD_UNREAD",
494
- "category": "page",
495
- "description": "An `extend { … }` field no kept trait reads/sets/renders and no orbital-level config knob value forwards (Stage C, warning — rung 2)."
448
+ "code": "ORB_BINDING_TRAIT_INVALID_FORMAT",
449
+ "category": "binding",
450
+ "description": "A trait binding or trait-typed config default is not a valid trait reference"
496
451
  },
497
452
  {
498
- "code": "ORB_O_FIELD_RENAME_UNAPPLIED",
499
- "category": "page",
500
- "description": "A `fields { OLD: NEW }` rename on an `orbital X = Alias.orbitals.Y { … }` reference left a structurally-recognized field-reference position (a config default's bare/list field-name value) still naming the pre-rename upstream field — the rename silently failed to reach it (G3, `docs/Almadar_Compiler_Gaps.md` §82, rung 2: what used to validate 0/0 with a dead reference now errors instead)."
453
+ "code": "ORB_BINDING_TRAIT_INVALID_POSITION",
454
+ "category": "binding",
455
+ "description": "A @trait binding appears in a position other than a children array or a node-typed prop"
501
456
  },
502
457
  {
503
- "code": "ORB_O_MOCK_UNKNOWN_FIELD",
504
- "category": "page",
505
- "description": "A `mock { … }` key names no field of the imported primary entity."
458
+ "code": "ORB_BINDING_TRAIT_MISSING_NAME",
459
+ "category": "binding",
460
+ "description": "A @trait binding does not name the trait it refers to"
506
461
  },
507
462
  {
508
- "code": "ORB_O_RETYPE_UNKNOWN_FIELD",
509
- "category": "page",
510
- "description": "A `retype { … }` field the upstream primary entity does not declare (after `fields {}` renames)."
463
+ "code": "ORB_BINDING_TRAIT_OUTSIDE_RENDER_UI",
464
+ "category": "binding",
465
+ "description": "An @trait binding appears outside a render-ui effect, where it is the only place trait references are allowed"
511
466
  },
512
467
  {
513
- "code": "ORB_O_RETYPE_FIELD_CONFLICT",
514
- "category": "page",
515
- "description": "A `retype { … }` field also added by `extend {}`, or retyped twice."
468
+ "code": "ORB_BINDING_TRAIT_SELF_REFERENCE",
469
+ "category": "binding",
470
+ "description": "A trait references itself through a trait binding"
516
471
  },
517
472
  {
518
- "code": "ORB_O_ENTITY_PERSISTENCE_LOCKED",
519
- "category": "page",
520
- "description": "An `entity [persistent: …]` override on an upstream entity whose persistence mode does not allow overrides (the factory-runtime rule)."
473
+ "code": "ORB_BINDING_TRAIT_UNKNOWN",
474
+ "category": "binding",
475
+ "description": "A @trait binding references a trait that is not declared in this orbital"
521
476
  },
522
477
  {
523
- "code": "ORB_O_TRAITS_UNKNOWN_TRAIT",
524
- "category": "page",
525
- "description": "A `traits { T { … } }` key naming no trait of the upstream orbital."
478
+ "code": "ORB_BINDING_UNKNOWN_ENTITY",
479
+ "category": "binding",
480
+ "description": "A binding refers to an entity that is not declared in the program"
526
481
  },
527
482
  {
528
- "code": "ORB_O_TRAITS_OMITTED_TRAIT",
529
- "category": "page",
530
- "description": "A `traits { T { … } }` key naming a trait `omit {}` / `only {}` dropped."
483
+ "code": "ORB_BINDING_UNKNOWN_ROOT",
484
+ "category": "binding",
485
+ "description": "A binding names a root the context does not provide"
531
486
  },
532
487
  {
533
- "code": "ORB_P_SECTIONS_FORBIDDEN",
534
- "category": "page",
535
- "description": "Static sections are forbidden (use render_ui)"
488
+ "code": "ORB_CALL_KEY_UNUSED",
489
+ "category": "effect",
490
+ "description": "A literal (as 'k' CallKey) names a key that no keyed call in the program runs under"
536
491
  },
537
492
  {
538
- "code": "ORB_P_INVALID_TRAIT_REF",
539
- "category": "page",
540
- "description": "Invalid trait reference on page"
493
+ "code": "ORB_CALL_SERVICE_CANCELLED_WITHOUT_KEY",
494
+ "category": "call_service",
495
+ "description": "A call-service declares emit.cancelled but has no key, so nothing can cancel an unkeyed call"
541
496
  },
542
497
  {
543
- "code": "ORB_P_INVALID_VIEW_TYPE",
544
- "category": "page",
545
- "description": "Invalid view type"
498
+ "code": "ORB_CALL_SERVICE_KEY_DUPLICATE",
499
+ "category": "effect",
500
+ "description": "Two call-service effects in one transition use the same key"
546
501
  },
547
502
  {
548
- "code": "ORB_PAGE_UNREACHABLE",
549
- "category": "page",
550
- "description": "A declared inline page is not the target of any `navigate` effect, any literal `href` value, and is not the root page or a parameterized page — nothing in the schema can ever route a viewer to it. Ported from the JS wiring lint's `page-absent-from-nav`, generalised: no navItems-array opt-in gate, and scalar `href` values count (not only object-array entries)."
503
+ "code": "ORB_CALL_SERVICE_KEY_TYPE",
504
+ "category": "call_service",
505
+ "description": "A keyed call-service effect has a key that is not a non-empty string"
551
506
  },
552
507
  {
553
- "code": "ORB_PAGE_SECOND_CONTENT_BODY",
554
- "category": "page",
555
- "description": "A page's content owner (`page_content_owner`'s `channel`/`ambiguous`) leaves a SECOND page-declared, inline, content-main-writing trait unclaimed: not an owner itself, not embedded by any client-bound trait, and not kin to the owner through either the config-channel or embed-containment relation (`reduce_to_owners({owner, this}).len() == 1` would mean related, not a rival). Two content bodies stacking into one page's `main`. Ported from the JS wiring lint's `unclaimed-main-writer` (warning there; error here per the owner's Q3 ruling)."
508
+ "code": "ORB_CALL_SERVICE_RESULT_HAS_KEY",
509
+ "category": "effect",
510
+ "description": "A keyed call-service returns a record that already has a key field, so the call key would collide with it"
556
511
  },
557
512
  {
558
- "code": "ORB_PAGE_CONTROL_OUTSIDE_SHELL",
559
- "category": "page",
560
- "description": "A page whose `main` a shell owns through a config channel (`contentTrait` …) also mounts a trait that paints a control into `main` which neither the owner nor anything it embeds references: the control stacks outside the shell's layout instead of inside it."
513
+ "code": "ORB_CIRCUIT_ASYNC_RESULT_DEAF_TARGET",
514
+ "category": "circuit",
515
+ "description": "A transition declares async result events but its target state has no arm handling them, so the requester cannot hear its own result"
561
516
  },
562
517
  {
563
- "code": "ORB_COMPOSED_STATE_UNREACHABLE",
518
+ "code": "ORB_CIRCUIT_DEAD_BODILESS_ACTION",
564
519
  "category": "circuit",
565
- "description": "A composed trait (`sourceBehavior` set) has a state no event the program can produce leads to: every transition into it waits on an event nothing routes in, no control or effect fires, and the host is not declared to send (`external`). An atom's own inputs are its offer; a composition that never wires one leaves that part of it dead."
520
+ "description": "A transition changes state but carries no effects, so the screen keeps its paint and affordances routed to it are dead"
566
521
  },
567
522
  {
568
- "code": "ORB_COMPOSED_TRANSITION_UNREACHABLE",
523
+ "code": "ORB_CIRCUIT_FAILURE_ARM_MISSING",
569
524
  "category": "circuit",
570
- "description": "A composed trait (`sourceBehavior` set) has a live transition, from a reachable state, on an event the program cannot produce under its resolved config: no listens route, control or effect fires it, it is not a lifecycle event and not declared `external` (G-CROSS-144)."
525
+ "description": "A transition starting an asynchronous client call has no failure arm to handle its error"
571
526
  },
572
527
  {
573
- "code": "ORB_CONTROL_VALUE_DISCARDED",
528
+ "code": "ORB_CIRCUIT_FAILURE_ARM_RENDERS_NOTHING",
574
529
  "category": "circuit",
575
- "description": "A composed trait's rendered control fires an event carrying a value that no other trait hears and whose own handling reads none of it: the value the user entered is discarded (a form submission nothing keeps)."
530
+ "description": "A state handles a failure event but its arm neither renders nor emits a declared event, so the failure reaches no one"
576
531
  },
577
532
  {
578
- "code": "ORB_PAGE_AMBIGUOUS_CONTENT_OWNER",
579
- "category": "page",
580
- "description": "A page whose content owner is ambiguous: two or more page-declared `main` writers, none composing the others, no shell channel naming one. Renders stacked alone, but any shell that designates one `contentTrait` turns the rest into second bodies (G-ORB-128)."
533
+ "code": "ORB_CIRCUIT_INIT_UNCOVERED_STATE",
534
+ "category": "circuit",
535
+ "description": "A page trait handles INIT in its initial state but not in another reachable state, so revisiting the page from there does nothing"
581
536
  },
582
537
  {
583
- "code": "ORB_SLOT_MAIN_NOT_COVERED",
584
- "category": "slot",
585
- "description": "Main slot not covered by any trait"
538
+ "code": "ORB_CIRCUIT_LIFECYCLE_EMIT_UNDELIVERED",
539
+ "category": "circuit",
540
+ "description": "A transition emits a lifecycle event that the event bus never delivers"
586
541
  },
587
542
  {
588
- "code": "ORB_SLOT_CONTENTION",
589
- "category": "slot",
590
- "description": "Multiple traits rendering to same slot (INIT state)"
543
+ "code": "ORB_CIRCUIT_MODAL_SHELL_CLOSE_DEAF",
544
+ "category": "circuit",
545
+ "description": "A state mounting an overlay-slot pattern has no CLOSE or CANCEL transition to dismiss it"
591
546
  },
592
547
  {
593
- "code": "ORB_SLOT_CONTENTION_RUNTIME",
594
- "category": "slot",
595
- "description": "Multiple traits rendering to same slot in a reachable post-INIT state (emitted as a warning; INIT-state case still errors via `SlotContention`)"
548
+ "code": "ORB_CIRCUIT_OWN_EMIT_UNREACHABLE",
549
+ "category": "circuit",
550
+ "description": "A transition emits an event its own trait handles only from other states, so the same-trait cascade never delivers it from the target state"
596
551
  },
597
552
  {
598
- "code": "ORB_SLOT_CONTENTION_TICK",
599
- "category": "slot",
600
- "description": "Two or more traits mounted on one page repaint the same slot from inside a `ticks` block, with no guard proving either one dead. Tick bodies run every frame, so they paint together rather than alternating."
553
+ "code": "ORB_CIRCUIT_SELF_EMIT_LOOP",
554
+ "category": "circuit",
555
+ "description": "A transition re-emits its own trigger event with a constant payload and a same-event arm is reachable, so it loops forever"
601
556
  },
602
557
  {
603
- "code": "ORB_SLOT_INVALID_NESTING",
604
- "category": "slot",
605
- "description": "Invalid slot nesting (e.g., modal in modal)"
558
+ "code": "ORB_CIRCUIT_SELF_OVERLAY_IN_SHELL",
559
+ "category": "circuit",
560
+ "description": "A self-overlaying pattern is rendered inside an overlay slot payload, stacking two overlay chromes"
606
561
  },
607
562
  {
608
- "code": "ORB_RUI_INVALID_SLOT",
609
- "category": "render_ui",
610
- "description": "Invalid slot in render_ui effect"
563
+ "code": "ORB_CIRCUIT_VIEWER_STRANDED",
564
+ "category": "circuit",
565
+ "description": "A page's content owner repaints its region on a user-triggered event with a body that offers no way on"
611
566
  },
612
567
  {
613
- "code": "ORB_RUI_INVALID_PATTERN",
614
- "category": "render_ui",
615
- "description": "Invalid pattern type"
568
+ "code": "ORB_COMPOSED_STATE_UNREACHABLE",
569
+ "category": "circuit",
570
+ "description": "A composed trait can never enter some states because nothing in the program sends the events that enter them"
616
571
  },
617
572
  {
618
- "code": "ORB_RUI_MISSING_PATTERN_TYPE",
619
- "category": "render_ui",
620
- "description": "Pattern missing type property"
573
+ "code": "ORB_COMPOSED_TRANSITION_UNREACHABLE",
574
+ "category": "composed",
575
+ "description": "A composed trait handles events that nothing in the program ever sends"
621
576
  },
622
577
  {
623
- "code": "ORB_RUI_INVALID_PROP",
624
- "category": "render_ui",
625
- "description": "Invalid prop for pattern"
578
+ "code": "ORB_COMPUTED_KEY_DOT_PATH",
579
+ "category": "lint",
580
+ "description": "object/set, object/get or object/has on a Map field with a str/concat key containing a literal dot: the key is read as a dot path, so the value nests instead of being one map entry"
626
581
  },
627
582
  {
628
- "code": "ORB_RUI_CHILD_NOT_DRAWABLE",
629
- "category": "render_ui",
630
- "description": "A non-drawable child composed under a canvas draw-host. A draw-host paints only neutral drawable descriptors (draw-sprite / draw-shape / draw-text / draw-*-layer); DOM chrome belongs in a `hud`/`overlay` slot."
583
+ "code": "ORB_CONFIG_DANGLING_REF",
584
+ "category": "binding",
585
+ "description": "An @config key is not declared by any config schema reachable from the trait chain"
631
586
  },
632
587
  {
633
- "code": "ORB_RUI_MISSING_REQUIRED_PROP",
634
- "category": "render_ui",
635
- "description": "Missing required prop for pattern"
588
+ "code": "ORB_CONTROL_NO_CONSEQUENCE",
589
+ "category": "emit",
590
+ "description": "A rendered control fires an event whose handlers change nothing the app or the viewer can observe."
636
591
  },
637
592
  {
638
- "code": "ORB_RUI_INVALID_ITEM_ACTION",
639
- "category": "render_ui",
640
- "description": "Invalid itemAction configuration"
593
+ "code": "ORB_CONTROL_VALUE_DISCARDED",
594
+ "category": "circuit",
595
+ "description": "A composed trait's rendered control fires an event carrying a value that no other trait hears and whose own handling reads none of it: the value the user entered is discarded (a form submission nothing keeps)."
641
596
  },
642
597
  {
643
- "code": "ORB_RUI_UNKNOWN_ITEM_ACTION_PROP",
644
- "category": "render_ui",
645
- "description": "Unknown itemAction prop (e.g., hallucinated 'condition')"
598
+ "code": "ORB_CREDENTIAL_REQUEST_INVALID",
599
+ "category": "credential",
600
+ "description": "A credential request host effect carries options other than the ones it declares"
646
601
  },
647
602
  {
648
- "code": "ORB_RUI_MISSING_ACTION",
649
- "category": "render_ui",
650
- "description": "Button/link missing action prop"
603
+ "code": "ORB_DERIVED_FIELD_WRITTEN",
604
+ "category": "entity_mutation",
605
+ "description": "A set or persist writes an @derived field that the kernel computes on every write"
651
606
  },
652
607
  {
653
- "code": "ORB_A11Y_UNNAMED",
654
- "category": "render_ui",
655
- "description": "A pattern that declares `@accessibleName` props has none of them, no `aria-label`/`aria-labelledby`, and is not `aria-hidden`"
608
+ "code": "ORB_EFFECT_OPTION_DROPPED",
609
+ "category": "effect",
610
+ "description": "An effect carries options that depend on a key echo, but the effect has no key so the options are dropped"
656
611
  },
657
612
  {
658
- "code": "ORB_RUI_INVALID_FIELD_PATH",
659
- "category": "render_ui",
660
- "description": "Nested field path references invalid relation or field"
613
+ "code": "ORB_EFF_CALL_SERVICE_MISSING_ACTION",
614
+ "category": "effect",
615
+ "description": "A call-service effect has no string action"
661
616
  },
662
617
  {
663
- "code": "ORB_RUI_FORM_FIELD_INTRINSIC",
664
- "category": "render_ui",
665
- "description": "A `form`-contract pattern offers an input for an `@intrinsic` entity field — intrinsic fields are never persisted, so the input is discarded."
618
+ "code": "ORB_EFF_CALL_SERVICE_MISSING_PARAM",
619
+ "category": "effect",
620
+ "description": "A call-service effect omits a parameter the service action requires"
666
621
  },
667
622
  {
668
- "code": "ORB_RUI_PROP_TYPE_MISMATCH",
669
- "category": "render_ui",
670
- "description": "Prop value type doesn't match expected type from registry"
623
+ "code": "ORB_EFF_CALL_SERVICE_MISSING_SERVICE",
624
+ "category": "effect",
625
+ "description": "A call_service effect is missing its service name or action"
671
626
  },
672
627
  {
673
- "code": "ORB_RUI_BINDING_TYPE_MISMATCH",
674
- "category": "render_ui",
675
- "description": "L2.1 keystone: render-ui prop bound to a `@payload.X` / `@entity.X` / `@config.X` / SExpression operator whose resolved type doesn't match any of the prop's declared `types` in the patterns registry. Distinct from `RenderUIPropTypeMismatch` (literal-only); this rule uses the F3 binding resolver to walk through bindings and SExpression operator return types (sharpened by F2's `returnSemantics` for input-dependent operators). Gap #6 in `docs/Almadar_Std_Verification.md`."
628
+ "code": "ORB_EFF_CALL_SERVICE_PARAM_TYPE",
629
+ "category": "effect",
630
+ "description": "A call-service parameter has a value whose type does not match the type the service action declares"
676
631
  },
677
632
  {
678
- "code": "ORB_RUI_ELEMENT_SHAPE_MISMATCH",
679
- "category": "render_ui",
680
- "description": "L2.4: render-ui binds an array literal to a prop whose pattern declares per-element required fields (`items.properties.<field>.required`), and one or more elements omit a required field. Catches the landing-page/about-page/showcase class of bugs where the lolo `[StepCard]` type omits `id` but the consuming `step-flow-organism` pattern requires it — surfaced at codegen as TS2322 before this rule. Walks `OirValue::Array` element-by-element against `items.properties` from `patterns-registry.json`. Discovery context: `docs/Almadar_Std_Gaps.md` §13."
633
+ "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_PARAM",
634
+ "category": "effect",
635
+ "description": "A call-service passes a param that the service action does not declare"
681
636
  },
682
637
  {
683
- "code": "ORB_T_ENTITY_NAME_SHADOWS_TRAIT_UNION",
684
- "category": "entity",
685
- "description": "Entity name collides with a sibling trait's generated `<TraitName>State` or `<TraitName>Event` union type. The TS codegen emits both `import type { <EntityName> } from '@app/shared'` and `type <TraitName>State = '...'` / `type <TraitName>Event = '...'` in every server-handler / client-hook / view file — when the entity name equals one of those generated unions, the import collides with the local declaration and tsc raises TS2440 \"Import declaration conflicts with local declaration\". Defense-in-depth pair with the lolo lowering check `LowerError::EntityNameShadowsTraitUnion`: the lolo rule catches hand-authored `.lolo`, this validator rule catches `.orb` mutated directly by an agent or factory that bypassed the lolo parse path. Convention fix: rename the entity (e.g. `<TraitName>Data`)."
638
+ "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_SERVICE",
639
+ "category": "effect",
640
+ "description": "A call-service effect names a service that is not a registered integrator or declared service"
686
641
  },
687
642
  {
688
- "code": "ORB_RUI_EVENT_BINDING_PAYLOAD_MISMATCH",
689
- "category": "render_ui",
690
- "description": "L2.2: render-ui prop with `kind: \"event-ref\"` or `kind: \"callback\"` bound to an event-name string whose declared payload schema in the trait's `emits {}` block doesn't match the component's documented bus emit shape (registry's `emitPayloadSchema` for event-ref props; `callbackArgs` for callback props). Gap #32 in `docs/Almadar_Std_Verification.md`."
643
+ "code": "ORB_EFF_EMIT_INVALID_NAME",
644
+ "category": "effect",
645
+ "description": "The event name inside an emit effect is not a valid string event name"
691
646
  },
692
647
  {
693
- "code": "ORB_X_RENDER_UI_EVENT_LITERAL_STALE",
694
- "category": "render_ui",
695
- "description": "L2.3: render-ui pattern carries a string literal that matches an event name no longer in the trait's event set after the inline phase applies an `events: { OLD: NEW }` override. Detects the stale literal that the compiler's events-rewrite pass should have rewritten — defense-in-depth for C1 (the compiler fix). Gap #30 in `docs/Almadar_Std_Verification.md`."
648
+ "code": "ORB_EFF_EMIT_KEY_INVALID",
649
+ "category": "effect",
650
+ "description": "An emit config carries a key that the operator does not support"
696
651
  },
697
652
  {
698
- "code": "ORB_EFF_CALL_SERVICE_MISSING_SERVICE",
653
+ "code": "ORB_EFF_EMIT_UNDECLARED_EVENT",
699
654
  "category": "effect",
700
- "description": "call_service missing service name"
655
+ "description": "An event named in emit is not declared in the trait's emits array"
701
656
  },
702
657
  {
703
- "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_SERVICE",
658
+ "code": "ORB_EFF_FETCH_BY_ID_PAYLOAD_LIST",
704
659
  "category": "effect",
705
- "description": "call_service names a service in neither schema.services nor the services registry. Error severity."
660
+ "description": "A fetch by id effect takes its id from a payload that is a list rather than a single value"
706
661
  },
707
662
  {
708
- "code": "ORB_EFF_CALL_SERVICE_MISSING_ACTION",
663
+ "code": "ORB_EFF_FETCH_INVALID_ENTITY",
709
664
  "category": "effect",
710
- "description": "call_service missing action"
665
+ "description": "A fetch effect is missing an entity name or references an invalid entity"
711
666
  },
712
667
  {
713
- "code": "ORB_EFF_CALL_SERVICE_MISSING_HANDLERS",
668
+ "code": "ORB_EFF_FETCH_INVALID_INCLUDE",
714
669
  "category": "effect",
715
- "description": "call_service missing onSuccess/onError handlers"
670
+ "description": "A fetch includes a relation that the fetched entity has no relation field for"
716
671
  },
717
672
  {
718
- "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_PARAM",
673
+ "code": "ORB_EFF_FETCH_INVALID_OPTION",
719
674
  "category": "effect",
720
- "description": "call_service params carry a key the action's registry contract does not declare (I-13 — the `recipient` vs `to` class)"
675
+ "description": "A fetch deliver option is not one of the allowed values rows or ids"
721
676
  },
722
677
  {
723
- "code": "ORB_EFF_CALL_SERVICE_MISSING_PARAM",
678
+ "code": "ORB_EFF_MISSING_FETCH_FOR_ENTITY",
724
679
  "category": "effect",
725
- "description": "call_service params omit a key the action's registry contract requires"
680
+ "description": "A render-ui references an entity but no fetch effect for it exists in this or any predecessor transition"
726
681
  },
727
682
  {
728
- "code": "ORB_EFF_CALL_SERVICE_PARAM_TYPE",
683
+ "code": "ORB_EFF_NAVIGATE_MISSING_PAYLOAD",
729
684
  "category": "effect",
730
- "description": "call_service literal param value contradicts the contract's param type"
685
+ "description": "A navigate effect omits a payload field the target page requires for its INIT event"
731
686
  },
732
687
  {
733
- "code": "ORB_CALL_SERVICE_CANCELLED_WITHOUT_KEY",
688
+ "code": "ORB_EFF_NAVIGATE_TARGET_UNREACHABLE",
734
689
  "category": "effect",
735
- "description": "call-service declares `emit.cancelled` but no `key` — nothing can cancel an unkeyed call"
690
+ "description": "A navigate target path does not resolve to any declared page"
736
691
  },
737
692
  {
738
- "code": "ORB_CALL_SERVICE_KEY_TYPE",
693
+ "code": "ORB_EFF_PROGRAM_EVAL_FAILURE_MISSING",
739
694
  "category": "effect",
740
- "description": "call-service `key` is a non-string literal (number/bool/object/array)"
695
+ "description": "program/eval carries no emit.failure event, so validator errors would be dropped"
741
696
  },
742
697
  {
743
- "code": "ORB_CANCEL_CALL_NO_KEYED_CALL",
698
+ "code": "ORB_EFF_RETIRED_FORM",
744
699
  "category": "effect",
745
- "description": "the app runs `cancel-call` but no `call-service` anywhere carries a `key`"
700
+ "description": "An effect is written in a retired object form instead of the array form"
746
701
  },
747
702
  {
748
- "code": "ORB_CALL_KEY_UNUSED",
703
+ "code": "ORB_EFF_SET_INVALID_BINDING",
749
704
  "category": "effect",
750
- "description": "a literal `(as \"k\" CallKey)` in a program whose keyed calls are all keyed by literals, none of them `\"k\"`"
705
+ "description": "A set effect is missing its binding or its value"
751
706
  },
752
707
  {
753
- "code": "ORB_EFFECT_OPTION_DROPPED",
708
+ "code": "ORB_EFF_SET_PAYLOAD_NOT_ALLOWED",
754
709
  "category": "effect",
755
- "description": "an emit-options `key` on an effect that carries no key, so its completion could never echo it"
710
+ "description": "A set effect targets @payload, which is read-only; it should target @entity"
756
711
  },
757
712
  {
758
- "code": "ORB_CANCEL_CALL_KEY_NEVER_CALLED",
713
+ "code": "ORB_EFF_UNKNOWN_TYPE",
759
714
  "category": "effect",
760
- "description": "`--final`: a `cancel-call` on a `CallKey` (or a list of them) in a finished program where no keyed call has a `CallKey`-typed `key:`, so nothing the program runs is named by a key made with `as`"
715
+ "description": "An effect has an unknown type or is malformed"
761
716
  },
762
717
  {
763
- "code": "ORB_CALL_SERVICE_KEY_DUPLICATE",
718
+ "code": "ORB_EFF_UNSIGNED_NOT_ENV_GUARDED",
764
719
  "category": "effect",
765
- "description": "two `call-service` effects of one transition carry the same literal `key`"
720
+ "description": "A jws/verify call with a literal allowUnsigned true sits in a transition that is not env-guarded"
766
721
  },
767
722
  {
768
- "code": "ORB_CALL_SERVICE_RESULT_HAS_KEY",
769
- "category": "effect",
770
- "description": "a keyed call-service whose registry responseShape already has a `key` field"
723
+ "code": "ORB_EMBED_CONFIG_FORWARD_MULTI_REFERRER",
724
+ "category": "embed",
725
+ "description": "A trait that forwards @config is embedded by more than one referrer, so the forwarded value is ambiguous"
771
726
  },
772
727
  {
773
- "code": "ORB_HTTP_EGRESS_UNDECLARED",
728
+ "code": "ORB_EMIT_CONFIG_REF_INVALID",
774
729
  "category": "effect",
775
- "description": "an `http` origin, `tokenUrl` origin, or `url` knob default is not in `egress`"
730
+ "description": "An emit config reference is invalid"
776
731
  },
777
732
  {
778
- "code": "ORB_HTTP_EGRESS_ENTRY_INVALID",
779
- "category": "effect",
780
- "description": "an `egress` entry is not `scheme://host[:port]`"
733
+ "code": "ORB_EMIT_CONTROL_UNHANDLED",
734
+ "category": "emit",
735
+ "description": "A rendered control fires an event nothing handles or routes."
781
736
  },
782
737
  {
783
- "code": "ORB_INBOUND_UNDECLARED",
784
- "category": "effect",
785
- "description": "an inbound handler (`listens { EVENT -> inbound \"name\" … }`) is reachable in a program whose app does not declare `name` in `inbound`"
738
+ "code": "ORB_EMIT_UNROUTED_TO_HANDLER",
739
+ "category": "trait_event",
740
+ "description": "A trait emits an event another trait has an arm for, but no declared listens route delivers it"
786
741
  },
787
742
  {
788
- "code": "ORB_INBOUND_ENTRY_INVALID",
789
- "category": "effect",
790
- "description": "an `inbound` entry is not one lower-case hook name (letters, digits, `-`), or is listed twice"
743
+ "code": "ORB_ENTITY_INTRINSIC_FIELD_PERSISTED",
744
+ "category": "entity_mutation",
745
+ "description": "A persist data literal names an @intrinsic field, which is trait-owned view-state and never a persisted column"
791
746
  },
792
747
  {
793
- "code": "ORB_INBOUND_DUPLICATE",
794
- "category": "effect",
795
- "description": "two traits handle the same inbound hook name"
748
+ "code": "ORB_ENTITY_OWNER_COLUMN_UNSCOPED",
749
+ "category": "entity",
750
+ "description": "An entity declares owner columns but has no access policy scoping rows to the owner"
796
751
  },
797
752
  {
798
- "code": "ORB_INBOUND_ANSWER_UNDECLARED",
799
- "category": "effect",
800
- "description": "an inbound handler answers with an event its trait does not declare in `emits`"
753
+ "code": "ORB_ENTITY_SPLIT_MUTATION",
754
+ "category": "entity_mutation",
755
+ "description": "A runtime entity is mutated by several traits on isolated per-trait copies while another trait reads a field it never writes"
801
756
  },
802
757
  {
803
- "code": "ORB_INBOUND_ANSWER_FOREIGN",
804
- "category": "effect",
805
- "description": "a trait other than an inbound handler emits the handler's answer event and the handler does not relay it: only the handler's own emit answers"
758
+ "code": "ORB_E_DUPLICATE_FIELD",
759
+ "category": "entity",
760
+ "description": "An entity declares the same field name more than once"
806
761
  },
807
762
  {
808
- "code": "ORB_INBOUND_VERIFY_INVALID",
809
- "category": "effect",
810
- "description": "an inbound `verifies` header is not a lower-case header name, or its credential is not a credential name"
763
+ "code": "ORB_E_EMPTY_ENUM_VALUES",
764
+ "category": "entity",
765
+ "description": "An enum field declares no values"
811
766
  },
812
767
  {
813
- "code": "ORB_OS_GRANT_MISSING",
814
- "category": "effect",
815
- "description": "an `os/` call needs something the calling orbital's grants do not cover"
768
+ "code": "ORB_E_IDENTITY_LOCAL",
769
+ "category": "entity",
770
+ "description": "An identity entity is declared as browser-stored, but the viewer directory is never browser-resident"
816
771
  },
817
772
  {
818
- "code": "ORB_OS_TARGET_NOT_STATIC",
819
- "category": "effect",
820
- "description": "an `os/` call's target (path, command, host, port, variable, flags) is not a literal"
773
+ "code": "ORB_E_INSTANCE_INVALID",
774
+ "category": "entity",
775
+ "description": "An entity instance row sets a key that is not a field of the entity"
821
776
  },
822
777
  {
823
- "code": "ORB_OS_GRANT_UNUSED",
824
- "category": "effect",
825
- "description": "a declared `os/` grant entry that no `os/` call of the orbitals holding it uses (warning)"
778
+ "code": "ORB_E_INVALID_FIELD_NAME",
779
+ "category": "entity",
780
+ "description": "An entity field or entity name is empty or not in the required naming form"
826
781
  },
827
782
  {
828
- "code": "ORB_OS_GRANT_ENTRY_INVALID",
829
- "category": "effect",
830
- "description": "a declared `os/` grant entry whose shape cannot match anything"
783
+ "code": "ORB_E_INVALID_FIELD_TYPE",
784
+ "category": "entity",
785
+ "description": "An entity field declares a type that is not a valid field type"
831
786
  },
832
787
  {
833
- "code": "ORB_PLACEMENT_ORBITAL_UNKNOWN",
834
- "category": "effect",
835
- "description": "a `deployment` unit lists an orbital the program does not declare"
788
+ "code": "ORB_E_INVALID_RELATION",
789
+ "category": "entity",
790
+ "description": "A relation field is missing its relation configuration or points at an entity that does not exist"
836
791
  },
837
792
  {
838
- "code": "ORB_PLACEMENT_ORBITAL_DUPLICATE",
839
- "category": "effect",
840
- "description": "an orbital is listed in more than one `deployment` unit, or twice in one"
793
+ "code": "ORB_E_LITERAL_UNION_DEFAULT_MISMATCH",
794
+ "category": "entity",
795
+ "description": "A field default is not one of the values of its declared literal union"
841
796
  },
842
797
  {
843
- "code": "ORB_PLACEMENT_ORBITAL_UNPLACED",
844
- "category": "effect",
845
- "description": "a `deployment` is declared and an orbital is in none of its units"
798
+ "code": "ORB_E_LOCALE_INSTANCES_INCOMPLETE",
799
+ "category": "entity",
800
+ "description": "An entity writes rows per locale but has no default instances block for its default locale"
846
801
  },
847
802
  {
848
- "code": "ORB_PLACEMENT_UNIT_EMPTY",
849
- "category": "effect",
850
- "description": "a `deployment` unit lists no orbital"
803
+ "code": "ORB_E_LOCALE_INSTANCES_NOT_LOCAL",
804
+ "category": "entity",
805
+ "description": "An entity writes rows per locale but its rows are not browser-stored, so every viewer shares them"
851
806
  },
852
807
  {
853
- "code": "ORB_HTTP_ORIGIN_NOT_STATIC",
854
- "category": "effect",
855
- "description": "an `http` origin is neither a string literal nor a `url`-typed `@config` knob"
808
+ "code": "ORB_E_LOCALE_INSTANCES_UNKNOWN_LOCALE",
809
+ "category": "entity",
810
+ "description": "An entity writes locale instances for a locale that is not among the declared locales"
856
811
  },
857
812
  {
858
- "code": "ORB_HTTP_METHOD_UNKNOWN",
859
- "category": "effect",
860
- "description": "an `http` method is not one of GET POST PUT PATCH DELETE"
813
+ "code": "ORB_E_LOCAL_REQUIRES_PERSISTENT",
814
+ "category": "entity",
815
+ "description": "A runtime entity declares a browser storage location, which only applies to persistent entities"
861
816
  },
862
817
  {
863
- "code": "ORB_HTTP_PATH_INVALID",
864
- "category": "effect",
865
- "description": "an `http` path violates the kernel's absolute-path contract"
818
+ "code": "ORB_E_MERGED_FIELD_UNREFERENCED",
819
+ "category": "entity",
820
+ "description": "A field merged into an entity is never read, written, fetch-included or persisted by any trait of the orbital"
866
821
  },
867
822
  {
868
- "code": "ORB_HTTP_OPTION_UNKNOWN",
869
- "category": "effect",
870
- "description": "an `http` request/auth/paginate object carries a key outside its closed set"
823
+ "code": "ORB_E_MISSING_COLLECTION",
824
+ "category": "entity",
825
+ "description": "A persistent entity does not declare a collection name"
871
826
  },
872
827
  {
873
- "code": "ORB_HTTP_AUTH_SCHEME_UNKNOWN",
874
- "category": "effect",
875
- "description": "`http` `auth.scheme` is not in the closed scheme set"
828
+ "code": "ORB_E_MISSING_NAME",
829
+ "category": "entity",
830
+ "description": "An entity is missing its required name"
876
831
  },
877
832
  {
878
- "code": "ORB_HTTP_AUTH_INVALID",
879
- "category": "effect",
880
- "description": "An HTTP auth, grant-cache, presign, or webpush configuration violates its contract."
833
+ "code": "ORB_E_MOCK_NOT_IN_ENUM",
834
+ "category": "entity",
835
+ "description": "Mock candidate values are not values of the enum field they belong to"
881
836
  },
882
837
  {
883
- "code": "ORB_HTTP_TOKEN_ROTATE_INVALID",
884
- "category": "effect",
885
- "description": "A token-exchange `rotate` is not a `{ field, credential }` rotation of the body's `refresh_token` slot."
838
+ "code": "ORB_E_NO_FIELDS",
839
+ "category": "entity",
840
+ "description": "An entity declares no fields and must have at least one"
886
841
  },
887
842
  {
888
- "code": "ORB_HTTP_HEADER_INVALID",
843
+ "code": "ORB_E_SEMANTIC_VALUE_INVALID",
844
+ "category": "entity",
845
+ "description": "A semantically typed field has a default value that is invalid for its kind, such as an empty string"
846
+ },
847
+ {
848
+ "code": "ORB_FETCH_DELIVER_IDS_ENTITY_REFS",
849
+ "category": "fetch",
850
+ "description": "A fetch using deliver ids also asks for included relations, but ids delivers no rows to carry them"
851
+ },
852
+ {
853
+ "code": "ORB_FETCH_DELIVER_IDS_NO_SUCCESS",
889
854
  "category": "effect",
890
- "description": "An HTTP request/auth header name is not a token, or its value is not a single-line string."
855
+ "description": "A fetch with deliver ids has no emit.success, so nothing carries the reference"
891
856
  },
892
857
  {
893
- "code": "ORB_HTTP_REQUEST_OPTION_INVALID",
858
+ "code": "ORB_FETCH_DELIVER_IDS_ROWS_READ",
894
859
  "category": "effect",
895
- "description": "An HTTP request's `timeoutMs`, `delayMs` or `retry` is not a value of its declared kind."
860
+ "description": "A fetch with deliver ids delivers a row-set reference as the success event's data; any use other than passing it whole as a render-ui prop value reads rows that were never delivered"
896
861
  },
897
862
  {
898
- "code": "ORB_HTTP_AUTH_ON_CLIENT",
863
+ "code": "ORB_FETCH_NEEDS_COMPOSITE_INDEX",
899
864
  "category": "effect",
900
- "description": "an `http` with `auth` sits where its trait runs on the client (a `[client]` trait, a browser-run tick)"
865
+ "description": "A fetch query needs a composite index that the store driver does not create and no index declaration covers"
901
866
  },
902
867
  {
903
- "code": "ORB_HTTP_BODY_CONFLICT",
868
+ "code": "ORB_FETCH_TOTAL_NONE_READ",
904
869
  "category": "effect",
905
- "description": "an `http` request has more than one body kind, or a body on GET"
870
+ "description": "A fetch with total none skips the count, so the success event's totalCount is never set and may not be read"
871
+ },
872
+ {
873
+ "code": "ORB_FETCH_UNINDEXED",
874
+ "category": "query",
875
+ "description": "A fetch filter cannot be pushed down by the store driver and no @index covers it, so the kernel scans every row"
876
+ },
877
+ {
878
+ "code": "ORB_GEN_INVALID_VALUE",
879
+ "category": "generic",
880
+ "description": "A value is invalid for the position it is written in"
881
+ },
882
+ {
883
+ "code": "ORB_GUARD_ON_FRAME_FIELD_AUTHORIZES",
884
+ "category": "guard",
885
+ "description": "A guard reads an intrinsic frame field of an entity to authorize, but intrinsic fields are not trustworthy for access"
886
+ },
887
+ {
888
+ "code": "ORB_GUEST_VIEW_NOT_CLIENT",
889
+ "category": "trait",
890
+ "description": "A trait that does not run on the client paints a guest-view, so the kernel cannot route a click inside the guest"
906
891
  },
907
892
  {
908
893
  "code": "ORB_HOST_EFFECT_ARITY",
909
894
  "category": "effect",
910
- "description": "`random-bytes`, `credential-status` or `credential-forget` with the wrong number of arguments"
895
+ "description": "A host effect is called with the wrong number of arguments"
896
+ },
897
+ {
898
+ "code": "ORB_HOST_EFFECT_OPTION_UNKNOWN",
899
+ "category": "host_effect",
900
+ "description": "A host effect is given an option outside the set of options it accepts"
901
+ },
902
+ {
903
+ "code": "ORB_HTTP_EGRESS_ENTRY_INVALID",
904
+ "category": "http",
905
+ "description": "An egress allowlist entry is not of the form scheme://host[:port]"
906
+ },
907
+ {
908
+ "code": "ORB_HTTP_EGRESS_UNDECLARED",
909
+ "category": "http",
910
+ "description": "An outbound request targets an origin that is not declared in the program egress list"
911
+ },
912
+ {
913
+ "code": "ORB_HTTP_ORIGIN_NOT_STATIC",
914
+ "category": "http",
915
+ "description": "An http origin is not a string literal or a url-typed config knob, so egress cannot be checked"
916
+ },
917
+ {
918
+ "code": "ORB_ID_AUTHORED_WITHOUT_LEDGER",
919
+ "category": "id",
920
+ "description": "An id is authored in source without a matching ledger entry, so it is replaced on load"
921
+ },
922
+ {
923
+ "code": "ORB_ID_DUPLICATE_EVENT_ID",
924
+ "category": "id",
925
+ "description": "An event id is declared by more than one trait, but ids must be document-unique"
911
926
  },
912
927
  {
913
- "code": "ORB_HOST_EFFECT_OPTION_UNKNOWN",
914
- "category": "effect",
915
- "description": "a key other than `emit`, or a non-object, as the options of a host effect"
928
+ "code": "ORB_ID_KIND_MISMATCH",
929
+ "category": "id",
930
+ "description": "An id of one kind is used in a position that requires an id of a different kind"
916
931
  },
917
932
  {
918
- "code": "ORB_RANDOM_BYTES_COUNT",
919
- "category": "effect",
920
- "description": "a literal `random-bytes` count that is not an integer from 1 to 1024"
933
+ "code": "ORB_ID_LEDGER_ORPHAN",
934
+ "category": "id",
935
+ "description": "An id ledger row is carried by no node in the schema and is stale"
921
936
  },
922
937
  {
923
- "code": "ORB_CREDENTIAL_REQUEST_INVALID",
924
- "category": "effect",
925
- "description": "a literal request of a `credential-*` administration effect that is not an object of its declared parameters, or leaves one out"
938
+ "code": "ORB_ID_NAME_MISMATCH",
939
+ "category": "id",
940
+ "description": "A name in the source disagrees with the current name the ledger records for the same id"
926
941
  },
927
942
  {
928
- "code": "ORB_REDIS_CALL_INVALID",
929
- "category": "effect",
930
- "description": "a `redis` call whose origin is not `redis://` or `rediss://`, whose command is not a non-empty list of text, or whose connection options are malformed"
943
+ "code": "ORB_ID_UNKNOWN_REF",
944
+ "category": "id",
945
+ "description": "An id reference matches no arena node or ledger entry"
931
946
  },
932
947
  {
933
- "code": "ORB_POSTGRES_CALL_INVALID",
934
- "category": "effect",
935
- "description": "a `postgres` call whose origin is not `postgres://` or `postgresql://`, whose literal statement is not a single read-only SELECT, whose params are not a list, or whose connection options are malformed or lack a user"
948
+ "code": "ORB_INBOUND_ANSWER_FOREIGN",
949
+ "category": "inbound",
950
+ "description": "A trait other than an inbound handler emits the handler's answer event, so the answer never reaches the caller"
936
951
  },
937
952
  {
938
- "code": "ORB_OAUTH_CLIENT_INVALID",
939
- "category": "effect",
940
- "description": "an OAuth client object with an unknown or missing key, both or neither of `issuer`/`endpoints`, or a bad word"
953
+ "code": "ORB_INBOUND_ANSWER_UNDECLARED",
954
+ "category": "inbound",
955
+ "description": "An inbound hook event answers with an event the trait does not declare in emits"
941
956
  },
942
957
  {
943
- "code": "ORB_OAUTH_OP_UNKNOWN",
944
- "category": "effect",
945
- "description": "an `oauth-client` `op` outside the closed set, or an input the op does not take or requires"
958
+ "code": "ORB_INBOUND_DUPLICATE",
959
+ "category": "inbound",
960
+ "description": "An inbound hook has more than one handler"
946
961
  },
947
962
  {
948
- "code": "ORB_OAUTH_ENDPOINT_MISMATCH",
949
- "category": "effect",
950
- "description": "`oauth-endpoint` without an `oauth-client` auth, or a target word or method that does not serve the op"
963
+ "code": "ORB_INBOUND_ENTRY_INVALID",
964
+ "category": "inbound",
965
+ "description": "An inbound entry is not a valid hook name"
951
966
  },
952
967
  {
953
- "code": "ORB_OAUTH_REQUEST_CONFLICT",
954
- "category": "effect",
955
- "description": "an `oauth-client` request that carries anything but `auth`"
968
+ "code": "ORB_INBOUND_UNDECLARED",
969
+ "category": "inbound",
970
+ "description": "An event handles an inbound hook that the program's inbound block does not declare"
956
971
  },
957
972
  {
958
- "code": "ORB_OAUTH_PROVIDER_UNKNOWN",
959
- "category": "effect",
960
- "description": "a provider word outside `google | github | auth0`"
973
+ "code": "ORB_INBOUND_VERIFY_INVALID",
974
+ "category": "inbound",
975
+ "description": "An inbound hook verifies a header against a credential, but the header is not a lower-case header name or the credential is not a credential name"
961
976
  },
962
977
  {
963
- "code": "ORB_OAUTH_OPTION_UNKNOWN",
964
- "category": "effect",
965
- "description": "an unknown key, or a missing `redirectUri`, in `oauth-authorize` options"
978
+ "code": "ORB_INDEX_PATH_DUPLICATE",
979
+ "category": "index",
980
+ "description": "The same index path, with the same ordering, is declared more than once on an entity"
966
981
  },
967
982
  {
968
- "code": "ORB_HTTP_PAGINATE_MAX_MISSING",
969
- "category": "effect",
970
- "description": "`http` `paginate` without `max`"
983
+ "code": "ORB_INDEX_PATH_INVALID",
984
+ "category": "entity",
985
+ "description": "An index path names a field that the entity does not declare"
971
986
  },
972
987
  {
973
- "code": "ORB_HTTP_STREAM_WITHOUT_ON_MESSAGE",
974
- "category": "effect",
975
- "description": "`http` `stream` without `emit.onMessage`"
988
+ "code": "ORB_JSON_ROUNDTRIP",
989
+ "category": "lint",
990
+ "description": "json/parse re-parses what json/stringify just serialized; a stringify→parse round trip launders a value's type past the checker (owner hard rule, CLAUDE.md). Narrow with `as`."
976
991
  },
977
992
  {
978
- "code": "ORB_PAGE_FACTS_FIELD_INVALID",
979
- "category": "effect",
980
- "description": "`browser/page-facts` fields: an unknown word, an empty list or a duplicate"
993
+ "code": "ORB_LINT_FINDING_CODE_UNDECLARED",
994
+ "category": "lint",
995
+ "description": "A lint rule names a finding code that its declared codes record does not carry."
981
996
  },
982
997
  {
983
- "code": "ORB_PAGE_FACTS_UNREQUESTED_READ",
984
- "category": "effect",
985
- "description": "an event reads a page fact the `browser/page-facts` call did not request"
998
+ "code": "ORB_LINT_INDEX_MISSING",
999
+ "category": "lint",
1000
+ "description": "The lint input arrived without a shared program fact the rule reads (the structural index, sites, units, embeds or entities), so the rule cannot check the program"
986
1001
  },
987
1002
  {
988
- "code": "ORB_BEACON_OPTION_UNKNOWN",
989
- "category": "effect",
990
- "description": "a `browser/beacon` request or option key outside its closed set"
1003
+ "code": "ORB_LINT_INPUT_UNREAD",
1004
+ "category": "lint",
1005
+ "description": "A lint input file could not be read or lowered, so the lint rules did not run"
991
1006
  },
992
1007
  {
993
- "code": "ORB_BEACON_TEXT_REQUIRED",
994
- "category": "effect",
995
- "description": "a `browser/beacon` request without `text`"
1008
+ "code": "ORB_LINT_LANGUAGE_FACTS_UNREAD",
1009
+ "category": "lint",
1010
+ "description": "The installed language facts could not be read, so the lint rule could not check what it needs"
996
1011
  },
997
1012
  {
998
- "code": "ORB_BEACON_URL_NOT_ABSOLUTE",
999
- "category": "effect",
1000
- "description": "a literal `browser/beacon` URL that is not an absolute http(s) URL"
1013
+ "code": "ORB_LINT_OPERATOR_SHAPES_UNREAD",
1014
+ "category": "lint",
1015
+ "description": "The installed operator table could not be read or does not match the operator shape type, so a lint cannot run"
1001
1016
  },
1002
1017
  {
1003
- "code": "ORB_ON_DEVICE_EFFECT_ON_SERVER",
1004
- "category": "effect",
1005
- "description": "a `browser/prompt` or `browser/embed` where the server runs the transition: a `[background]` tick"
1018
+ "code": "ORB_LINT_RULE_COUNT_MISMATCH",
1019
+ "category": "lint",
1020
+ "description": "A lint engine's rules or programOnlyRules names differ from the rule names its routed rule traits answer LINT_FOUND with"
1006
1021
  },
1007
1022
  {
1008
- "code": "ORB_ON_DEVICE_SCHEMA_INVALID",
1009
- "category": "effect",
1010
- "description": "a literal `browser/prompt` response schema that is not a JSON object"
1023
+ "code": "ORB_LINT_RULE_FAILED",
1024
+ "category": "lint",
1025
+ "description": "A lint rule met an input its own preconditions exclude and could not check it"
1011
1026
  },
1012
1027
  {
1013
- "code": "ORB_TAB_REQUEST_INVALID",
1014
- "category": "effect",
1015
- "description": "a `browser/tab-*` request that is not an object of the op's closed keys, or whose literal values the kernel refuses"
1028
+ "code": "ORB_LINT_SERVICE_REGISTRY_UNREAD",
1029
+ "category": "lint",
1030
+ "description": "The installed services registry could not be read, so call-service services cannot be checked"
1016
1031
  },
1017
1032
  {
1018
- "code": "ORB_TAB_EFFECT_ON_SERVER",
1019
- "category": "effect",
1020
- "description": "a `browser/tab-*` effect where the server runs the transition: a `[background]` tick"
1033
+ "code": "ORB_LINT_UI_VOCAB_UNREAD",
1034
+ "category": "lint",
1035
+ "description": "The installed @almadar/core declares no readable UI vocabulary, so a UI lint check cannot run"
1021
1036
  },
1022
1037
  {
1023
- "code": "ORB_EFF_SET_INVALID_BINDING",
1024
- "category": "effect",
1025
- "description": "set effect using invalid binding"
1038
+ "code": "ORB_LISTEN_REDUNDANT_EMBED_ROUTE",
1039
+ "category": "listen",
1040
+ "description": "A listens route is redundant because the embedded trait already receives that event"
1026
1041
  },
1027
1042
  {
1028
- "code": "ORB_EFF_SET_PAYLOAD_NOT_ALLOWED",
1029
- "category": "effect",
1030
- "description": "set effect using @payload (should use @entity)"
1043
+ "code": "ORB_LISTEN_ROUTE_STARVES_REQUIRED_FIELD",
1044
+ "category": "trait_event",
1045
+ "description": "A listens route requires a payload field that the source event contract never produces"
1031
1046
  },
1032
1047
  {
1033
- "code": "ORB_EFF_FETCH_INVALID_ENTITY",
1034
- "category": "effect",
1035
- "description": "fetch effect referencing invalid entity"
1048
+ "code": "ORB_LISTEN_WILDCARD_UNKEYED",
1049
+ "category": "trait_event",
1050
+ "description": "A wildcard listens route hears every caller's event but its guard never reads the call key in the payload"
1036
1051
  },
1037
1052
  {
1038
- "code": "ORB_EFF_FETCH_INVALID_INCLUDE",
1039
- "category": "effect",
1040
- "description": "fetch effect include references non-existent or non-relation field"
1053
+ "code": "ORB_MEM_ALIAS",
1054
+ "category": "mem",
1055
+ "description": "An exclusive borrow of a block while another borrow of it is live, or a borrow while an exclusive one is live"
1041
1056
  },
1042
1057
  {
1043
- "code": "ORB_PERSIST_BATCH_OPS_NOT_ARRAY",
1044
- "category": "effect",
1045
- "description": "`persist batch` ops expression is not array-typed"
1058
+ "code": "ORB_MEM_DOUBLE_FREE",
1059
+ "category": "mem",
1060
+ "description": "A handle is freed, dropped or released a second time on some path"
1046
1061
  },
1047
1062
  {
1048
- "code": "ORB_PERSIST_BATCH_BAD_OP",
1049
- "category": "effect",
1050
- "description": "`persist batch` op tuple with an unknown action or the wrong arity"
1063
+ "code": "ORB_MEM_LEAK",
1064
+ "category": "mem",
1065
+ "description": "An arena reaches a resting state on some path without being dropped"
1051
1066
  },
1052
1067
  {
1053
- "code": "ORB_PERSIST_BATCH_MIXED_PLACEMENT",
1054
- "category": "effect",
1055
- "description": "`persist batch` ops name both browser-stored and server-stored entities"
1068
+ "code": "ORB_MEM_USE_AFTER_FREE",
1069
+ "category": "mem",
1070
+ "description": "A mem/ call takes a handle after it was freed, dropped or released on some path"
1056
1071
  },
1057
1072
  {
1058
- "code": "ORB_EFF_SLOT_CONFLICT",
1059
- "category": "effect",
1060
- "description": "Multiple render_ui effects targeting same slot"
1073
+ "code": "ORB_NAV_TARGET_UNDECLARED",
1074
+ "category": "page",
1075
+ "description": "A navigation target stated as a literal path (a navigate effect, a navItems or link href, a navigatesTo) names no page the finished program declares"
1061
1076
  },
1062
1077
  {
1063
- "code": "ORB_EFF_UNKNOWN_TYPE",
1064
- "category": "effect",
1065
- "description": "Unknown effect type"
1078
+ "code": "ORB_OAUTH_CLIENT_INVALID",
1079
+ "category": "oauth",
1080
+ "description": "An OAuth client block uses a key that is not a valid OAuth client key"
1066
1081
  },
1067
1082
  {
1068
- "code": "ORB_EFF_NOTIFY_RETIRED",
1069
- "category": "effect",
1070
- "description": "`notify` is sugar for `render-ui toast { type: alert, … }`, desugared at `.lolo` lowering (owner ruling 2026-09-11) — the `.orb` IR never carries a `notify` effect kind. A `notify` tuple reaching L2 means a hand-authored `.orb` or a registry not yet re-emitted."
1083
+ "code": "ORB_OAUTH_OPTION_UNKNOWN",
1084
+ "category": "oauth",
1085
+ "description": "An oauth-authorize call passes an option that is not recognized"
1071
1086
  },
1072
1087
  {
1073
- "code": "ORB_EFF_NAVIGATE_MISSING_PAYLOAD",
1074
- "category": "effect",
1075
- "description": "Navigate effect missing required payload for target page"
1088
+ "code": "ORB_OAUTH_PROVIDER_UNKNOWN",
1089
+ "category": "oauth",
1090
+ "description": "The OAuth clients map is keyed by something other than a known provider tag"
1076
1091
  },
1077
1092
  {
1078
- "code": "ORB_EFF_NAVIGATE_TARGET_UNREACHABLE",
1079
- "category": "effect",
1080
- "description": "Navigate effect references a path that doesn't resolve to any declared `pages[].path` across the resolved schema. Post-inline backstop for L1.2 — catches navigate calls injected by molecule- level `effects: { ... }` overrides AND navigate calls that targeted imported pages from `uses` refs that L1 couldn't see."
1093
+ "code": "ORB_ON_DEVICE_EFFECT_ON_SERVER",
1094
+ "category": "browser",
1095
+ "description": "An on-device model effect runs in a background tick on the server, which has no on-device model"
1081
1096
  },
1082
1097
  {
1083
- "code": "ORB_EMIT_DECLARED_BUT_UNFIRED",
1084
- "category": "effect",
1085
- "description": "Trait declares an event in its `emits[]` block but no transition fires it via `(emit X)` or operator emit-config success/failure. Usually a copy-paste leftover or a stale declaration after a rename; gap #2 defense in `docs/Almadar_Std_Verification.md`."
1098
+ "code": "ORB_ON_DEVICE_SCHEMA_INVALID",
1099
+ "category": "browser",
1100
+ "description": "A browser prompt response schema is not valid JSON Schema text describing a JSON object"
1086
1101
  },
1087
1102
  {
1088
- "code": "ORB_EMIT_CONTROL_UNHANDLED",
1089
- "category": "effect",
1090
- "description": "`orb validate --final`: a rendered control fires an event no trait handles — not the rendering trait, an embedder of it, nor a `listens` route (G-ORB-187)."
1103
+ "code": "ORB_OP_INVALID_TIME_UNIT",
1104
+ "category": "operator",
1105
+ "description": "A time operator is given a unit that is not an accepted time unit"
1091
1106
  },
1092
1107
  {
1093
- "code": "ORB_EMIT_CONFIG_REF_INVALID",
1094
- "category": "effect",
1095
- "description": "`emits { @config.<knob> -> ... }` references a knob that isn't a DECLARED string-typed config field with a default (Option B contract). Left unresolved by the inline phase; surfaces here with the specific clause that failed."
1108
+ "code": "ORB_OS_EGRESS_SCHEME_UNUSED",
1109
+ "category": "os",
1110
+ "description": "An egress entry whose scheme (redis, rediss, postgres, postgresql) no operator or fetch uses since the TCP protocol-target grants were retired; its net-grant replacement is named"
1096
1111
  },
1097
1112
  {
1098
- "code": "ORB_EFF_MISSING_FETCH_FOR_ENTITY",
1099
- "category": "effect",
1100
- "description": "render-ui has entity prop but no fetch effect for that entity in the same transition"
1113
+ "code": "ORB_OS_GRANT_ENTRY_INVALID",
1114
+ "category": "os",
1115
+ "description": "A declared grant entry that can match nothing"
1101
1116
  },
1102
1117
  {
1103
- "code": "ORB_EFF_EMIT_KEY_INVALID",
1104
- "category": "effect",
1105
- "description": "`emit:` config carries a key the operator doesn't support (e.g. `on_message` on `fetch`, `failure` on `set`)."
1118
+ "code": "ORB_OS_GRANT_MISSING",
1119
+ "category": "os",
1120
+ "description": "An os/ call that the grants of its orbital (app level plus its own) do not cover"
1106
1121
  },
1107
1122
  {
1108
- "code": "ORB_EFF_EMIT_INVALID_NAME",
1109
- "category": "effect",
1110
- "description": "Event name inside `emit:` isn't UPPER_SNAKE_CASE."
1123
+ "code": "ORB_OS_GRANT_UNUSED",
1124
+ "category": "os",
1125
+ "description": "A granted entry that no os/ call of the orbital (or of the program, at app level) uses; a warning"
1111
1126
  },
1112
1127
  {
1113
- "code": "ORB_EFF_EMIT_UNDECLARED_EVENT",
1114
- "category": "effect",
1115
- "description": "Event in `emit:` isn't declared in the trait's `emits` array."
1128
+ "code": "ORB_OS_TARGET_NOT_STATIC",
1129
+ "category": "os",
1130
+ "description": "An os/ call target that is computed, so its grant cannot be checked at build time"
1116
1131
  },
1117
1132
  {
1118
- "code": "ORB_EFF_PROGRAM_EVAL_FAILURE_MISSING",
1119
- "category": "effect",
1120
- "description": "`program/eval` carries no `emit.failure` event: the validator's errors come back through the failure arm, so without one they are dropped."
1133
+ "code": "ORB_O_CONFIG_DEAD_KNOB",
1134
+ "category": "orbital",
1135
+ "description": "A declared app-level config knob is not forwarded by any trait config default, so it has no effect"
1121
1136
  },
1122
1137
  {
1123
- "code": "ORB_EFF_MISSING_REQUIRED_EMIT",
1124
- "category": "effect",
1125
- "description": "Operator declares `requiresEmitSuccess: true` in canonical-operators.json but the effect call site is missing the trailing options object or its `emit.success` event key. Applies to fetch / persist / call-service / ref by default; any future operator can opt in via the same JSON flag."
1138
+ "code": "ORB_O_CONFIG_UNKNOWN_KEY",
1139
+ "category": "orbital_ref",
1140
+ "description": "A call-site config key matches no config knob declared by the upstream orbital"
1126
1141
  },
1127
1142
  {
1128
- "code": "ORB_EFF_FETCH_BY_ID_PAYLOAD_LIST",
1129
- "category": "effect",
1130
- "description": "A success event only `(fetch X { id: … })` produces declares `data` as a list; a by-id fetch delivers one row (G-ORB-185)."
1143
+ "code": "ORB_O_DUPLICATE_NAME",
1144
+ "category": "orbital",
1145
+ "description": "Two or more orbitals in a program share the same name"
1131
1146
  },
1132
1147
  {
1133
- "code": "ORB_EFF_FETCH_INVALID_OPTION",
1134
- "category": "effect",
1135
- "description": "A `fetch` option outside its closed enum (`deliver: rows | ids`, `total: exact | none`)."
1148
+ "code": "ORB_O_DUPLICATE_USE_ALIAS",
1149
+ "category": "orbital",
1150
+ "description": "Two uses imports share the same alias"
1136
1151
  },
1137
1152
  {
1138
- "code": "ORB_FETCH_DELIVER_IDS_ROWS_READ",
1139
- "category": "effect",
1140
- "description": "`deliver: ids` makes the success event's `data` a row-set reference; any use other than passing it whole as a `render-ui` prop value reads rows that were never delivered."
1153
+ "code": "ORB_O_ENTITY_EXPECT_AMBIGUOUS",
1154
+ "category": "orbital_ref",
1155
+ "description": "An entity an imported orbital expects of a sibling is provided by several sibling imports and no entities entry binds it"
1141
1156
  },
1142
1157
  {
1143
- "code": "ORB_FETCH_DELIVER_IDS_ENTITY_REFS",
1144
- "category": "effect",
1145
- "description": "`deliver: ids` with `include`: included relations are row content."
1158
+ "code": "ORB_O_ENTITY_PERSISTENCE_LOCKED",
1159
+ "category": "orbital",
1160
+ "description": "An entity persistence or collection override on an orbital reference has no effect because the primary entity locks it"
1146
1161
  },
1147
1162
  {
1148
- "code": "ORB_FETCH_DELIVER_IDS_NO_SUCCESS",
1149
- "category": "effect",
1150
- "description": "`deliver: ids` with no `emit.success`: the reference is only ever passed whole to a `render-ui` prop, and nothing can reference a result that no event carries."
1163
+ "code": "ORB_O_ENTITY_TARGET_UNKNOWN",
1164
+ "category": "orbital_ref",
1165
+ "description": "An entities value names no entity the consumer schema declares"
1151
1166
  },
1152
1167
  {
1153
- "code": "ORB_FETCH_TOTAL_NONE_READ",
1154
- "category": "effect",
1155
- "description": "`total: none` skips the count, so the success event's `totalCount` is never set."
1168
+ "code": "ORB_O_ENTITY_UNKNOWN_KEY",
1169
+ "category": "orbital_ref",
1170
+ "description": "An entities key names no entity in the upstream out-of-orbital closure"
1156
1171
  },
1157
1172
  {
1158
- "code": "SEXPR_INVALID_OPERATOR",
1159
- "category": "sexpr",
1160
- "description": "Unknown operator in S-expression"
1173
+ "code": "ORB_O_ENTITY_UNMAPPED",
1174
+ "category": "orbital_ref",
1175
+ "description": "A kept trait, relation or page references an out-of-orbital entity that entities {} never maps"
1161
1176
  },
1162
1177
  {
1163
- "code": "SEXPR_ARITY_MISMATCH",
1164
- "category": "sexpr",
1165
- "description": "Wrong number of arguments for operator"
1178
+ "code": "ORB_O_EXTEND_FIELD_COLLISION",
1179
+ "category": "orbital_ref",
1180
+ "description": "An extend field collides with a field already declared on the upstream primary entity"
1166
1181
  },
1167
1182
  {
1168
- "code": "SEXPR_LAMBDA_ARG_POSITION",
1169
- "category": "sexpr",
1170
- "description": "A `(fn …)` form in an argument position the operator does not take its lambda in — decidable wrong argument order, e.g. `(array/reduce arr (fn …) init)`"
1183
+ "code": "ORB_O_EXTEND_FIELD_UNREAD",
1184
+ "category": "orbital",
1185
+ "description": "A field added by an extend block is never read, set, rendered or forwarded by a config knob"
1171
1186
  },
1172
1187
  {
1173
- "code": "SEXPR_EFFECT_IN_GUARD",
1174
- "category": "sexpr",
1175
- "description": "Effect operator used in guard context"
1188
+ "code": "ORB_O_FIELD_RENAME_UNAPPLIED",
1189
+ "category": "orbital_ref",
1190
+ "description": "A fields rename left the pre-rename field name in a config default position the rewrite does not reach"
1176
1191
  },
1177
1192
  {
1178
- "code": "SEXPR_INVALID_BINDING",
1179
- "category": "sexpr",
1180
- "description": "Invalid binding reference"
1193
+ "code": "ORB_O_MOCK_UNKNOWN_FIELD",
1194
+ "category": "orbital",
1195
+ "description": "A mock block names a field the entity materialized from the referenced orbital does not declare"
1181
1196
  },
1182
1197
  {
1183
- "code": "SEXPR_INVALID_BINDING_PATH",
1184
- "category": "sexpr",
1185
- "description": "Invalid binding path syntax"
1198
+ "code": "ORB_O_OMIT_EMBEDDED_TRAIT",
1199
+ "category": "orbital",
1200
+ "description": "An orbital reference omits a trait that another kept trait embeds"
1186
1201
  },
1187
1202
  {
1188
- "code": "SEXPR_UNKNOWN_ENTITY",
1189
- "category": "sexpr",
1190
- "description": "Unknown entity in binding"
1203
+ "code": "ORB_O_PAGE_UNKNOWN_PATH",
1204
+ "category": "orbital_ref",
1205
+ "description": "A pages or mounts key names a page path that the upstream orbital does not declare"
1191
1206
  },
1192
1207
  {
1193
- "code": "SEXPR_PARSE_ERROR",
1194
- "category": "sexpr",
1195
- "description": "Parse error in S-expression"
1208
+ "code": "ORB_O_RETYPE_FIELD_CONFLICT",
1209
+ "category": "orbital",
1210
+ "description": "A field is both retyped and added by extend in the same orbital reference"
1196
1211
  },
1197
1212
  {
1198
- "code": "ORB_X_DUPLICATE_ENTITY",
1199
- "category": "cross",
1200
- "description": "Duplicate entity name across orbitals"
1213
+ "code": "ORB_O_RETYPE_UNKNOWN_FIELD",
1214
+ "category": "orbital",
1215
+ "description": "A retype block names a field the entity materialized from the referenced orbital does not declare"
1201
1216
  },
1202
1217
  {
1203
- "code": "ORB_X_MIXED_RESIDENCE",
1204
- "category": "cross",
1205
- "description": "One transition's data effects touch both browser-stored and server-stored entities (ORB_X_MIXED_RESIDENCE)"
1218
+ "code": "ORB_O_ROLE_TARGET_NOT_MEMBER",
1219
+ "category": "orbital_ref",
1220
+ "description": "A roles target is not a member of the consumer roster field vocabulary"
1206
1221
  },
1207
1222
  {
1208
- "code": "ORB_X_ORPHAN_LISTENER",
1209
- "category": "cross",
1210
- "description": "Event listener without matching emitter"
1223
+ "code": "ORB_O_ROLE_UNKNOWN_UPSTREAM",
1224
+ "category": "orbital_ref",
1225
+ "description": "A roles key names no value in any upstream identity field vocabulary"
1211
1226
  },
1212
1227
  {
1213
- "code": "ORB_X_UNUSED_EMISSION",
1214
- "category": "cross",
1215
- "description": "Event emitted but never listened to"
1228
+ "code": "ORB_O_TRAITS_OMITTED_TRAIT",
1229
+ "category": "orbital",
1230
+ "description": "A traits override names a trait that omit or only drops from the imported orbital"
1216
1231
  },
1217
1232
  {
1218
- "code": "ORB_EMIT_UNROUTED_TO_HANDLER",
1219
- "category": "cross",
1220
- "description": "A trait emits an event (an `(emit …)` effect or an operator emit-config result) that a SIBLING trait in the same orbital has an arm for, but no declared `listens` route delivers it from that emitter. Events reach another trait only through declared routes, so the intent terminates in nothing (std-pong's PADDLE_MOVE, 2026-09-24)."
1233
+ "code": "ORB_O_TRAITS_UNKNOWN_TRAIT",
1234
+ "category": "orbital_ref",
1235
+ "description": "A traits key names a trait that the upstream orbital does not have"
1221
1236
  },
1222
1237
  {
1223
- "code": "ORB_T_CLIENT_TICK_NOT_LOCAL",
1224
- "category": "cross",
1225
- "description": "A trait writing a client-held `[runtime]` frame from client ticks (or bound to a `[shared]` one another trait ticks) is not `[client]`: its dispatches post to a stateful host whose stale copy folds back."
1238
+ "code": "ORB_PAGE_AMBIGUOUS_CONTENT_OWNER",
1239
+ "category": "page",
1240
+ "description": "Several traits each render a content body into the main slot and none composes the others, so the page has no single content owner"
1226
1241
  },
1227
1242
  {
1228
- "code": "ORB_X_CIRCULAR_DEPENDENCY",
1229
- "category": "cross",
1230
- "description": "Circular dependency in event wiring"
1243
+ "code": "ORB_PAGE_CONTROL_OUTSIDE_SHELL",
1244
+ "category": "page",
1245
+ "description": "A trait paints a control into the main slot of a page whose shell shows another trait as its content, and nothing there embeds it"
1231
1246
  },
1232
1247
  {
1233
- "code": "ORB_X_MISSING_ORBITAL_NAME",
1234
- "category": "cross",
1235
- "description": "Orbital missing name"
1248
+ "code": "ORB_PAGE_FACTS_FIELD_INVALID",
1249
+ "category": "page",
1250
+ "description": "A browser/page-facts effect declares no facts"
1236
1251
  },
1237
1252
  {
1238
- "code": "ORB_X_PAYLOAD_MISMATCH",
1239
- "category": "cross",
1240
- "description": "Payload mismatch between emitter and listener"
1253
+ "code": "ORB_PAGE_NOT_FOUND_DUPLICATE",
1254
+ "category": "page",
1255
+ "description": "A program declares more than one [notFound] page."
1241
1256
  },
1242
1257
  {
1243
- "code": "ORB_X_LISTEN_SOURCE_UNRESOLVED",
1244
- "category": "cross",
1245
- "description": "`listens` references a source trait or event that doesn't exist in the resolved IR. Defense-in-depth backstop for the L1 (`orbital-lolo`) `LowerError::ListenSourceUnresolved` check; surfaces the same defect after `use`-imports inline so atoms/molecules pulled into an orbital can't accidentally introduce dangling listens."
1258
+ "code": "ORB_PAGE_NOT_FOUND_MISSING",
1259
+ "category": "page",
1260
+ "description": "A program with route pages declares no [notFound] page."
1246
1261
  },
1247
1262
  {
1248
- "code": "ORB_X_LISTEN_SOURCE_NEVER_PRODUCES",
1249
- "category": "cross",
1250
- "description": "A `listens { S.E -> TRIGGER }` route whose source trait S DOES declare event E in its `emits[]` contract, but nothing in the schema currently produces E live — no effect emit, no rendered `action:`/ event prop, no structured `itemActions` entry, and no trait embedded (directly or transitively) inside S produces it either. The contract permits it; a config override (an itemActions/browseItemActions narrowed at this call site, say) removed the only producer, so the route is a live wire with nothing behind it — fires whatever the emit's declared `scope` is (`external` included: a cross-orbital broadcast still needs a live broadcaster). Ported from the JS wiring lint's `listener-affordance-removed-by-config`."
1263
+ "code": "ORB_PAGE_SECOND_CONTENT_BODY",
1264
+ "category": "page",
1265
+ "description": "More than one trait on a page renders a content body into the main slot"
1251
1266
  },
1252
1267
  {
1253
- "code": "ORB_X_LISTEN_TRIGGER_UNMATCHED",
1254
- "category": "cross",
1255
- "description": "A `listens { Src.EVENT -> TRIGGER }` entry names an internal TRIGGER that no transition in the SAME trait reacts to. The bus would deliver the event but the state machine has no handler — the wire silently drops. Runs post-inline so the `events: { OLD: NEW }`-rename variant (where the rewrite renamed the transition event but the listen trigger drifted) is caught too. Defense-in-depth for the L1 (`orbital-lolo`) author-time check on hand-authored `.lolo`."
1268
+ "code": "ORB_PAGE_UNREACHABLE",
1269
+ "category": "page",
1270
+ "description": "A page is declared but appears in no link, navItems entry or navigate effect"
1256
1271
  },
1257
1272
  {
1258
- "code": "ORB_X_INTERNAL_EVENT_EXPOSED",
1259
- "category": "cross",
1260
- "description": "Composing trait's override map touches an event declared `scope: 'internal'`. Error severity. See COMP-7 in docs/Almadar_Agent_Behaviors_Plan.md."
1273
+ "code": "ORB_PERSIST_BATCH_BAD_OP",
1274
+ "category": "persist",
1275
+ "description": "A persist batch contains an operation that is not valid in a batch"
1261
1276
  },
1262
1277
  {
1263
- "code": "ORB_X_FILTER_FIELD_NEVER_WRITTEN",
1264
- "category": "cross",
1265
- "description": "A `fetch`'s `filter` compares a LITERAL `(object/get @entity <field>)` against a value, but no `persist create`/`update` anywhere in the schema (own trait, sibling trait, or a `persistent:`-collection-mate entity) ever supplies that field — the filter can never match a real row. Cross-orbital because the persistor routinely lives in a sibling orbital (the modal + persistor idiom). `[identity]`-roster entities and `@intrinsic` fields are exempt; a declared default only exempts the field when it folds, under the trait's resolved config, to the SAME literal the filter's comparand folds to — an undecidable (payload/entity/user-bound) comparand stays silent rather than guessing. Ported from `filter-field-never-written`. Error severity."
1278
+ "code": "ORB_PERSIST_BATCH_MIXED_PLACEMENT",
1279
+ "category": "persist",
1280
+ "description": "A persist batch writes both browser-stored and server-stored entities in one effect, which no single executor can hold"
1266
1281
  },
1267
1282
  {
1268
- "code": "ORB_X_UNRESOLVED_RELATION_TARGET",
1269
- "category": "cross",
1270
- "description": "A `type: 'relation'` field's `relation.entity` does not resolve to any entity declared in the same schema. Error severity; the entity-scope validator also emits `ORB_E_INVALID_RELATION` for the same condition. See COMP-9 in docs/Almadar_Agent_Behaviors_Plan.md."
1283
+ "code": "ORB_PERSIST_BATCH_OPS_NOT_ARRAY",
1284
+ "category": "persist",
1285
+ "description": "A persist batch operations expression is missing or not array-typed"
1271
1286
  },
1272
1287
  {
1273
- "code": "ORB_X_UNRESOLVED_PATTERN_FIELD_REF",
1274
- "category": "cross",
1275
- "description": "A pattern prop tagged `kind: 'field-ref'` (scalar) or `itemKind: 'field-ref'` (array element) carries a value that does not resolve to any field on the linked entity. Error severity. See Phase 3.2/3.3 in docs/Almadar_Agent_Behaviors_Plan.md."
1288
+ "code": "ORB_PERSIST_CREATE_LITERAL_ID",
1289
+ "category": "persist",
1290
+ "description": "A persist create names a literal id, so a second run fails with a duplicate id"
1276
1291
  },
1277
1292
  {
1278
- "code": "ORB_LISTEN_ROUTE_STARVES_REQUIRED_FIELD",
1279
- "category": "cross",
1280
- "description": "A `listens { Src.EVENT -> TRIGGER }` route's TRIGGER declares a required leaf payload field the route never produces: no `with { }` mapping supplies it, and (pass-through, no mapping) the source trait's declared `emits { EVENT { ... } }` contract never declares it at the same dotted path either. The consumer's transition reads `?payload.<field>` as `undefined` at runtime."
1293
+ "code": "ORB_PERSIST_CREATE_MISSING_POLICY_FIELD",
1294
+ "category": "persist",
1295
+ "description": "A persist create data literal omits a field its entity's create access policy compares, so the row can never satisfy the policy"
1281
1296
  },
1282
1297
  {
1283
- "code": "ORB_LISTEN_REDUNDANT_EMBED_ROUTE",
1284
- "category": "cross",
1285
- "description": "A host trait's `listens { Child.EV -> EV }` route where `Child` is a trait the host embeds (directly or transitively), `EV` is fired by a control inside `Child`'s subtree, and the host already has a transition on `EV`. The control's emit bubbles to every scope on the embed chain, so the host already hears it directly; the route is a second delivery of the same physical event."
1298
+ "code": "ORB_PERSIST_ID_NOT_A_PATH",
1299
+ "category": "persist",
1300
+ "description": "A persist effect names its row id with an expression instead of a binding path or literal id, so no row key resolves"
1286
1301
  },
1287
1302
  {
1288
- "code": "ORB_LISTEN_WILDCARD_UNKEYED",
1289
- "category": "cross",
1290
- "description": "A `*.EVENT` route on an event whose payload carries a `CallKey`-typed `key`, with a guard that never reads it."
1303
+ "code": "ORB_PERSIST_WHERE_NOT_A_PREDICATE",
1304
+ "category": "persist",
1305
+ "description": "A persist where clause is not a valid row predicate"
1291
1306
  },
1292
1307
  {
1293
- "code": "ORB_BINDING_INVALID_FORMAT",
1294
- "category": "binding",
1295
- "description": "Binding has invalid format"
1308
+ "code": "ORB_PLACEMENT_ORBITAL_DUPLICATE",
1309
+ "category": "placement",
1310
+ "description": "An orbital is placed more than once in the deployment"
1296
1311
  },
1297
1312
  {
1298
- "code": "ORB_BINDING_UNKNOWN_ROOT",
1299
- "category": "binding",
1300
- "description": "Unknown binding root"
1313
+ "code": "ORB_PLACEMENT_ORBITAL_UNKNOWN",
1314
+ "category": "placement",
1315
+ "description": "A deployment unit lists an orbital name that is not an orbital of the program"
1301
1316
  },
1302
1317
  {
1303
- "code": "ORB_CONFIG_DANGLING_REF",
1304
- "category": "binding",
1305
- "description": "`@config.<key>` literal whose key no reachable config schema declares"
1318
+ "code": "ORB_PLACEMENT_ORBITAL_UNPLACED",
1319
+ "category": "placement",
1320
+ "description": "A deployment is declared but an orbital belongs to none of its units"
1306
1321
  },
1307
1322
  {
1308
- "code": "ORB_CONFIG_FIELD_REF_UNKNOWN",
1309
- "category": "binding",
1310
- "description": "A `field @entity` config knob names something that is not a field of the trait's bound entity"
1323
+ "code": "ORB_PLACEMENT_UNIT_EMPTY",
1324
+ "category": "placement",
1325
+ "description": "A deployment unit lists no orbital"
1311
1326
  },
1312
1327
  {
1313
- "code": "ORB_CONFIG_FIELD_REF_TYPE_MISMATCH",
1314
- "category": "binding",
1315
- "description": "A `field @entity T` config knob names a field whose type is not `T`"
1328
+ "code": "ORB_P_AUTH_NO_SIGN_IN",
1329
+ "category": "page",
1330
+ "description": "A page requires authenticated access but the app declares no signIn route"
1316
1331
  },
1317
1332
  {
1318
- "code": "ORB_BINDING_INVALID_PATH",
1319
- "category": "binding",
1320
- "description": "Invalid binding path"
1333
+ "code": "ORB_P_DUPLICATE_PATH",
1334
+ "category": "page",
1335
+ "description": "Two pages declare the same path after normalization"
1321
1336
  },
1322
1337
  {
1323
- "code": "ORB_BINDING_STATE_NO_PATH",
1324
- "category": "binding",
1325
- "description": "@state binding should not have path"
1338
+ "code": "ORB_P_EMPTY_TRAITS",
1339
+ "category": "page",
1340
+ "description": "A page declares an empty traits array"
1326
1341
  },
1327
1342
  {
1328
- "code": "ORB_BINDING_NOW_NO_PATH",
1329
- "category": "binding",
1330
- "description": "@now binding should not have path"
1343
+ "code": "ORB_P_HOST_RESERVED_ROUTE",
1344
+ "category": "page",
1345
+ "description": "A page is declared on the host's reserved sign-in route"
1331
1346
  },
1332
1347
  {
1333
- "code": "ORB_BINDING_PAYLOAD_IN_TICK",
1334
- "category": "binding",
1335
- "description": "@payload not available in tick context"
1348
+ "code": "ORB_P_INDEX_PARAM_ROUTE",
1349
+ "category": "page",
1350
+ "description": "A parameter-route page is marked indexing index although its concrete URLs are not declared"
1336
1351
  },
1337
1352
  {
1338
- "code": "ORB_BINDING_DISPATCH_ROOT_IN_TICK",
1339
- "category": "binding",
1340
- "description": "`@event`/`@prevEvents`/`@prevStates`/`@fromState`/`@toState` in a tick, which has no delivery"
1353
+ "code": "ORB_P_INDEX_REQUIRES_PUBLIC",
1354
+ "category": "page",
1355
+ "description": "A page declares indexing: index but lacks the public access it requires"
1341
1356
  },
1342
1357
  {
1343
- "code": "ORB_BINDING_FROM_ENTITY_OUTSIDE_ENSURES",
1344
- "category": "binding",
1345
- "description": "`@fromEntity` (the row before a transition) outside an `@ensures`"
1358
+ "code": "ORB_P_INVALID_PATH",
1359
+ "category": "page",
1360
+ "description": "A page or navigate path does not start with a slash"
1346
1361
  },
1347
1362
  {
1348
- "code": "ORB_BINDING_ROOT_NO_PATH",
1349
- "category": "binding",
1350
- "description": "`@fromState`/`@toState`/`@prevStates`/`@prevEvents` written with a path"
1363
+ "code": "ORB_P_INVALID_TRAIT_REF",
1364
+ "category": "page",
1365
+ "description": "A page's inline trait reference has no name"
1351
1366
  },
1352
1367
  {
1353
- "code": "ORB_BINDING_EVENT_INVALID_PATH",
1354
- "category": "binding",
1355
- "description": "`@event.<path>` that does not follow the `{ event, payload, source }` record"
1368
+ "code": "ORB_P_INVALID_VIEW_TYPE",
1369
+ "category": "page",
1370
+ "description": "A page declares a view type that is not a valid view type"
1356
1371
  },
1357
1372
  {
1358
- "code": "ORB_BINDING_UNKNOWN_ENTITY",
1359
- "category": "binding",
1360
- "description": "Unknown entity in @EntityName binding"
1373
+ "code": "ORB_P_MISSING_NAME",
1374
+ "category": "page",
1375
+ "description": "A page does not declare a name"
1361
1376
  },
1362
1377
  {
1363
- "code": "ORB_BINDING_INVALID_FIELD_NAME",
1364
- "category": "binding",
1365
- "description": "Invalid field name in binding path"
1378
+ "code": "ORB_P_MISSING_PATH",
1379
+ "category": "page",
1380
+ "description": "A page is missing its required path"
1366
1381
  },
1367
1382
  {
1368
- "code": "ORB_BINDING_SET_TARGET_MISSING_PATH",
1369
- "category": "binding",
1370
- "description": "Set target missing field path"
1383
+ "code": "ORB_P_MISSING_TRAITS",
1384
+ "category": "page",
1385
+ "description": "A page has no traits array for trait-driven UI"
1371
1386
  },
1372
1387
  {
1373
- "code": "ORB_BINDING_PAYLOAD_FIELD_UNDECLARED",
1374
- "category": "binding",
1375
- "description": "@payload.field references a field not declared in event payload schema"
1388
+ "code": "ORB_P_SIGN_IN_UNKNOWN_ROUTE",
1389
+ "category": "page",
1390
+ "description": "The app's signIn route names a path that is no page of the app"
1376
1391
  },
1377
1392
  {
1378
- "code": "ORB_BINDING_PAYLOAD_TYPE_INCOMPATIBLE",
1379
- "category": "binding",
1380
- "description": "@payload.field is declared but its type does not match the operator argument or comparison it appears in (e.g. string used where a number was expected). Warn-only in V2 Phase 0 rollout; escalates to error in the Phase 5 cleanup. Wired up in a follow-up pass over operator signatures; the class is declared here so the code path can reference it and emit warnings incrementally."
1393
+ "code": "ORB_P_TRANSLATION_DUPLICATE_LOCALE",
1394
+ "category": "page",
1395
+ "description": "A translation group holds more than one page in the same locale"
1381
1396
  },
1382
1397
  {
1383
- "code": "ORB_X_SET_VALUE_TYPE_MISMATCH",
1384
- "category": "effect",
1385
- "description": "`(set @entity.X ?payloadField)` writes a payload field whose declared type does not match the target entity field's declared type. The lolo crate catches this at author time for `.lolo`; this is the raw-`.orb` defense-in-depth backstop. Payload field types are sourced from the trait's `emits[].payload_schema` and `listens` payload metadata."
1398
+ "code": "ORB_RANDOM_BYTES_COUNT",
1399
+ "category": "random",
1400
+ "description": "A random-bytes count argument is outside the allowed integer range"
1386
1401
  },
1387
1402
  {
1388
- "code": "ORB_X_ENUM_VALUE_NOT_MEMBER",
1389
- "category": "effect",
1390
- "description": "`(set @entity.X literal)` assigns a string literal that is not a member of the target field's declared enum (`values: [...]`). The declared union was previously validated + emitted but never enforced — an out-of-set value passed silently. The lolo crate catches this at author time for `.lolo`; this is the raw-`.orb` defense-in-depth backstop."
1403
+ "code": "ORB_RENDER_ACTION_LIFECYCLE_EVENT",
1404
+ "category": "render_ui",
1405
+ "description": "A rendered pattern prop targets a lifecycle event that the bus never delivers"
1391
1406
  },
1392
1407
  {
1393
- "code": "ORB_X_SET_RETURN_TYPE_MISMATCH",
1394
- "category": "effect",
1395
- "description": "`(set @entity.X (op …))` assigns an operator/expression value whose inferred result type is incompatible with the target field's declared type (e.g. `(set @entity.count (str/concat …))` into a `number` field). The value's type is inferred *through* the S-expression via the canonical operator `return_semantics` lattice; an unknowable result (`Json`) never rejects (Gap G-LOLO-SET-OP-RETURN)."
1408
+ "code": "ORB_RENDER_GROUPBY_ENUM_COLUMN_GAP",
1409
+ "category": "render_ui",
1410
+ "description": "A groupBy column set omits enum values of the field, so rows with those values match no column and disappear"
1396
1411
  },
1397
1412
  {
1398
- "code": "ORB_X_COMPARISON_OPERAND_TYPE_MISMATCH",
1399
- "category": "effect",
1400
- "description": "An ordering comparison (`<`, `<=`, `>`, `>=`) whose operands infer to a number on one side and a string on the other. The JS runtime coerces, the compiled TypeScript does not typecheck, and Rust compares kinds — the paths disagree. Convert one side so both are the same kind."
1413
+ "code": "ORB_RENDER_ORBITAL_VALUE_EMBEDDED",
1414
+ "category": "render_ui",
1415
+ "description": "A render-ui embeds an orbital value, but only trait values can be rendered"
1401
1416
  },
1402
1417
  {
1403
- "code": "ORB_X_OPERATOR_ARG_TYPE_MISMATCH",
1404
- "category": "effect",
1405
- "description": "An operator argument whose static type contradicts the type the operator table declares for its position — `(str/upper @entity.count)` with `count: number`, `(+ \"a\" 1)`. Both evaluators raise the same typed mismatch at run time (D-12), so the program can never do what it says."
1418
+ "code": "ORB_RENDER_UNBOUND_TRAIT_KNOB_EMBEDDED",
1419
+ "category": "render_ui",
1420
+ "description": "A render-ui embeds a trait-typed value that may be unbound without a guard, so it renders nothing"
1406
1421
  },
1407
1422
  {
1408
- "code": "ORB_X_OPERATOR_ARG_UNDETERMINED",
1409
- "category": "effect",
1410
- "description": "A value handed to an operator's type variable has no determined type — an unresolved expression, an expression value, json, a list whose items share no type — so what the variable stands for, and the type of the call's result, is unknown. There are no generic types: give the value a real type (a declared payload or entity shape, a named union alias for a list of differently-shaped items)."
1423
+ "code": "ORB_RUI_CHILD_NOT_DRAWABLE",
1424
+ "category": "render_ui",
1425
+ "description": "A non-drawable child is composed under a canvas draw-host, which paints only neutral drawable descriptors"
1411
1426
  },
1412
1427
  {
1413
- "code": "ORB_X_ORDERING_OPTIONAL_OPERAND",
1414
- "category": "effect",
1415
- "description": "An ordering comparison (`<`, `<=`, `>`, `>=`) over an operand that can be missing or null — an optional entity field with no default, an optional payload field — that the program neither guards with a presence check (`(and (validate/required x) (< x 3))`, an `if`/`when` on presence) nor declares a default for. Both evaluators read a missing value as below any number; every push-down store fails the comparison, so the meaning is the program's to state."
1428
+ "code": "ORB_RUI_ELEMENT_SHAPE_MISMATCH",
1429
+ "category": "render_ui",
1430
+ "description": "An element of a pattern prop is missing a field required by the pattern's element shape"
1416
1431
  },
1417
1432
  {
1418
- "code": "ORB_X_OPERATOR_NULL_OPERAND",
1419
- "category": "effect",
1420
- "description": "An operand that can be missing or null — an optional entity field with no default, an optional payload field — handed to a position the kernel raises on when it is null (`rejectsNull` in the operator table), with no presence check or default in front of it. The program says what a missing value means: a guard, a default, or a required field."
1433
+ "code": "ORB_RUI_FORM_FIELD_INTRINSIC",
1434
+ "category": "render_ui",
1435
+ "description": "A form pattern offers an input for an intrinsic entity field, which is never persisted so the input is discarded"
1421
1436
  },
1422
1437
  {
1423
- "code": "ORB_X_SET_REQUIRED_FIELD_FROM_OPTIONAL_KNOB",
1424
- "category": "effect",
1425
- "description": "`(set @entity.X @config.<knob>)` where the value is STILL the literal `@config.<knob>` token post-inline (no default resolved it, no call-site override supplied one) and `X` is a REQUIRED entity field. The emitter has nothing honest to assign — a required TS slot gets `undefined`. Give the knob a default or make the field optional."
1438
+ "code": "ORB_RUI_INVALID_FIELD_PATH",
1439
+ "category": "render_ui",
1440
+ "description": "A nested field path references an invalid relation or field"
1426
1441
  },
1427
1442
  {
1428
- "code": "ORB_EMIT_PAYLOAD_MISSING_REQUIRED",
1429
- "category": "binding",
1430
- "description": "`(emit EVT {...})` literal payload is missing a field the event's declared payload marks as required. Error severity."
1443
+ "code": "ORB_RUI_INVALID_ITEM_ACTION",
1444
+ "category": "render_ui",
1445
+ "description": "An itemAction configuration on a rendered pattern is invalid"
1431
1446
  },
1432
1447
  {
1433
- "code": "ORB_EMIT_PAYLOAD_EXTRA_FIELD",
1434
- "category": "binding",
1435
- "description": "`(emit EVT {...})` literal carries a field that is not declared on the event's payload schema. Error severity."
1448
+ "code": "ORB_RUI_INVALID_PATTERN",
1449
+ "category": "render_ui",
1450
+ "description": "A render-ui pattern type is not in the pattern registry"
1436
1451
  },
1437
1452
  {
1438
- "code": "ORB_EMIT_PAYLOAD_FIELD_TYPE_MISMATCH",
1439
- "category": "binding",
1440
- "description": "`(emit EVT {...})` literal provides a value whose primitive type does not match the declared `PayloadField.field_type`. Error severity."
1453
+ "code": "ORB_RUI_INVALID_PROP",
1454
+ "category": "render_ui",
1455
+ "description": "A render-ui pattern is given a prop that the pattern does not define"
1441
1456
  },
1442
1457
  {
1443
- "code": "ORB_USER_INTO_REQUIRED_SLOT",
1444
- "category": "binding",
1445
- "description": "The whole `@user` record fills a required slot (an emit payload `X!`, a required entity field) with no guard on its presence: a dispatch with no viewer (an os/ completion, a tick) has a null `@user`. Error severity."
1458
+ "code": "ORB_RUI_INVALID_SLOT",
1459
+ "category": "render_ui",
1460
+ "description": "A render-ui effect targets an invalid slot"
1446
1461
  },
1447
1462
  {
1448
- "code": "ORB_EMIT_REPEATS_IDENTICALLY",
1449
- "category": "binding",
1450
- "description": "An `emit` repeats an earlier one of the same transition identically: the dispatch loop collapses the second."
1463
+ "code": "ORB_RUI_MISSING_ACTION",
1464
+ "category": "render_ui",
1465
+ "description": "A render-ui pattern that needs an interaction target has no action, onClick, event or href"
1451
1466
  },
1452
1467
  {
1453
- "code": "ORB_X_PAYLOAD_FIELD_NAME",
1454
- "category": "binding",
1455
- "description": "An event/emit `payloadSchema` field name is not a valid TypeScript identifier (contains a dot, space, or leading digit). Codegen turns each field into a struct member, so `row.category` would emit broken TS. Validate-layer defense-in-depth for the lowering pass that flattens nested payload field names. Error severity."
1468
+ "code": "ORB_RUI_MISSING_PATTERN_TYPE",
1469
+ "category": "render_ui",
1470
+ "description": "A render-ui pattern has no type property"
1456
1471
  },
1457
1472
  {
1458
- "code": "ORB_X_UNTYPED_ARRAY",
1459
- "category": "entity",
1460
- "description": "An array field (entity or payload-schema) declares no element type."
1473
+ "code": "ORB_RUI_MISSING_REQUIRED_PROP",
1474
+ "category": "render_ui",
1475
+ "description": "A render-ui pattern is missing a prop that the pattern requires"
1461
1476
  },
1462
1477
  {
1463
- "code": "ORB_X_ENTITY_PROP_CONTRACT",
1478
+ "code": "ORB_RUI_PROP_TYPE_MISMATCH",
1464
1479
  "category": "render_ui",
1465
- "description": "A render-ui pattern prop typed `EntityWith<K>` declares required entity fields (`requiredFields` in the registry), but the bound entity does not provide them and no remap/field-map supplies them. The component would render blank rows. Remap-aware (runs post-inline). Error severity."
1480
+ "description": "A render-ui pattern prop has a value that is not one of its allowed values"
1466
1481
  },
1467
1482
  {
1468
- "code": "ORB_EMIT_SUCCESS_PAYLOAD_RETURN_MISMATCH",
1469
- "category": "binding",
1470
- "description": "**RETIRED (2026-08-30) — superseded by `EmitPayloadNotProduced`, which checks the full shape rather than only the empty-payload case.** No longer raised anywhere; the variant is kept so external tooling matching on the wire string `ORB_EMIT_SUCCESS_PAYLOAD_RETURN_MISMATCH` does not break on an unknown code. `emit: { success: \"X\" }` config on a data operator declares success event X but X's declared payload does not match the operator's `effect.produces` at this call site. Warn-only."
1483
+ "code": "ORB_RUI_RENDERABLE_IN_GENERIC_FIELD",
1484
+ "category": "render_ui",
1485
+ "description": "A render-ui pattern literal is passed to a field not typed node, hiding renderable content from render-ui checks"
1471
1486
  },
1472
1487
  {
1473
- "code": "ORB_EMIT_PAYLOAD_NOT_PRODUCED",
1474
- "category": "binding",
1475
- "description": "**The payload invariant.** An event's declared payload type IS its access path: declaring `Survey` means the payload is the row (read `?name`); declaring `{ row : Survey }` means read `?row.name`. This fires when an event declares a field that the effect firing it does not actually emit — so every read of that field is `undefined` at runtime, even though `orb validate` and `orb verify` otherwise pass. Checked as width subtyping (`declared ⊆ produced`): declaring FEWER fields than are emitted is legal, declaring one that is never emitted is not. Replaces the narrower `EmitSuccessPayloadWrapped` (persist-only) and `EmitSuccessPayloadReturnMismatch` (empty-payload-only) checks. Error severity."
1488
+ "code": "ORB_SET_COLUMN_WITHOUT_ROW",
1489
+ "category": "entity_mutation",
1490
+ "description": "A set writes an entity column with no row in scope and no persist create or update that could land it"
1476
1491
  },
1477
1492
  {
1478
- "code": "ORB_EMIT_SUCCESS_PAYLOAD_WRAPPED",
1479
- "category": "binding",
1480
- "description": "**RETIRED (2026-08-30) — superseded by `EmitPayloadNotProduced`.** This check only recognised a wrapper on `persist create`/`update` whose type named that exact entity; the general rule catches the same defect at any operator and in shapes this one was blind to (a wrapper naming a different entity, a field the operator never emits at all). Kept so external tooling matching `ORB_EMIT_SUCCESS_PAYLOAD_WRAPPED` still resolves. A `persist create`/`persist update` call's `emit: { success: \"X\" }` names an event X whose declared payload wraps the persisted entity under a single field (`type X = Event { row: EntityName }`), but `persist create`/`update` emits the persisted row directly (flat, unwrapped) on success in both @almadar/runtime and orbital-core — verified live 2026-08-30 (std-thread's `ThreadPostCreated`): a wrapped declaration validates and compiles clean but every `?row.<field>` read silently returns undefined at runtime. Warn-only."
1493
+ "code": "ORB_SHARED_ENTITY_FIELD_CONFLICT",
1494
+ "category": "entity_mutation",
1495
+ "description": "A field of a shared entity is written by more than one trait"
1481
1496
  },
1482
1497
  {
1483
- "code": "ORB_X_CROSS_EMITTER_DECLARED_PAYLOAD_MISMATCH",
1484
- "category": "cross",
1485
- "description": "Phase F.2: two or more traits declare the same external event name in their `emits` arrays but disagree on the declared payload field list. Consumers that listen on the event will see one shape from one emitter and a different shape from another. Error severity."
1498
+ "code": "ORB_SHARED_ENTITY_RENDER_AUTHORITY",
1499
+ "category": "entity_mutation",
1500
+ "description": "A shared entity is render-ui-read by more than one trait, but only one render authority is allowed per entity and slot"
1486
1501
  },
1487
1502
  {
1488
- "code": "ORB_X_DUPLICATE_TRAIT_ID",
1489
- "category": "cross",
1490
- "description": "Two traits of one program carry the same trait id; listens match sources by id, so each hears the other's emits."
1503
+ "code": "ORB_SLOT_CONTENTION",
1504
+ "category": "slot",
1505
+ "description": "Multiple traits on a page render into the same slot"
1491
1506
  },
1492
1507
  {
1493
- "code": "ORB_BINDING_ENTITY_FIELD_NOT_FOUND",
1494
- "category": "binding",
1495
- "description": "@entity.field references a field not present on the linked entity"
1508
+ "code": "ORB_SLOT_CONTENTION_RUNTIME",
1509
+ "category": "slot",
1510
+ "description": "Several traits render to the same slot in the same state, so they contend for it"
1496
1511
  },
1497
1512
  {
1498
- "code": "ORB_BINDING_ENTITY_FIELD_NEVER_SET",
1499
- "category": "binding",
1500
- "description": "@entity.field is referenced by render-ui / guard / effect but no transition in the same trait runs `(set @entity.field <value>)`. Per the explicit-binding rule, every `@entity.X` read must be backed by at least one explicit setter; otherwise the value is undefined and the component renders empty. Surfaces post-inline so atoms imported via `uses` get checked too. Defense-in-depth backstop for the L1 `LowerError::EntityFieldNeverSet` check."
1513
+ "code": "ORB_SLOT_CONTENTION_TICK",
1514
+ "category": "slot",
1515
+ "description": "Several traits on a page render into the same slot from ticks, so their output contends"
1501
1516
  },
1502
1517
  {
1503
- "code": "ORB_BINDING_PERSIST_ROW_ID_NEVER_SET",
1504
- "category": "binding",
1505
- "description": "`(persist update|delete <Entity> @entity)` passes the WHOLE row, so the row key never appears as an `@entity.id` read and `BindingEntityFieldNeverSet` cannot see it. An unbound `id` resolves empty and the runtime refuses the write outright."
1518
+ "code": "ORB_SLOT_INVALID_NESTING",
1519
+ "category": "slot",
1520
+ "description": "A slot is nested in an invalid way"
1506
1521
  },
1507
1522
  {
1508
- "code": "ORB_BINDING_EMBED_READS_ARM_WRITE",
1509
- "category": "binding",
1510
- "description": "A transition writes `@entity.F` (or its whole row) and renders an embedded trait (`@trait.X`, incl. a hoisted inline `<A.traits.T/>`) whose call-site value reads that field of the same PERSISTENT entity. The embed resolves `@entity` against its own frame at its own render (its mount), so it shows the value from before this transition. Read the value the transition used instead (a call-site capture, `?row.F`), or route the host event to the embed's INIT."
1523
+ "code": "ORB_SLOT_MAIN_NOT_COVERED",
1524
+ "category": "slot",
1525
+ "description": "No trait on a page renders anything into the main slot"
1511
1526
  },
1512
1527
  {
1513
- "code": "ORB_PERSIST_CREATE_MISSING_POLICY_FIELD",
1514
- "category": "binding",
1515
- "description": "`persist create E { ... }` with an explicit data literal whose key set lacks a field that `E.@create` compares (e.g. `@create sender == @user.id` and the literal has no `sender`). The access policy will never be satisfied by a row this transition itself creates — every future `@update`/`@delete`/`@read` gated on that field locks the creator out of their own row. A bare `persist create @entity` (whole frame) is not a hit. Wave 2. Error severity."
1528
+ "code": "ORB_STORE_DRIVER_CONTRACT",
1529
+ "category": "store",
1530
+ "description": "A store driver has no trait handling one or more verbs required by the row-store driver contract"
1516
1531
  },
1517
1532
  {
1518
- "code": "ORB_PERSIST_CREATE_LITERAL_ID",
1519
- "category": "binding",
1520
- "description": "`persist create E { id: \"literal\", … }`: the row names a string-literal id, so the second run creates a row that already exists and fails with `duplicate-id`. A seed or singleton re-save is an authored `persist upsert` (create-or-replace by id). Error severity."
1533
+ "code": "ORB_STORE_DRIVER_NOT_CONDITIONAL",
1534
+ "category": "store",
1535
+ "description": "A conditional persist op is bound to a store driver that cannot execute conditional writes"
1521
1536
  },
1522
1537
  {
1523
- "code": "ORB_PERSIST_ID_NOT_A_PATH",
1524
- "category": "binding",
1525
- "description": "`persist delete E <expression>` / `persist update E <expression> data`: the single forms take the row id as a binding path or a literal, so an expression resolves no row key at run time. Error severity."
1538
+ "code": "ORB_STORE_ON_NON_PERSISTENT",
1539
+ "category": "store",
1540
+ "description": "An entity binds a store but its rows live in no store"
1526
1541
  },
1527
1542
  {
1528
- "code": "ORB_PERSIST_WHERE_NOT_A_PREDICATE",
1529
- "category": "binding",
1530
- "description": "`persist … { where: … }`: the guard is a one-param `fn` over the stored row that never reads the frame (`@entity`), on a single `delete` or `update` only (EXEC-STEP-8). Error severity."
1543
+ "code": "ORB_STORE_UNKNOWN_ORBITAL",
1544
+ "category": "store",
1545
+ "description": "A store binding names an orbital that is not part of the program"
1531
1546
  },
1532
1547
  {
1533
- "code": "ORB_EFFECT_IN_LAMBDA",
1534
- "category": "binding",
1535
- "description": "An effect (`emit`, `persist`, `set`, `notify`, …) inside the `fn` body of a collection operator: a lambda is evaluated for its value, an effect there never runs. Error severity."
1548
+ "code": "ORB_STORE_VERB_OUTSIDE_SEAM",
1549
+ "category": "store",
1550
+ "description": "A trait emits a row-store verb directly, but a store driver may be asked only by the store seam"
1536
1551
  },
1537
1552
  {
1538
- "code": "ORB_BINDING_TRAIT_MISSING_NAME",
1539
- "category": "binding",
1540
- "description": "`@trait` binding with no trait name — bare `@trait` is not resolvable."
1553
+ "code": "ORB_S_ACCESS_POLICY_INVALID_BINDING",
1554
+ "category": "schema",
1555
+ "description": "An access directive uses a binding other than the ones legal there"
1541
1556
  },
1542
1557
  {
1543
- "code": "ORB_BINDING_TRAIT_INVALID_FORMAT",
1544
- "category": "binding",
1545
- "description": "`@trait.X` trait name doesn't match the `PascalCase` identifier pattern."
1558
+ "code": "ORB_S_ACCESS_POLICY_REQUIRES_IDENTITY",
1559
+ "category": "schema",
1560
+ "description": "An access directive reads @user but the program declares no identity entity"
1546
1561
  },
1547
1562
  {
1548
- "code": "ORB_BINDING_TRAIT_UNKNOWN",
1549
- "category": "binding",
1550
- "description": "`@trait.X` references a trait not declared in the current orbital."
1563
+ "code": "ORB_S_ACCESS_POLICY_UNKNOWN_ENTITY_FIELD",
1564
+ "category": "schema",
1565
+ "description": "An access policy references a name that is not a field of its entity, so it resolves to null and denies everyone"
1551
1566
  },
1552
1567
  {
1553
- "code": "ORB_BINDING_TRAIT_SELF_REFERENCE",
1554
- "category": "binding",
1555
- "description": "A trait's render-ui references itself via `@trait.<self>`."
1568
+ "code": "ORB_S_COLLECTION_POLICY_CONFLICT",
1569
+ "category": "schema",
1570
+ "description": "Entities bound to the same collection declare different access directives"
1556
1571
  },
1557
1572
  {
1558
- "code": "ORB_BINDING_TRAIT_CYCLE",
1559
- "category": "binding",
1560
- "description": "Cycle detected in the `@trait.X` reference graph (e.g. A → B → A)."
1573
+ "code": "ORB_S_EMPTY_VERSION",
1574
+ "category": "schema",
1575
+ "description": "The schema version is empty"
1561
1576
  },
1562
1577
  {
1563
- "code": "ORB_BINDING_TRAIT_INVALID_POSITION",
1564
- "category": "binding",
1565
- "description": "`@trait.X` appears outside a `children:` array or a `node`-typed pattern prop — valid positions are where a subtree can be substituted."
1578
+ "code": "ORB_S_EXPECTATION_FIELD_UNDECLARED",
1579
+ "category": "schema",
1580
+ "description": "An effect persists a field that the orbital's expects entity shape does not declare"
1566
1581
  },
1567
1582
  {
1568
- "code": "ORB_BINDING_TRAIT_OUTSIDE_RENDER_UI",
1569
- "category": "binding",
1570
- "description": "`@trait.X` (a render-only, client-side binding) appears outside a `render-ui` effect entirely — in a guard, a non-render effect (`fetch`/`set`/`persist`/`ref`/`call-service`), or a tick. Trait references are render-time composition primitives and have no meaning in data/effects/control flow."
1583
+ "code": "ORB_S_EXPECTATION_PROVIDER_MISMATCH",
1584
+ "category": "schema",
1585
+ "description": "An expectation requires a field to be marked as a key but the providing entity declares it without that mark"
1571
1586
  },
1572
1587
  {
1573
- "code": "ORB_RENDER_UNBOUND_TRAIT_KNOB_EMBEDDED",
1574
- "category": "render_ui",
1575
- "description": "A render-ui payload embeds `@config.<knob>` (as a child or inside a `children` entry) where `<knob>` is a `trait`-typed config field whose resolved value is `none` (unbound), and the render-ui is not guarded by an `(if @config.<knob> ...)` wrapping it in the same effect list. An unbound trait knob's embed renders nothing — the closed-circuit rule that no wire may terminate in nothing (owner ruling 2026-09-13: a `trait`-typed config knob may be `none`)."
1588
+ "code": "ORB_S_EXPECTATION_UNSATISFIED",
1589
+ "category": "schema",
1590
+ "description": "An orbital expects an entity, trait, event, or config default that nothing in the program provides"
1576
1591
  },
1577
1592
  {
1578
- "code": "ORB_RENDER_ORBITAL_VALUE_EMBEDDED",
1579
- "category": "render_ui",
1580
- "description": "A render-ui payload embeds an `orbital`-typed field: an orbital value is data (an import body) and never renders — only trait values embed."
1593
+ "code": "ORB_S_EXPECTED_FIELD_NOT_PROVIDED",
1594
+ "category": "schema",
1595
+ "description": "A rebound entity does not provide a field that the trait expects it to have"
1581
1596
  },
1582
1597
  {
1583
- "code": "ORB_EMBED_BRIDGE_LISTENS_UNSENT",
1584
- "category": "render_ui",
1585
- "description": "A bridged embed delivers an event nothing in the program sends."
1598
+ "code": "ORB_S_EXPECTED_FIELD_TYPE_MISMATCH",
1599
+ "category": "schema",
1600
+ "description": "The provider has the expected field or knob but with an incompatible type"
1586
1601
  },
1587
1602
  {
1588
- "code": "ORB_EMBED_BRIDGE_EMITS_UNHEARD",
1589
- "category": "render_ui",
1590
- "description": "A bridged embed re-emits an event nothing in the program handles."
1603
+ "code": "ORB_S_IDENTITY_NOT_UNIQUE",
1604
+ "category": "schema",
1605
+ "description": "More than one entity is tagged identity, making every @user field reference ambiguous"
1591
1606
  },
1592
1607
  {
1593
- "code": "ORB_ENTITY_SPLIT_MUTATION",
1594
- "category": "entity_mutation",
1595
- "description": "A non-`[shared]`, `Runtime`-persistence entity is mutated (via `set` or a tick write) by ≥2 distinct traits. Each mutator gets an isolated per-trait copy, so if one of the mutators' render-ui also reads the entity, it only ever sees its own trait's writes — never the others'. Error severity: add `[shared]` to the entity, or isolate the mutators."
1608
+ "code": "ORB_S_INVARIANT_UNPROVED",
1609
+ "category": "spec",
1610
+ "description": "A spec proposition the prover cannot decide, so the program is not shown to keep it"
1596
1611
  },
1597
1612
  {
1598
- "code": "ORB_SHARED_ENTITY_FIELD_CONFLICT",
1599
- "category": "entity_mutation",
1600
- "description": "A `[shared]` entity has ≥2 distinct traits writing the SAME field. Coupled mechanics writing one field must be one ordered pipeline, not parallel writers — undefined last-write-wins ordering otherwise."
1613
+ "code": "ORB_S_INVARIANT_VIOLATED",
1614
+ "category": "spec",
1615
+ "description": "A spec proposition (invariant, holds, ensures) is broken by a write, with a counterexample the evaluator confirms"
1601
1616
  },
1602
1617
  {
1603
- "code": "ORB_SHARED_ENTITY_RENDER_AUTHORITY",
1604
- "category": "entity_mutation",
1605
- "description": "A `[shared]` entity is render-ui-read by more than one distinct trait. Exactly one render authority is allowed per shared entity, mirroring `SlotContention`'s single-owner rule."
1618
+ "code": "ORB_S_MISSING_NAME",
1619
+ "category": "schema",
1620
+ "description": "The schema does not declare a name"
1606
1621
  },
1607
1622
  {
1608
- "code": "ORB_E_MERGED_FIELD_UNREFERENCED",
1609
- "category": "entity_mutation",
1610
- "description": "Post-inline: an entity field carrying `mergedFrom` (added by the rebind-merge auto-merge, `merge_imported_entity_fields`) that no trait of the consuming orbital reads, writes, fetch-includes, or persists — R-ENTITY-FIELD-UNION-ACROSS-SAME-NAMED-ENTITY. The merge already narrows to referenced fields at compose time; this catches drift when a later edit removes the trait/effect that used to justify the merge. Error severity."
1623
+ "code": "ORB_S_NO_ORBITALS",
1624
+ "category": "schema",
1625
+ "description": "The schema declares no orbitals"
1611
1626
  },
1612
1627
  {
1613
- "code": "ORB_TICK_REQUIRES_RUNTIME",
1614
- "category": "entity_mutation",
1615
- "description": "A trait runs a non-`Cron` tick (frame/duration interval) against a `Persistent` linked entity. Corpus-facing backstop mirroring the lolo L1 tick guards. Error severity."
1628
+ "code": "ORB_S_OWNER_FIELD_NOT_IDENTITY_TYPED",
1629
+ "category": "schema",
1630
+ "description": "An access directive compares a field to @user.id but the field is not a relation to the identity entity"
1616
1631
  },
1617
1632
  {
1618
- "code": "ORB_TICK_ASYNC_EFFECT",
1619
- "category": "entity_mutation",
1620
- "description": "A non-`Cron` tick effect calls a server-async operator (the canonical registry's `std-agent` category — `agent/generate`, `agent/invoke`, etc.). Repeated per-tick LLM/agent calls can pile up faster than they resolve. Error severity."
1633
+ "code": "ORB_S_ROLE_LITERAL_NOT_MEMBER",
1634
+ "category": "schema",
1635
+ "description": "A literal compared against an @user field with a closed vocabulary is not a member of that vocabulary, so the branch can never be taken"
1621
1636
  },
1622
1637
  {
1623
- "code": "ORB_ENTITY_INTRINSIC_FIELD_PERSISTED",
1624
- "category": "entity_mutation",
1625
- "description": "An explicit `persist create`/`persist update` data LITERAL (an `OirExpr::Object`, never a bare whole-frame `@entity`) names an `@intrinsic` field of the target entity. Intrinsic fields are trait-owned view-state/machinery (`OirEntity::frame_fields`'s ONLY allow-list) — never a persisted column — so writing one into the database is a category error the author almost certainly meant as a domain field. Wave 2. Error severity."
1638
+ "code": "ORB_S_SHARED_WITHOUT_PERSISTENCE_MODE",
1639
+ "category": "schema",
1640
+ "description": "A shared entity declares no persistence mode, and none may be inferred"
1626
1641
  },
1627
1642
  {
1628
- "code": "ORB_GUARD_ON_FRAME_FIELD_AUTHORIZES",
1629
- "category": "entity_mutation",
1630
- "description": "An `@intrinsic` field is used as an AUTHORIZATION input: it appears in an access policy (`@create`/`@read`/`@update`/`@delete`), or in a transition guard that also reads `@user.*`/role/identity AND the transition performs `persist`/`call-service`. Intrinsic fields are trait-computed view-state the runtime never seeds or persists — using one to gate a mutation means the gate is trivially bypassable (the caller controls the \"intrinsic\" value directly). A plain precondition guard with no identity comparison is not a hit. Wave 2. Error severity."
1643
+ "code": "ORB_S_UNKNOWN_IDENTITY_FIELD",
1644
+ "category": "schema",
1645
+ "description": "A read of a field of the signed-in user names a field the declared identity entity does not have"
1631
1646
  },
1632
1647
  {
1633
- "code": "ORB_SET_COLUMN_WITHOUT_ROW",
1634
- "category": "entity_mutation",
1635
- "description": "`(set @entity.<f> ...)` writes a non-`@intrinsic` column of a `[persistent]` entity in a transition with no row binding (no `id`/`?row`-bearing event payload, no `entityId` in scope) AND the owning trait never runs `persist create`/`persist update` on that entity anywhere — so the write can never land: it is not framed to an identified row, and nothing ever persists it. A draft form that sets columns across several transitions before a final `persist create` is legitimate (the write eventually lands); this only fires when the trait has no landing transition at all. Wave 2. Error severity."
1648
+ "code": "ORB_TAB_EFFECT_ON_SERVER",
1649
+ "category": "tab",
1650
+ "description": "A browser tab effect is used in a transition that runs on the server, which holds no tabs"
1636
1651
  },
1637
1652
  {
1638
- "code": "CIRCUIT_ORPHAN_EVENT",
1639
- "category": "circuit",
1640
- "description": "Action emits event with no transition handler"
1653
+ "code": "ORB_TAB_REQUEST_INVALID",
1654
+ "category": "browser",
1655
+ "description": "A browser/tab request is not an object of the operation's closed keys or has refused literal values"
1641
1656
  },
1642
1657
  {
1643
- "code": "CIRCUIT_DUPLICATE_EVENT",
1644
- "category": "circuit",
1645
- "description": "Same event emitted multiple times in same context"
1658
+ "code": "ORB_THEME_PIN_CONTRADICTS_APP",
1659
+ "category": "theme",
1660
+ "description": "An orbital pins a theme that differs from the theme the app declares at app level"
1646
1661
  },
1647
1662
  {
1648
- "code": "CIRCUIT_DEAD_END_COMPONENT",
1649
- "category": "circuit",
1650
- "description": "Interactive component missing itemActions"
1663
+ "code": "ORB_THEME_UNDECLARED",
1664
+ "category": "theme",
1665
+ "description": "A frame is shown in a literal theme that the program does not declare, so no stylesheet ships for it"
1651
1666
  },
1652
1667
  {
1653
- "code": "CIRCUIT_UNREACHABLE_STATE",
1654
- "category": "circuit",
1655
- "description": "State has no incoming transitions"
1668
+ "code": "ORB_TICK_ASYNC_EFFECT",
1669
+ "category": "tick",
1670
+ "description": "A tick calls a server-async operator, which ticks cannot run"
1656
1671
  },
1657
1672
  {
1658
- "code": "CIRCUIT_DEAD_END_STATE",
1659
- "category": "circuit",
1660
- "description": "State has no outgoing transitions"
1673
+ "code": "ORB_TICK_REQUIRES_RUNTIME",
1674
+ "category": "trait",
1675
+ "description": "A non-cron tick mutates a persistent entity, which should usually be runtime"
1661
1676
  },
1662
1677
  {
1663
- "code": "CIRCUIT_ACTION_COMPONENT_MISMATCH",
1664
- "category": "circuit",
1665
- "description": "Action-component mismatch"
1678
+ "code": "ORB_T_CLIENT_TICK_NOT_LOCAL",
1679
+ "category": "trait",
1680
+ "description": "A trait writes a frame entity ticked on the client but declares no dispatch mode, so a server step overwrites the live frame"
1666
1681
  },
1667
1682
  {
1668
- "code": "CIRCUIT_NO_OVERLAY_EXIT",
1669
- "category": "circuit",
1670
- "description": "Overlay slot (modal/drawer) missing exit transition"
1683
+ "code": "ORB_T_CLIENT_TICK_SERVER_EFFECT",
1684
+ "category": "trait",
1685
+ "description": "A tick that runs in the browser has effects that reach the server, and nothing replays a tick there"
1671
1686
  },
1672
1687
  {
1673
- "code": "CIRCUIT_MODAL_EXIT_INCOMPLETE",
1674
- "category": "circuit",
1675
- "description": "Modal-to-inline transition missing render-ui(\"main\", ...) alongside render-ui(\"modal\", null)"
1688
+ "code": "ORB_T_CONFIG_MISSING_REQUIRED_KEY",
1689
+ "category": "trait",
1690
+ "description": "A trait reference does not supply a config knob that the referenced trait declares as required"
1676
1691
  },
1677
1692
  {
1678
- "code": "CIRCUIT_DEAD_HANDLER",
1679
- "category": "circuit",
1680
- "description": "Render-ui handler fires event with no matching transition from the rendering state"
1693
+ "code": "ORB_T_CONFIG_OBJECT_ARRAY_FORBIDDEN",
1694
+ "category": "trait",
1695
+ "description": "A config field uses a banned bare object or array type instead of a named struct alias"
1681
1696
  },
1682
1697
  {
1683
- "code": "ORB_RENDER_ACTION_LIFECYCLE_EVENT",
1684
- "category": "circuit",
1685
- "description": "A rendered affordance's event-bearing prop (`action`, `itemActions[].event`, `submitEvent`, `onChange`, …) targets a lifecycle event (`orbital_core::events::BUS_EXCLUDED_EVENTS`). The bus never re-delivers `INIT`/`LOAD`/`$MOUNT`, so the control is dead on click."
1698
+ "code": "ORB_T_CONFIG_TIER_INVALID",
1699
+ "category": "trait",
1700
+ "description": "A config field declares a tier value outside domain, policy, infra, presentation and internal"
1686
1701
  },
1687
1702
  {
1688
- "code": "ORB_CIRCUIT_FAILURE_ARM_MISSING",
1689
- "category": "circuit",
1690
- "description": "A transition's effects (`fetch`/`persist`/`call-service`) declare an `emit.failure` event, but no arm at the destination state (`from === to || from === '*'`) handles it — the async result contract's failure half is a live wire terminating in nothing. Ported from the JS wiring lint's `failure-arm-missing` (client-bound traits only). Error severity."
1703
+ "code": "ORB_T_CONFIG_UNKNOWN_CALL_SITE_KEY",
1704
+ "category": "trait",
1705
+ "description": "A call-site config key matches no config knob declared on the referenced trait"
1691
1706
  },
1692
1707
  {
1693
- "code": "ORB_CIRCUIT_FAILURE_ARM_RENDERS_NOTHING",
1694
- "category": "circuit",
1695
- "description": "The failure-handling arm found for [`CircuitFailureArmMissing`]'s contract exists but paints nothing (no `render-ui <slot> <non-null>` anywhere in its effects, including through `if`/`do`) — the failure is caught but never shown to the user. A trait declared `[integration]` is headless, so its arm also handles the failure by emitting an event some trait in the program listens to, or one it declares `-> external`; an emit nobody hears still reports. Ported from `failure-arm-renders- nothing`. Error severity."
1708
+ "code": "ORB_T_DUPLICATE_NAME",
1709
+ "category": "trait",
1710
+ "description": "The same trait name is defined in more than one orbital"
1696
1711
  },
1697
1712
  {
1698
- "code": "ORB_CIRCUIT_MODAL_SHELL_CLOSE_DEAF",
1699
- "category": "circuit",
1700
- "description": "A transition renders a non-self-overlaying pattern into an overlay slot (`modal`/`drawer`/`overlay`), but the destination state has no `CLOSE`/`CANCEL` arm — the generic portal shell's own dismiss control (X / Escape / overlay-click) fires an event nothing handles. Ported from `modal-shell-close-deaf`. Error severity."
1713
+ "code": "ORB_T_DUPLICATE_STATE",
1714
+ "category": "trait",
1715
+ "description": "A trait declares the same state name more than once"
1701
1716
  },
1702
1717
  {
1703
- "code": "ORB_CIRCUIT_SELF_OVERLAY_IN_SHELL",
1704
- "category": "circuit",
1705
- "description": "A transition renders a SELF-overlaying pattern (`slideOver: true` anywhere in the payload tree) into an overlay slot — the generic portal shell wraps it too, producing two stacked overlay chromes. Ported from `self-overlay-inside-modal-shell`. Error severity."
1718
+ "code": "ORB_T_DUPLICATE_TRANSITION",
1719
+ "category": "trait",
1720
+ "description": "Two transitions share the same source state and event without guards"
1706
1721
  },
1707
1722
  {
1708
- "code": "ORB_CIRCUIT_LIFECYCLE_EMIT_UNDELIVERED",
1709
- "category": "circuit",
1710
- "description": "A transition's own effects list contains a top-level `(emit <event>)` naming a lifecycle event (`orbital_core::events::BUS_EXCLUDED_EVENTS`) — the bus never re-delivers it, so this half of the closed circuit is written but can never run. Sibling production site to [`RenderActionLifecycleEvent`](ErrorCode::RenderActionLifecycleEvent) (an explicit effect instead of a rendered affordance prop). Ported from the JS wiring lint's `dead-lifecycle-emit`. Error severity."
1723
+ "code": "ORB_T_EMPTY_EVENT_NAME",
1724
+ "category": "trait",
1725
+ "description": "An event name is empty"
1711
1726
  },
1712
1727
  {
1713
- "code": "ORB_CIRCUIT_SELF_EMIT_LOOP",
1714
- "category": "circuit",
1715
- "description": "A transition arm re-emits its OWN trigger event (`X --X--> Y` whose effects contain `(emit X ...)`), the `to` state has another arm on X, and the re-emitted payload does not derive from `@payload` — the runtime path re-enters an arm on the same event with unchanged payload and loops forever (G-RUNTIME-020). Payloads derived from `@payload` (sentinel fan-out counters) make progress per hop and are not flagged; neither is a self-emit whose target state has no same-event arm (a dead-end broadcast). Error severity."
1728
+ "code": "ORB_T_ENDPOINT_TRAIT_RENDERS",
1729
+ "category": "trait",
1730
+ "description": "A trait mounted only on protocol endpoints renders UI, which endpoints cannot show"
1716
1731
  },
1717
1732
  {
1718
- "code": "ORB_CIRCUIT_INIT_UNCOVERED_STATE",
1719
- "category": "circuit",
1720
- "description": "A page trait that initializes on `INIT` has a reachable state with no `INIT` arm: trait state survives unmount, so revisiting the page from that state does nothing (G-ORB-186)."
1733
+ "code": "ORB_T_ENTITY_NAME_SHADOWS_TRAIT_UNION",
1734
+ "category": "trait",
1735
+ "description": "An entity name collides with a trait's generated state union type"
1721
1736
  },
1722
1737
  {
1723
- "code": "ORB_CIRCUIT_DEAD_BODILESS_ACTION",
1724
- "category": "circuit",
1725
- "description": "A transition moves `from -> to` (not a self-transition) with NO effects at all, out of a `from` state some OTHER arm already painted into a main slot (`orbital_core::slots::MAIN_SLOTS`) — the machine leaves that state but the screen keeps its old paint standing, so every affordance routed here is dead. Client-bound gated (an unbound trait's arms never run in the shipped client at all). Ported from the JS wiring lint's `dead-bodiless-action`. Error severity."
1738
+ "code": "ORB_T_ENTITY_NOT_REBINDABLE",
1739
+ "category": "trait",
1740
+ "description": "A trait is bound to an entity it cannot be rebound to"
1726
1741
  },
1727
1742
  {
1728
- "code": "ORB_CIRCUIT_ASYNC_RESULT_DEAF_TARGET",
1729
- "category": "circuit",
1730
- "description": "A state-CHANGING transition (`from != to`) whose `fetch`/`persist` effects declare async-result events (`collect_async_result_events`: EVERY value of the `emit` map, recursing through `if`/`do`) that the destination state's own arms (`from === to-state || from === \"*\"`) don't handle — the requester departs before it can hear its own operation's result, so the cascade lands on a machine deaf to it and wedges. NOT client-bound gated (the JS predicate has none here, unlike its `failure-arm-missing` sibling). Ported from the JS wiring lint's `async-result-deaf-target` (warning there; error here per the 0/0 ruling). Error severity."
1743
+ "code": "ORB_T_EVENT_RENAME_UNKNOWN_KEY",
1744
+ "category": "trait",
1745
+ "description": "An events rename key names no event declared by the referenced trait"
1731
1746
  },
1732
1747
  {
1733
- "code": "ORB_CIRCUIT_VIEWER_STRANDED",
1734
- "category": "circuit",
1735
- "description": "The trait that OWNS a page's content region (`page_content_owner`'s `channel`/`sole-writer`) has a user-triggered arm that repaints its own main-slot body with something offering no way on: no content-body pattern, no registry event-kind prop bound to a live (non-lifecycle) event or an unresolved binding, and no `@trait.X` embed. \"User- triggered\" means the event is reachable from a rendered affordance or a `listens` route, transitively, minus async-result and lifecycle events. Exempt: an arm running its own `fetch`/`persist` (its result arm repaints); a non-self-transition escaping to a state with another producible, non-lifecycle arm. Ported from the JS wiring lint's `viewer-stranded`, predicate revised 2026-09-12 per the F31 live probe (`play_scene` on `ui-minigolf-board`/`std-chem-titration`): the JS's labelled-control test and `@`/`?` sigil branch were both heuristics and are dropped — a registry event-kind prop is the only test. Error severity."
1748
+ "code": "ORB_T_EVT_EXTERNAL_MISSING_PAYLOAD",
1749
+ "category": "trait",
1750
+ "description": "An external event does not declare a typed payload"
1736
1751
  },
1737
1752
  {
1738
- "code": "ORB_UI_ICON_INVALID_FORMAT",
1739
- "category": "icon",
1740
- "description": "Icon name has invalid format"
1753
+ "code": "ORB_T_EVT_INVALID_NAME",
1754
+ "category": "trait",
1755
+ "description": "An event name is not a valid UPPER_SNAKE_CASE identifier"
1741
1756
  },
1742
1757
  {
1743
- "code": "ORB_UI_ICON_EMPTY",
1744
- "category": "icon",
1745
- "description": "Icon name is empty"
1758
+ "code": "ORB_T_EVT_UNDECLARED",
1759
+ "category": "trait",
1760
+ "description": "An event is emitted but not declared in the trait's emits array"
1746
1761
  },
1747
1762
  {
1748
- "code": "ORB_UI_ICON_NOT_FOUND",
1749
- "category": "icon",
1750
- "description": "Icon may not exist in Lucide"
1763
+ "code": "ORB_T_EXTERNAL_INPUT_NOT_RESTING",
1764
+ "category": "trait",
1765
+ "description": "An external input is not accepted from the trait's initial state"
1751
1766
  },
1752
1767
  {
1753
- "code": "ORB_OP_INVALID_TIME_UNIT",
1754
- "category": "operator",
1755
- "description": "A `time/*` operator was given a unit literal outside the vocabulary. Unchecked, it throws at evaluation time — and inside a read predicate that means rows are dropped fail-closed while the run still reports PASS (`S-CALENDAR-RANGE-FILTER-USES-UNSUPPORTED-TIME-UNITS`)."
1768
+ "code": "ORB_T_GENERIC_TYPE_DEPRECATED",
1769
+ "category": "trait",
1770
+ "description": "A declaration uses a generic type such as bare json, object without properties, or any, which the language no longer allows"
1756
1771
  },
1757
1772
  {
1758
- "code": "ORB_QUERY_MISSING_SEARCH",
1759
- "category": "query",
1760
- "description": "Query singleton missing search field"
1773
+ "code": "ORB_T_INIT_MISSING_FETCH",
1774
+ "category": "trait",
1775
+ "description": "No trait fetches a persistent entity on INIT, so interaction traits read data nothing loads"
1761
1776
  },
1762
1777
  {
1763
- "code": "ORB_QUERY_MISSING_RECOMMENDED",
1764
- "category": "query",
1765
- "description": "Query singleton missing recommended fields"
1778
+ "code": "ORB_T_INVALID_EVENT_DEFAULT",
1779
+ "category": "trait",
1780
+ "description": "A config field typed event holds a value that is not a valid event name or member of the trait's event set"
1766
1781
  },
1767
1782
  {
1768
- "code": "ORB_QUERY_UNSUPPORTED_PATTERN",
1769
- "category": "query",
1770
- "description": "Pattern doesn't support query prop"
1783
+ "code": "ORB_T_INVALID_FORMAT",
1784
+ "category": "trait",
1785
+ "description": "A trait reference has neither a ref nor a name property"
1771
1786
  },
1772
1787
  {
1773
- "code": "ORB_QUERY_UNKNOWN_SINGLETON",
1774
- "category": "query",
1775
- "description": "Query references unknown singleton"
1788
+ "code": "ORB_T_INVALID_PATTERN_DEFAULT",
1789
+ "category": "trait",
1790
+ "description": "A pattern-typed config knob has a default that is not a known pattern type"
1776
1791
  },
1777
1792
  {
1778
- "code": "ORB_QUERY_UNUSED_SINGLETON",
1779
- "category": "query",
1780
- "description": "Query singleton is unused"
1793
+ "code": "ORB_T_INVALID_SLOT_DEFAULT",
1794
+ "category": "trait",
1795
+ "description": "A slot-typed config field has a default that is not a valid slot"
1781
1796
  },
1782
1797
  {
1783
- "code": "ORB_T_EVT_UNDECLARED",
1784
- "category": "trait_event",
1785
- "description": "Event emitted but not declared in trait.emits"
1798
+ "code": "ORB_T_INVALID_TRANSITION",
1799
+ "category": "trait",
1800
+ "description": "A transition references a source or target state that does not exist"
1786
1801
  },
1787
1802
  {
1788
- "code": "ORB_T_EVT_INVALID_NAME",
1789
- "category": "trait_event",
1790
- "description": "Event name not UPPER_SNAKE_CASE"
1803
+ "code": "ORB_T_LOCAL_ON_NON_SHARED_PERSISTENT",
1804
+ "category": "trait",
1805
+ "description": "A client-dispatch trait is linked to an entity that is neither shared nor client-resident, hiding server-gated writes behind optimism"
1791
1806
  },
1792
1807
  {
1793
- "code": "ORB_T_EVT_TICK_UNDECLARED",
1794
- "category": "trait_event",
1795
- "description": "Tick emits undeclared event"
1808
+ "code": "ORB_T_LOCAL_TRAIT_TOUCHES_SERVER",
1809
+ "category": "trait",
1810
+ "description": "A client trait transition guards on or touches server-only state"
1796
1811
  },
1797
1812
  {
1798
- "code": "ORB_T_EVT_SCOPE_MISMATCH",
1799
- "category": "trait_event",
1800
- "description": "Listener scope mismatch"
1813
+ "code": "ORB_T_MISSING_INIT_TRANSITION",
1814
+ "category": "trait",
1815
+ "description": "A route trait has no INIT transition on its initial state"
1801
1816
  },
1802
1817
  {
1803
- "code": "ORB_T_EVT_EXTERNAL_MISSING_PAYLOAD",
1804
- "category": "trait_event",
1805
- "description": "External emit missing payload definition"
1818
+ "code": "ORB_T_MULTIPLE_INITIAL_STATES",
1819
+ "category": "trait",
1820
+ "description": "A trait state machine declares more than one initial state"
1806
1821
  },
1807
1822
  {
1808
- "code": "ORB_S_MISSING_NAME",
1809
- "category": "schema",
1810
- "description": "Schema missing name"
1823
+ "code": "ORB_T_NO_INITIAL_STATE",
1824
+ "category": "trait",
1825
+ "description": "A state machine declares no states and so has no initial state"
1811
1826
  },
1812
1827
  {
1813
- "code": "ORB_S_NO_ORBITALS",
1814
- "category": "schema",
1815
- "description": "Schema has no orbitals"
1828
+ "code": "ORB_T_REBIND_MISSING_FIELDS",
1829
+ "category": "trait",
1830
+ "description": "A trait is rebound to an entity that lacks fields the trait requires"
1816
1831
  },
1817
1832
  {
1818
- "code": "ORB_S_EMPTY_VERSION",
1819
- "category": "schema",
1820
- "description": "Schema version is empty"
1833
+ "code": "ORB_T_REBIND_TARGET_UNRESOLVED",
1834
+ "category": "trait",
1835
+ "description": "A trait rebind target cannot be resolved"
1821
1836
  },
1822
1837
  {
1823
- "code": "ORB_S_IDENTITY_NOT_UNIQUE",
1824
- "category": "schema",
1825
- "description": "More than one differently-named `[identity]` entity in one composed program. `@user` is a single root resolving to a single viewer, so two declarations make every `@user.x` ambiguous. (Same-name duplicates are already rejected upstream by `validate_entity_uniqueness`.)"
1838
+ "code": "ORB_T_SECRET_DEFAULT_NOT_STRING",
1839
+ "category": "trait",
1840
+ "description": "A config field typed secret does not default to a string credential reference"
1826
1841
  },
1827
1842
  {
1828
- "code": "ORB_S_ROLE_LITERAL_NOT_MEMBER",
1829
- "category": "schema",
1830
- "description": "A literal compared against an `@user.<field>` whose declared type is a closed vocabulary is not one of that vocabulary's members — a branch that can never be taken. The bug class that let std-healthcare's `\"patient\"` and std-lms's `\"student\"` ship green."
1843
+ "code": "ORB_T_STATE_UNREACHABLE",
1844
+ "category": "trait",
1845
+ "description": "A state is unreachable from the initial state through any transition path"
1831
1846
  },
1832
1847
  {
1833
- "code": "ORB_S_UNKNOWN_IDENTITY_FIELD",
1834
- "category": "schema",
1835
- "description": "`@user.<field>` names a field the declared `[identity]` entity does not have. Resolves to null at runtime, so the guard silently takes its negative branch."
1848
+ "code": "ORB_T_TRAIT_ON_ROUTE_AND_ENDPOINT",
1849
+ "category": "trait",
1850
+ "description": "A trait is mounted on both a route page and a protocol endpoint"
1836
1851
  },
1837
1852
  {
1838
- "code": "ORB_S_ACCESS_POLICY_UNKNOWN_ENTITY_FIELD",
1839
- "category": "schema",
1840
- "description": "`@entity.<field>` (or `(object/get @entity field)`) inside an `@read`/`@create`/`@update`/`@delete` directive names a field the OWNING entity does not have."
1853
+ "code": "ORB_T_TRAIT_UNMOUNTED",
1854
+ "category": "trait",
1855
+ "description": "A trait owns a state machine but is listed on no page and reached by no embed"
1841
1856
  },
1842
1857
  {
1843
- "code": "ORB_S_OWNER_FIELD_NOT_IDENTITY_TYPED",
1844
- "category": "schema",
1845
- "description": "An access directive compares an `@entity.<field>` against `@user.id`, but `<field>` is not a relation to the `[identity]` entity. The comparison is then between a free-text scalar and a roster id — it type-checks, reads like ownership, and matches nothing, because the seeder only stamps viewer ids onto DECLARED relations. This is the `customerEmail` trap: a policy that silently denies everyone while looking correct."
1858
+ "code": "ORB_T_UNDEFINED_EVENT",
1859
+ "category": "trait",
1860
+ "description": "A transition uses an event that is not defined in the trait's events array"
1846
1861
  },
1847
1862
  {
1848
- "code": "ORB_ENTITY_OWNER_COLUMN_UNSCOPED",
1849
- "category": "entity",
1850
- "description": "An entity declares ≥1 owner column (a declared relation to the `[identity]` entity, via `owner_fields_from_schema` — never by field name) but no `read_policy` and no stated `access_waivers.read` reason. An undeclared policy is ALLOW-ALL, not deny-all, so every viewer reads every row. L3 port of JS `unscoped-owned-entity`."
1863
+ "code": "ORB_T_UNDEFINED_TRAIT",
1864
+ "category": "trait",
1865
+ "description": "A trait reference does not give a trait name"
1851
1866
  },
1852
1867
  {
1853
- "code": "ORB_STORE_UNKNOWN_ORBITAL",
1854
- "category": "entity",
1855
- "description": "`store: X` (entity or app header) names no orbital of the program (EXEC-STORE-4). Error severity."
1868
+ "code": "ORB_T_UNRESOLVED_TYPE_PARAM",
1869
+ "category": "trait",
1870
+ "description": "A declaration uses a type variable that no trait parameter binds"
1856
1871
  },
1857
1872
  {
1858
- "code": "ORB_STORE_DRIVER_CONTRACT",
1859
- "category": "entity",
1860
- "description": "A store driver orbital has no trait handling one of ROW_READ / ROW_LIST / ROWS_QUERY / ROWS_WRITE (`spec/store/row-store.lolo`). Error severity."
1873
+ "code": "ORB_UI_ICON_EMPTY",
1874
+ "category": "icon",
1875
+ "description": "An icon name is empty"
1861
1876
  },
1862
1877
  {
1863
- "code": "ORB_STORE_ON_NON_PERSISTENT",
1864
- "category": "entity",
1865
- "description": "`store:` on an entity whose rows live in no store (`[runtime]` or browser-stored). Error severity."
1878
+ "code": "ORB_UI_ICON_INVALID_FORMAT",
1879
+ "category": "icon",
1880
+ "description": "An icon name has an invalid format"
1866
1881
  },
1867
1882
  {
1868
- "code": "ORB_STORE_VERB_OUTSIDE_SEAM",
1869
- "category": "entity",
1870
- "description": "A trait outside a store driver orbital emits a row verb: the store seam alone asks a driver, one frame per ask (EXEC-STORE-4). Error severity."
1883
+ "code": "ORB_UI_ICON_NOT_FOUND",
1884
+ "category": "icon",
1885
+ "description": "An icon name does not exist in the icon set"
1871
1886
  },
1872
1887
  {
1873
- "code": "ORB_STORE_DRIVER_NOT_CONDITIONAL",
1874
- "category": "entity",
1875
- "description": "A single `persist delete|update` on an entity whose driver declares `writeCapabilities.conditional` false: the take is one conditional op (EXEC-STEP-8). Error severity."
1888
+ "code": "ORB_U_CONFIG_UNKNOWN_KEY",
1889
+ "category": "uses",
1890
+ "description": "A uses config override names a knob the imported behavior app-level config never declared"
1876
1891
  },
1877
1892
  {
1878
- "code": "ORB_RENDER_GROUPBY_ENUM_COLUMN_GAP",
1879
- "category": "render_ui",
1880
- "description": "A trait's `config.groupByField` + `config.columns[].key` bucket rows of the linked entity by strict key equality, but the field's declared enum allows a value no column key names — those rows match no column and silently disappear. L3 port of JS `groupby-enum-column-gap`."
1893
+ "code": "ORB_W_LOOP_INVARIANT_PARSE",
1894
+ "category": "lint",
1895
+ "description": "A parse inside a lambda re-parses the same value for every element and should be bound once outside"
1881
1896
  },
1882
1897
  {
1883
- "code": "ORB_EMBED_CONFIG_FORWARD_MULTI_REFERRER",
1898
+ "code": "ORB_X_CIRCULAR_DEPENDENCY",
1884
1899
  "category": "cross",
1885
- "description": "A trait embedded via `@trait.X` by ≥2 referrers that itself declares an `@config.<key>` forward. One declaration serves one embedder (its forwards chain to the first referrer only), so the second embedder's call-site config never takes effect. L3 port of JS `embedded-sibling-single-referrer`."
1886
- },
1887
- {
1888
- "code": "ORB_THEME_PIN_CONTRADICTS_APP",
1889
- "category": "schema",
1890
- "description": "A trait pins `config.theme` to a non-empty literal that isn't a binding (`@…`) and doesn't match the schema's app-level `theme` declaration. `\"\"` and bindings are unpinned — an orbital riding the ambient default is silent. L3 port of the app-level branch of JS `app-theme-divergent`; the dominant-vote branch is a name/plurality heuristic and is retired, not ported."
1900
+ "description": "Traits form a circular event dependency"
1891
1901
  },
1892
1902
  {
1893
- "code": "ORB_THEME_UNDECLARED",
1894
- "category": "schema",
1895
- "description": "A `data-theme` resolves to a literal theme the program does not declare (app or orbital `theme`, or the app's `themes`), so the compiled client ships no stylesheet for it (G-UI-106)."
1903
+ "code": "ORB_X_CROSS_EMITTER_DECLARED_PAYLOAD_MISMATCH",
1904
+ "category": "cross",
1905
+ "description": "An event declared by several emitters has conflicting payload fields across them"
1896
1906
  },
1897
1907
  {
1898
- "code": "ORB_S_ACCESS_POLICY_INVALID_BINDING",
1899
- "category": "schema",
1900
- "description": "An access directive reads a binding root other than `@entity`/`@user` — the directive has no call site, so `@payload`/`@config`/`@state` are not meaningful there."
1908
+ "code": "ORB_X_DUPLICATE_ENTITY",
1909
+ "category": "cross",
1910
+ "description": "The same entity name is defined in more than one orbital"
1901
1911
  },
1902
1912
  {
1903
- "code": "ORB_S_ACCESS_POLICY_REQUIRES_IDENTITY",
1904
- "category": "schema",
1905
- "description": "An access directive reads `@user` in a program declaring no `[identity]` entity. Unlike a bare pre-existing `@user` read (which falls back to the implicit default shape), a NEW authorization construct must have a real roster — that is what makes personas switchable."
1913
+ "code": "ORB_X_DUPLICATE_TRAIT_ID",
1914
+ "category": "cross",
1915
+ "description": "Two or more traits carry the same trait id, so listens match each other's emits"
1906
1916
  },
1907
1917
  {
1908
- "code": "ORB_S_COLLECTION_POLICY_CONFLICT",
1909
- "category": "schema",
1910
- "description": "Two entity declarations bind the same `persistent:` collection and declare DIFFERENT access directives. One table cannot honestly have two visibility rules, and the runtime's collection-level inheritance has no principled way to choose (`R-SHADOW-ENTITY-SHARES-COLLECTION-DIRECTIVES-DONT-APPLY`)."
1918
+ "code": "ORB_X_ENUM_VALUE_NOT_MEMBER",
1919
+ "category": "cross",
1920
+ "description": "A set effect assigns a string literal that is not a declared member of the target field's enum"
1911
1921
  },
1912
1922
  {
1913
- "code": "ORB_S_EXPECTATION_UNSATISFIED",
1914
- "category": "schema",
1915
- "description": "Compose link-check: an orbital's `expects entity X` / `expects entity X [identity]` names a requirement no orbital in the program provides. The message names WHO ASKED — the consumer orbital — so the repair is attributable."
1923
+ "code": "ORB_X_FILTER_FIELD_NEVER_WRITTEN",
1924
+ "category": "cross",
1925
+ "description": "A fetch filters on a field that no persist create or update of that entity supplies, so it always returns empty"
1916
1926
  },
1917
1927
  {
1918
- "code": "ORB_S_EXPECTATION_PROVIDER_MISMATCH",
1919
- "category": "schema",
1920
- "description": "Compose link-check: the named provider entity exists but lacks the expected kind (e.g. `expects entity Customer [identity]` where `Customer` carries no `[identity]` tag)."
1928
+ "code": "ORB_X_LISTEN_PER_ENTITY",
1929
+ "category": "trait_event",
1930
+ "description": "A trait that listens per a key does not link a [runtime] entity declaring an id : string field"
1921
1931
  },
1922
1932
  {
1923
- "code": "ORB_S_EXPECTED_FIELD_NOT_PROVIDED",
1924
- "category": "schema",
1925
- "description": "Compose link-check: the provider entity declares no field with an expected shape name. Names consumer, provider, and field."
1933
+ "code": "ORB_X_LISTEN_PER_ROUTED_PAGE",
1934
+ "category": "trait_event",
1935
+ "description": "A trait that listens per a key is placed on a route page"
1926
1936
  },
1927
1937
  {
1928
- "code": "ORB_S_EXPECTED_FIELD_TYPE_MISMATCH",
1929
- "category": "schema",
1930
- "description": "Compose link-check: the provider has the expected field but with an incompatible type (per orbital-core's `type_compat`; literal unions use subset semantics — every expected member must be a provider member)."
1938
+ "code": "ORB_X_LISTEN_SOURCE_NEVER_PRODUCES",
1939
+ "category": "cross",
1940
+ "description": "A listens route names a source whose emits contract never produces the listened event"
1931
1941
  },
1932
1942
  {
1933
- "code": "ORB_S_EXPECTATION_FIELD_UNDECLARED",
1934
- "category": "schema",
1935
- "description": "Standalone AND compose self-consistency: the consumer uses a field it did not declare — an `@user.<field>` read outside its `expects identity` shape, or a `persist` payload field outside its `expects entity` shape. The consumer's declaration is its own source of truth."
1943
+ "code": "ORB_X_LISTEN_SOURCE_UNRESOLVED",
1944
+ "category": "cross",
1945
+ "description": "A listen entry references a source trait event that the source does not declare"
1936
1946
  },
1937
1947
  {
1938
- "code": "ORB_S_INVARIANT_VIOLATED",
1939
- "category": "schema",
1940
- "description": "A spec proposition (`@invariant` on `expects entity`, `@holds` on an `expects trait` state) is broken: a write or transition of the program falsifies it on a counterexample the evaluator confirms."
1948
+ "code": "ORB_X_LISTEN_TRIGGER_UNMATCHED",
1949
+ "category": "cross",
1950
+ "description": "A listens entry triggers an event that no transition in the same trait reacts to"
1941
1951
  },
1942
1952
  {
1943
- "code": "ORB_S_INVARIANT_UNPROVED",
1944
- "category": "schema",
1945
- "description": "A spec proposition the prover could not decide (an expression outside the decidable fragment, or a write whose effect on the proposition is over-approximated). Never a pass."
1953
+ "code": "ORB_X_LLM_WIRE_UNROUTED",
1954
+ "category": "cross",
1955
+ "description": "A composed std-llm trait can emit a wire event that no trait in the program listens to"
1946
1956
  },
1947
1957
  {
1948
- "code": "ORB_U_CONFIG_UNKNOWN_KEY",
1949
- "category": "schema",
1950
- "description": "A `uses A from \"…\" { config { … } }` call-site override names a key the imported behavior's app-level `config {}` (`OrbitalSchema.config`, `Almadar_Orbital_Import.md` §4.5) does not declare."
1958
+ "code": "ORB_X_MISSING_ORBITAL_NAME",
1959
+ "category": "cross",
1960
+ "description": "An orbital does not declare a name"
1951
1961
  },
1952
1962
  {
1953
- "code": "ORB_S_SHARED_WITHOUT_PERSISTENCE_MODE",
1954
- "category": "schema",
1955
- "description": "L2 twin of `orbital-lolo`'s `LowerError::SharedEntityWithoutPersistenceMode` (`ORB_S_SHARED_WITHOUT_PERSISTENCE_MODE`): `EntityDefinition.shared && persistence.is_none()` on the input schema. Nothing about a `[shared]` entity may be inferred — it must say `persistent: <collection>` or `runtime` explicitly. Catches a `.orb` mutated directly (factory edits, agent rewrites) that bypasses the `.lolo` parse path. Runs before any persistence defaulting. Wave 2. Error severity."
1963
+ "code": "ORB_X_ORPHAN_LISTENER",
1964
+ "category": "cross",
1965
+ "description": "A trait listens for an event that no trait emits"
1956
1966
  },
1957
1967
  {
1958
- "code": "ORB_ID_UNKNOWN_REF",
1959
- "category": "identity",
1960
- "description": "A populated dual-carry id field points at an id that is neither a node declared in the schema's arena (orbital/entity/trait/page/emit-event) nor a `schema.ledger` entry. The edge is dangling."
1968
+ "code": "ORB_X_PARALLEL_LAMBDA_IMPURE",
1969
+ "category": "parallel",
1970
+ "description": "The lambda of array/pmap or array/preduce is not a literal fn or is not provably pure"
1961
1971
  },
1962
1972
  {
1963
- "code": "ORB_ID_NAME_MISMATCH",
1964
- "category": "identity",
1965
- "description": "Both a reference's name field and its id sibling are populated, but the ledger's `curName` for that id disagrees with the name (dual-carry drift)."
1973
+ "code": "ORB_X_PAYLOAD_FIELD_NAME",
1974
+ "category": "cross",
1975
+ "description": "A payload field name is not a valid TypeScript identifier"
1966
1976
  },
1967
1977
  {
1968
- "code": "ORB_ID_KIND_MISMATCH",
1969
- "category": "identity",
1970
- "description": "An id's kind prefix (`identity::id_kind_of`) disagrees with the reference position it occupies (e.g. an `ent_` id sitting in a trait `refId`)."
1978
+ "code": "ORB_X_PAYLOAD_MISMATCH",
1979
+ "category": "cross",
1980
+ "description": "An external emit is missing a payload field required by the event's declaration"
1971
1981
  },
1972
1982
  {
1973
- "code": "ORB_ID_LEDGER_ORPHAN",
1974
- "category": "identity",
1975
- "description": "A ledger row whose id no node in the schema carries — a stale row left behind after its node was removed. Error severity."
1983
+ "code": "ORB_X_RENDER_UI_EVENT_LITERAL_STALE",
1984
+ "category": "cross",
1985
+ "description": "A render-ui prop references an event literal that no longer matches a declared event"
1976
1986
  },
1977
1987
  {
1978
- "code": "ORB_ID_DUPLICATE_EVENT_ID",
1979
- "category": "identity",
1980
- "description": "One event id is declared by two or more DIFFERENT traits in the same orbital (`stateMachine.events[].id` / `emits[].eventId`). Ids are the durable node keys of the identity graph; a shared id makes every id→name resolution (identity normalize, id-primary dispatch) ambiguous. Inline's event-id hygiene derives per-instance ids at expansion, so this fires only on an artifact produced outside that path."
1988
+ "code": "ORB_X_ROW_LITERAL_FIELD_TYPE_MISMATCH",
1989
+ "category": "effect",
1990
+ "description": "A record literal written into an entity carries a value whose type the declared field does not admit."
1981
1991
  },
1982
1992
  {
1983
- "code": "ORB_ID_AUTHORED_WITHOUT_LEDGER",
1984
- "category": "identity",
1985
- "description": "A ledger-less `.orb` carries an authored declaration id that loading re-mints (`stamp::ensure_stamped`). Warning severity."
1993
+ "code": "ORB_X_ROW_LITERAL_MISSING_REQUIRED",
1994
+ "category": "effect",
1995
+ "description": "A `persist create` data literal omits a column the entity requires (no default, not framework-stamped)."
1986
1996
  },
1987
1997
  {
1988
- "code": "ORB_BEHAVIOR_PACKAGE_NOT_INSTALLED",
1989
- "category": "behavior_package",
1990
- "description": "`<prefix>/<name>` names a prefix no installed behavior package declares."
1998
+ "code": "ORB_X_ROW_LITERAL_UNKNOWN_FIELD",
1999
+ "category": "effect",
2000
+ "description": "A record literal written into an entity (a `persist` data literal, or a `set` into a relation field) names a key the entity does not declare."
1991
2001
  },
1992
2002
  {
1993
- "code": "ORB_BEHAVIOR_NOT_FOUND",
1994
- "category": "behavior_package",
1995
- "description": "The prefix resolved to an installed package, but it has no behavior by that name (or `std/behaviors/<name>` matched neither the std source nor any other installed package)."
2003
+ "code": "ORB_X_UNKNOWN_THEME",
2004
+ "category": "cross",
2005
+ "description": "A theme reference is neither a built-in theme key nor an orbital-declared inline theme"
1996
2006
  },
1997
2007
  {
1998
- "code": "ORB_BEHAVIOR_AMBIGUOUS",
1999
- "category": "behavior_package",
2000
- "description": "`std/behaviors/<name>` matched the same behavior name in two or more non-std installed packages."
2008
+ "code": "ORB_X_UNRESOLVED_RELATION_TARGET",
2009
+ "category": "cross",
2010
+ "description": "A relation field points at an entity that is not declared in the schema"
2001
2011
  },
2002
2012
  {
2003
- "code": "ORB_BEHAVIOR_PREFIX_CONFLICT",
2004
- "category": "behavior_package",
2005
- "description": "Two different installed packages declare the same `orb.prefix`."
2013
+ "code": "ORB_X_UNTYPED_ARRAY",
2014
+ "category": "cross",
2015
+ "description": "An array field declares no element type"
2006
2016
  },
2007
2017
  {
2008
- "code": "ORB_BEHAVIOR_NAME_DUPLICATE",
2009
- "category": "behavior_package",
2010
- "description": "A behavior name is duplicated within or across installed package sources."
2018
+ "code": "ORB_X_UNUSED_EMISSION",
2019
+ "category": "cross",
2020
+ "description": "A trait emits an event that no trait listens for"
2011
2021
  },
2012
2022
  {
2013
- "code": "ORB_BEHAVIOR_PACKAGE_INVALID",
2014
- "category": "behavior_package",
2015
- "description": "An installed behavior package's registry cannot be read or indexed."
2023
+ "code": "SEXPR_INVALID_BINDING",
2024
+ "category": "sexpr",
2025
+ "description": "An s-expression contains an invalid binding"
2016
2026
  },
2017
2027
  {
2018
- "code": "ORB_GEN_INVALID_VALUE",
2019
- "category": "generic",
2020
- "description": "Generic invalid value"
2028
+ "code": "SEXPR_INVALID_OPERATOR",
2029
+ "category": "sexpr",
2030
+ "description": "An S-expression uses an operator that is not in the operator registry"
2021
2031
  },
2022
2032
  {
2023
- "code": "ORB_GEN_INVALID_REFERENCE",
2024
- "category": "generic",
2025
- "description": "Generic invalid reference format"
2033
+ "code": "SEXPR_UNKNOWN_ENTITY",
2034
+ "category": "sexpr",
2035
+ "description": "An entity named in a binding may not exist in the program"
2026
2036
  },
2027
2037
  {
2028
- "code": "ORB_X_UNKNOWN_THEME",
2029
- "category": "generic",
2030
- "description": "Theme reference names a theme not in the valid set (built-in `@almadar-ui/themes/` registry ∪ orbital-declared inline themes)"
2038
+ "code": "inbound-hook-duplicate",
2039
+ "category": "lint",
2040
+ "description": "Two cli hooks declare the same inbound name"
2031
2041
  },
2032
2042
  {
2033
- "code": "ORB_GEN_MISSING_FIELD",
2034
- "category": "generic",
2035
- "description": "Generic missing required field"
2043
+ "code": "shared-type-drift",
2044
+ "category": "lint",
2045
+ "description": "A type shared between behaviors has drifted from its canonical declaration"
2036
2046
  },
2037
2047
  {
2038
- "code": "ORB_GEN_DUPLICATE",
2039
- "category": "generic",
2040
- "description": "Generic duplicate entity/item"
2048
+ "code": "unread",
2049
+ "category": "lint",
2050
+ "description": "The file the rule reads could not be read or listed"
2041
2051
  }
2042
2052
  ]