@consiliency/agent-board-schema 1.2.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 (92) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +11 -0
  3. package/README.md +55 -0
  4. package/bin/agent-board-schema.js +97 -0
  5. package/fixtures/already-applied.json +181 -0
  6. package/fixtures/divergent-history.json +173 -0
  7. package/fixtures/production-history.json +173 -0
  8. package/migrations/20260501000001_agent_board_schema_version.sql +12 -0
  9. package/migrations/20260502000000_agent_board_schema.sql +180 -0
  10. package/migrations/20260503000000_agent_board_rpcs.sql +422 -0
  11. package/migrations/20260503000001_agent_board_coordination_rpcs.sql +229 -0
  12. package/migrations/20260504000000_agent_board_read_models.sql +206 -0
  13. package/migrations/20260505000000_agent_board_inbox_schema.sql +341 -0
  14. package/migrations/20260506000000_agent_board_inbox_delivery_rpcs.sql +1200 -0
  15. package/migrations/20260506000001_agent_board_inbox_callback_rpcs.sql +330 -0
  16. package/migrations/20260507000000_agent_board_inbox_reads.sql +334 -0
  17. package/migrations/20260508000000_agent_board_callback_runtime.sql +453 -0
  18. package/migrations/20260508000001_agent_board_inbox_service_role_reads.sql +10 -0
  19. package/migrations/20260510000000_agent_board_dblint_repairs.sql +413 -0
  20. package/migrations/20260511000000_agent_board_auth_schema.sql +146 -0
  21. package/migrations/20260511000001_agent_board_auth_credentials.sql +39 -0
  22. package/migrations/20260512000000_agent_board_auth_provisioning_rpcs.sql +622 -0
  23. package/migrations/20260512000001_agent_board_auth_v1_rpcs.sql +798 -0
  24. package/migrations/20260512000002_agent_board_auth_v2_rpcs.sql +1243 -0
  25. package/migrations/20260512000003_agent_board_auth_rls.sql +484 -0
  26. package/migrations/20260513000000_agent_board_backup_ops.sql +34 -0
  27. package/migrations/20260513000001_agent_board_retention.sql +160 -0
  28. package/migrations/20260513000002_agent_board_monitoring_views.sql +227 -0
  29. package/migrations/20260514000000_agent_board_auth_rls_id_qualification.sql +150 -0
  30. package/migrations/20260515000000_agent_board_boardopt.sql +493 -0
  31. package/migrations/20260516000000_agent_board_callbackcap.sql +113 -0
  32. package/migrations/20260517000000_agent_board_addressing.sql +542 -0
  33. package/migrations/20260628000000_agent_board_signing_store.sql +174 -0
  34. package/migrations/20260628000001_agent_board_signing_proof_rpcs.sql +215 -0
  35. package/migrations/20260628000002_agent_board_signature_rls_reads.sql +300 -0
  36. package/migrations/20260628000003_agent_board_signed_write_gateway.sql +288 -0
  37. package/migrations/20260628000004_agent_board_fleet_registry.sql +411 -0
  38. package/migrations/20260628000005_agent_board_fleet_policy.sql +509 -0
  39. package/migrations/20260628000006_agent_board_fleet_read_models.sql +170 -0
  40. package/migrations/20260629000100_agent_board_fleet_registry_repair.sql +411 -0
  41. package/migrations/20260629000101_agent_board_fleet_policy_refresh.sql +509 -0
  42. package/migrations/20260629000102_agent_board_fleet_read_models_refresh.sql +170 -0
  43. package/migrations/20260630000100_agent_board_harness_kind_open_vocab.sql +15 -0
  44. package/migrations/20260710000000_agent_board_authbound_boundary.sql +155 -0
  45. package/migrations/20260710000100_agent_board_schema_version_rpc.sql +14 -0
  46. package/migrations/20260710000400_agent_board_nonfleet_identity.sql +87 -0
  47. package/migrations/20260710000401_agent_board_workload_providers.sql +39 -0
  48. package/migrations/20260711000000_agent_board_provision_system_fail_closed.sql +242 -0
  49. package/migrations/20260711000100_canary_signed_fleet_enforcement.sql +234 -0
  50. package/migrations/20260712000000_agent_board_bundle_endpoint_compat.sql +97 -0
  51. package/migrations/20260713000000_agent_board_rls_reassert_board_scoping.sql +90 -0
  52. package/package.json +42 -0
  53. package/provenance.json +580 -0
  54. package/schema-manifest.json +458 -0
  55. package/src/check.js +23 -0
  56. package/src/index.js +50 -0
  57. package/src/materialize.js +73 -0
  58. package/src/plan.js +44 -0
  59. package/src/tooling.test.mjs +97 -0
  60. package/tests/agent_board_addressing.test.sql +166 -0
  61. package/tests/agent_board_auth_rls.test.sql +243 -0
  62. package/tests/agent_board_auth_rls_id_qualification.test.sql +225 -0
  63. package/tests/agent_board_auth_rpcs.test.sql +311 -0
  64. package/tests/agent_board_auth_schema.test.sql +411 -0
  65. package/tests/agent_board_authbound_boundary.test.sql +148 -0
  66. package/tests/agent_board_boardopt.test.sql +170 -0
  67. package/tests/agent_board_bundle_endpoint_compat.test.sql +49 -0
  68. package/tests/agent_board_callback_runtime.test.sql +425 -0
  69. package/tests/agent_board_callbackcap.test.sql +222 -0
  70. package/tests/agent_board_canary_signed_fleet_enforcement.test.sql +60 -0
  71. package/tests/agent_board_dblint_rpcs.test.sql +247 -0
  72. package/tests/agent_board_fleet_policy.test.sql +370 -0
  73. package/tests/agent_board_fleet_read_models.test.sql +158 -0
  74. package/tests/agent_board_fleet_registry.test.sql +149 -0
  75. package/tests/agent_board_inbox_reads.test.sql +471 -0
  76. package/tests/agent_board_inbox_rpcs.test.sql +452 -0
  77. package/tests/agent_board_inbox_schema.test.sql +355 -0
  78. package/tests/agent_board_nonfleet_identity.test.sql +26 -0
  79. package/tests/agent_board_rls_reassert_board_scoping.test.sql +39 -0
  80. package/tests/agent_board_schema_version.test.sql +24 -0
  81. package/tests/agent_board_schema_version_rpc.test.sql +40 -0
  82. package/tests/agent_board_signature_rls_reads.test.sql +133 -0
  83. package/tests/agent_board_signed_write_gateway.test.sql +219 -0
  84. package/tests/agent_board_signing_proof_rpcs.test.sql +143 -0
  85. package/tests/agent_board_signing_store.test.sql +183 -0
  86. package/tests/agent_board_smoke.test.sql +12 -0
  87. package/tests/agent_board_v1_invariants.test.sql +298 -0
  88. package/tests/agent_board_v2_invariants.test.sql +753 -0
  89. package/tests/agent_board_workload_providers.test.sql +15 -0
  90. package/tests/fixtures/adopter-base.sql +19 -0
  91. package/tests/fixtures/operator-hardening.sql +27 -0
  92. package/tests/fixtures/test-prereqs.sql +84 -0
@@ -0,0 +1,458 @@
1
+ {
2
+ "schema": "agent_board_schema_manifest.v1",
3
+ "interface": "IF-0-MBPLANE-BUNDLE-1",
4
+ "package": "@consiliency/agent-board-schema",
5
+ "packageVersion": "1.2.0",
6
+ "schemaVersion": 7,
7
+ "minClientVersion": "1.1.0",
8
+ "source": {
9
+ "portalBaseline": "94f9c269a358a943498454003e8f05f47e27a491",
10
+ "laneHead": "7ddb0bbbd83d510e1a968bc7796ad15fcf7a27b9",
11
+ "mergeBase": "c9b184997f20efad34201eb64781dc1218c76de4"
12
+ },
13
+ "replayOrder": "frozen union (baseline-then-lane) followed by Message Board-owned forward migrations in filename order",
14
+ "assumptions": {
15
+ "postgres": ">=15",
16
+ "supabase": "PostgREST + GoTrue roles (anon, authenticated, service_role); pgTAP for tests",
17
+ "extensions": [
18
+ "pgcrypto",
19
+ "pgtap (tests only)"
20
+ ]
21
+ },
22
+ "externalDependencies": [
23
+ {
24
+ "object": "auth.users",
25
+ "kind": "supabase-base",
26
+ "usage": "read (identity linkage)"
27
+ },
28
+ {
29
+ "object": "auth.identities",
30
+ "kind": "supabase-base",
31
+ "usage": "read (identity linkage)"
32
+ },
33
+ {
34
+ "object": "auth.uid()/auth.role()",
35
+ "kind": "supabase-base",
36
+ "usage": "RLS predicates"
37
+ },
38
+ {
39
+ "object": "public.user_org_roles",
40
+ "kind": "portal-owned",
41
+ "usage": "read (platform_admin seed; guarded, tolerates empty)"
42
+ },
43
+ {
44
+ "object": "public.app_settings",
45
+ "kind": "portal-owned",
46
+ "usage": "upsert (retention/monitoring defaults; on conflict do nothing)"
47
+ }
48
+ ],
49
+ "migrationCount": 44,
50
+ "aggregateSha256": "256b9de4e36809ed16778541adb8a573325b59dbcb30d56a428dbfd8fa5d2435",
51
+ "migrations": [
52
+ {
53
+ "order": 0,
54
+ "id": "20260501000001_agent_board_schema_version",
55
+ "filename": "20260501000001_agent_board_schema_version.sql",
56
+ "origin": "baseline",
57
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
58
+ "bytes": 470,
59
+ "sha256": "326909867e4b6e0b756e52455171def3308561d47cf815c10a47a0b39c8afc5f"
60
+ },
61
+ {
62
+ "order": 1,
63
+ "id": "20260502000000_agent_board_schema",
64
+ "filename": "20260502000000_agent_board_schema.sql",
65
+ "origin": "baseline",
66
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
67
+ "bytes": 10283,
68
+ "sha256": "a4466d5d202de2328d58de0f870313b69541880f37ce73f1dfe1c005ad497bda"
69
+ },
70
+ {
71
+ "order": 2,
72
+ "id": "20260503000000_agent_board_rpcs",
73
+ "filename": "20260503000000_agent_board_rpcs.sql",
74
+ "origin": "baseline",
75
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
76
+ "bytes": 16515,
77
+ "sha256": "685a7b88295bd76f0dda6530d96b17828f5024c037f0552b6b82555fb0f298c8"
78
+ },
79
+ {
80
+ "order": 3,
81
+ "id": "20260503000001_agent_board_coordination_rpcs",
82
+ "filename": "20260503000001_agent_board_coordination_rpcs.sql",
83
+ "origin": "baseline",
84
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
85
+ "bytes": 8826,
86
+ "sha256": "658d8e397dff727e9c3906699c8827004b1d365e53c7b5691935fd613c662adb"
87
+ },
88
+ {
89
+ "order": 4,
90
+ "id": "20260504000000_agent_board_read_models",
91
+ "filename": "20260504000000_agent_board_read_models.sql",
92
+ "origin": "baseline",
93
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
94
+ "bytes": 6375,
95
+ "sha256": "5b35cb4c8763640bf4cf35fb5e063357ad35bd5d086dd5a6d8f13c04b4b0f29e"
96
+ },
97
+ {
98
+ "order": 5,
99
+ "id": "20260505000000_agent_board_inbox_schema",
100
+ "filename": "20260505000000_agent_board_inbox_schema.sql",
101
+ "origin": "baseline",
102
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
103
+ "bytes": 17332,
104
+ "sha256": "9cf93fd8756e169484c9630285451fe87b3fe1a17390d34f3c071d2aef7b4030"
105
+ },
106
+ {
107
+ "order": 6,
108
+ "id": "20260506000000_agent_board_inbox_delivery_rpcs",
109
+ "filename": "20260506000000_agent_board_inbox_delivery_rpcs.sql",
110
+ "origin": "baseline",
111
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
112
+ "bytes": 36603,
113
+ "sha256": "b56defdeb2cfe06b6fe1b50de5ff2515000097783552c175b512b34fd68bcbc6"
114
+ },
115
+ {
116
+ "order": 7,
117
+ "id": "20260506000001_agent_board_inbox_callback_rpcs",
118
+ "filename": "20260506000001_agent_board_inbox_callback_rpcs.sql",
119
+ "origin": "baseline",
120
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
121
+ "bytes": 11557,
122
+ "sha256": "f31d855e3ea091f7f38ebfb5981bd9aad63e927eee3b46e7d011c2121806b030"
123
+ },
124
+ {
125
+ "order": 8,
126
+ "id": "20260507000000_agent_board_inbox_reads",
127
+ "filename": "20260507000000_agent_board_inbox_reads.sql",
128
+ "origin": "baseline",
129
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
130
+ "bytes": 10949,
131
+ "sha256": "d9a11145ef49c7ee49b283c9fc71d230eb5d8e14ab76fa7a8da23519886af2d5"
132
+ },
133
+ {
134
+ "order": 9,
135
+ "id": "20260508000000_agent_board_callback_runtime",
136
+ "filename": "20260508000000_agent_board_callback_runtime.sql",
137
+ "origin": "baseline",
138
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
139
+ "bytes": 12760,
140
+ "sha256": "750848141ead5c1c8b58fc10f7b7b2d082055300ee28d8666bdcecea7db527ac"
141
+ },
142
+ {
143
+ "order": 10,
144
+ "id": "20260508000001_agent_board_inbox_service_role_reads",
145
+ "filename": "20260508000001_agent_board_inbox_service_role_reads.sql",
146
+ "origin": "baseline",
147
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
148
+ "bytes": 348,
149
+ "sha256": "85c2301902d5a49f6f226c9887ee5cf01a02f88b5c65925cb23cc3fb4c0a941e"
150
+ },
151
+ {
152
+ "order": 11,
153
+ "id": "20260510000000_agent_board_dblint_repairs",
154
+ "filename": "20260510000000_agent_board_dblint_repairs.sql",
155
+ "origin": "baseline",
156
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
157
+ "bytes": 14627,
158
+ "sha256": "4b862004b455d6569254638d3c5c07779b84b95ab8d70210d92a628dc3eb94c5"
159
+ },
160
+ {
161
+ "order": 12,
162
+ "id": "20260511000000_agent_board_auth_schema",
163
+ "filename": "20260511000000_agent_board_auth_schema.sql",
164
+ "origin": "baseline",
165
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
166
+ "bytes": 4611,
167
+ "sha256": "dba2128e74e25d009a8dc20052d3329fffee364e7b4c15c92ab22584b8f797a3"
168
+ },
169
+ {
170
+ "order": 13,
171
+ "id": "20260511000001_agent_board_auth_credentials",
172
+ "filename": "20260511000001_agent_board_auth_credentials.sql",
173
+ "origin": "baseline",
174
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
175
+ "bytes": 1885,
176
+ "sha256": "1f63c4d12fc34db76b7ceef17ee9c64ad09be9e13b9e02497477ec62aa14ebbc"
177
+ },
178
+ {
179
+ "order": 14,
180
+ "id": "20260512000000_agent_board_auth_provisioning_rpcs",
181
+ "filename": "20260512000000_agent_board_auth_provisioning_rpcs.sql",
182
+ "origin": "baseline",
183
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
184
+ "bytes": 17149,
185
+ "sha256": "4a72d9ac64446889a54293fb60bb3402da9dbd8bdb29027e7d5d15965e20af27"
186
+ },
187
+ {
188
+ "order": 15,
189
+ "id": "20260512000001_agent_board_auth_v1_rpcs",
190
+ "filename": "20260512000001_agent_board_auth_v1_rpcs.sql",
191
+ "origin": "baseline",
192
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
193
+ "bytes": 33511,
194
+ "sha256": "c1fdc772beac92f60010ca6d2e7ea95a81989d651f7cb279905770756dc47bda"
195
+ },
196
+ {
197
+ "order": 16,
198
+ "id": "20260512000002_agent_board_auth_v2_rpcs",
199
+ "filename": "20260512000002_agent_board_auth_v2_rpcs.sql",
200
+ "origin": "baseline",
201
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
202
+ "bytes": 43972,
203
+ "sha256": "c2df467ef49c6c30eea50d1a789e8816627a3b8f34a1172fdeb61b7d681031ae"
204
+ },
205
+ {
206
+ "order": 17,
207
+ "id": "20260512000003_agent_board_auth_rls",
208
+ "filename": "20260512000003_agent_board_auth_rls.sql",
209
+ "origin": "baseline",
210
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
211
+ "bytes": 15177,
212
+ "sha256": "d194a28482d8a7b00272e1b06a09fd125ec13f2906de86d2aab942671bc79294"
213
+ },
214
+ {
215
+ "order": 18,
216
+ "id": "20260513000000_agent_board_backup_ops",
217
+ "filename": "20260513000000_agent_board_backup_ops.sql",
218
+ "origin": "baseline",
219
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
220
+ "bytes": 1470,
221
+ "sha256": "1e9e5d1a6b6e2f6b83d9b5479e464cd0f91297c2a28ff71c54cabde656761142"
222
+ },
223
+ {
224
+ "order": 19,
225
+ "id": "20260513000001_agent_board_retention",
226
+ "filename": "20260513000001_agent_board_retention.sql",
227
+ "origin": "baseline",
228
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
229
+ "bytes": 5123,
230
+ "sha256": "7dd0ebd14eb97922d9c16fcf9c29815b0ab5c2bd7534c6f2de189d55e7d633ec"
231
+ },
232
+ {
233
+ "order": 20,
234
+ "id": "20260513000002_agent_board_monitoring_views",
235
+ "filename": "20260513000002_agent_board_monitoring_views.sql",
236
+ "origin": "baseline",
237
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
238
+ "bytes": 8790,
239
+ "sha256": "037b4d036a4526fd2b905e0a950698b8cbad5ad4a16e6fbea4cdab3b4147edc1"
240
+ },
241
+ {
242
+ "order": 21,
243
+ "id": "20260514000000_agent_board_auth_rls_id_qualification",
244
+ "filename": "20260514000000_agent_board_auth_rls_id_qualification.sql",
245
+ "origin": "baseline",
246
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
247
+ "bytes": 5490,
248
+ "sha256": "9d09d16f993cf504552e1736b867b4c6b2d5cad4ec9a99b512bf645fe83cfd76"
249
+ },
250
+ {
251
+ "order": 22,
252
+ "id": "20260515000000_agent_board_boardopt",
253
+ "filename": "20260515000000_agent_board_boardopt.sql",
254
+ "origin": "baseline",
255
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
256
+ "bytes": 17756,
257
+ "sha256": "99d82496dd9c791968cc7e129026e6af97da700302fa87e86b6a0e28513c7163"
258
+ },
259
+ {
260
+ "order": 23,
261
+ "id": "20260516000000_agent_board_callbackcap",
262
+ "filename": "20260516000000_agent_board_callbackcap.sql",
263
+ "origin": "baseline",
264
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
265
+ "bytes": 3725,
266
+ "sha256": "6f68ef098aaa6e2bd7e251d0ca9cd367cc593a4616a7b6acf51e3078394545fa"
267
+ },
268
+ {
269
+ "order": 24,
270
+ "id": "20260517000000_agent_board_addressing",
271
+ "filename": "20260517000000_agent_board_addressing.sql",
272
+ "origin": "baseline",
273
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
274
+ "bytes": 18997,
275
+ "sha256": "83ce21d332e9bc96a996b662848a2d02c508c8cdbd7ad8831feba83be0676a8b"
276
+ },
277
+ {
278
+ "order": 25,
279
+ "id": "20260628000000_agent_board_signing_store",
280
+ "filename": "20260628000000_agent_board_signing_store.sql",
281
+ "origin": "baseline",
282
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
283
+ "bytes": 9072,
284
+ "sha256": "889d73cd6c261a3ebde19c091db9bc71a1e5307f4f275cfd2a6871b509b16927"
285
+ },
286
+ {
287
+ "order": 26,
288
+ "id": "20260628000001_agent_board_signing_proof_rpcs",
289
+ "filename": "20260628000001_agent_board_signing_proof_rpcs.sql",
290
+ "origin": "baseline",
291
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
292
+ "bytes": 6663,
293
+ "sha256": "36571e459bf534dc5b79221ac3e3930840818b75cc3df21d744bd17eef548002"
294
+ },
295
+ {
296
+ "order": 27,
297
+ "id": "20260628000002_agent_board_signature_rls_reads",
298
+ "filename": "20260628000002_agent_board_signature_rls_reads.sql",
299
+ "origin": "baseline",
300
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
301
+ "bytes": 9776,
302
+ "sha256": "4172a46d85c1e1dcfb28e3398eed0aba73175cb9b3bfb3af712ec3eee9da2096"
303
+ },
304
+ {
305
+ "order": 28,
306
+ "id": "20260628000003_agent_board_signed_write_gateway",
307
+ "filename": "20260628000003_agent_board_signed_write_gateway.sql",
308
+ "origin": "baseline",
309
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
310
+ "bytes": 10728,
311
+ "sha256": "7cf2b5baf6520242b0d2a7f921dc4a54db8995b24c844d16ee67a79fe68d5903"
312
+ },
313
+ {
314
+ "order": 29,
315
+ "id": "20260628000004_agent_board_fleet_registry",
316
+ "filename": "20260628000004_agent_board_fleet_registry.sql",
317
+ "origin": "baseline",
318
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
319
+ "bytes": 19512,
320
+ "sha256": "8ee7a679d1c3355a28ff2ef61872651f43c172d391dd7c8e9b0d0e005def140a"
321
+ },
322
+ {
323
+ "order": 30,
324
+ "id": "20260628000005_agent_board_fleet_policy",
325
+ "filename": "20260628000005_agent_board_fleet_policy.sql",
326
+ "origin": "baseline",
327
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
328
+ "bytes": 19807,
329
+ "sha256": "b6e3603dc8b3911ee280a62f52bf578d76c8bb7932bc21f140f8852296512475"
330
+ },
331
+ {
332
+ "order": 31,
333
+ "id": "20260628000006_agent_board_fleet_read_models",
334
+ "filename": "20260628000006_agent_board_fleet_read_models.sql",
335
+ "origin": "baseline",
336
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
337
+ "bytes": 6626,
338
+ "sha256": "59c697536520d0e0650d7ca6cea25a97a7a2157b44623f9fcd7d56552809b6f4"
339
+ },
340
+ {
341
+ "order": 32,
342
+ "id": "20260629000100_agent_board_fleet_registry_repair",
343
+ "filename": "20260629000100_agent_board_fleet_registry_repair.sql",
344
+ "origin": "baseline",
345
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
346
+ "bytes": 19512,
347
+ "sha256": "8ee7a679d1c3355a28ff2ef61872651f43c172d391dd7c8e9b0d0e005def140a"
348
+ },
349
+ {
350
+ "order": 33,
351
+ "id": "20260629000101_agent_board_fleet_policy_refresh",
352
+ "filename": "20260629000101_agent_board_fleet_policy_refresh.sql",
353
+ "origin": "baseline",
354
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
355
+ "bytes": 19807,
356
+ "sha256": "b6e3603dc8b3911ee280a62f52bf578d76c8bb7932bc21f140f8852296512475"
357
+ },
358
+ {
359
+ "order": 34,
360
+ "id": "20260629000102_agent_board_fleet_read_models_refresh",
361
+ "filename": "20260629000102_agent_board_fleet_read_models_refresh.sql",
362
+ "origin": "baseline",
363
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
364
+ "bytes": 6626,
365
+ "sha256": "59c697536520d0e0650d7ca6cea25a97a7a2157b44623f9fcd7d56552809b6f4"
366
+ },
367
+ {
368
+ "order": 35,
369
+ "id": "20260630000100_agent_board_harness_kind_open_vocab",
370
+ "filename": "20260630000100_agent_board_harness_kind_open_vocab.sql",
371
+ "origin": "baseline",
372
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
373
+ "bytes": 566,
374
+ "sha256": "ed141128a5ec8b29a13ada55bae9582df8ba6226527c8afe32374cbbbda1cf6a"
375
+ },
376
+ {
377
+ "order": 36,
378
+ "id": "20260711000000_agent_board_provision_system_fail_closed",
379
+ "filename": "20260711000000_agent_board_provision_system_fail_closed.sql",
380
+ "origin": "baseline",
381
+ "sourceRef": "94f9c269a358a943498454003e8f05f47e27a491",
382
+ "bytes": 8308,
383
+ "sha256": "11b9b7d4617f190501ecee175f14335926d75500ffcedf0675275e6d2752b2e0"
384
+ },
385
+ {
386
+ "order": 37,
387
+ "id": "20260710000000_agent_board_authbound_boundary",
388
+ "filename": "20260710000000_agent_board_authbound_boundary.sql",
389
+ "origin": "lane",
390
+ "sourceRef": "7ddb0bbbd83d510e1a968bc7796ad15fcf7a27b9",
391
+ "bytes": 5061,
392
+ "sha256": "4656cabe7b0f4caec1cffe28ec5d84627fece85c1bc9d45092301c7bea3da2fe"
393
+ },
394
+ {
395
+ "order": 38,
396
+ "id": "20260710000100_agent_board_schema_version_rpc",
397
+ "filename": "20260710000100_agent_board_schema_version_rpc.sql",
398
+ "origin": "lane",
399
+ "sourceRef": "7ddb0bbbd83d510e1a968bc7796ad15fcf7a27b9",
400
+ "bytes": 415,
401
+ "sha256": "62d5d567c3b336607a6e65aaf8246b975a73e357db281924f466382f669a3286"
402
+ },
403
+ {
404
+ "order": 39,
405
+ "id": "20260710000400_agent_board_nonfleet_identity",
406
+ "filename": "20260710000400_agent_board_nonfleet_identity.sql",
407
+ "origin": "lane",
408
+ "sourceRef": "7ddb0bbbd83d510e1a968bc7796ad15fcf7a27b9",
409
+ "bytes": 5003,
410
+ "sha256": "6c37b4e00a6f13bc73e74276e7cc3864b2955ce7189a4602074511d6795a0873"
411
+ },
412
+ {
413
+ "order": 40,
414
+ "id": "20260710000401_agent_board_workload_providers",
415
+ "filename": "20260710000401_agent_board_workload_providers.sql",
416
+ "origin": "lane",
417
+ "sourceRef": "7ddb0bbbd83d510e1a968bc7796ad15fcf7a27b9",
418
+ "bytes": 2150,
419
+ "sha256": "b29afcdfb69d4fd765f10e49b18280f1ba4fb98c90cf02ab56ea6fc20e0f8bce"
420
+ },
421
+ {
422
+ "order": 41,
423
+ "id": "20260711000100_canary_signed_fleet_enforcement",
424
+ "filename": "20260711000100_canary_signed_fleet_enforcement.sql",
425
+ "origin": "lane",
426
+ "sourceRef": "7ddb0bbbd83d510e1a968bc7796ad15fcf7a27b9",
427
+ "bytes": 12649,
428
+ "sha256": "f56c6bb4a0e6bcdfbd2884d215c702f4cf374a374635b3180a958d08cdfa2607"
429
+ },
430
+ {
431
+ "order": 42,
432
+ "id": "20260712000000_agent_board_bundle_endpoint_compat",
433
+ "filename": "20260712000000_agent_board_bundle_endpoint_compat.sql",
434
+ "origin": "message-board-forward",
435
+ "sourceRef": "message-board",
436
+ "bytes": 4726,
437
+ "sha256": "ee4cccd78191f62ebac4c1c43c3fdcfe2b41debc6c2090f8bcadf701df84aa42"
438
+ },
439
+ {
440
+ "order": 43,
441
+ "id": "20260713000000_agent_board_rls_reassert_board_scoping",
442
+ "filename": "20260713000000_agent_board_rls_reassert_board_scoping.sql",
443
+ "origin": "message-board-forward",
444
+ "sourceRef": "message-board",
445
+ "bytes": 3464,
446
+ "sha256": "ba2c55bd11600d3dc86d54f02acd48ef4de711aaedce425e6bbfc85284a46c74"
447
+ }
448
+ ],
449
+ "excludedBridge": {
450
+ "id": "20260710000200_portal_htmltasking_taskbridge",
451
+ "filename": "20260710000200_portal_htmltasking_taskbridge.sql",
452
+ "origin": "portal-bridge",
453
+ "sourceRef": "7ddb0bbbd83d510e1a968bc7796ad15fcf7a27b9",
454
+ "bytes": 2598,
455
+ "sha256": "0dd8d76e8e1d2d3f215ec78eeb2e00ae4b3323f6459e3a71770d263a348c16ee",
456
+ "note": "Portal-owned bridge; reads agent_board.tasks; excluded from canonical union, remains adopter-side."
457
+ }
458
+ }
package/src/check.js ADDED
@@ -0,0 +1,23 @@
1
+ // Posture check with stable machine-readable output and exit codes. Wraps plan()
2
+ // and maps posture -> deterministic exit code for CI / adopter gating.
3
+
4
+ import { plan } from './plan.js';
5
+
6
+ export const EXIT = {
7
+ exact: 0,
8
+ behind: 10,
9
+ ahead: 11,
10
+ divergent: 12,
11
+ error: 13,
12
+ };
13
+
14
+ export function check(history) {
15
+ const p = plan(history);
16
+ return {
17
+ schema: 'agent_board_check.v1',
18
+ posture: p.posture,
19
+ exitCode: EXIT[p.posture] ?? EXIT.error,
20
+ counts: p.counts,
21
+ ahead: p.ahead,
22
+ };
23
+ }
package/src/index.js ADDED
@@ -0,0 +1,50 @@
1
+ // @consiliency/agent-board-schema — programmatic surface + shared helpers for
2
+ // the deterministic materialize / plan / check tooling.
3
+ //
4
+ // Self-contained: resolves the bundle's own migrations + manifest relative to
5
+ // this package, with no workspace dependency (packed-consumer safe).
6
+
7
+ import { createHash } from 'node:crypto';
8
+ import { readFileSync, readdirSync } from 'node:fs';
9
+ import { dirname, join } from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+
12
+ const HERE = dirname(fileURLToPath(import.meta.url));
13
+ export const PKG_ROOT = join(HERE, '..');
14
+ export const MIGRATIONS_DIR = join(PKG_ROOT, 'migrations');
15
+
16
+ export const sha256 = (buf) => createHash('sha256').update(buf).digest('hex');
17
+
18
+ export function loadManifest() {
19
+ return JSON.parse(readFileSync(join(PKG_ROOT, 'schema-manifest.json'), 'utf8'));
20
+ }
21
+
22
+ // The ordered, digest-verified bundle migrations (throws on immutable-byte drift
23
+ // or a missing file — the same fail-closed guard used at build time).
24
+ export function loadOrderedMigrations() {
25
+ const manifest = loadManifest();
26
+ const present = new Set(readdirSync(MIGRATIONS_DIR).filter((f) => f.endsWith('.sql')));
27
+ return manifest.migrations.map((m) => {
28
+ if (!present.has(m.filename)) {
29
+ throw new Error(`bundle corrupt: missing migration ${m.filename}`);
30
+ }
31
+ const bytes = readFileSync(join(MIGRATIONS_DIR, m.filename));
32
+ const digest = sha256(bytes);
33
+ if (digest !== m.sha256) {
34
+ throw new Error(`bundle corrupt: ${m.id} digest ${digest} != manifest ${m.sha256}`);
35
+ }
36
+ return { ...m, bytes, digest };
37
+ });
38
+ }
39
+
40
+ // Parse a supplied migration-history snapshot: an array of { id/version,
41
+ // sha256? } (applied migrations), or a plain array of version-id strings.
42
+ export function normalizeHistory(history) {
43
+ const rows = Array.isArray(history) ? history : history?.applied ?? [];
44
+ const map = new Map();
45
+ for (const r of rows) {
46
+ if (typeof r === 'string') map.set(r, null);
47
+ else map.set(r.id ?? r.version, r.sha256 ?? r.digest ?? null);
48
+ }
49
+ return map;
50
+ }
@@ -0,0 +1,73 @@
1
+ // Deterministic materializer — the ONLY adopter path. Writes the bundle's
2
+ // original, digest-verified migration IDs + exact bytes into an adopter's
3
+ // supabase/migrations workspace, carrying a provenance marker the adopter CI
4
+ // recognizes. Refuses to overwrite manual edits. Never touches DB history.
5
+
6
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { loadManifest, loadOrderedMigrations } from './index.js';
9
+
10
+ const MARKER_PREFIX = '-- @agent-board-schema:materialized';
11
+
12
+ function markerLine(version, id, sha) {
13
+ return `${MARKER_PREFIX} ${version} ${id} ${sha}`;
14
+ }
15
+
16
+ // Strip a leading materialize marker line (if present) to recover original bytes.
17
+ function stripMarker(text) {
18
+ if (text.startsWith(MARKER_PREFIX)) {
19
+ const nl = text.indexOf('\n');
20
+ return nl === -1 ? '' : text.slice(nl + 1);
21
+ }
22
+ return text;
23
+ }
24
+
25
+ export function materialize(targetDir, { dryRun = false } = {}) {
26
+ const manifest = loadManifest();
27
+ const migrations = loadOrderedMigrations();
28
+ mkdirSync(targetDir, { recursive: true });
29
+
30
+ const written = [];
31
+ for (const m of migrations) {
32
+ const dest = join(targetDir, m.filename);
33
+ const originalText = m.bytes.toString('utf8');
34
+ const content = `${markerLine(manifest.packageVersion, m.id, m.sha256)}\n${originalText}`;
35
+
36
+ if (existsSync(dest)) {
37
+ const existing = readFileSync(dest, 'utf8');
38
+ const existingOriginal = stripMarker(existing);
39
+ if (existingOriginal !== originalText) {
40
+ throw new Error(
41
+ `refusing to overwrite manual difference in ${m.filename}: adopter bytes diverge from the pinned bundle. Resolve via a forward corrective migration upstream, never by editing here.`,
42
+ );
43
+ }
44
+ written.push({ id: m.id, filename: m.filename, action: 'unchanged' });
45
+ continue;
46
+ }
47
+ if (!dryRun) writeFileSync(dest, content);
48
+ written.push({ id: m.id, filename: m.filename, action: dryRun ? 'would-write' : 'written' });
49
+ }
50
+
51
+ const receipt = {
52
+ schema: 'agent_board_materialize_receipt.v1',
53
+ package: manifest.package,
54
+ packageVersion: manifest.packageVersion,
55
+ schemaVersion: manifest.schemaVersion,
56
+ bundleAggregateDigest: manifest.aggregateSha256,
57
+ source: manifest.source,
58
+ orderedIds: migrations.map((m) => m.id),
59
+ perFile: migrations.map((m) => ({ id: m.id, sha256: m.sha256 })),
60
+ target: targetDir,
61
+ // NOTE: after applying these to the database the adopter MUST call
62
+ // agent_board.record_bundle_installation(packageVersion, bundleAggregateDigest,
63
+ // schemaVersion, sourceCommit, receiptId) so the compatibility RPC reports live.
64
+ recordInstallationRpc: 'agent_board.record_bundle_installation',
65
+ };
66
+ if (!dryRun) {
67
+ writeFileSync(
68
+ join(targetDir, '.agent-board-schema-materialize-receipt.json'),
69
+ JSON.stringify(receipt, null, 2) + '\n',
70
+ );
71
+ }
72
+ return { written, receipt };
73
+ }
package/src/plan.js ADDED
@@ -0,0 +1,44 @@
1
+ // Read-only per-ID plan against a supplied migration-history snapshot. Reports,
2
+ // for every bundle migration, whether it is already applied (exact), applied
3
+ // with a divergent digest, applied with an unknown digest, or pending — plus any
4
+ // history entries the adopter has that the bundle does not (ahead). Never
5
+ // touches the database.
6
+
7
+ import { loadOrderedMigrations, normalizeHistory } from './index.js';
8
+
9
+ export function plan(history) {
10
+ const migrations = loadOrderedMigrations();
11
+ const applied = normalizeHistory(history);
12
+ const bundleIds = new Set(migrations.map((m) => m.id));
13
+
14
+ const perId = migrations.map((m) => {
15
+ if (!applied.has(m.id)) return { id: m.id, action: 'pending' };
16
+ const appliedSha = applied.get(m.id);
17
+ if (appliedSha == null) return { id: m.id, action: 'applied-unknown-digest' };
18
+ if (appliedSha === m.sha256) return { id: m.id, action: 'applied-exact' };
19
+ return { id: m.id, action: 'applied-divergent', appliedSha256: appliedSha, bundleSha256: m.sha256 };
20
+ });
21
+
22
+ const ahead = [...applied.keys()].filter((id) => !bundleIds.has(id));
23
+
24
+ const counts = perId.reduce((acc, r) => {
25
+ acc[r.action] = (acc[r.action] || 0) + 1;
26
+ return acc;
27
+ }, {});
28
+
29
+ const divergent = perId.filter((r) => r.action === 'applied-divergent').length;
30
+ const pending = perId.filter((r) => r.action === 'pending').length;
31
+ let posture;
32
+ if (divergent > 0) posture = 'divergent';
33
+ else if (ahead.length > 0 && pending === 0) posture = 'ahead';
34
+ else if (pending > 0) posture = 'behind';
35
+ else posture = 'exact';
36
+
37
+ return {
38
+ schema: 'agent_board_plan.v1',
39
+ posture,
40
+ counts: { ...counts, ahead: ahead.length },
41
+ ahead,
42
+ perId,
43
+ };
44
+ }