@almadar/core 10.129.0 → 11.0.0

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 (132) 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-BhnofAik.d.ts} +5966 -7116
  4. package/dist/builders.d.ts +6 -6
  5. package/dist/builders.js +7 -6
  6. package/dist/{bus-CcbB__oo.d.ts → bus-BrRFWDQK.d.ts} +270 -354
  7. package/dist/chunk-347APWFM.js +286 -0
  8. package/dist/chunk-347APWFM.js.map +1 -0
  9. package/dist/chunk-3URQAGD7.js +98 -0
  10. package/dist/chunk-3URQAGD7.js.map +1 -0
  11. package/dist/chunk-7GHJU5WI.js +39 -0
  12. package/dist/chunk-7GHJU5WI.js.map +1 -0
  13. package/dist/chunk-B4MNHGBP.js +8 -0
  14. package/dist/chunk-B4MNHGBP.js.map +1 -0
  15. package/dist/{chunk-KDMV222Q.js → chunk-F6KHUW7T.js} +304 -373
  16. package/dist/chunk-F6KHUW7T.js.map +1 -0
  17. package/dist/chunk-FGT5OS2Y.js +918 -0
  18. package/dist/chunk-FGT5OS2Y.js.map +1 -0
  19. package/dist/chunk-FQLEAMAB.js +24 -0
  20. package/dist/chunk-FQLEAMAB.js.map +1 -0
  21. package/dist/chunk-HEXOGHQ4.js +3264 -0
  22. package/dist/chunk-HEXOGHQ4.js.map +1 -0
  23. package/dist/chunk-JCD6GLBX.js +412 -0
  24. package/dist/chunk-JCD6GLBX.js.map +1 -0
  25. package/dist/{chunk-QUOTJULD.js → chunk-MGLG2XLD.js} +20 -219
  26. package/dist/chunk-MGLG2XLD.js.map +1 -0
  27. package/dist/chunk-MTBEBSNO.js +1293 -0
  28. package/dist/chunk-MTBEBSNO.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-UZPYYI37.js} +524 -26
  32. package/dist/{chunk-RYPVOI6H.js.map → chunk-UZPYYI37.js.map} +1 -1
  33. package/dist/chunk-VG7BRFUD.js +152 -0
  34. package/dist/chunk-VG7BRFUD.js.map +1 -0
  35. package/dist/chunk-Y2DYZPP5.js +2329 -0
  36. package/dist/chunk-Y2DYZPP5.js.map +1 -0
  37. package/dist/chunk-ZEI7C32D.js +1566 -0
  38. package/dist/chunk-ZEI7C32D.js.map +1 -0
  39. package/dist/{domain-Dz3jP-UM.d.ts → domain-CfKPpXCP.d.ts} +51 -51
  40. package/dist/{effect-result-Bebwu9yT.d.ts → effect-result-DPERsn_v.d.ts} +641 -851
  41. package/dist/{effect-CiEVLsZz.d.ts → effect-wP-IdRt2.d.ts} +236 -443
  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-DomgmRBG.d.ts} +29 -729
  54. package/dist/index.d.ts +69 -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 +1205 -1215
  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/index.d.ts +24 -120
  74. package/dist/patterns/index.js +3 -3
  75. package/dist/patterns/patterns-registry.json +522 -24
  76. package/dist/patterns/registry.json +522 -24
  77. package/dist/trait-CzG9M89M.d.ts +3519 -0
  78. package/dist/types/index.d.ts +9 -10
  79. package/dist/types/index.js +11 -5
  80. package/dist/{types-DGwrltUF.d.ts → types-BHlTjwWd.d.ts} +3 -3
  81. package/fixtures/events-wire/client-effects-by-trait/response.json +0 -18
  82. package/fixtures/events-wire/client-effects-provenance/response.json +0 -18
  83. package/fixtures/events-wire/effect-results-every-kind/response.json +2 -27
  84. package/fixtures/events-wire/navigate-1/response.json +8 -5
  85. package/fixtures/events-wire/navigate-2/response.json +11 -8
  86. package/fixtures/events-wire/navigate-3/response.json +14 -11
  87. package/fixtures/events-wire/navigate-back/response.json +7 -4
  88. package/fixtures/events-wire/render-ui-3/response.json +12 -9
  89. package/fixtures/events-wire/render-ui-clear/response.json +0 -7
  90. package/fixtures/events-wire/sse-stream/response.json +0 -20
  91. package/fixtures/events-wire/sse-stream/stream.json +0 -20
  92. package/fixtures/events-wire/stateless-traits/response.json +14 -5
  93. package/fixtures/kernel-wire/golden/basic-entity.json +1687 -0
  94. package/fixtures/kernel-wire/golden/entity-rerender.json +743 -0
  95. package/fixtures/kernel-wire/golden/rollback.json +793 -0
  96. package/fixtures/kernel-wire/golden/tick-counter.json +1538 -0
  97. package/fixtures/kernel-wire/golden/two-orbital-chore.json +847 -0
  98. package/fixtures/kernel-wire/golden/two-orbital-task.json +457 -0
  99. package/fixtures/kernel-wire/played-step.json +136 -0
  100. package/fixtures/kernel-wire/scripts/basic-entity.json +28 -0
  101. package/fixtures/kernel-wire/scripts/entity-rerender.json +13 -0
  102. package/fixtures/kernel-wire/scripts/rollback.json +53 -0
  103. package/fixtures/kernel-wire/scripts/tick-counter.json +26 -0
  104. package/fixtures/kernel-wire/scripts/two-orbital-chore.json +9 -0
  105. package/fixtures/kernel-wire/scripts/two-orbital-task.json +9 -0
  106. package/package.json +28 -19
  107. package/dist/builders-DmZE5By0.d.ts +0 -2663
  108. package/dist/chunk-45I2O4SJ.js +0 -4646
  109. package/dist/chunk-45I2O4SJ.js.map +0 -1
  110. package/dist/chunk-6LR43Z5E.js +0 -3061
  111. package/dist/chunk-6LR43Z5E.js.map +0 -1
  112. package/dist/chunk-GIUA3NUJ.js +0 -809
  113. package/dist/chunk-GIUA3NUJ.js.map +0 -1
  114. package/dist/chunk-GTY53NS5.js +0 -1908
  115. package/dist/chunk-GTY53NS5.js.map +0 -1
  116. package/dist/chunk-JOHDVS6J.js +0 -1614
  117. package/dist/chunk-JOHDVS6J.js.map +0 -1
  118. package/dist/chunk-KDMV222Q.js.map +0 -1
  119. package/dist/chunk-QRHJUS3D.js +0 -23
  120. package/dist/chunk-QRHJUS3D.js.map +0 -1
  121. package/dist/chunk-QUOTJULD.js.map +0 -1
  122. package/dist/chunk-V5VNGRVU.js +0 -66
  123. package/dist/chunk-V5VNGRVU.js.map +0 -1
  124. package/dist/chunk-X4SC7FGF.js.map +0 -1
  125. package/dist/entityAccess-BPSz1i2n.d.ts +0 -80
  126. package/dist/mock/index.d.ts +0 -153
  127. package/dist/mock/index.js +0 -190
  128. package/dist/mock/index.js.map +0 -1
  129. package/dist/schema-T5RT5s6H.d.ts +0 -282
  130. package/dist/state-machine/index.d.ts +0 -359
  131. package/dist/state-machine/index.js +0 -3
  132. package/dist/state-machine/index.js.map +0 -1
@@ -1,2042 +1,2032 @@
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)"
51
- },
52
- {
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)"
56
- },
57
- {
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)"
61
- },
62
- {
63
- "code": "ORB_E_INVALID_RELATION",
64
- "category": "entity",
65
- "description": "Relation target entity doesn't exist"
3
+ "code": "ORB_T_MISSING_RENDER_UI",
4
+ "category": "trait",
5
+ "description": "Interaction trait missing render_ui effects"
66
6
  },
67
7
  {
68
- "code": "ORB_E_EMPTY_ENUM_VALUES",
69
- "category": "entity",
70
- "description": "Enum field has no values"
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."
71
11
  },
72
12
  {
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\"`)."
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."
76
16
  },
77
17
  {
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."
18
+ "code": "ORB_T_UNQUOTE_OUTSIDE_QUASIQUOTE",
19
+ "category": "trait",
20
+ "description": "An `[\"unquote\", …]` call outside a quasiquote body in an `.orb` input."
81
21
  },
82
22
  {
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."
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."
86
26
  },
87
27
  {
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."
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."
91
31
  },
92
32
  {
93
- "code": "ORB_T_UNDEFINED_TRAIT",
33
+ "code": "ORB_T_CONFIG_SHAPE_MISMATCH",
94
34
  "category": "trait",
95
- "description": "Trait reference not found"
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."
96
36
  },
97
37
  {
98
- "code": "ORB_T_INVALID_FORMAT",
38
+ "code": "ORB_T_TYPE_UNKNOWN",
99
39
  "category": "trait",
100
- "description": "Trait has invalid format"
40
+ "description": "A type reference names no declared type, entity or primitive"
101
41
  },
102
42
  {
103
- "code": "ORB_T_NO_INITIAL_STATE",
43
+ "code": "ORB_T_TYPE_CYCLE",
104
44
  "category": "trait",
105
- "description": "State machine has no initial state"
45
+ "description": "A type composition chain refers back to itself"
106
46
  },
107
47
  {
108
- "code": "ORB_T_MULTIPLE_INITIAL_STATES",
48
+ "code": "ORB_T_TYPE_KIND_MISMATCH",
109
49
  "category": "trait",
110
- "description": "State machine has multiple initial states"
50
+ "description": "Composed types do not share a kind (all Entity, all Trait, …)"
111
51
  },
112
52
  {
113
- "code": "ORB_T_DUPLICATE_STATE",
53
+ "code": "ORB_T_TYPE_COMPOSITION_CONFLICT",
114
54
  "category": "trait",
115
- "description": "Duplicate state name in state machine"
55
+ "description": "A field is declared in more than one composed entity"
116
56
  },
117
57
  {
118
- "code": "ORB_T_EMPTY_EVENT_NAME",
58
+ "code": "ORB_T_TYPE_ANNOTATION_MISMATCH",
119
59
  "category": "trait",
120
- "description": "An event declared, emitted or transitioned on has an empty name"
60
+ "description": "A type body does not match its `::` type annotation"
121
61
  },
122
62
  {
123
- "code": "ORB_T_INVALID_TRANSITION",
63
+ "code": "ORB_T_TYPE_UNKNOWN_PARAM",
124
64
  "category": "trait",
125
- "description": "Transition references non-existent state"
65
+ "description": "A type alias body uses a type parameter the alias does not declare"
126
66
  },
127
67
  {
128
- "code": "ORB_T_DUPLICATE_TRANSITION",
68
+ "code": "ORB_T_TYPE_WRONG_ARG_COUNT",
129
69
  "category": "trait",
130
- "description": "Duplicate transition (same from/event without guard)"
70
+ "description": "A type alias is applied with the wrong number of type arguments"
131
71
  },
132
72
  {
133
- "code": "ORB_T_MISSING_INIT_TRANSITION",
73
+ "code": "ORB_T_EVENT_TYPE_WRONG_KIND",
134
74
  "category": "trait",
135
- "description": "Missing INIT transition on initial state"
75
+ "description": "An `emits` entry names a declared type that is not an Event type"
136
76
  },
137
77
  {
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."
78
+ "code": "ORB_P_UNKNOWN_PROTOCOL",
79
+ "category": "page",
80
+ "description": "A page names a protocol that is no row of the protocol table"
141
81
  },
142
82
  {
143
- "code": "ORB_T_INIT_MISSING_FETCH",
144
- "category": "trait",
145
- "description": "INIT transition missing fetch effect for linked entity"
83
+ "code": "ORB_P_ENDPOINT_GRANT_MISSING",
84
+ "category": "page",
85
+ "description": "An `http` endpoint has no covering `net` listen grant"
146
86
  },
147
87
  {
148
- "code": "ORB_T_MISSING_RENDER_UI",
149
- "category": "trait",
150
- "description": "Interaction trait missing render_ui effects"
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"
151
91
  },
152
92
  {
153
- "code": "ORB_T_ENDPOINT_TRAIT_RENDERS",
154
- "category": "trait",
155
- "description": "A trait mounted only on protocol endpoints renders"
93
+ "code": "ORB_RUI_UNKNOWN_ITEM_ACTION_PROP",
94
+ "category": "render_ui",
95
+ "description": "Unknown itemAction prop (e.g., hallucinated 'condition')"
156
96
  },
157
97
  {
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"
98
+ "code": "ORB_RUI_BINDING_TYPE_MISMATCH",
99
+ "category": "render_ui",
100
+ "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`."
161
101
  },
162
102
  {
163
- "code": "ORB_T_TRAIT_UNMOUNTED",
164
- "category": "trait",
165
- "description": "A program trait is listed on no page"
103
+ "code": "ORB_RUI_EVENT_BINDING_PAYLOAD_MISMATCH",
104
+ "category": "render_ui",
105
+ "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`."
166
106
  },
167
107
  {
168
- "code": "ORB_T_DEPRECATED_UI",
169
- "category": "trait",
170
- "description": "Deprecated ui property used"
108
+ "code": "ORB_CANCEL_CALL_NO_KEYED_CALL",
109
+ "category": "effect",
110
+ "description": "the app runs `cancel-call` but no `call-service` anywhere carries a `key`"
171
111
  },
172
112
  {
173
- "code": "ORB_T_DUPLICATE_NAME",
174
- "category": "trait",
175
- "description": "Duplicate trait name across orbitals"
113
+ "code": "ORB_CANCEL_CALL_KEY_NEVER_CALLED",
114
+ "category": "effect",
115
+ "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`"
176
116
  },
177
117
  {
178
- "code": "ORB_T_UNDEFINED_EVENT",
179
- "category": "trait",
180
- "description": "Event not defined but used in transition"
118
+ "code": "ORB_PAGE_FACTS_UNREQUESTED_READ",
119
+ "category": "effect",
120
+ "description": "an event reads a page fact the `browser/page-facts` call did not request"
181
121
  },
182
122
  {
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."
123
+ "code": "ORB_TAB_REQUEST_REFUSED",
124
+ "category": "effect",
125
+ "description": "a literal `browser/tab-*` request whose keys the op declares but whose values the kernel's tab-call parser refuses"
186
126
  },
187
127
  {
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."
128
+ "code": "ORB_X_DISPATCH_MIXED_RESIDENCE",
129
+ "category": "effect",
130
+ "description": "one dispatch's delegated effects reach browser-stored rows and server work"
191
131
  },
192
132
  {
193
- "code": "ORB_T_UNQUOTE_OUTSIDE_QUASIQUOTE",
194
- "category": "trait",
195
- "description": "An `[\"unquote\", …]` call outside a quasiquote body in an `.orb` input."
133
+ "code": "ORB_EFF_SLOT_CONFLICT",
134
+ "category": "effect",
135
+ "description": "Multiple render_ui effects targeting same slot"
196
136
  },
197
137
  {
198
- "code": "ORB_T_INVALID_SLOT_DEFAULT",
199
- "category": "trait",
200
- "description": "Config field typed `slot` has a default value not in `VALID_SLOTS`"
138
+ "code": "ORB_EFF_NOTIFY_RETIRED",
139
+ "category": "effect",
140
+ "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."
201
141
  },
202
142
  {
203
- "code": "ORB_T_INVALID_PATTERN_DEFAULT",
204
- "category": "trait",
205
- "description": "Config field typed `pattern` has a default value not in `PATTERN_TYPES`"
143
+ "code": "ORB_EMIT_DECLARED_BUT_UNFIRED",
144
+ "category": "effect",
145
+ "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`."
206
146
  },
207
147
  {
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)"
148
+ "code": "ORB_EFF_MISSING_REQUIRED_EMIT",
149
+ "category": "effect",
150
+ "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."
211
151
  },
212
152
  {
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."
153
+ "code": "SEXPR_ARITY_MISMATCH",
154
+ "category": "sexpr",
155
+ "description": "Wrong number of arguments for operator"
216
156
  },
217
157
  {
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."
158
+ "code": "SEXPR_LAMBDA_ARG_POSITION",
159
+ "category": "sexpr",
160
+ "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)`"
221
161
  },
222
162
  {
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."
163
+ "code": "SEXPR_EFFECT_IN_GUARD",
164
+ "category": "sexpr",
165
+ "description": "Effect operator used in guard context"
226
166
  },
227
167
  {
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."
168
+ "code": "ORB_X_UNRESOLVED_PATTERN_FIELD_REF",
169
+ "category": "cross",
170
+ "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."
231
171
  },
232
172
  {
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."
173
+ "code": "ORB_CONFIG_FIELD_REF_UNKNOWN",
174
+ "category": "binding",
175
+ "description": "A `field @entity` config knob names something that is not a field of the trait's bound entity"
236
176
  },
237
177
  {
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."
178
+ "code": "ORB_CONFIG_FIELD_REF_TYPE_MISMATCH",
179
+ "category": "binding",
180
+ "description": "A `field @entity T` config knob names a field whose type is not `T`"
241
181
  },
242
182
  {
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)."
183
+ "code": "ORB_BINDING_INVALID_PATH",
184
+ "category": "binding",
185
+ "description": "Invalid binding path"
246
186
  },
247
187
  {
248
- "code": "ORB_T_TYPE_UNKNOWN",
249
- "category": "trait",
250
- "description": "A type reference names no declared type, entity or primitive"
188
+ "code": "ORB_X_SET_VALUE_TYPE_MISMATCH",
189
+ "category": "effect",
190
+ "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."
251
191
  },
252
192
  {
253
- "code": "ORB_T_TYPE_CYCLE",
254
- "category": "trait",
255
- "description": "A type composition chain refers back to itself"
193
+ "code": "ORB_X_SET_RETURN_TYPE_MISMATCH",
194
+ "category": "effect",
195
+ "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)."
256
196
  },
257
197
  {
258
- "code": "ORB_T_TYPE_KIND_MISMATCH",
259
- "category": "trait",
260
- "description": "Composed types do not share a kind (all Entity, all Trait, …)"
198
+ "code": "ORB_X_COMPARISON_OPERAND_TYPE_MISMATCH",
199
+ "category": "effect",
200
+ "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."
261
201
  },
262
202
  {
263
- "code": "ORB_T_TYPE_COMPOSITION_CONFLICT",
264
- "category": "trait",
265
- "description": "A field is declared in more than one composed entity"
203
+ "code": "ORB_X_OPERATOR_ARG_TYPE_MISMATCH",
204
+ "category": "effect",
205
+ "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."
266
206
  },
267
207
  {
268
- "code": "ORB_T_TYPE_ANNOTATION_MISMATCH",
269
- "category": "trait",
270
- "description": "A type body does not match its `::` type annotation"
208
+ "code": "ORB_X_OPERATOR_ARG_UNDETERMINED",
209
+ "category": "effect",
210
+ "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)."
271
211
  },
272
212
  {
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"
213
+ "code": "ORB_X_ORDERING_OPTIONAL_OPERAND",
214
+ "category": "effect",
215
+ "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."
276
216
  },
277
217
  {
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"
218
+ "code": "ORB_X_OPERATOR_NULL_OPERAND",
219
+ "category": "effect",
220
+ "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."
281
221
  },
282
222
  {
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"
223
+ "code": "ORB_X_OPERATOR_OPTION_NEWER",
224
+ "category": "effect",
225
+ "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."
286
226
  },
287
227
  {
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)."
228
+ "code": "ORB_X_SET_REQUIRED_FIELD_FROM_OPTIONAL_KNOB",
229
+ "category": "effect",
230
+ "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."
291
231
  },
292
232
  {
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."
233
+ "code": "ORB_EMIT_PAYLOAD_MISSING_REQUIRED",
234
+ "category": "binding",
235
+ "description": "`(emit EVT {...})` literal payload is missing a field the event's declared payload marks as required. Error severity."
296
236
  },
297
237
  {
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."
238
+ "code": "ORB_EMIT_PAYLOAD_EXTRA_FIELD",
239
+ "category": "binding",
240
+ "description": "`(emit EVT {...})` literal carries a field that is not declared on the event's payload schema. Error severity."
301
241
  },
302
242
  {
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`."
243
+ "code": "ORB_EMIT_PAYLOAD_FIELD_TYPE_MISMATCH",
244
+ "category": "binding",
245
+ "description": "`(emit EVT {...})` literal provides a value whose primitive type does not match the declared `PayloadField.field_type`. Error severity."
306
246
  },
307
247
  {
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."
248
+ "code": "ORB_EMIT_REPEATS_IDENTICALLY",
249
+ "category": "binding",
250
+ "description": "An `emit` repeats an earlier one of the same transition identically: the dispatch loop collapses the second."
311
251
  },
312
252
  {
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."
253
+ "code": "ORB_X_ENTITY_PROP_CONTRACT",
254
+ "category": "render_ui",
255
+ "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."
316
256
  },
317
257
  {
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)."
258
+ "code": "ORB_EMIT_PAYLOAD_NOT_PRODUCED",
259
+ "category": "binding",
260
+ "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."
321
261
  },
322
262
  {
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."
263
+ "code": "ORB_EFFECT_IN_LAMBDA",
264
+ "category": "binding",
265
+ "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."
326
266
  },
327
267
  {
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)."
268
+ "code": "CIRCUIT_DEAD_END_COMPONENT",
269
+ "category": "circuit",
270
+ "description": "Interactive component missing itemActions"
331
271
  },
332
272
  {
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."
273
+ "code": "ORB_GEN_INVALID_REFERENCE",
274
+ "category": "generic",
275
+ "description": "Generic invalid reference format"
336
276
  },
337
277
  {
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."
278
+ "code": "ORB_GEN_MISSING_FIELD",
279
+ "category": "generic",
280
+ "description": "Generic missing required field"
341
281
  },
342
282
  {
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."
283
+ "code": "ORB_GEN_DUPLICATE",
284
+ "category": "generic",
285
+ "description": "Generic duplicate entity/item"
346
286
  },
347
287
  {
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."
288
+ "code": "CIRCUIT_ACTION_COMPONENT_MISMATCH",
289
+ "category": "circuit",
290
+ "description": "An item action is used on a component type that does not support that action"
351
291
  },
352
292
  {
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)."
293
+ "code": "CIRCUIT_DEAD_END_STATE",
294
+ "category": "circuit",
295
+ "description": "A state has no outgoing transitions, so it is a dead end"
356
296
  },
357
297
  {
358
- "code": "ORB_P_MISSING_NAME",
359
- "category": "page",
360
- "description": "Page is missing a name"
298
+ "code": "CIRCUIT_DEAD_HANDLER",
299
+ "category": "circuit",
300
+ "description": "An item action fires an event into a state where no transition handles that event"
361
301
  },
362
302
  {
363
- "code": "ORB_P_MISSING_PATH",
364
- "category": "page",
365
- "description": "Page is missing a path"
303
+ "code": "CIRCUIT_DUPLICATE_EVENT",
304
+ "category": "circuit",
305
+ "description": "The same event is emitted by more than one action within a single render-ui effect"
366
306
  },
367
307
  {
368
- "code": "ORB_P_INVALID_PATH",
369
- "category": "page",
370
- "description": "Page path is invalid (must start with /)"
308
+ "code": "CIRCUIT_MODAL_EXIT_INCOMPLETE",
309
+ "category": "circuit",
310
+ "description": "A transition leaving a modal state does not close the modal overlay it opened"
371
311
  },
372
312
  {
373
- "code": "ORB_P_DUPLICATE_PATH",
374
- "category": "page",
375
- "description": "Duplicate page path"
313
+ "code": "CIRCUIT_NO_OVERLAY_EXIT",
314
+ "category": "circuit",
315
+ "description": "A state renders into an overlay slot but has no exit transition, leaving users stuck"
376
316
  },
377
317
  {
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`"
318
+ "code": "CIRCUIT_ORPHAN_EVENT",
319
+ "category": "circuit",
320
+ "description": "An action or emit raises an event that has no transition handler"
381
321
  },
382
322
  {
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)"
323
+ "code": "CIRCUIT_UNREACHABLE_STATE",
324
+ "category": "circuit",
325
+ "description": "A state has no incoming transitions and cannot be reached"
386
326
  },
387
327
  {
388
- "code": "ORB_P_AUTH_NO_SIGN_IN",
389
- "category": "page",
390
- "description": "`access: authenticated` page in an app that declares no `signIn` route"
328
+ "code": "LINT_NODE_UNCHECKED",
329
+ "category": "lint",
330
+ "description": "A lint rule met a schema node of an unexpected shape and could not check it"
391
331
  },
392
332
  {
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`"
333
+ "code": "ORB_A11Y_UNNAMED",
334
+ "category": "a11y",
335
+ "description": "A render-ui control has no accessible name, so screen readers announce it as unlabeled"
396
336
  },
397
337
  {
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`)"
338
+ "code": "ORB_ASSET_INLINE_URL",
339
+ "category": "asset",
340
+ "description": "A literal http(s) url sits in the config defaults or seed rows of an orbital that composes std-asset-pack."
401
341
  },
402
342
  {
403
- "code": "ORB_P_UNKNOWN_PROTOCOL",
404
- "category": "page",
405
- "description": "A page names a protocol that is no row of the protocol table"
343
+ "code": "ORB_AUTH_GUARD_CLIENT_ONLY",
344
+ "category": "auth",
345
+ "description": "A transition guards on @user but its trait dispatches client-only, so the UI transition advances before the server evaluates the guard"
406
346
  },
407
347
  {
408
- "code": "ORB_P_ENDPOINT_GRANT_MISSING",
409
- "category": "page",
410
- "description": "An `http` endpoint has no covering `net` listen grant"
348
+ "code": "ORB_BEACON_OPTION_UNKNOWN",
349
+ "category": "beacon",
350
+ "description": "A browser beacon request carries an option key that is not a known beacon request key"
411
351
  },
412
352
  {
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"
353
+ "code": "ORB_BEACON_TEXT_REQUIRED",
354
+ "category": "browser",
355
+ "description": "browser/beacon needs a request carrying a text field"
416
356
  },
417
357
  {
418
- "code": "ORB_P_TRANSLATION_DUPLICATE_LOCALE",
419
- "category": "page",
420
- "description": "One locale holds two pages of the same `translationOf` group"
358
+ "code": "ORB_BEACON_URL_NOT_ABSOLUTE",
359
+ "category": "browser",
360
+ "description": "A browser beacon effect targets a URL that is not an absolute http(s) URL"
421
361
  },
422
362
  {
423
- "code": "ORB_P_MISSING_TRAITS",
424
- "category": "page",
425
- "description": "Page is missing traits array"
363
+ "code": "ORB_BINDING_DISPATCH_ROOT_IN_TICK",
364
+ "category": "binding",
365
+ "description": "A dispatch-only binding root is read inside a tick, where a firing has no delivery"
426
366
  },
427
367
  {
428
- "code": "ORB_P_EMPTY_TRAITS",
429
- "category": "page",
430
- "description": "Page traits array is empty"
368
+ "code": "ORB_BINDING_EMBED_READS_ARM_WRITE",
369
+ "category": "binding",
370
+ "description": "A transition writes a value and renders a child that reads it on mount, so the child shows the stale value"
431
371
  },
432
372
  {
433
- "code": "ORB_O_DUPLICATE_NAME",
434
- "category": "page",
435
- "description": "Two orbitals of one program share a name"
373
+ "code": "ORB_BINDING_ENTITY_FIELD_NEVER_SET",
374
+ "category": "binding",
375
+ "description": "A trait reads an entity binding field but no transition ever sets it, so it stays undefined"
436
376
  },
437
377
  {
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)."
378
+ "code": "ORB_BINDING_ENTITY_FIELD_NOT_FOUND",
379
+ "category": "binding",
380
+ "description": "An @entity binding names a field that the linked entity does not declare"
441
381
  },
442
382
  {
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."
383
+ "code": "ORB_BINDING_EVENT_INVALID_PATH",
384
+ "category": "binding",
385
+ "description": "An @event binding path does not follow the shape of the delivery record"
446
386
  },
447
387
  {
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."
388
+ "code": "ORB_BINDING_FROM_ENTITY_OUTSIDE_ENSURES",
389
+ "category": "binding",
390
+ "description": "@fromEntity is the row before a transition and may only be used inside an @ensures"
451
391
  },
452
392
  {
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)."
393
+ "code": "ORB_BINDING_INVALID_FORMAT",
394
+ "category": "binding",
395
+ "description": "A binding string is not in a valid binding format"
456
396
  },
457
397
  {
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)."
398
+ "code": "ORB_BINDING_NOW_NO_PATH",
399
+ "category": "binding",
400
+ "description": "The @now binding is given a path, but it returns the current timestamp directly"
461
401
  },
462
402
  {
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."
403
+ "code": "ORB_BINDING_PAYLOAD_FIELD_UNDECLARED",
404
+ "category": "binding",
405
+ "description": "A @payload binding reads a field that the triggering event does not declare in its payload"
466
406
  },
467
407
  {
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."
408
+ "code": "ORB_BINDING_PAYLOAD_IN_TICK",
409
+ "category": "binding",
410
+ "description": "A binding reads @payload inside a tick, where a firing has no delivery"
471
411
  },
472
412
  {
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."
413
+ "code": "ORB_BINDING_PERSIST_ROW_ID_NEVER_SET",
414
+ "category": "binding",
415
+ "description": "A persist update or delete runs on an event but no transition sets the row id, so the write never touches a row"
476
416
  },
477
417
  {
478
- "code": "ORB_O_ENTITY_TARGET_UNKNOWN",
479
- "category": "page",
480
- "description": "An `obj.entities {}` value names no entity the consumer schema declares."
418
+ "code": "ORB_BINDING_ROOT_NO_PATH",
419
+ "category": "binding",
420
+ "description": "A binding root that takes no path is written with a path"
481
421
  },
482
422
  {
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."
423
+ "code": "ORB_BINDING_SET_TARGET_MISSING_PATH",
424
+ "category": "binding",
425
+ "description": "A set effect targets a binding root without a field path"
486
426
  },
487
427
  {
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)."
428
+ "code": "ORB_BINDING_STATE_NO_PATH",
429
+ "category": "binding",
430
+ "description": "A binding root that returns a bare value, such as @state, is given a path"
491
431
  },
492
432
  {
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)."
433
+ "code": "ORB_BINDING_TRAIT_CYCLE",
434
+ "category": "binding",
435
+ "description": "A cycle exists in @trait references"
496
436
  },
497
437
  {
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)."
438
+ "code": "ORB_BINDING_TRAIT_INVALID_FORMAT",
439
+ "category": "binding",
440
+ "description": "A trait binding or trait-typed config default is not a valid trait reference"
501
441
  },
502
442
  {
503
- "code": "ORB_O_MOCK_UNKNOWN_FIELD",
504
- "category": "page",
505
- "description": "A `mock { … }` key names no field of the imported primary entity."
443
+ "code": "ORB_BINDING_TRAIT_INVALID_POSITION",
444
+ "category": "binding",
445
+ "description": "A @trait binding appears in a position other than a children array or a node-typed prop"
506
446
  },
507
447
  {
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)."
448
+ "code": "ORB_BINDING_TRAIT_MISSING_NAME",
449
+ "category": "binding",
450
+ "description": "A @trait binding does not name the trait it refers to"
511
451
  },
512
452
  {
513
- "code": "ORB_O_RETYPE_FIELD_CONFLICT",
514
- "category": "page",
515
- "description": "A `retype { … }` field also added by `extend {}`, or retyped twice."
453
+ "code": "ORB_BINDING_TRAIT_OUTSIDE_RENDER_UI",
454
+ "category": "binding",
455
+ "description": "An @trait binding appears outside a render-ui effect, where it is the only place trait references are allowed"
516
456
  },
517
457
  {
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)."
458
+ "code": "ORB_BINDING_TRAIT_SELF_REFERENCE",
459
+ "category": "binding",
460
+ "description": "A trait references itself through a trait binding"
521
461
  },
522
462
  {
523
- "code": "ORB_O_TRAITS_UNKNOWN_TRAIT",
524
- "category": "page",
525
- "description": "A `traits { T { … } }` key naming no trait of the upstream orbital."
463
+ "code": "ORB_BINDING_TRAIT_UNKNOWN",
464
+ "category": "binding",
465
+ "description": "A @trait binding references a trait that is not declared in this orbital"
526
466
  },
527
467
  {
528
- "code": "ORB_O_TRAITS_OMITTED_TRAIT",
529
- "category": "page",
530
- "description": "A `traits { T { … } }` key naming a trait `omit {}` / `only {}` dropped."
468
+ "code": "ORB_BINDING_UNKNOWN_ENTITY",
469
+ "category": "binding",
470
+ "description": "A binding refers to an entity that is not declared in the program"
531
471
  },
532
472
  {
533
- "code": "ORB_P_SECTIONS_FORBIDDEN",
534
- "category": "page",
535
- "description": "Static sections are forbidden (use render_ui)"
473
+ "code": "ORB_BINDING_UNKNOWN_ROOT",
474
+ "category": "binding",
475
+ "description": "A binding names a root the context does not provide"
536
476
  },
537
477
  {
538
- "code": "ORB_P_INVALID_TRAIT_REF",
539
- "category": "page",
540
- "description": "Invalid trait reference on page"
478
+ "code": "ORB_CALL_KEY_UNUSED",
479
+ "category": "effect",
480
+ "description": "A literal (as 'k' CallKey) names a key that no keyed call in the program runs under"
541
481
  },
542
482
  {
543
- "code": "ORB_P_INVALID_VIEW_TYPE",
544
- "category": "page",
545
- "description": "Invalid view type"
483
+ "code": "ORB_CALL_SERVICE_CANCELLED_WITHOUT_KEY",
484
+ "category": "call_service",
485
+ "description": "A call-service declares emit.cancelled but has no key, so nothing can cancel an unkeyed call"
546
486
  },
547
487
  {
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)."
488
+ "code": "ORB_CALL_SERVICE_KEY_DUPLICATE",
489
+ "category": "effect",
490
+ "description": "Two call-service effects in one transition use the same key"
551
491
  },
552
492
  {
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)."
493
+ "code": "ORB_CALL_SERVICE_KEY_TYPE",
494
+ "category": "call_service",
495
+ "description": "A keyed call-service effect has a key that is not a non-empty string"
556
496
  },
557
497
  {
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."
498
+ "code": "ORB_CALL_SERVICE_RESULT_HAS_KEY",
499
+ "category": "effect",
500
+ "description": "A keyed call-service returns a record that already has a key field, so the call key would collide with it"
561
501
  },
562
502
  {
563
- "code": "ORB_COMPOSED_STATE_UNREACHABLE",
503
+ "code": "ORB_CIRCUIT_ASYNC_RESULT_DEAF_TARGET",
564
504
  "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."
505
+ "description": "A transition declares async result events but its target state has no arm handling them, so the requester cannot hear its own result"
566
506
  },
567
507
  {
568
- "code": "ORB_COMPOSED_TRANSITION_UNREACHABLE",
508
+ "code": "ORB_CIRCUIT_DEAD_BODILESS_ACTION",
569
509
  "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)."
510
+ "description": "A transition changes state but carries no effects, so the screen keeps its paint and affordances routed to it are dead"
571
511
  },
572
512
  {
573
- "code": "ORB_CONTROL_VALUE_DISCARDED",
513
+ "code": "ORB_CIRCUIT_FAILURE_ARM_MISSING",
574
514
  "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)."
515
+ "description": "A transition starting an asynchronous client call has no failure arm to handle its error"
576
516
  },
577
517
  {
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)."
518
+ "code": "ORB_CIRCUIT_FAILURE_ARM_RENDERS_NOTHING",
519
+ "category": "circuit",
520
+ "description": "A state handles a failure event but its arm neither renders nor emits a declared event, so the failure reaches no one"
581
521
  },
582
522
  {
583
- "code": "ORB_SLOT_MAIN_NOT_COVERED",
584
- "category": "slot",
585
- "description": "Main slot not covered by any trait"
523
+ "code": "ORB_CIRCUIT_INIT_UNCOVERED_STATE",
524
+ "category": "circuit",
525
+ "description": "A page trait handles INIT in its initial state but not in another reachable state, so revisiting the page from there does nothing"
586
526
  },
587
527
  {
588
- "code": "ORB_SLOT_CONTENTION",
589
- "category": "slot",
590
- "description": "Multiple traits rendering to same slot (INIT state)"
528
+ "code": "ORB_CIRCUIT_LIFECYCLE_EMIT_UNDELIVERED",
529
+ "category": "circuit",
530
+ "description": "A transition emits a lifecycle event that the event bus never delivers"
591
531
  },
592
532
  {
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`)"
533
+ "code": "ORB_CIRCUIT_MODAL_SHELL_CLOSE_DEAF",
534
+ "category": "circuit",
535
+ "description": "A state mounting an overlay-slot pattern has no CLOSE or CANCEL transition to dismiss it"
596
536
  },
597
537
  {
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."
538
+ "code": "ORB_CIRCUIT_OWN_EMIT_UNREACHABLE",
539
+ "category": "circuit",
540
+ "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"
601
541
  },
602
542
  {
603
- "code": "ORB_SLOT_INVALID_NESTING",
604
- "category": "slot",
605
- "description": "Invalid slot nesting (e.g., modal in modal)"
543
+ "code": "ORB_CIRCUIT_SELF_EMIT_LOOP",
544
+ "category": "circuit",
545
+ "description": "A transition re-emits its own trigger event with a constant payload and a same-event arm is reachable, so it loops forever"
606
546
  },
607
547
  {
608
- "code": "ORB_RUI_INVALID_SLOT",
609
- "category": "render_ui",
610
- "description": "Invalid slot in render_ui effect"
548
+ "code": "ORB_CIRCUIT_SELF_OVERLAY_IN_SHELL",
549
+ "category": "circuit",
550
+ "description": "A self-overlaying pattern is rendered inside an overlay slot payload, stacking two overlay chromes"
611
551
  },
612
552
  {
613
- "code": "ORB_RUI_INVALID_PATTERN",
614
- "category": "render_ui",
615
- "description": "Invalid pattern type"
553
+ "code": "ORB_CIRCUIT_VIEWER_STRANDED",
554
+ "category": "circuit",
555
+ "description": "A page's content owner repaints its region on a user-triggered event with a body that offers no way on"
616
556
  },
617
557
  {
618
- "code": "ORB_RUI_MISSING_PATTERN_TYPE",
619
- "category": "render_ui",
620
- "description": "Pattern missing type property"
558
+ "code": "ORB_COMPOSED_STATE_UNREACHABLE",
559
+ "category": "circuit",
560
+ "description": "A composed trait can never enter some states because nothing in the program sends the events that enter them"
621
561
  },
622
562
  {
623
- "code": "ORB_RUI_INVALID_PROP",
624
- "category": "render_ui",
625
- "description": "Invalid prop for pattern"
563
+ "code": "ORB_COMPOSED_TRANSITION_UNREACHABLE",
564
+ "category": "composed",
565
+ "description": "A composed trait handles events that nothing in the program ever sends"
626
566
  },
627
567
  {
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."
568
+ "code": "ORB_CONFIG_DANGLING_REF",
569
+ "category": "binding",
570
+ "description": "An @config key is not declared by any config schema reachable from the trait chain"
631
571
  },
632
572
  {
633
- "code": "ORB_RUI_MISSING_REQUIRED_PROP",
634
- "category": "render_ui",
635
- "description": "Missing required prop for pattern"
573
+ "code": "ORB_CONTROL_NO_CONSEQUENCE",
574
+ "category": "emit",
575
+ "description": "A rendered control fires an event whose handlers change nothing the app or the viewer can observe."
636
576
  },
637
577
  {
638
- "code": "ORB_RUI_INVALID_ITEM_ACTION",
639
- "category": "render_ui",
640
- "description": "Invalid itemAction configuration"
578
+ "code": "ORB_CONTROL_VALUE_DISCARDED",
579
+ "category": "circuit",
580
+ "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
581
  },
642
582
  {
643
- "code": "ORB_RUI_UNKNOWN_ITEM_ACTION_PROP",
644
- "category": "render_ui",
645
- "description": "Unknown itemAction prop (e.g., hallucinated 'condition')"
583
+ "code": "ORB_CREDENTIAL_REQUEST_INVALID",
584
+ "category": "credential",
585
+ "description": "A credential request host effect carries options other than the ones it declares"
646
586
  },
647
587
  {
648
- "code": "ORB_RUI_MISSING_ACTION",
649
- "category": "render_ui",
650
- "description": "Button/link missing action prop"
588
+ "code": "ORB_DERIVED_FIELD_WRITTEN",
589
+ "category": "entity_mutation",
590
+ "description": "A set or persist writes an @derived field that the kernel computes on every write"
651
591
  },
652
592
  {
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`"
593
+ "code": "ORB_EFFECT_OPTION_DROPPED",
594
+ "category": "effect",
595
+ "description": "An effect carries options that depend on a key echo, but the effect has no key so the options are dropped"
656
596
  },
657
597
  {
658
- "code": "ORB_RUI_INVALID_FIELD_PATH",
659
- "category": "render_ui",
660
- "description": "Nested field path references invalid relation or field"
598
+ "code": "ORB_EFF_CALL_SERVICE_MISSING_ACTION",
599
+ "category": "effect",
600
+ "description": "A call-service effect has no string action"
661
601
  },
662
602
  {
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."
603
+ "code": "ORB_EFF_CALL_SERVICE_MISSING_PARAM",
604
+ "category": "effect",
605
+ "description": "A call-service effect omits a parameter the service action requires"
666
606
  },
667
607
  {
668
- "code": "ORB_RUI_PROP_TYPE_MISMATCH",
669
- "category": "render_ui",
670
- "description": "Prop value type doesn't match expected type from registry"
608
+ "code": "ORB_EFF_CALL_SERVICE_MISSING_SERVICE",
609
+ "category": "effect",
610
+ "description": "A call_service effect is missing its service name or action"
671
611
  },
672
612
  {
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`."
613
+ "code": "ORB_EFF_CALL_SERVICE_PARAM_TYPE",
614
+ "category": "effect",
615
+ "description": "A call-service parameter has a value whose type does not match the type the service action declares"
676
616
  },
677
617
  {
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."
618
+ "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_PARAM",
619
+ "category": "effect",
620
+ "description": "A call-service passes a param that the service action does not declare"
681
621
  },
682
622
  {
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`)."
623
+ "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_SERVICE",
624
+ "category": "effect",
625
+ "description": "A call-service effect names a service that is not a registered integrator or declared service"
686
626
  },
687
627
  {
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`."
628
+ "code": "ORB_EFF_EMIT_INVALID_NAME",
629
+ "category": "effect",
630
+ "description": "The event name inside an emit effect is not a valid string event name"
691
631
  },
692
632
  {
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`."
633
+ "code": "ORB_EFF_EMIT_KEY_INVALID",
634
+ "category": "effect",
635
+ "description": "An emit config carries a key that the operator does not support"
696
636
  },
697
637
  {
698
- "code": "ORB_EFF_CALL_SERVICE_MISSING_SERVICE",
638
+ "code": "ORB_EFF_EMIT_UNDECLARED_EVENT",
699
639
  "category": "effect",
700
- "description": "call_service missing service name"
640
+ "description": "An event named in emit is not declared in the trait's emits array"
701
641
  },
702
642
  {
703
- "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_SERVICE",
643
+ "code": "ORB_EFF_FETCH_BY_ID_PAYLOAD_LIST",
704
644
  "category": "effect",
705
- "description": "call_service names a service in neither schema.services nor the services registry. Error severity."
645
+ "description": "A fetch by id effect takes its id from a payload that is a list rather than a single value"
706
646
  },
707
647
  {
708
- "code": "ORB_EFF_CALL_SERVICE_MISSING_ACTION",
648
+ "code": "ORB_EFF_FETCH_INVALID_ENTITY",
709
649
  "category": "effect",
710
- "description": "call_service missing action"
650
+ "description": "A fetch effect is missing an entity name or references an invalid entity"
711
651
  },
712
652
  {
713
- "code": "ORB_EFF_CALL_SERVICE_MISSING_HANDLERS",
653
+ "code": "ORB_EFF_FETCH_INVALID_INCLUDE",
714
654
  "category": "effect",
715
- "description": "call_service missing onSuccess/onError handlers"
655
+ "description": "A fetch includes a relation that the fetched entity has no relation field for"
716
656
  },
717
657
  {
718
- "code": "ORB_EFF_CALL_SERVICE_UNKNOWN_PARAM",
658
+ "code": "ORB_EFF_FETCH_INVALID_OPTION",
719
659
  "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)"
660
+ "description": "A fetch deliver option is not one of the allowed values rows or ids"
721
661
  },
722
662
  {
723
- "code": "ORB_EFF_CALL_SERVICE_MISSING_PARAM",
663
+ "code": "ORB_EFF_MISSING_FETCH_FOR_ENTITY",
724
664
  "category": "effect",
725
- "description": "call_service params omit a key the action's registry contract requires"
665
+ "description": "A render-ui references an entity but no fetch effect for it exists in this or any predecessor transition"
726
666
  },
727
667
  {
728
- "code": "ORB_EFF_CALL_SERVICE_PARAM_TYPE",
668
+ "code": "ORB_EFF_NAVIGATE_MISSING_PAYLOAD",
729
669
  "category": "effect",
730
- "description": "call_service literal param value contradicts the contract's param type"
670
+ "description": "A navigate effect omits a payload field the target page requires for its INIT event"
731
671
  },
732
672
  {
733
- "code": "ORB_CALL_SERVICE_CANCELLED_WITHOUT_KEY",
673
+ "code": "ORB_EFF_NAVIGATE_TARGET_UNREACHABLE",
734
674
  "category": "effect",
735
- "description": "call-service declares `emit.cancelled` but no `key` — nothing can cancel an unkeyed call"
675
+ "description": "A navigate target path does not resolve to any declared page"
736
676
  },
737
677
  {
738
- "code": "ORB_CALL_SERVICE_KEY_TYPE",
678
+ "code": "ORB_EFF_PROGRAM_EVAL_FAILURE_MISSING",
739
679
  "category": "effect",
740
- "description": "call-service `key` is a non-string literal (number/bool/object/array)"
680
+ "description": "program/eval carries no emit.failure event, so validator errors would be dropped"
741
681
  },
742
682
  {
743
- "code": "ORB_CANCEL_CALL_NO_KEYED_CALL",
683
+ "code": "ORB_EFF_RETIRED_FORM",
744
684
  "category": "effect",
745
- "description": "the app runs `cancel-call` but no `call-service` anywhere carries a `key`"
685
+ "description": "An effect is written in a retired object form instead of the array form"
746
686
  },
747
687
  {
748
- "code": "ORB_CALL_KEY_UNUSED",
688
+ "code": "ORB_EFF_SET_INVALID_BINDING",
749
689
  "category": "effect",
750
- "description": "a literal `(as \"k\" CallKey)` in a program whose keyed calls are all keyed by literals, none of them `\"k\"`"
690
+ "description": "A set effect is missing its binding or its value"
751
691
  },
752
692
  {
753
- "code": "ORB_EFFECT_OPTION_DROPPED",
693
+ "code": "ORB_EFF_SET_PAYLOAD_NOT_ALLOWED",
754
694
  "category": "effect",
755
- "description": "an emit-options `key` on an effect that carries no key, so its completion could never echo it"
695
+ "description": "A set effect targets @payload, which is read-only; it should target @entity"
756
696
  },
757
697
  {
758
- "code": "ORB_CANCEL_CALL_KEY_NEVER_CALLED",
698
+ "code": "ORB_EFF_UNKNOWN_TYPE",
759
699
  "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`"
700
+ "description": "An effect has an unknown type or is malformed"
761
701
  },
762
702
  {
763
- "code": "ORB_CALL_SERVICE_KEY_DUPLICATE",
703
+ "code": "ORB_EFF_UNSIGNED_NOT_ENV_GUARDED",
764
704
  "category": "effect",
765
- "description": "two `call-service` effects of one transition carry the same literal `key`"
705
+ "description": "A jws/verify call with a literal allowUnsigned true sits in a transition that is not env-guarded"
766
706
  },
767
707
  {
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"
708
+ "code": "ORB_EMBED_CONFIG_FORWARD_MULTI_REFERRER",
709
+ "category": "embed",
710
+ "description": "A trait that forwards @config is embedded by more than one referrer, so the forwarded value is ambiguous"
771
711
  },
772
712
  {
773
- "code": "ORB_HTTP_EGRESS_UNDECLARED",
713
+ "code": "ORB_EMIT_CONFIG_REF_INVALID",
774
714
  "category": "effect",
775
- "description": "an `http` origin, `tokenUrl` origin, or `url` knob default is not in `egress`"
715
+ "description": "An emit config reference is invalid"
776
716
  },
777
717
  {
778
- "code": "ORB_HTTP_EGRESS_ENTRY_INVALID",
779
- "category": "effect",
780
- "description": "an `egress` entry is not `scheme://host[:port]`"
718
+ "code": "ORB_EMIT_CONTROL_UNHANDLED",
719
+ "category": "emit",
720
+ "description": "A rendered control fires an event nothing handles or routes."
781
721
  },
782
722
  {
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`"
723
+ "code": "ORB_EMIT_UNROUTED_TO_HANDLER",
724
+ "category": "trait_event",
725
+ "description": "A trait emits an event another trait has an arm for, but no declared listens route delivers it"
786
726
  },
787
727
  {
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"
728
+ "code": "ORB_ENTITY_INTRINSIC_FIELD_PERSISTED",
729
+ "category": "entity_mutation",
730
+ "description": "A persist data literal names an @intrinsic field, which is trait-owned view-state and never a persisted column"
791
731
  },
792
732
  {
793
- "code": "ORB_INBOUND_DUPLICATE",
794
- "category": "effect",
795
- "description": "two traits handle the same inbound hook name"
733
+ "code": "ORB_ENTITY_OWNER_COLUMN_UNSCOPED",
734
+ "category": "entity",
735
+ "description": "An entity declares owner columns but has no access policy scoping rows to the owner"
796
736
  },
797
737
  {
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`"
738
+ "code": "ORB_ENTITY_SPLIT_MUTATION",
739
+ "category": "entity_mutation",
740
+ "description": "A runtime entity is mutated by several traits on isolated per-trait copies while another trait reads a field it never writes"
801
741
  },
802
742
  {
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"
743
+ "code": "ORB_E_DUPLICATE_FIELD",
744
+ "category": "entity",
745
+ "description": "An entity declares the same field name more than once"
806
746
  },
807
747
  {
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"
748
+ "code": "ORB_E_EMPTY_ENUM_VALUES",
749
+ "category": "entity",
750
+ "description": "An enum field declares no values"
811
751
  },
812
752
  {
813
- "code": "ORB_OS_GRANT_MISSING",
814
- "category": "effect",
815
- "description": "an `os/` call needs something the calling orbital's grants do not cover"
753
+ "code": "ORB_E_IDENTITY_LOCAL",
754
+ "category": "entity",
755
+ "description": "An identity entity is declared as browser-stored, but the viewer directory is never browser-resident"
816
756
  },
817
757
  {
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"
758
+ "code": "ORB_E_INSTANCE_INVALID",
759
+ "category": "entity",
760
+ "description": "An entity instance row sets a key that is not a field of the entity"
821
761
  },
822
762
  {
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)"
763
+ "code": "ORB_E_INVALID_FIELD_NAME",
764
+ "category": "entity",
765
+ "description": "An entity field or entity name is empty or not in the required naming form"
826
766
  },
827
767
  {
828
- "code": "ORB_OS_GRANT_ENTRY_INVALID",
829
- "category": "effect",
830
- "description": "a declared `os/` grant entry whose shape cannot match anything"
768
+ "code": "ORB_E_INVALID_FIELD_TYPE",
769
+ "category": "entity",
770
+ "description": "An entity field declares a type that is not a valid field type"
831
771
  },
832
772
  {
833
- "code": "ORB_PLACEMENT_ORBITAL_UNKNOWN",
834
- "category": "effect",
835
- "description": "a `deployment` unit lists an orbital the program does not declare"
773
+ "code": "ORB_E_INVALID_RELATION",
774
+ "category": "entity",
775
+ "description": "A relation field is missing its relation configuration or points at an entity that does not exist"
836
776
  },
837
777
  {
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"
778
+ "code": "ORB_E_LITERAL_UNION_DEFAULT_MISMATCH",
779
+ "category": "entity",
780
+ "description": "A field default is not one of the values of its declared literal union"
841
781
  },
842
782
  {
843
- "code": "ORB_PLACEMENT_ORBITAL_UNPLACED",
844
- "category": "effect",
845
- "description": "a `deployment` is declared and an orbital is in none of its units"
783
+ "code": "ORB_E_LOCALE_INSTANCES_INCOMPLETE",
784
+ "category": "entity",
785
+ "description": "An entity writes rows per locale but has no default instances block for its default locale"
846
786
  },
847
787
  {
848
- "code": "ORB_PLACEMENT_UNIT_EMPTY",
849
- "category": "effect",
850
- "description": "a `deployment` unit lists no orbital"
788
+ "code": "ORB_E_LOCALE_INSTANCES_NOT_LOCAL",
789
+ "category": "entity",
790
+ "description": "An entity writes rows per locale but its rows are not browser-stored, so every viewer shares them"
851
791
  },
852
792
  {
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"
793
+ "code": "ORB_E_LOCALE_INSTANCES_UNKNOWN_LOCALE",
794
+ "category": "entity",
795
+ "description": "An entity writes locale instances for a locale that is not among the declared locales"
856
796
  },
857
797
  {
858
- "code": "ORB_HTTP_METHOD_UNKNOWN",
859
- "category": "effect",
860
- "description": "an `http` method is not one of GET POST PUT PATCH DELETE"
798
+ "code": "ORB_E_LOCAL_REQUIRES_PERSISTENT",
799
+ "category": "entity",
800
+ "description": "A runtime entity declares a browser storage location, which only applies to persistent entities"
861
801
  },
862
802
  {
863
- "code": "ORB_HTTP_PATH_INVALID",
864
- "category": "effect",
865
- "description": "an `http` path violates the kernel's absolute-path contract"
803
+ "code": "ORB_E_MERGED_FIELD_UNREFERENCED",
804
+ "category": "entity",
805
+ "description": "A field merged into an entity is never read, written, fetch-included or persisted by any trait of the orbital"
866
806
  },
867
807
  {
868
- "code": "ORB_HTTP_OPTION_UNKNOWN",
869
- "category": "effect",
870
- "description": "an `http` request/auth/paginate object carries a key outside its closed set"
808
+ "code": "ORB_E_MISSING_COLLECTION",
809
+ "category": "entity",
810
+ "description": "A persistent entity does not declare a collection name"
871
811
  },
872
812
  {
873
- "code": "ORB_HTTP_AUTH_SCHEME_UNKNOWN",
874
- "category": "effect",
875
- "description": "`http` `auth.scheme` is not in the closed scheme set"
813
+ "code": "ORB_E_MISSING_NAME",
814
+ "category": "entity",
815
+ "description": "An entity is missing its required name"
876
816
  },
877
817
  {
878
- "code": "ORB_HTTP_AUTH_INVALID",
879
- "category": "effect",
880
- "description": "An HTTP auth, grant-cache, presign, or webpush configuration violates its contract."
818
+ "code": "ORB_E_MOCK_NOT_IN_ENUM",
819
+ "category": "entity",
820
+ "description": "Mock candidate values are not values of the enum field they belong to"
881
821
  },
882
822
  {
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."
823
+ "code": "ORB_E_NO_FIELDS",
824
+ "category": "entity",
825
+ "description": "An entity declares no fields and must have at least one"
826
+ },
827
+ {
828
+ "code": "ORB_E_SEMANTIC_VALUE_INVALID",
829
+ "category": "entity",
830
+ "description": "A semantically typed field has a default value that is invalid for its kind, such as an empty string"
831
+ },
832
+ {
833
+ "code": "ORB_FETCH_DELIVER_IDS_ENTITY_REFS",
834
+ "category": "fetch",
835
+ "description": "A fetch using deliver ids also asks for included relations, but ids delivers no rows to carry them"
886
836
  },
887
837
  {
888
- "code": "ORB_HTTP_HEADER_INVALID",
838
+ "code": "ORB_FETCH_DELIVER_IDS_NO_SUCCESS",
889
839
  "category": "effect",
890
- "description": "An HTTP request/auth header name is not a token, or its value is not a single-line string."
840
+ "description": "A fetch with deliver ids has no emit.success, so nothing carries the reference"
891
841
  },
892
842
  {
893
- "code": "ORB_HTTP_REQUEST_OPTION_INVALID",
843
+ "code": "ORB_FETCH_DELIVER_IDS_ROWS_READ",
894
844
  "category": "effect",
895
- "description": "An HTTP request's `timeoutMs`, `delayMs` or `retry` is not a value of its declared kind."
845
+ "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
846
  },
897
847
  {
898
- "code": "ORB_HTTP_AUTH_ON_CLIENT",
848
+ "code": "ORB_FETCH_NEEDS_COMPOSITE_INDEX",
899
849
  "category": "effect",
900
- "description": "an `http` with `auth` sits where its trait runs on the client (a `[client]` trait, a browser-run tick)"
850
+ "description": "A fetch query needs a composite index that the store driver does not create and no index declaration covers"
901
851
  },
902
852
  {
903
- "code": "ORB_HTTP_BODY_CONFLICT",
853
+ "code": "ORB_FETCH_TOTAL_NONE_READ",
904
854
  "category": "effect",
905
- "description": "an `http` request has more than one body kind, or a body on GET"
855
+ "description": "A fetch with total none skips the count, so the success event's totalCount is never set and may not be read"
856
+ },
857
+ {
858
+ "code": "ORB_FETCH_UNINDEXED",
859
+ "category": "query",
860
+ "description": "A fetch filter cannot be pushed down by the store driver and no @index covers it, so the kernel scans every row"
861
+ },
862
+ {
863
+ "code": "ORB_GEN_INVALID_VALUE",
864
+ "category": "generic",
865
+ "description": "A value is invalid for the position it is written in"
866
+ },
867
+ {
868
+ "code": "ORB_GUARD_ON_FRAME_FIELD_AUTHORIZES",
869
+ "category": "guard",
870
+ "description": "A guard reads an intrinsic frame field of an entity to authorize, but intrinsic fields are not trustworthy for access"
871
+ },
872
+ {
873
+ "code": "ORB_GUEST_VIEW_NOT_CLIENT",
874
+ "category": "trait",
875
+ "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
876
  },
907
877
  {
908
878
  "code": "ORB_HOST_EFFECT_ARITY",
909
879
  "category": "effect",
910
- "description": "`random-bytes`, `credential-status` or `credential-forget` with the wrong number of arguments"
880
+ "description": "A host effect is called with the wrong number of arguments"
881
+ },
882
+ {
883
+ "code": "ORB_HOST_EFFECT_OPTION_UNKNOWN",
884
+ "category": "host_effect",
885
+ "description": "A host effect is given an option outside the set of options it accepts"
886
+ },
887
+ {
888
+ "code": "ORB_HTTP_EGRESS_ENTRY_INVALID",
889
+ "category": "http",
890
+ "description": "An egress allowlist entry is not of the form scheme://host[:port]"
891
+ },
892
+ {
893
+ "code": "ORB_HTTP_EGRESS_UNDECLARED",
894
+ "category": "http",
895
+ "description": "An outbound request targets an origin that is not declared in the program egress list"
896
+ },
897
+ {
898
+ "code": "ORB_HTTP_ORIGIN_NOT_STATIC",
899
+ "category": "http",
900
+ "description": "An http origin is not a string literal or a url-typed config knob, so egress cannot be checked"
901
+ },
902
+ {
903
+ "code": "ORB_ID_AUTHORED_WITHOUT_LEDGER",
904
+ "category": "id",
905
+ "description": "An id is authored in source without a matching ledger entry, so it is replaced on load"
911
906
  },
912
907
  {
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"
908
+ "code": "ORB_ID_DUPLICATE_EVENT_ID",
909
+ "category": "id",
910
+ "description": "An event id is declared by more than one trait, but ids must be document-unique"
916
911
  },
917
912
  {
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"
913
+ "code": "ORB_ID_KIND_MISMATCH",
914
+ "category": "id",
915
+ "description": "An id of one kind is used in a position that requires an id of a different kind"
921
916
  },
922
917
  {
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"
918
+ "code": "ORB_ID_LEDGER_ORPHAN",
919
+ "category": "id",
920
+ "description": "An id ledger row is carried by no node in the schema and is stale"
926
921
  },
927
922
  {
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"
923
+ "code": "ORB_ID_NAME_MISMATCH",
924
+ "category": "id",
925
+ "description": "A name in the source disagrees with the current name the ledger records for the same id"
931
926
  },
932
927
  {
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"
928
+ "code": "ORB_ID_UNKNOWN_REF",
929
+ "category": "id",
930
+ "description": "An id reference matches no arena node or ledger entry"
936
931
  },
937
932
  {
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"
933
+ "code": "ORB_INBOUND_ANSWER_FOREIGN",
934
+ "category": "inbound",
935
+ "description": "A trait other than an inbound handler emits the handler's answer event, so the answer never reaches the caller"
941
936
  },
942
937
  {
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"
938
+ "code": "ORB_INBOUND_ANSWER_UNDECLARED",
939
+ "category": "inbound",
940
+ "description": "An inbound hook event answers with an event the trait does not declare in emits"
946
941
  },
947
942
  {
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"
943
+ "code": "ORB_INBOUND_DUPLICATE",
944
+ "category": "inbound",
945
+ "description": "An inbound hook has more than one handler"
951
946
  },
952
947
  {
953
- "code": "ORB_OAUTH_REQUEST_CONFLICT",
954
- "category": "effect",
955
- "description": "an `oauth-client` request that carries anything but `auth`"
948
+ "code": "ORB_INBOUND_ENTRY_INVALID",
949
+ "category": "inbound",
950
+ "description": "An inbound entry is not a valid hook name"
956
951
  },
957
952
  {
958
- "code": "ORB_OAUTH_PROVIDER_UNKNOWN",
959
- "category": "effect",
960
- "description": "a provider word outside `google | github | auth0`"
953
+ "code": "ORB_INBOUND_UNDECLARED",
954
+ "category": "inbound",
955
+ "description": "An event handles an inbound hook that the program's inbound block does not declare"
961
956
  },
962
957
  {
963
- "code": "ORB_OAUTH_OPTION_UNKNOWN",
964
- "category": "effect",
965
- "description": "an unknown key, or a missing `redirectUri`, in `oauth-authorize` options"
958
+ "code": "ORB_INBOUND_VERIFY_INVALID",
959
+ "category": "inbound",
960
+ "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"
966
961
  },
967
962
  {
968
- "code": "ORB_HTTP_PAGINATE_MAX_MISSING",
969
- "category": "effect",
970
- "description": "`http` `paginate` without `max`"
963
+ "code": "ORB_INDEX_PATH_DUPLICATE",
964
+ "category": "index",
965
+ "description": "The same index path, with the same ordering, is declared more than once on an entity"
971
966
  },
972
967
  {
973
- "code": "ORB_HTTP_STREAM_WITHOUT_ON_MESSAGE",
974
- "category": "effect",
975
- "description": "`http` `stream` without `emit.onMessage`"
968
+ "code": "ORB_INDEX_PATH_INVALID",
969
+ "category": "entity",
970
+ "description": "An index path names a field that the entity does not declare"
976
971
  },
977
972
  {
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"
973
+ "code": "ORB_JSON_ROUNDTRIP",
974
+ "category": "lint",
975
+ "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`."
981
976
  },
982
977
  {
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"
978
+ "code": "ORB_LINT_FINDING_CODE_UNDECLARED",
979
+ "category": "lint",
980
+ "description": "A lint rule names a finding code that its declared codes record does not carry."
986
981
  },
987
982
  {
988
- "code": "ORB_BEACON_OPTION_UNKNOWN",
989
- "category": "effect",
990
- "description": "a `browser/beacon` request or option key outside its closed set"
983
+ "code": "ORB_LINT_INPUT_UNREAD",
984
+ "category": "lint",
985
+ "description": "A lint input file could not be read or lowered, so the lint rules did not run"
991
986
  },
992
987
  {
993
- "code": "ORB_BEACON_TEXT_REQUIRED",
994
- "category": "effect",
995
- "description": "a `browser/beacon` request without `text`"
988
+ "code": "ORB_LINT_LANGUAGE_FACTS_UNREAD",
989
+ "category": "lint",
990
+ "description": "The installed language facts could not be read, so the lint rule could not check what it needs"
996
991
  },
997
992
  {
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"
993
+ "code": "ORB_LINT_OPERATOR_SHAPES_UNREAD",
994
+ "category": "lint",
995
+ "description": "The installed operator table could not be read or does not match the operator shape type, so a lint cannot run"
1001
996
  },
1002
997
  {
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"
998
+ "code": "ORB_LINT_RULE_COUNT_MISMATCH",
999
+ "category": "lint",
1000
+ "description": "A lint engine's rules or programOnlyRules names differ from the rule names its routed rule traits answer LINT_FOUND with"
1006
1001
  },
1007
1002
  {
1008
- "code": "ORB_ON_DEVICE_SCHEMA_INVALID",
1009
- "category": "effect",
1010
- "description": "a literal `browser/prompt` response schema that is not a JSON object"
1003
+ "code": "ORB_LINT_RULE_FAILED",
1004
+ "category": "lint",
1005
+ "description": "A lint rule met an input its own preconditions exclude and could not check it"
1011
1006
  },
1012
1007
  {
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"
1008
+ "code": "ORB_LINT_SERVICE_REGISTRY_UNREAD",
1009
+ "category": "lint",
1010
+ "description": "The installed services registry could not be read, so call-service services cannot be checked"
1016
1011
  },
1017
1012
  {
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"
1013
+ "code": "ORB_LINT_UI_VOCAB_UNREAD",
1014
+ "category": "lint",
1015
+ "description": "The installed @almadar/core declares no readable UI vocabulary, so a UI lint check cannot run"
1021
1016
  },
1022
1017
  {
1023
- "code": "ORB_EFF_SET_INVALID_BINDING",
1024
- "category": "effect",
1025
- "description": "set effect using invalid binding"
1018
+ "code": "ORB_LISTEN_REDUNDANT_EMBED_ROUTE",
1019
+ "category": "listen",
1020
+ "description": "A listens route is redundant because the embedded trait already receives that event"
1026
1021
  },
1027
1022
  {
1028
- "code": "ORB_EFF_SET_PAYLOAD_NOT_ALLOWED",
1029
- "category": "effect",
1030
- "description": "set effect using @payload (should use @entity)"
1023
+ "code": "ORB_LISTEN_ROUTE_STARVES_REQUIRED_FIELD",
1024
+ "category": "trait_event",
1025
+ "description": "A listens route requires a payload field that the source event contract never produces"
1031
1026
  },
1032
1027
  {
1033
- "code": "ORB_EFF_FETCH_INVALID_ENTITY",
1034
- "category": "effect",
1035
- "description": "fetch effect referencing invalid entity"
1028
+ "code": "ORB_LISTEN_WILDCARD_UNKEYED",
1029
+ "category": "trait_event",
1030
+ "description": "A wildcard listens route hears every caller's event but its guard never reads the call key in the payload"
1036
1031
  },
1037
1032
  {
1038
- "code": "ORB_EFF_FETCH_INVALID_INCLUDE",
1039
- "category": "effect",
1040
- "description": "fetch effect include references non-existent or non-relation field"
1033
+ "code": "ORB_MEM_ALIAS",
1034
+ "category": "mem",
1035
+ "description": "An exclusive borrow of a block while another borrow of it is live, or a borrow while an exclusive one is live"
1041
1036
  },
1042
1037
  {
1043
- "code": "ORB_PERSIST_BATCH_OPS_NOT_ARRAY",
1044
- "category": "effect",
1045
- "description": "`persist batch` ops expression is not array-typed"
1038
+ "code": "ORB_MEM_DOUBLE_FREE",
1039
+ "category": "mem",
1040
+ "description": "A handle is freed, dropped or released a second time on some path"
1046
1041
  },
1047
1042
  {
1048
- "code": "ORB_PERSIST_BATCH_BAD_OP",
1049
- "category": "effect",
1050
- "description": "`persist batch` op tuple with an unknown action or the wrong arity"
1043
+ "code": "ORB_MEM_LEAK",
1044
+ "category": "mem",
1045
+ "description": "An arena reaches a resting state on some path without being dropped"
1051
1046
  },
1052
1047
  {
1053
- "code": "ORB_PERSIST_BATCH_MIXED_PLACEMENT",
1054
- "category": "effect",
1055
- "description": "`persist batch` ops name both browser-stored and server-stored entities"
1048
+ "code": "ORB_MEM_USE_AFTER_FREE",
1049
+ "category": "mem",
1050
+ "description": "A mem/ call takes a handle after it was freed, dropped or released on some path"
1056
1051
  },
1057
1052
  {
1058
- "code": "ORB_EFF_SLOT_CONFLICT",
1059
- "category": "effect",
1060
- "description": "Multiple render_ui effects targeting same slot"
1053
+ "code": "ORB_NAV_TARGET_UNDECLARED",
1054
+ "category": "page",
1055
+ "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
1056
  },
1062
1057
  {
1063
- "code": "ORB_EFF_UNKNOWN_TYPE",
1064
- "category": "effect",
1065
- "description": "Unknown effect type"
1058
+ "code": "ORB_OAUTH_CLIENT_INVALID",
1059
+ "category": "oauth",
1060
+ "description": "An OAuth client block uses a key that is not a valid OAuth client key"
1066
1061
  },
1067
1062
  {
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."
1063
+ "code": "ORB_OAUTH_OPTION_UNKNOWN",
1064
+ "category": "oauth",
1065
+ "description": "An oauth-authorize call passes an option that is not recognized"
1071
1066
  },
1072
1067
  {
1073
- "code": "ORB_EFF_NAVIGATE_MISSING_PAYLOAD",
1074
- "category": "effect",
1075
- "description": "Navigate effect missing required payload for target page"
1068
+ "code": "ORB_OAUTH_PROVIDER_UNKNOWN",
1069
+ "category": "oauth",
1070
+ "description": "The OAuth clients map is keyed by something other than a known provider tag"
1076
1071
  },
1077
1072
  {
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."
1073
+ "code": "ORB_ON_DEVICE_EFFECT_ON_SERVER",
1074
+ "category": "browser",
1075
+ "description": "An on-device model effect runs in a background tick on the server, which has no on-device model"
1081
1076
  },
1082
1077
  {
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`."
1078
+ "code": "ORB_ON_DEVICE_SCHEMA_INVALID",
1079
+ "category": "browser",
1080
+ "description": "A browser prompt response schema is not valid JSON Schema text describing a JSON object"
1086
1081
  },
1087
1082
  {
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)."
1083
+ "code": "ORB_OP_INVALID_TIME_UNIT",
1084
+ "category": "operator",
1085
+ "description": "A time operator is given a unit that is not an accepted time unit"
1091
1086
  },
1092
1087
  {
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."
1088
+ "code": "ORB_OS_EGRESS_SCHEME_UNUSED",
1089
+ "category": "os",
1090
+ "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
1091
  },
1097
1092
  {
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"
1093
+ "code": "ORB_OS_GRANT_ENTRY_INVALID",
1094
+ "category": "os",
1095
+ "description": "A declared grant entry that can match nothing"
1101
1096
  },
1102
1097
  {
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`)."
1098
+ "code": "ORB_OS_GRANT_MISSING",
1099
+ "category": "os",
1100
+ "description": "An os/ call that the grants of its orbital (app level plus its own) do not cover"
1106
1101
  },
1107
1102
  {
1108
- "code": "ORB_EFF_EMIT_INVALID_NAME",
1109
- "category": "effect",
1110
- "description": "Event name inside `emit:` isn't UPPER_SNAKE_CASE."
1103
+ "code": "ORB_OS_GRANT_UNUSED",
1104
+ "category": "os",
1105
+ "description": "A granted entry that no os/ call of the orbital (or of the program, at app level) uses; a warning"
1111
1106
  },
1112
1107
  {
1113
- "code": "ORB_EFF_EMIT_UNDECLARED_EVENT",
1114
- "category": "effect",
1115
- "description": "Event in `emit:` isn't declared in the trait's `emits` array."
1108
+ "code": "ORB_OS_TARGET_NOT_STATIC",
1109
+ "category": "os",
1110
+ "description": "An os/ call target that is computed, so its grant cannot be checked at build time"
1116
1111
  },
1117
1112
  {
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."
1113
+ "code": "ORB_O_CONFIG_DEAD_KNOB",
1114
+ "category": "orbital",
1115
+ "description": "A declared app-level config knob is not forwarded by any trait config default, so it has no effect"
1121
1116
  },
1122
1117
  {
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."
1118
+ "code": "ORB_O_CONFIG_UNKNOWN_KEY",
1119
+ "category": "orbital_ref",
1120
+ "description": "A call-site config key matches no config knob declared by the upstream orbital"
1126
1121
  },
1127
1122
  {
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)."
1123
+ "code": "ORB_O_DUPLICATE_NAME",
1124
+ "category": "orbital",
1125
+ "description": "Two or more orbitals in a program share the same name"
1131
1126
  },
1132
1127
  {
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`)."
1128
+ "code": "ORB_O_DUPLICATE_USE_ALIAS",
1129
+ "category": "orbital",
1130
+ "description": "Two uses imports share the same alias"
1136
1131
  },
1137
1132
  {
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."
1133
+ "code": "ORB_O_ENTITY_EXPECT_AMBIGUOUS",
1134
+ "category": "orbital_ref",
1135
+ "description": "An entity an imported orbital expects of a sibling is provided by several sibling imports and no entities entry binds it"
1141
1136
  },
1142
1137
  {
1143
- "code": "ORB_FETCH_DELIVER_IDS_ENTITY_REFS",
1144
- "category": "effect",
1145
- "description": "`deliver: ids` with `include`: included relations are row content."
1138
+ "code": "ORB_O_ENTITY_PERSISTENCE_LOCKED",
1139
+ "category": "orbital",
1140
+ "description": "An entity persistence or collection override on an orbital reference has no effect because the primary entity locks it"
1146
1141
  },
1147
1142
  {
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."
1143
+ "code": "ORB_O_ENTITY_TARGET_UNKNOWN",
1144
+ "category": "orbital_ref",
1145
+ "description": "An entities value names no entity the consumer schema declares"
1151
1146
  },
1152
1147
  {
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."
1148
+ "code": "ORB_O_ENTITY_UNKNOWN_KEY",
1149
+ "category": "orbital_ref",
1150
+ "description": "An entities key names no entity in the upstream out-of-orbital closure"
1156
1151
  },
1157
1152
  {
1158
- "code": "SEXPR_INVALID_OPERATOR",
1159
- "category": "sexpr",
1160
- "description": "Unknown operator in S-expression"
1153
+ "code": "ORB_O_ENTITY_UNMAPPED",
1154
+ "category": "orbital_ref",
1155
+ "description": "A kept trait, relation or page references an out-of-orbital entity that entities {} never maps"
1161
1156
  },
1162
1157
  {
1163
- "code": "SEXPR_ARITY_MISMATCH",
1164
- "category": "sexpr",
1165
- "description": "Wrong number of arguments for operator"
1158
+ "code": "ORB_O_EXTEND_FIELD_COLLISION",
1159
+ "category": "orbital_ref",
1160
+ "description": "An extend field collides with a field already declared on the upstream primary entity"
1166
1161
  },
1167
1162
  {
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)`"
1163
+ "code": "ORB_O_EXTEND_FIELD_UNREAD",
1164
+ "category": "orbital",
1165
+ "description": "A field added by an extend block is never read, set, rendered or forwarded by a config knob"
1171
1166
  },
1172
1167
  {
1173
- "code": "SEXPR_EFFECT_IN_GUARD",
1174
- "category": "sexpr",
1175
- "description": "Effect operator used in guard context"
1168
+ "code": "ORB_O_FIELD_RENAME_UNAPPLIED",
1169
+ "category": "orbital_ref",
1170
+ "description": "A fields rename left the pre-rename field name in a config default position the rewrite does not reach"
1176
1171
  },
1177
1172
  {
1178
- "code": "SEXPR_INVALID_BINDING",
1179
- "category": "sexpr",
1180
- "description": "Invalid binding reference"
1173
+ "code": "ORB_O_MOCK_UNKNOWN_FIELD",
1174
+ "category": "orbital",
1175
+ "description": "A mock block names a field the entity materialized from the referenced orbital does not declare"
1181
1176
  },
1182
1177
  {
1183
- "code": "SEXPR_INVALID_BINDING_PATH",
1184
- "category": "sexpr",
1185
- "description": "Invalid binding path syntax"
1178
+ "code": "ORB_O_OMIT_EMBEDDED_TRAIT",
1179
+ "category": "orbital",
1180
+ "description": "An orbital reference omits a trait that another kept trait embeds"
1186
1181
  },
1187
1182
  {
1188
- "code": "SEXPR_UNKNOWN_ENTITY",
1189
- "category": "sexpr",
1190
- "description": "Unknown entity in binding"
1183
+ "code": "ORB_O_PAGE_UNKNOWN_PATH",
1184
+ "category": "orbital_ref",
1185
+ "description": "A pages or mounts key names a page path that the upstream orbital does not declare"
1191
1186
  },
1192
1187
  {
1193
- "code": "SEXPR_PARSE_ERROR",
1194
- "category": "sexpr",
1195
- "description": "Parse error in S-expression"
1188
+ "code": "ORB_O_RETYPE_FIELD_CONFLICT",
1189
+ "category": "orbital",
1190
+ "description": "A field is both retyped and added by extend in the same orbital reference"
1196
1191
  },
1197
1192
  {
1198
- "code": "ORB_X_DUPLICATE_ENTITY",
1199
- "category": "cross",
1200
- "description": "Duplicate entity name across orbitals"
1193
+ "code": "ORB_O_RETYPE_UNKNOWN_FIELD",
1194
+ "category": "orbital",
1195
+ "description": "A retype block names a field the entity materialized from the referenced orbital does not declare"
1201
1196
  },
1202
1197
  {
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)"
1198
+ "code": "ORB_O_ROLE_TARGET_NOT_MEMBER",
1199
+ "category": "orbital_ref",
1200
+ "description": "A roles target is not a member of the consumer roster field vocabulary"
1206
1201
  },
1207
1202
  {
1208
- "code": "ORB_X_ORPHAN_LISTENER",
1209
- "category": "cross",
1210
- "description": "Event listener without matching emitter"
1203
+ "code": "ORB_O_ROLE_UNKNOWN_UPSTREAM",
1204
+ "category": "orbital_ref",
1205
+ "description": "A roles key names no value in any upstream identity field vocabulary"
1211
1206
  },
1212
1207
  {
1213
- "code": "ORB_X_UNUSED_EMISSION",
1214
- "category": "cross",
1215
- "description": "Event emitted but never listened to"
1208
+ "code": "ORB_O_TRAITS_OMITTED_TRAIT",
1209
+ "category": "orbital",
1210
+ "description": "A traits override names a trait that omit or only drops from the imported orbital"
1216
1211
  },
1217
1212
  {
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)."
1213
+ "code": "ORB_O_TRAITS_UNKNOWN_TRAIT",
1214
+ "category": "orbital_ref",
1215
+ "description": "A traits key names a trait that the upstream orbital does not have"
1221
1216
  },
1222
1217
  {
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."
1218
+ "code": "ORB_PAGE_AMBIGUOUS_CONTENT_OWNER",
1219
+ "category": "page",
1220
+ "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
1221
  },
1227
1222
  {
1228
- "code": "ORB_X_CIRCULAR_DEPENDENCY",
1229
- "category": "cross",
1230
- "description": "Circular dependency in event wiring"
1223
+ "code": "ORB_PAGE_CONTROL_OUTSIDE_SHELL",
1224
+ "category": "page",
1225
+ "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
1226
  },
1232
1227
  {
1233
- "code": "ORB_X_MISSING_ORBITAL_NAME",
1234
- "category": "cross",
1235
- "description": "Orbital missing name"
1228
+ "code": "ORB_PAGE_FACTS_FIELD_INVALID",
1229
+ "category": "page",
1230
+ "description": "A browser/page-facts effect declares no facts"
1236
1231
  },
1237
1232
  {
1238
- "code": "ORB_X_PAYLOAD_MISMATCH",
1239
- "category": "cross",
1240
- "description": "Payload mismatch between emitter and listener"
1233
+ "code": "ORB_PAGE_NOT_FOUND_DUPLICATE",
1234
+ "category": "page",
1235
+ "description": "A program declares more than one [notFound] page."
1241
1236
  },
1242
1237
  {
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."
1238
+ "code": "ORB_PAGE_NOT_FOUND_MISSING",
1239
+ "category": "page",
1240
+ "description": "A program with route pages declares no [notFound] page."
1246
1241
  },
1247
1242
  {
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`."
1243
+ "code": "ORB_PAGE_SECOND_CONTENT_BODY",
1244
+ "category": "page",
1245
+ "description": "More than one trait on a page renders a content body into the main slot"
1251
1246
  },
1252
1247
  {
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`."
1248
+ "code": "ORB_PAGE_UNREACHABLE",
1249
+ "category": "page",
1250
+ "description": "A page is declared but appears in no link, navItems entry or navigate effect"
1256
1251
  },
1257
1252
  {
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."
1253
+ "code": "ORB_PERSIST_BATCH_BAD_OP",
1254
+ "category": "persist",
1255
+ "description": "A persist batch contains an operation that is not valid in a batch"
1261
1256
  },
1262
1257
  {
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."
1258
+ "code": "ORB_PERSIST_BATCH_MIXED_PLACEMENT",
1259
+ "category": "persist",
1260
+ "description": "A persist batch writes both browser-stored and server-stored entities in one effect, which no single executor can hold"
1266
1261
  },
1267
1262
  {
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."
1263
+ "code": "ORB_PERSIST_BATCH_OPS_NOT_ARRAY",
1264
+ "category": "persist",
1265
+ "description": "A persist batch operations expression is missing or not array-typed"
1271
1266
  },
1272
1267
  {
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."
1268
+ "code": "ORB_PERSIST_CREATE_LITERAL_ID",
1269
+ "category": "persist",
1270
+ "description": "A persist create names a literal id, so a second run fails with a duplicate id"
1276
1271
  },
1277
1272
  {
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."
1273
+ "code": "ORB_PERSIST_CREATE_MISSING_POLICY_FIELD",
1274
+ "category": "persist",
1275
+ "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
1276
  },
1282
1277
  {
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."
1278
+ "code": "ORB_PERSIST_ID_NOT_A_PATH",
1279
+ "category": "persist",
1280
+ "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
1281
  },
1287
1282
  {
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."
1283
+ "code": "ORB_PERSIST_WHERE_NOT_A_PREDICATE",
1284
+ "category": "persist",
1285
+ "description": "A persist where clause is not a valid row predicate"
1291
1286
  },
1292
1287
  {
1293
- "code": "ORB_BINDING_INVALID_FORMAT",
1294
- "category": "binding",
1295
- "description": "Binding has invalid format"
1288
+ "code": "ORB_PLACEMENT_ORBITAL_DUPLICATE",
1289
+ "category": "placement",
1290
+ "description": "An orbital is placed more than once in the deployment"
1296
1291
  },
1297
1292
  {
1298
- "code": "ORB_BINDING_UNKNOWN_ROOT",
1299
- "category": "binding",
1300
- "description": "Unknown binding root"
1293
+ "code": "ORB_PLACEMENT_ORBITAL_UNKNOWN",
1294
+ "category": "placement",
1295
+ "description": "A deployment unit lists an orbital name that is not an orbital of the program"
1301
1296
  },
1302
1297
  {
1303
- "code": "ORB_CONFIG_DANGLING_REF",
1304
- "category": "binding",
1305
- "description": "`@config.<key>` literal whose key no reachable config schema declares"
1298
+ "code": "ORB_PLACEMENT_ORBITAL_UNPLACED",
1299
+ "category": "placement",
1300
+ "description": "A deployment is declared but an orbital belongs to none of its units"
1306
1301
  },
1307
1302
  {
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"
1303
+ "code": "ORB_PLACEMENT_UNIT_EMPTY",
1304
+ "category": "placement",
1305
+ "description": "A deployment unit lists no orbital"
1311
1306
  },
1312
1307
  {
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`"
1308
+ "code": "ORB_P_AUTH_NO_SIGN_IN",
1309
+ "category": "page",
1310
+ "description": "A page requires authenticated access but the app declares no signIn route"
1316
1311
  },
1317
1312
  {
1318
- "code": "ORB_BINDING_INVALID_PATH",
1319
- "category": "binding",
1320
- "description": "Invalid binding path"
1313
+ "code": "ORB_P_DUPLICATE_PATH",
1314
+ "category": "page",
1315
+ "description": "Two pages declare the same path after normalization"
1321
1316
  },
1322
1317
  {
1323
- "code": "ORB_BINDING_STATE_NO_PATH",
1324
- "category": "binding",
1325
- "description": "@state binding should not have path"
1318
+ "code": "ORB_P_EMPTY_TRAITS",
1319
+ "category": "page",
1320
+ "description": "A page declares an empty traits array"
1326
1321
  },
1327
1322
  {
1328
- "code": "ORB_BINDING_NOW_NO_PATH",
1329
- "category": "binding",
1330
- "description": "@now binding should not have path"
1323
+ "code": "ORB_P_HOST_RESERVED_ROUTE",
1324
+ "category": "page",
1325
+ "description": "A page is declared on the host's reserved sign-in route"
1331
1326
  },
1332
1327
  {
1333
- "code": "ORB_BINDING_PAYLOAD_IN_TICK",
1334
- "category": "binding",
1335
- "description": "@payload not available in tick context"
1328
+ "code": "ORB_P_INDEX_PARAM_ROUTE",
1329
+ "category": "page",
1330
+ "description": "A parameter-route page is marked indexing index although its concrete URLs are not declared"
1336
1331
  },
1337
1332
  {
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"
1333
+ "code": "ORB_P_INDEX_REQUIRES_PUBLIC",
1334
+ "category": "page",
1335
+ "description": "A page declares indexing: index but lacks the public access it requires"
1341
1336
  },
1342
1337
  {
1343
- "code": "ORB_BINDING_FROM_ENTITY_OUTSIDE_ENSURES",
1344
- "category": "binding",
1345
- "description": "`@fromEntity` (the row before a transition) outside an `@ensures`"
1338
+ "code": "ORB_P_INVALID_PATH",
1339
+ "category": "page",
1340
+ "description": "A page or navigate path does not start with a slash"
1346
1341
  },
1347
1342
  {
1348
- "code": "ORB_BINDING_ROOT_NO_PATH",
1349
- "category": "binding",
1350
- "description": "`@fromState`/`@toState`/`@prevStates`/`@prevEvents` written with a path"
1343
+ "code": "ORB_P_INVALID_TRAIT_REF",
1344
+ "category": "page",
1345
+ "description": "A page's inline trait reference has no name"
1351
1346
  },
1352
1347
  {
1353
- "code": "ORB_BINDING_EVENT_INVALID_PATH",
1354
- "category": "binding",
1355
- "description": "`@event.<path>` that does not follow the `{ event, payload, source }` record"
1348
+ "code": "ORB_P_INVALID_VIEW_TYPE",
1349
+ "category": "page",
1350
+ "description": "A page declares a view type that is not a valid view type"
1356
1351
  },
1357
1352
  {
1358
- "code": "ORB_BINDING_UNKNOWN_ENTITY",
1359
- "category": "binding",
1360
- "description": "Unknown entity in @EntityName binding"
1353
+ "code": "ORB_P_MISSING_NAME",
1354
+ "category": "page",
1355
+ "description": "A page does not declare a name"
1361
1356
  },
1362
1357
  {
1363
- "code": "ORB_BINDING_INVALID_FIELD_NAME",
1364
- "category": "binding",
1365
- "description": "Invalid field name in binding path"
1358
+ "code": "ORB_P_MISSING_PATH",
1359
+ "category": "page",
1360
+ "description": "A page is missing its required path"
1366
1361
  },
1367
1362
  {
1368
- "code": "ORB_BINDING_SET_TARGET_MISSING_PATH",
1369
- "category": "binding",
1370
- "description": "Set target missing field path"
1363
+ "code": "ORB_P_MISSING_TRAITS",
1364
+ "category": "page",
1365
+ "description": "A page has no traits array for trait-driven UI"
1371
1366
  },
1372
1367
  {
1373
- "code": "ORB_BINDING_PAYLOAD_FIELD_UNDECLARED",
1374
- "category": "binding",
1375
- "description": "@payload.field references a field not declared in event payload schema"
1368
+ "code": "ORB_P_SIGN_IN_UNKNOWN_ROUTE",
1369
+ "category": "page",
1370
+ "description": "The app's signIn route names a path that is no page of the app"
1376
1371
  },
1377
1372
  {
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."
1373
+ "code": "ORB_P_TRANSLATION_DUPLICATE_LOCALE",
1374
+ "category": "page",
1375
+ "description": "A translation group holds more than one page in the same locale"
1381
1376
  },
1382
1377
  {
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."
1378
+ "code": "ORB_RANDOM_BYTES_COUNT",
1379
+ "category": "random",
1380
+ "description": "A random-bytes count argument is outside the allowed integer range"
1386
1381
  },
1387
1382
  {
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."
1383
+ "code": "ORB_RENDER_ACTION_LIFECYCLE_EVENT",
1384
+ "category": "render_ui",
1385
+ "description": "A rendered pattern prop targets a lifecycle event that the bus never delivers"
1391
1386
  },
1392
1387
  {
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)."
1388
+ "code": "ORB_RENDER_GROUPBY_ENUM_COLUMN_GAP",
1389
+ "category": "render_ui",
1390
+ "description": "A groupBy column set omits enum values of the field, so rows with those values match no column and disappear"
1396
1391
  },
1397
1392
  {
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."
1393
+ "code": "ORB_RENDER_ORBITAL_VALUE_EMBEDDED",
1394
+ "category": "render_ui",
1395
+ "description": "A render-ui embeds an orbital value, but only trait values can be rendered"
1401
1396
  },
1402
1397
  {
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."
1398
+ "code": "ORB_RENDER_UNBOUND_TRAIT_KNOB_EMBEDDED",
1399
+ "category": "render_ui",
1400
+ "description": "A render-ui embeds a trait-typed value that may be unbound without a guard, so it renders nothing"
1406
1401
  },
1407
1402
  {
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)."
1403
+ "code": "ORB_RUI_CHILD_NOT_DRAWABLE",
1404
+ "category": "render_ui",
1405
+ "description": "A non-drawable child is composed under a canvas draw-host, which paints only neutral drawable descriptors"
1411
1406
  },
1412
1407
  {
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."
1408
+ "code": "ORB_RUI_ELEMENT_SHAPE_MISMATCH",
1409
+ "category": "render_ui",
1410
+ "description": "An element of a pattern prop is missing a field required by the pattern's element shape"
1416
1411
  },
1417
1412
  {
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."
1413
+ "code": "ORB_RUI_FORM_FIELD_INTRINSIC",
1414
+ "category": "render_ui",
1415
+ "description": "A form pattern offers an input for an intrinsic entity field, which is never persisted so the input is discarded"
1421
1416
  },
1422
1417
  {
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."
1418
+ "code": "ORB_RUI_INVALID_FIELD_PATH",
1419
+ "category": "render_ui",
1420
+ "description": "A nested field path references an invalid relation or field"
1426
1421
  },
1427
1422
  {
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."
1423
+ "code": "ORB_RUI_INVALID_ITEM_ACTION",
1424
+ "category": "render_ui",
1425
+ "description": "An itemAction configuration on a rendered pattern is invalid"
1431
1426
  },
1432
1427
  {
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."
1428
+ "code": "ORB_RUI_INVALID_PATTERN",
1429
+ "category": "render_ui",
1430
+ "description": "A render-ui pattern type is not in the pattern registry"
1436
1431
  },
1437
1432
  {
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."
1433
+ "code": "ORB_RUI_INVALID_PROP",
1434
+ "category": "render_ui",
1435
+ "description": "A render-ui pattern is given a prop that the pattern does not define"
1441
1436
  },
1442
1437
  {
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."
1438
+ "code": "ORB_RUI_INVALID_SLOT",
1439
+ "category": "render_ui",
1440
+ "description": "A render-ui effect targets an invalid slot"
1446
1441
  },
1447
1442
  {
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."
1443
+ "code": "ORB_RUI_MISSING_ACTION",
1444
+ "category": "render_ui",
1445
+ "description": "A render-ui pattern that needs an interaction target has no action, onClick, event or href"
1451
1446
  },
1452
1447
  {
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."
1448
+ "code": "ORB_RUI_MISSING_PATTERN_TYPE",
1449
+ "category": "render_ui",
1450
+ "description": "A render-ui pattern has no type property"
1456
1451
  },
1457
1452
  {
1458
- "code": "ORB_X_UNTYPED_ARRAY",
1459
- "category": "entity",
1460
- "description": "An array field (entity or payload-schema) declares no element type."
1453
+ "code": "ORB_RUI_MISSING_REQUIRED_PROP",
1454
+ "category": "render_ui",
1455
+ "description": "A render-ui pattern is missing a prop that the pattern requires"
1461
1456
  },
1462
1457
  {
1463
- "code": "ORB_X_ENTITY_PROP_CONTRACT",
1458
+ "code": "ORB_RUI_PROP_TYPE_MISMATCH",
1464
1459
  "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."
1460
+ "description": "A render-ui pattern prop has a value that is not one of its allowed values"
1466
1461
  },
1467
1462
  {
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."
1463
+ "code": "ORB_RUI_RENDERABLE_IN_GENERIC_FIELD",
1464
+ "category": "render_ui",
1465
+ "description": "A render-ui pattern literal is passed to a field not typed node, hiding renderable content from render-ui checks"
1471
1466
  },
1472
1467
  {
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."
1468
+ "code": "ORB_SET_COLUMN_WITHOUT_ROW",
1469
+ "category": "entity_mutation",
1470
+ "description": "A set writes an entity column with no row in scope and no persist create or update that could land it"
1476
1471
  },
1477
1472
  {
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."
1473
+ "code": "ORB_SHARED_ENTITY_FIELD_CONFLICT",
1474
+ "category": "entity_mutation",
1475
+ "description": "A field of a shared entity is written by more than one trait"
1481
1476
  },
1482
1477
  {
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."
1478
+ "code": "ORB_SHARED_ENTITY_RENDER_AUTHORITY",
1479
+ "category": "entity_mutation",
1480
+ "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
1481
  },
1487
1482
  {
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."
1483
+ "code": "ORB_SLOT_CONTENTION",
1484
+ "category": "slot",
1485
+ "description": "Multiple traits on a page render into the same slot"
1491
1486
  },
1492
1487
  {
1493
- "code": "ORB_BINDING_ENTITY_FIELD_NOT_FOUND",
1494
- "category": "binding",
1495
- "description": "@entity.field references a field not present on the linked entity"
1488
+ "code": "ORB_SLOT_CONTENTION_RUNTIME",
1489
+ "category": "slot",
1490
+ "description": "Several traits render to the same slot in the same state, so they contend for it"
1496
1491
  },
1497
1492
  {
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."
1493
+ "code": "ORB_SLOT_CONTENTION_TICK",
1494
+ "category": "slot",
1495
+ "description": "Several traits on a page render into the same slot from ticks, so their output contends"
1501
1496
  },
1502
1497
  {
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."
1498
+ "code": "ORB_SLOT_INVALID_NESTING",
1499
+ "category": "slot",
1500
+ "description": "A slot is nested in an invalid way"
1506
1501
  },
1507
1502
  {
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."
1503
+ "code": "ORB_SLOT_MAIN_NOT_COVERED",
1504
+ "category": "slot",
1505
+ "description": "No trait on a page renders anything into the main slot"
1511
1506
  },
1512
1507
  {
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."
1508
+ "code": "ORB_STORE_DRIVER_CONTRACT",
1509
+ "category": "store",
1510
+ "description": "A store driver has no trait handling one or more verbs required by the row-store driver contract"
1516
1511
  },
1517
1512
  {
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."
1513
+ "code": "ORB_STORE_DRIVER_NOT_CONDITIONAL",
1514
+ "category": "store",
1515
+ "description": "A conditional persist op is bound to a store driver that cannot execute conditional writes"
1521
1516
  },
1522
1517
  {
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."
1518
+ "code": "ORB_STORE_ON_NON_PERSISTENT",
1519
+ "category": "store",
1520
+ "description": "An entity binds a store but its rows live in no store"
1526
1521
  },
1527
1522
  {
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."
1523
+ "code": "ORB_STORE_UNKNOWN_ORBITAL",
1524
+ "category": "store",
1525
+ "description": "A store binding names an orbital that is not part of the program"
1531
1526
  },
1532
1527
  {
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."
1528
+ "code": "ORB_STORE_VERB_OUTSIDE_SEAM",
1529
+ "category": "store",
1530
+ "description": "A trait emits a row-store verb directly, but a store driver may be asked only by the store seam"
1536
1531
  },
1537
1532
  {
1538
- "code": "ORB_BINDING_TRAIT_MISSING_NAME",
1539
- "category": "binding",
1540
- "description": "`@trait` binding with no trait name — bare `@trait` is not resolvable."
1533
+ "code": "ORB_S_ACCESS_POLICY_INVALID_BINDING",
1534
+ "category": "schema",
1535
+ "description": "An access directive uses a binding other than the ones legal there"
1541
1536
  },
1542
1537
  {
1543
- "code": "ORB_BINDING_TRAIT_INVALID_FORMAT",
1544
- "category": "binding",
1545
- "description": "`@trait.X` trait name doesn't match the `PascalCase` identifier pattern."
1538
+ "code": "ORB_S_ACCESS_POLICY_REQUIRES_IDENTITY",
1539
+ "category": "schema",
1540
+ "description": "An access directive reads @user but the program declares no identity entity"
1546
1541
  },
1547
1542
  {
1548
- "code": "ORB_BINDING_TRAIT_UNKNOWN",
1549
- "category": "binding",
1550
- "description": "`@trait.X` references a trait not declared in the current orbital."
1543
+ "code": "ORB_S_ACCESS_POLICY_UNKNOWN_ENTITY_FIELD",
1544
+ "category": "schema",
1545
+ "description": "An access policy references a name that is not a field of its entity, so it resolves to null and denies everyone"
1551
1546
  },
1552
1547
  {
1553
- "code": "ORB_BINDING_TRAIT_SELF_REFERENCE",
1554
- "category": "binding",
1555
- "description": "A trait's render-ui references itself via `@trait.<self>`."
1548
+ "code": "ORB_S_COLLECTION_POLICY_CONFLICT",
1549
+ "category": "schema",
1550
+ "description": "Entities bound to the same collection declare different access directives"
1556
1551
  },
1557
1552
  {
1558
- "code": "ORB_BINDING_TRAIT_CYCLE",
1559
- "category": "binding",
1560
- "description": "Cycle detected in the `@trait.X` reference graph (e.g. A → B → A)."
1553
+ "code": "ORB_S_EMPTY_VERSION",
1554
+ "category": "schema",
1555
+ "description": "The schema version is empty"
1561
1556
  },
1562
1557
  {
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."
1558
+ "code": "ORB_S_EXPECTATION_FIELD_UNDECLARED",
1559
+ "category": "schema",
1560
+ "description": "An effect persists a field that the orbital's expects entity shape does not declare"
1566
1561
  },
1567
1562
  {
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."
1563
+ "code": "ORB_S_EXPECTATION_PROVIDER_MISMATCH",
1564
+ "category": "schema",
1565
+ "description": "An expectation requires a field to be marked as a key but the providing entity declares it without that mark"
1571
1566
  },
1572
1567
  {
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`)."
1568
+ "code": "ORB_S_EXPECTATION_UNSATISFIED",
1569
+ "category": "schema",
1570
+ "description": "An orbital expects an entity, trait, event, or config default that nothing in the program provides"
1576
1571
  },
1577
1572
  {
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."
1573
+ "code": "ORB_S_EXPECTED_FIELD_NOT_PROVIDED",
1574
+ "category": "schema",
1575
+ "description": "A rebound entity does not provide a field that the trait expects it to have"
1581
1576
  },
1582
1577
  {
1583
- "code": "ORB_EMBED_BRIDGE_LISTENS_UNSENT",
1584
- "category": "render_ui",
1585
- "description": "A bridged embed delivers an event nothing in the program sends."
1578
+ "code": "ORB_S_EXPECTED_FIELD_TYPE_MISMATCH",
1579
+ "category": "schema",
1580
+ "description": "The provider has the expected field or knob but with an incompatible type"
1586
1581
  },
1587
1582
  {
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."
1583
+ "code": "ORB_S_IDENTITY_NOT_UNIQUE",
1584
+ "category": "schema",
1585
+ "description": "More than one entity is tagged identity, making every @user field reference ambiguous"
1591
1586
  },
1592
1587
  {
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."
1588
+ "code": "ORB_S_INVARIANT_UNPROVED",
1589
+ "category": "spec",
1590
+ "description": "A spec proposition the prover cannot decide, so the program is not shown to keep it"
1596
1591
  },
1597
1592
  {
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."
1593
+ "code": "ORB_S_INVARIANT_VIOLATED",
1594
+ "category": "spec",
1595
+ "description": "A spec proposition (invariant, holds, ensures) is broken by a write, with a counterexample the evaluator confirms"
1601
1596
  },
1602
1597
  {
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."
1598
+ "code": "ORB_S_MISSING_NAME",
1599
+ "category": "schema",
1600
+ "description": "The schema does not declare a name"
1606
1601
  },
1607
1602
  {
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."
1603
+ "code": "ORB_S_NO_ORBITALS",
1604
+ "category": "schema",
1605
+ "description": "The schema declares no orbitals"
1611
1606
  },
1612
1607
  {
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."
1608
+ "code": "ORB_S_OWNER_FIELD_NOT_IDENTITY_TYPED",
1609
+ "category": "schema",
1610
+ "description": "An access directive compares a field to @user.id but the field is not a relation to the identity entity"
1616
1611
  },
1617
1612
  {
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."
1613
+ "code": "ORB_S_ROLE_LITERAL_NOT_MEMBER",
1614
+ "category": "schema",
1615
+ "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
1616
  },
1622
1617
  {
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."
1618
+ "code": "ORB_S_SHARED_WITHOUT_PERSISTENCE_MODE",
1619
+ "category": "schema",
1620
+ "description": "A shared entity declares no persistence mode, and none may be inferred"
1626
1621
  },
1627
1622
  {
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."
1623
+ "code": "ORB_S_UNKNOWN_IDENTITY_FIELD",
1624
+ "category": "schema",
1625
+ "description": "A read of a field of the signed-in user names a field the declared identity entity does not have"
1631
1626
  },
1632
1627
  {
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."
1628
+ "code": "ORB_TAB_EFFECT_ON_SERVER",
1629
+ "category": "tab",
1630
+ "description": "A browser tab effect is used in a transition that runs on the server, which holds no tabs"
1636
1631
  },
1637
1632
  {
1638
- "code": "CIRCUIT_ORPHAN_EVENT",
1639
- "category": "circuit",
1640
- "description": "Action emits event with no transition handler"
1633
+ "code": "ORB_TAB_REQUEST_INVALID",
1634
+ "category": "browser",
1635
+ "description": "A browser/tab request is not an object of the operation's closed keys or has refused literal values"
1641
1636
  },
1642
1637
  {
1643
- "code": "CIRCUIT_DUPLICATE_EVENT",
1644
- "category": "circuit",
1645
- "description": "Same event emitted multiple times in same context"
1638
+ "code": "ORB_THEME_PIN_CONTRADICTS_APP",
1639
+ "category": "theme",
1640
+ "description": "An orbital pins a theme that differs from the theme the app declares at app level"
1646
1641
  },
1647
1642
  {
1648
- "code": "CIRCUIT_DEAD_END_COMPONENT",
1649
- "category": "circuit",
1650
- "description": "Interactive component missing itemActions"
1643
+ "code": "ORB_THEME_UNDECLARED",
1644
+ "category": "theme",
1645
+ "description": "A frame is shown in a literal theme that the program does not declare, so no stylesheet ships for it"
1651
1646
  },
1652
1647
  {
1653
- "code": "CIRCUIT_UNREACHABLE_STATE",
1654
- "category": "circuit",
1655
- "description": "State has no incoming transitions"
1648
+ "code": "ORB_TICK_ASYNC_EFFECT",
1649
+ "category": "tick",
1650
+ "description": "A tick calls a server-async operator, which ticks cannot run"
1656
1651
  },
1657
1652
  {
1658
- "code": "CIRCUIT_DEAD_END_STATE",
1659
- "category": "circuit",
1660
- "description": "State has no outgoing transitions"
1653
+ "code": "ORB_TICK_REQUIRES_RUNTIME",
1654
+ "category": "trait",
1655
+ "description": "A non-cron tick mutates a persistent entity, which should usually be runtime"
1661
1656
  },
1662
1657
  {
1663
- "code": "CIRCUIT_ACTION_COMPONENT_MISMATCH",
1664
- "category": "circuit",
1665
- "description": "Action-component mismatch"
1658
+ "code": "ORB_T_CLIENT_TICK_NOT_LOCAL",
1659
+ "category": "trait",
1660
+ "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
1661
  },
1667
1662
  {
1668
- "code": "CIRCUIT_NO_OVERLAY_EXIT",
1669
- "category": "circuit",
1670
- "description": "Overlay slot (modal/drawer) missing exit transition"
1663
+ "code": "ORB_T_CLIENT_TICK_SERVER_EFFECT",
1664
+ "category": "trait",
1665
+ "description": "A tick that runs in the browser has effects that reach the server, and nothing replays a tick there"
1671
1666
  },
1672
1667
  {
1673
- "code": "CIRCUIT_MODAL_EXIT_INCOMPLETE",
1674
- "category": "circuit",
1675
- "description": "Modal-to-inline transition missing render-ui(\"main\", ...) alongside render-ui(\"modal\", null)"
1668
+ "code": "ORB_T_CONFIG_MISSING_REQUIRED_KEY",
1669
+ "category": "trait",
1670
+ "description": "A trait reference does not supply a config knob that the referenced trait declares as required"
1676
1671
  },
1677
1672
  {
1678
- "code": "CIRCUIT_DEAD_HANDLER",
1679
- "category": "circuit",
1680
- "description": "Render-ui handler fires event with no matching transition from the rendering state"
1673
+ "code": "ORB_T_CONFIG_OBJECT_ARRAY_FORBIDDEN",
1674
+ "category": "trait",
1675
+ "description": "A config field uses a banned bare object or array type instead of a named struct alias"
1681
1676
  },
1682
1677
  {
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."
1678
+ "code": "ORB_T_CONFIG_TIER_INVALID",
1679
+ "category": "trait",
1680
+ "description": "A config field declares a tier value outside domain, policy, infra, presentation and internal"
1686
1681
  },
1687
1682
  {
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."
1683
+ "code": "ORB_T_CONFIG_UNKNOWN_CALL_SITE_KEY",
1684
+ "category": "trait",
1685
+ "description": "A call-site config key matches no config knob declared on the referenced trait"
1691
1686
  },
1692
1687
  {
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."
1688
+ "code": "ORB_T_DUPLICATE_NAME",
1689
+ "category": "trait",
1690
+ "description": "The same trait name is defined in more than one orbital"
1696
1691
  },
1697
1692
  {
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."
1693
+ "code": "ORB_T_DUPLICATE_STATE",
1694
+ "category": "trait",
1695
+ "description": "A trait declares the same state name more than once"
1701
1696
  },
1702
1697
  {
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."
1698
+ "code": "ORB_T_DUPLICATE_TRANSITION",
1699
+ "category": "trait",
1700
+ "description": "Two transitions share the same source state and event without guards"
1706
1701
  },
1707
1702
  {
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."
1703
+ "code": "ORB_T_EMPTY_EVENT_NAME",
1704
+ "category": "trait",
1705
+ "description": "An event name is empty"
1711
1706
  },
1712
1707
  {
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."
1708
+ "code": "ORB_T_ENDPOINT_TRAIT_RENDERS",
1709
+ "category": "trait",
1710
+ "description": "A trait mounted only on protocol endpoints renders UI, which endpoints cannot show"
1716
1711
  },
1717
1712
  {
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)."
1713
+ "code": "ORB_T_ENTITY_NAME_SHADOWS_TRAIT_UNION",
1714
+ "category": "trait",
1715
+ "description": "An entity name collides with a trait's generated state union type"
1721
1716
  },
1722
1717
  {
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."
1718
+ "code": "ORB_T_ENTITY_NOT_REBINDABLE",
1719
+ "category": "trait",
1720
+ "description": "A trait is bound to an entity it cannot be rebound to"
1726
1721
  },
1727
1722
  {
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."
1723
+ "code": "ORB_T_EVENT_RENAME_UNKNOWN_KEY",
1724
+ "category": "trait",
1725
+ "description": "An events rename key names no event declared by the referenced trait"
1731
1726
  },
1732
1727
  {
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."
1728
+ "code": "ORB_T_EVT_EXTERNAL_MISSING_PAYLOAD",
1729
+ "category": "trait",
1730
+ "description": "An external event does not declare a typed payload"
1736
1731
  },
1737
1732
  {
1738
- "code": "ORB_UI_ICON_INVALID_FORMAT",
1739
- "category": "icon",
1740
- "description": "Icon name has invalid format"
1733
+ "code": "ORB_T_EVT_INVALID_NAME",
1734
+ "category": "trait",
1735
+ "description": "An event name is not a valid UPPER_SNAKE_CASE identifier"
1741
1736
  },
1742
1737
  {
1743
- "code": "ORB_UI_ICON_EMPTY",
1744
- "category": "icon",
1745
- "description": "Icon name is empty"
1738
+ "code": "ORB_T_EVT_UNDECLARED",
1739
+ "category": "trait",
1740
+ "description": "An event is emitted but not declared in the trait's emits array"
1746
1741
  },
1747
1742
  {
1748
- "code": "ORB_UI_ICON_NOT_FOUND",
1749
- "category": "icon",
1750
- "description": "Icon may not exist in Lucide"
1743
+ "code": "ORB_T_EXTERNAL_INPUT_NOT_RESTING",
1744
+ "category": "trait",
1745
+ "description": "An external input is not accepted from the trait's initial state"
1751
1746
  },
1752
1747
  {
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`)."
1748
+ "code": "ORB_T_GENERIC_TYPE_DEPRECATED",
1749
+ "category": "trait",
1750
+ "description": "A declaration uses a generic type such as bare json, object without properties, or any, which the language no longer allows"
1756
1751
  },
1757
1752
  {
1758
- "code": "ORB_QUERY_MISSING_SEARCH",
1759
- "category": "query",
1760
- "description": "Query singleton missing search field"
1753
+ "code": "ORB_T_INIT_MISSING_FETCH",
1754
+ "category": "trait",
1755
+ "description": "No trait fetches a persistent entity on INIT, so interaction traits read data nothing loads"
1761
1756
  },
1762
1757
  {
1763
- "code": "ORB_QUERY_MISSING_RECOMMENDED",
1764
- "category": "query",
1765
- "description": "Query singleton missing recommended fields"
1758
+ "code": "ORB_T_INVALID_EVENT_DEFAULT",
1759
+ "category": "trait",
1760
+ "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
1761
  },
1767
1762
  {
1768
- "code": "ORB_QUERY_UNSUPPORTED_PATTERN",
1769
- "category": "query",
1770
- "description": "Pattern doesn't support query prop"
1763
+ "code": "ORB_T_INVALID_FORMAT",
1764
+ "category": "trait",
1765
+ "description": "A trait reference has neither a ref nor a name property"
1771
1766
  },
1772
1767
  {
1773
- "code": "ORB_QUERY_UNKNOWN_SINGLETON",
1774
- "category": "query",
1775
- "description": "Query references unknown singleton"
1768
+ "code": "ORB_T_INVALID_PATTERN_DEFAULT",
1769
+ "category": "trait",
1770
+ "description": "A pattern-typed config knob has a default that is not a known pattern type"
1776
1771
  },
1777
1772
  {
1778
- "code": "ORB_QUERY_UNUSED_SINGLETON",
1779
- "category": "query",
1780
- "description": "Query singleton is unused"
1773
+ "code": "ORB_T_INVALID_SLOT_DEFAULT",
1774
+ "category": "trait",
1775
+ "description": "A slot-typed config field has a default that is not a valid slot"
1781
1776
  },
1782
1777
  {
1783
- "code": "ORB_T_EVT_UNDECLARED",
1784
- "category": "trait_event",
1785
- "description": "Event emitted but not declared in trait.emits"
1778
+ "code": "ORB_T_INVALID_TRANSITION",
1779
+ "category": "trait",
1780
+ "description": "A transition references a source or target state that does not exist"
1786
1781
  },
1787
1782
  {
1788
- "code": "ORB_T_EVT_INVALID_NAME",
1789
- "category": "trait_event",
1790
- "description": "Event name not UPPER_SNAKE_CASE"
1783
+ "code": "ORB_T_LOCAL_ON_NON_SHARED_PERSISTENT",
1784
+ "category": "trait",
1785
+ "description": "A client-dispatch trait is linked to an entity that is neither shared nor client-resident, hiding server-gated writes behind optimism"
1791
1786
  },
1792
1787
  {
1793
- "code": "ORB_T_EVT_TICK_UNDECLARED",
1794
- "category": "trait_event",
1795
- "description": "Tick emits undeclared event"
1788
+ "code": "ORB_T_LOCAL_TRAIT_TOUCHES_SERVER",
1789
+ "category": "trait",
1790
+ "description": "A client trait transition guards on or touches server-only state"
1796
1791
  },
1797
1792
  {
1798
- "code": "ORB_T_EVT_SCOPE_MISMATCH",
1799
- "category": "trait_event",
1800
- "description": "Listener scope mismatch"
1793
+ "code": "ORB_T_MISSING_INIT_TRANSITION",
1794
+ "category": "trait",
1795
+ "description": "A route trait has no INIT transition on its initial state"
1801
1796
  },
1802
1797
  {
1803
- "code": "ORB_T_EVT_EXTERNAL_MISSING_PAYLOAD",
1804
- "category": "trait_event",
1805
- "description": "External emit missing payload definition"
1798
+ "code": "ORB_T_MULTIPLE_INITIAL_STATES",
1799
+ "category": "trait",
1800
+ "description": "A trait state machine declares more than one initial state"
1806
1801
  },
1807
1802
  {
1808
- "code": "ORB_S_MISSING_NAME",
1809
- "category": "schema",
1810
- "description": "Schema missing name"
1803
+ "code": "ORB_T_NO_INITIAL_STATE",
1804
+ "category": "trait",
1805
+ "description": "A state machine declares no states and so has no initial state"
1811
1806
  },
1812
1807
  {
1813
- "code": "ORB_S_NO_ORBITALS",
1814
- "category": "schema",
1815
- "description": "Schema has no orbitals"
1808
+ "code": "ORB_T_REBIND_MISSING_FIELDS",
1809
+ "category": "trait",
1810
+ "description": "A trait is rebound to an entity that lacks fields the trait requires"
1816
1811
  },
1817
1812
  {
1818
- "code": "ORB_S_EMPTY_VERSION",
1819
- "category": "schema",
1820
- "description": "Schema version is empty"
1813
+ "code": "ORB_T_REBIND_TARGET_UNRESOLVED",
1814
+ "category": "trait",
1815
+ "description": "A trait rebind target cannot be resolved"
1821
1816
  },
1822
1817
  {
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`.)"
1818
+ "code": "ORB_T_SECRET_DEFAULT_NOT_STRING",
1819
+ "category": "trait",
1820
+ "description": "A config field typed secret does not default to a string credential reference"
1826
1821
  },
1827
1822
  {
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."
1823
+ "code": "ORB_T_STATE_UNREACHABLE",
1824
+ "category": "trait",
1825
+ "description": "A state is unreachable from the initial state through any transition path"
1831
1826
  },
1832
1827
  {
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."
1828
+ "code": "ORB_T_TRAIT_ON_ROUTE_AND_ENDPOINT",
1829
+ "category": "trait",
1830
+ "description": "A trait is mounted on both a route page and a protocol endpoint"
1836
1831
  },
1837
1832
  {
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."
1833
+ "code": "ORB_T_TRAIT_UNMOUNTED",
1834
+ "category": "trait",
1835
+ "description": "A trait owns a state machine but is listed on no page and reached by no embed"
1841
1836
  },
1842
1837
  {
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."
1838
+ "code": "ORB_T_UNDEFINED_EVENT",
1839
+ "category": "trait",
1840
+ "description": "A transition uses an event that is not defined in the trait's events array"
1846
1841
  },
1847
1842
  {
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`."
1843
+ "code": "ORB_T_UNDEFINED_TRAIT",
1844
+ "category": "trait",
1845
+ "description": "A trait reference does not give a trait name"
1851
1846
  },
1852
1847
  {
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."
1848
+ "code": "ORB_T_UNRESOLVED_TYPE_PARAM",
1849
+ "category": "trait",
1850
+ "description": "A declaration uses a type variable that no trait parameter binds"
1856
1851
  },
1857
1852
  {
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."
1853
+ "code": "ORB_UI_ICON_EMPTY",
1854
+ "category": "icon",
1855
+ "description": "An icon name is empty"
1861
1856
  },
1862
1857
  {
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."
1858
+ "code": "ORB_UI_ICON_INVALID_FORMAT",
1859
+ "category": "icon",
1860
+ "description": "An icon name has an invalid format"
1866
1861
  },
1867
1862
  {
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."
1863
+ "code": "ORB_UI_ICON_NOT_FOUND",
1864
+ "category": "icon",
1865
+ "description": "An icon name does not exist in the icon set"
1871
1866
  },
1872
1867
  {
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."
1868
+ "code": "ORB_U_CONFIG_UNKNOWN_KEY",
1869
+ "category": "uses",
1870
+ "description": "A uses config override names a knob the imported behavior app-level config never declared"
1876
1871
  },
1877
1872
  {
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`."
1873
+ "code": "ORB_W_LOOP_INVARIANT_PARSE",
1874
+ "category": "lint",
1875
+ "description": "A parse inside a lambda re-parses the same value for every element and should be bound once outside"
1881
1876
  },
1882
1877
  {
1883
- "code": "ORB_EMBED_CONFIG_FORWARD_MULTI_REFERRER",
1878
+ "code": "ORB_X_CIRCULAR_DEPENDENCY",
1884
1879
  "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."
1880
+ "description": "Traits form a circular event dependency"
1891
1881
  },
1892
1882
  {
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)."
1883
+ "code": "ORB_X_CROSS_EMITTER_DECLARED_PAYLOAD_MISMATCH",
1884
+ "category": "cross",
1885
+ "description": "An event declared by several emitters has conflicting payload fields across them"
1896
1886
  },
1897
1887
  {
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."
1888
+ "code": "ORB_X_DUPLICATE_ENTITY",
1889
+ "category": "cross",
1890
+ "description": "The same entity name is defined in more than one orbital"
1901
1891
  },
1902
1892
  {
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."
1893
+ "code": "ORB_X_DUPLICATE_TRAIT_ID",
1894
+ "category": "cross",
1895
+ "description": "Two or more traits carry the same trait id, so listens match each other's emits"
1906
1896
  },
1907
1897
  {
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`)."
1898
+ "code": "ORB_X_ENUM_VALUE_NOT_MEMBER",
1899
+ "category": "cross",
1900
+ "description": "A set effect assigns a string literal that is not a declared member of the target field's enum"
1911
1901
  },
1912
1902
  {
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."
1903
+ "code": "ORB_X_FILTER_FIELD_NEVER_WRITTEN",
1904
+ "category": "cross",
1905
+ "description": "A fetch filters on a field that no persist create or update of that entity supplies, so it always returns empty"
1916
1906
  },
1917
1907
  {
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)."
1908
+ "code": "ORB_X_LISTEN_PER_ENTITY",
1909
+ "category": "trait_event",
1910
+ "description": "A trait that listens per a key does not link a [runtime] entity declaring an id : string field"
1921
1911
  },
1922
1912
  {
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."
1913
+ "code": "ORB_X_LISTEN_PER_ROUTED_PAGE",
1914
+ "category": "trait_event",
1915
+ "description": "A trait that listens per a key is placed on a route page"
1926
1916
  },
1927
1917
  {
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)."
1918
+ "code": "ORB_X_LISTEN_SOURCE_NEVER_PRODUCES",
1919
+ "category": "cross",
1920
+ "description": "A listens route names a source whose emits contract never produces the listened event"
1931
1921
  },
1932
1922
  {
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."
1923
+ "code": "ORB_X_LISTEN_SOURCE_UNRESOLVED",
1924
+ "category": "cross",
1925
+ "description": "A listen entry references a source trait event that the source does not declare"
1936
1926
  },
1937
1927
  {
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."
1928
+ "code": "ORB_X_LISTEN_TRIGGER_UNMATCHED",
1929
+ "category": "cross",
1930
+ "description": "A listens entry triggers an event that no transition in the same trait reacts to"
1941
1931
  },
1942
1932
  {
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."
1933
+ "code": "ORB_X_LLM_WIRE_UNROUTED",
1934
+ "category": "cross",
1935
+ "description": "A composed std-llm trait can emit a wire event that no trait in the program listens to"
1946
1936
  },
1947
1937
  {
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."
1938
+ "code": "ORB_X_MISSING_ORBITAL_NAME",
1939
+ "category": "cross",
1940
+ "description": "An orbital does not declare a name"
1951
1941
  },
1952
1942
  {
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."
1943
+ "code": "ORB_X_ORPHAN_LISTENER",
1944
+ "category": "cross",
1945
+ "description": "A trait listens for an event that no trait emits"
1956
1946
  },
1957
1947
  {
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."
1948
+ "code": "ORB_X_PARALLEL_LAMBDA_IMPURE",
1949
+ "category": "parallel",
1950
+ "description": "The lambda of array/pmap or array/preduce is not a literal fn or is not provably pure"
1961
1951
  },
1962
1952
  {
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)."
1953
+ "code": "ORB_X_PAYLOAD_FIELD_NAME",
1954
+ "category": "cross",
1955
+ "description": "A payload field name is not a valid TypeScript identifier"
1966
1956
  },
1967
1957
  {
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`)."
1958
+ "code": "ORB_X_PAYLOAD_MISMATCH",
1959
+ "category": "cross",
1960
+ "description": "An external emit is missing a payload field required by the event's declaration"
1971
1961
  },
1972
1962
  {
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."
1963
+ "code": "ORB_X_RENDER_UI_EVENT_LITERAL_STALE",
1964
+ "category": "cross",
1965
+ "description": "A render-ui prop references an event literal that no longer matches a declared event"
1976
1966
  },
1977
1967
  {
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."
1968
+ "code": "ORB_X_ROW_LITERAL_FIELD_TYPE_MISMATCH",
1969
+ "category": "effect",
1970
+ "description": "A record literal written into an entity carries a value whose type the declared field does not admit."
1981
1971
  },
1982
1972
  {
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."
1973
+ "code": "ORB_X_ROW_LITERAL_MISSING_REQUIRED",
1974
+ "category": "effect",
1975
+ "description": "A `persist create` data literal omits a column the entity requires (no default, not framework-stamped)."
1986
1976
  },
1987
1977
  {
1988
- "code": "ORB_BEHAVIOR_PACKAGE_NOT_INSTALLED",
1989
- "category": "behavior_package",
1990
- "description": "`<prefix>/<name>` names a prefix no installed behavior package declares."
1978
+ "code": "ORB_X_ROW_LITERAL_UNKNOWN_FIELD",
1979
+ "category": "effect",
1980
+ "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
1981
  },
1992
1982
  {
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)."
1983
+ "code": "ORB_X_UNKNOWN_THEME",
1984
+ "category": "cross",
1985
+ "description": "A theme reference is neither a built-in theme key nor an orbital-declared inline theme"
1996
1986
  },
1997
1987
  {
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."
1988
+ "code": "ORB_X_UNRESOLVED_RELATION_TARGET",
1989
+ "category": "cross",
1990
+ "description": "A relation field points at an entity that is not declared in the schema"
2001
1991
  },
2002
1992
  {
2003
- "code": "ORB_BEHAVIOR_PREFIX_CONFLICT",
2004
- "category": "behavior_package",
2005
- "description": "Two different installed packages declare the same `orb.prefix`."
1993
+ "code": "ORB_X_UNTYPED_ARRAY",
1994
+ "category": "cross",
1995
+ "description": "An array field declares no element type"
2006
1996
  },
2007
1997
  {
2008
- "code": "ORB_BEHAVIOR_NAME_DUPLICATE",
2009
- "category": "behavior_package",
2010
- "description": "A behavior name is duplicated within or across installed package sources."
1998
+ "code": "ORB_X_UNUSED_EMISSION",
1999
+ "category": "cross",
2000
+ "description": "A trait emits an event that no trait listens for"
2011
2001
  },
2012
2002
  {
2013
- "code": "ORB_BEHAVIOR_PACKAGE_INVALID",
2014
- "category": "behavior_package",
2015
- "description": "An installed behavior package's registry cannot be read or indexed."
2003
+ "code": "SEXPR_INVALID_BINDING",
2004
+ "category": "sexpr",
2005
+ "description": "An s-expression contains an invalid binding"
2016
2006
  },
2017
2007
  {
2018
- "code": "ORB_GEN_INVALID_VALUE",
2019
- "category": "generic",
2020
- "description": "Generic invalid value"
2008
+ "code": "SEXPR_INVALID_OPERATOR",
2009
+ "category": "sexpr",
2010
+ "description": "An S-expression uses an operator that is not in the operator registry"
2021
2011
  },
2022
2012
  {
2023
- "code": "ORB_GEN_INVALID_REFERENCE",
2024
- "category": "generic",
2025
- "description": "Generic invalid reference format"
2013
+ "code": "SEXPR_UNKNOWN_ENTITY",
2014
+ "category": "sexpr",
2015
+ "description": "An entity named in a binding may not exist in the program"
2026
2016
  },
2027
2017
  {
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)"
2018
+ "code": "inbound-hook-duplicate",
2019
+ "category": "lint",
2020
+ "description": "Two cli hooks declare the same inbound name"
2031
2021
  },
2032
2022
  {
2033
- "code": "ORB_GEN_MISSING_FIELD",
2034
- "category": "generic",
2035
- "description": "Generic missing required field"
2023
+ "code": "shared-type-drift",
2024
+ "category": "lint",
2025
+ "description": "A type shared between behaviors has drifted from its canonical declaration"
2036
2026
  },
2037
2027
  {
2038
- "code": "ORB_GEN_DUPLICATE",
2039
- "category": "generic",
2040
- "description": "Generic duplicate entity/item"
2028
+ "code": "unread",
2029
+ "category": "lint",
2030
+ "description": "The file the rule reads could not be read or listed"
2041
2031
  }
2042
2032
  ]