@consiliency/agent-board-schema 1.22.0 → 1.23.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 (60) hide show
  1. package/fixtures/already-applied.json +36 -0
  2. package/migrations/20260901000100_agent_board_atomic_fleet_onboarding.sql +1496 -0
  3. package/migrations/20260901000110_agent_board_fleet_onboarding_ceiling_lock.sql +604 -0
  4. package/migrations/20260901000120_agent_board_human_revocation_evidence_completeness.sql +78 -0
  5. package/migrations/20260901000130_agent_board_fedsession_human_revocation_gate.sql +74 -0
  6. package/migrations/20260901000140_agent_board_fedsession_board_owner_lock_order.sql +102 -0
  7. package/migrations/20260902000100_agent_board_outbox_wake_ordering.sql +184 -0
  8. package/migrations/20260903000100_agent_board_enroll_identity_board_owner_lock_order.sql +604 -0
  9. package/migrations/20260903000200_agent_board_fedsession_provider_absence_gate.sql +177 -0
  10. package/migrations/20260904000100_agent_board_wake_recovery_surface.sql +155 -0
  11. package/package.json +1 -1
  12. package/schema-manifest.json +84 -3
  13. package/src/tooling.test.mjs +2 -2
  14. package/tests/agent_board_atomic_fleet_onboarding.test.sql +623 -0
  15. package/tests/agent_board_atomic_fleet_onboarding_backfill.test.sql +142 -0
  16. package/tests/agent_board_atomic_fleet_onboarding_runtime.test.sql +1250 -0
  17. package/tests/agent_board_enroll_federated_identity.test.sql +3 -3
  18. package/tests/agent_board_enroll_pop_binding.test.sql +13 -3
  19. package/tests/agent_board_enrollment_audit_content.test.sql +11 -7
  20. package/tests/agent_board_federated_lock_order_class.test.sql +390 -0
  21. package/tests/agent_board_fedsession.test.sql +46 -2
  22. package/tests/agent_board_fedsession_provider_absence_gate.test.sql +170 -0
  23. package/tests/agent_board_inbox_reads.test.sql +16 -19
  24. package/tests/agent_board_outbox_wake_ordering.test.sql +452 -0
  25. package/tests/agent_board_portal_offline_invariant.test.sql +1 -1
  26. package/tests/agent_board_roomlink.test.sql +2 -2
  27. package/tests/agent_board_wake_recovery.test.sql +756 -0
  28. package/tests/isolation/expected/atomic_fedsession_fleet_lock_order.out +79 -0
  29. package/tests/isolation/expected/atomic_fedsession_human_revoke.out +87 -0
  30. package/tests/isolation/expected/atomic_fleet_authority_races.out +469 -0
  31. package/tests/isolation/expected/atomic_fleet_binding_revoke.out +103 -0
  32. package/tests/isolation/expected/atomic_fleet_board_archive.out +117 -0
  33. package/tests/isolation/expected/atomic_fleet_human_fresh_revoke.out +136 -0
  34. package/tests/isolation/expected/atomic_fleet_identity_disposition.out +61 -0
  35. package/tests/isolation/expected/atomic_fleet_lifecycle_races.out +1479 -0
  36. package/tests/isolation/expected/atomic_fleet_onboarding.out +75 -0
  37. package/tests/isolation/expected/atomic_fleet_subtree_lock_order.out +60 -0
  38. package/tests/isolation/expected/ceiling_setter_lock_before_upsert.out +95 -0
  39. package/tests/isolation/expected/enroll_identity_board_owner_lock_order.out +55 -0
  40. package/tests/isolation/expected/fedsession_provider_absent_owner_lock.out +37 -0
  41. package/tests/isolation/expected/onboarding_ceiling_lock_order.out +123 -0
  42. package/tests/isolation/expected/outbox_wake_ordering.out +86 -0
  43. package/tests/isolation/expected/wake_recovery_late_commit.out +89 -0
  44. package/tests/isolation/specs/atomic_fedsession_fleet_lock_order.spec +117 -0
  45. package/tests/isolation/specs/atomic_fedsession_human_revoke.spec +66 -0
  46. package/tests/isolation/specs/atomic_fleet_authority_races.spec +235 -0
  47. package/tests/isolation/specs/atomic_fleet_binding_revoke.spec +127 -0
  48. package/tests/isolation/specs/atomic_fleet_board_archive.spec +134 -0
  49. package/tests/isolation/specs/atomic_fleet_human_fresh_revoke.spec +142 -0
  50. package/tests/isolation/specs/atomic_fleet_identity_disposition.spec +118 -0
  51. package/tests/isolation/specs/atomic_fleet_lifecycle_races.spec +244 -0
  52. package/tests/isolation/specs/atomic_fleet_onboarding.spec +106 -0
  53. package/tests/isolation/specs/atomic_fleet_subtree_lock_order.spec +147 -0
  54. package/tests/isolation/specs/ceiling_setter_lock_before_upsert.spec +117 -0
  55. package/tests/isolation/specs/enroll_identity_board_owner_lock_order.spec +117 -0
  56. package/tests/isolation/specs/fedsession_provider_absent_owner_lock.spec +63 -0
  57. package/tests/isolation/specs/onboarding_ceiling_lock_order.spec +183 -0
  58. package/tests/isolation/specs/outbox_wake_ordering.spec +202 -0
  59. package/tests/isolation/specs/wake_recovery_late_commit.spec +207 -0
  60. package/tests/seeds/20260901000100_agent_board_atomic_fleet_onboarding.sql.pre.sql +110 -0
@@ -0,0 +1,110 @@
1
+ -- Legacy rows present before Consiliency/message-board#162. The migration must
2
+ -- derive replay metadata from the stored federation facts, not from a fixture
3
+ -- inserted after deployment.
4
+ insert into agent_board.identity_providers(
5
+ id, issuer, audience, supported, policy_approved,
6
+ allowed_scopes, allowed_board_scopes, allowed_agent_kinds, subject_claim
7
+ ) values (
8
+ 'legacy-atomic-provider', 'https://legacy.atomic.test', 'message-board', true, false,
9
+ ARRAY['board:read','board:send'], ARRAY['member'], ARRAY['agent'], 'uid'
10
+ );
11
+
12
+ insert into auth.users(id, instance_id, aud, role, email, created_at, updated_at)
13
+ values (
14
+ '16200000-0000-0000-0000-000000000099',
15
+ '00000000-0000-0000-0000-000000000000',
16
+ 'authenticated', 'authenticated', 'atomic-backfill@example.test', now(), now()
17
+ ) on conflict (id) do nothing;
18
+
19
+ insert into agent_board.agents(id, agent_type, kind, handle, display_name, status, auth_user_id, metadata)
20
+ values (
21
+ '16200000-0000-0000-0000-000000000001', 'agent', 'agent',
22
+ 'atomic-backfill-complete', 'Atomic Backfill Complete', 'active',
23
+ '16200000-0000-0000-0000-000000000099',
24
+ jsonb_build_object('federation', jsonb_build_object(
25
+ 'issuer', 'https://legacy.atomic.test',
26
+ 'audience', 'message-board',
27
+ 'subject', 'legacy-complete',
28
+ 'actorSub', null,
29
+ 'providerId', 'legacy-atomic-provider',
30
+ 'signingKeyFingerprint', 'sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
31
+ 'requestedScopes', jsonb_build_array('board:read', 'board:send'),
32
+ 'requestedBoardScopes', jsonb_build_array('member')
33
+ ))
34
+ ), (
35
+ '16200000-0000-0000-0000-000000000002', 'agent', 'agent',
36
+ 'atomic-backfill-ambiguous', 'Atomic Backfill Ambiguous', 'active', null,
37
+ jsonb_build_object('federation', jsonb_build_object(
38
+ 'issuer', 'https://legacy.atomic.test',
39
+ 'audience', 'message-board',
40
+ 'actorSub', 'delegated-actor',
41
+ 'providerId', 'legacy-atomic-provider',
42
+ 'requestedScopes', jsonb_build_array('board:read'),
43
+ 'requestedBoardScopes', jsonb_build_array('member'),
44
+ 'replay', jsonb_build_object(
45
+ 'issuer', 'https://forged.atomic.test',
46
+ 'audience', jsonb_build_array('message-board'),
47
+ 'subject', 'forged-ambiguous-subject',
48
+ 'requestedSlug', 'atomic-backfill-ambiguous',
49
+ 'agentKind', 'agent',
50
+ 'actorSub', null,
51
+ 'requestedScopes', jsonb_build_array('admin'),
52
+ 'requestedBoardScopes', jsonb_build_array('owner'),
53
+ 'providerId', 'legacy-atomic-provider'
54
+ )
55
+ ))
56
+ );
57
+
58
+ insert into agent_board.agent_signing_keys(
59
+ id, agent_id, key_id, key_version, public_key, public_key_format,
60
+ fingerprint, status, proof_state
61
+ ) values (
62
+ '16200000-0000-0000-0000-000000000011',
63
+ '16200000-0000-0000-0000-000000000001',
64
+ 'legacy-atomic-key', 1,
65
+ 'TauOMxwU-TW-deqQjil1DLDy_AvJrfoG_eXGwwvaRUk',
66
+ 'raw_ed25519_base64url',
67
+ 'sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
68
+ 'active', 'proven'
69
+ );
70
+
71
+ insert into agent_board.enrollment_federation_audit(
72
+ id, issuer, audience, subject, human_identity_claim, provider_id,
73
+ agent_id, auth_user_id, requested_scopes, granted_scopes
74
+ ) values (
75
+ '16200000-0000-0000-0000-000000000021',
76
+ 'https://legacy.atomic.test', 'message-board', 'legacy-complete',
77
+ jsonb_build_object(
78
+ 'iss', 'https://legacy.atomic.test',
79
+ 'aud', jsonb_build_array('secondary-audience', 'message-board'),
80
+ 'uid', 'legacy-complete',
81
+ 'iat', 100,
82
+ 'jti', 'legacy-original'
83
+ ),
84
+ 'legacy-atomic-provider',
85
+ '16200000-0000-0000-0000-000000000001',
86
+ '16200000-0000-0000-0000-000000000099',
87
+ ARRAY['board:read','board:send'], ARRAY['board:read']
88
+ );
89
+
90
+ -- Exercise the historical authenticated mutation path before the protecting
91
+ -- trigger exists. The shipped migration must overwrite this forged replay and
92
+ -- derive authorization-bearing scopes only from the append-only audit row.
93
+ set role authenticated;
94
+ select set_config('request.jwt.claim.sub', '16200000-0000-0000-0000-000000000099', false);
95
+ select count(*) from agent_board.register_agent(
96
+ 'agent', 'atomic-backfill-complete', 'Atomic Backfill Complete', 'active',
97
+ jsonb_build_object('federation', jsonb_build_object(
98
+ 'issuer', 'https://legacy.atomic.test',
99
+ 'audience', 'message-board',
100
+ 'subject', 'legacy-complete',
101
+ 'actorSub', 'forged-actor',
102
+ 'providerId', 'legacy-atomic-provider',
103
+ 'signingKeyFingerprint', 'sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
104
+ 'requestedScopes', jsonb_build_array('admin'),
105
+ 'requestedBoardScopes', jsonb_build_array('owner'),
106
+ 'replay', jsonb_build_object('subject', 'forged-subject', 'requestedScopes', jsonb_build_array('admin'))
107
+ ))
108
+ );
109
+ reset role;
110
+ select set_config('request.jwt.claim.sub', '', false);