@consiliency/agent-board-schema 1.22.0 → 1.24.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.
- package/README.md +75 -1
- package/fixtures/already-applied.json +40 -0
- package/migrations/20260901000100_agent_board_atomic_fleet_onboarding.sql +1496 -0
- package/migrations/20260901000110_agent_board_fleet_onboarding_ceiling_lock.sql +604 -0
- package/migrations/20260901000120_agent_board_human_revocation_evidence_completeness.sql +78 -0
- package/migrations/20260901000130_agent_board_fedsession_human_revocation_gate.sql +74 -0
- package/migrations/20260901000140_agent_board_fedsession_board_owner_lock_order.sql +102 -0
- package/migrations/20260902000100_agent_board_outbox_wake_ordering.sql +184 -0
- package/migrations/20260903000100_agent_board_enroll_identity_board_owner_lock_order.sql +604 -0
- package/migrations/20260903000200_agent_board_fedsession_provider_absence_gate.sql +177 -0
- package/migrations/20260904000100_agent_board_wake_recovery_surface.sql +155 -0
- package/migrations/20260905000100_agent_board_consent_gating_reconcile.sql +151 -0
- package/package.json +1 -1
- package/schema-manifest.json +93 -3
- package/src/check.js +23 -0
- package/src/index.js +20 -0
- package/src/plan.js +79 -5
- package/src/tooling.test.mjs +237 -4
- package/tests/agent_board_atomic_fleet_onboarding.test.sql +623 -0
- package/tests/agent_board_atomic_fleet_onboarding_backfill.test.sql +142 -0
- package/tests/agent_board_atomic_fleet_onboarding_runtime.test.sql +1250 -0
- package/tests/agent_board_enroll_federated_identity.test.sql +3 -3
- package/tests/agent_board_enroll_pop_binding.test.sql +13 -3
- package/tests/agent_board_enrollment_audit_content.test.sql +11 -7
- package/tests/agent_board_federated_lock_order_class.test.sql +390 -0
- package/tests/agent_board_fedsession.test.sql +46 -2
- package/tests/agent_board_fedsession_provider_absence_gate.test.sql +170 -0
- package/tests/agent_board_inbox_reads.test.sql +16 -19
- package/tests/agent_board_outbox_wake_ordering.test.sql +452 -0
- package/tests/agent_board_portal_offline_invariant.test.sql +1 -1
- package/tests/agent_board_roomlink.test.sql +2 -2
- package/tests/agent_board_wake_recovery.test.sql +756 -0
- package/tests/isolation/expected/atomic_fedsession_fleet_lock_order.out +79 -0
- package/tests/isolation/expected/atomic_fedsession_human_revoke.out +87 -0
- package/tests/isolation/expected/atomic_fleet_authority_races.out +469 -0
- package/tests/isolation/expected/atomic_fleet_binding_revoke.out +103 -0
- package/tests/isolation/expected/atomic_fleet_board_archive.out +117 -0
- package/tests/isolation/expected/atomic_fleet_human_fresh_revoke.out +136 -0
- package/tests/isolation/expected/atomic_fleet_identity_disposition.out +61 -0
- package/tests/isolation/expected/atomic_fleet_lifecycle_races.out +1479 -0
- package/tests/isolation/expected/atomic_fleet_onboarding.out +75 -0
- package/tests/isolation/expected/atomic_fleet_subtree_lock_order.out +60 -0
- package/tests/isolation/expected/ceiling_setter_lock_before_upsert.out +95 -0
- package/tests/isolation/expected/enroll_identity_board_owner_lock_order.out +55 -0
- package/tests/isolation/expected/fedsession_provider_absent_owner_lock.out +37 -0
- package/tests/isolation/expected/onboarding_ceiling_lock_order.out +123 -0
- package/tests/isolation/expected/outbox_wake_ordering.out +86 -0
- package/tests/isolation/expected/wake_recovery_late_commit.out +89 -0
- package/tests/isolation/specs/atomic_fedsession_fleet_lock_order.spec +117 -0
- package/tests/isolation/specs/atomic_fedsession_human_revoke.spec +66 -0
- package/tests/isolation/specs/atomic_fleet_authority_races.spec +235 -0
- package/tests/isolation/specs/atomic_fleet_binding_revoke.spec +127 -0
- package/tests/isolation/specs/atomic_fleet_board_archive.spec +134 -0
- package/tests/isolation/specs/atomic_fleet_human_fresh_revoke.spec +142 -0
- package/tests/isolation/specs/atomic_fleet_identity_disposition.spec +118 -0
- package/tests/isolation/specs/atomic_fleet_lifecycle_races.spec +244 -0
- package/tests/isolation/specs/atomic_fleet_onboarding.spec +106 -0
- package/tests/isolation/specs/atomic_fleet_subtree_lock_order.spec +147 -0
- package/tests/isolation/specs/ceiling_setter_lock_before_upsert.spec +117 -0
- package/tests/isolation/specs/enroll_identity_board_owner_lock_order.spec +117 -0
- package/tests/isolation/specs/fedsession_provider_absent_owner_lock.spec +63 -0
- package/tests/isolation/specs/onboarding_ceiling_lock_order.spec +183 -0
- package/tests/isolation/specs/outbox_wake_ordering.spec +202 -0
- package/tests/isolation/specs/wake_recovery_late_commit.spec +207 -0
- 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);
|