@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.
- package/fixtures/already-applied.json +36 -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/package.json +1 -1
- package/schema-manifest.json +84 -3
- package/src/tooling.test.mjs +2 -2
- 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,142 @@
|
|
|
1
|
+
create extension if not exists pgtap with schema extensions;
|
|
2
|
+
set search_path = extensions, public, agent_board;
|
|
3
|
+
|
|
4
|
+
begin;
|
|
5
|
+
select plan(20);
|
|
6
|
+
|
|
7
|
+
select is(
|
|
8
|
+
(select metadata #>> '{federation,replay,issuer}' from agent_board.agents
|
|
9
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
10
|
+
'https://legacy.atomic.test',
|
|
11
|
+
'shipped migration backfills the stable issuer'
|
|
12
|
+
);
|
|
13
|
+
select is(
|
|
14
|
+
(select metadata #> '{federation,replay,audience}' from agent_board.agents
|
|
15
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
16
|
+
'["message-board", "secondary-audience"]'::jsonb,
|
|
17
|
+
'shipped migration derives the normalized multi-audience claim projection'
|
|
18
|
+
);
|
|
19
|
+
select is(
|
|
20
|
+
(select metadata #>> '{federation,replay,subject}' from agent_board.agents
|
|
21
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
22
|
+
'legacy-complete',
|
|
23
|
+
'shipped migration backfills the configured stable human subject'
|
|
24
|
+
);
|
|
25
|
+
select is(
|
|
26
|
+
(select metadata #>> '{federation,replay,requestedSlug}' from agent_board.agents
|
|
27
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
28
|
+
'atomic-backfill-complete',
|
|
29
|
+
'legacy handle is the fail-closed requested-slug baseline'
|
|
30
|
+
);
|
|
31
|
+
select is(
|
|
32
|
+
(select metadata #> '{federation,replay,actorSub}' from agent_board.agents
|
|
33
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
34
|
+
'null'::jsonb,
|
|
35
|
+
'independent null actor subject stays null-stable'
|
|
36
|
+
);
|
|
37
|
+
select is(
|
|
38
|
+
(select metadata #> '{federation,replay,requestedScopes}' from agent_board.agents
|
|
39
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
40
|
+
'["board:read", "board:send"]'::jsonb,
|
|
41
|
+
'requested scope ceiling is preserved byte-for-byte'
|
|
42
|
+
);
|
|
43
|
+
select is(
|
|
44
|
+
(select metadata #> '{federation,replay,requestedBoardScopes}' from agent_board.agents
|
|
45
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
46
|
+
'[]'::jsonb,
|
|
47
|
+
'historically mutable board scopes are sanitized to the least-privilege baseline'
|
|
48
|
+
);
|
|
49
|
+
select ok(
|
|
50
|
+
not ((select metadata #> '{federation}' from agent_board.agents
|
|
51
|
+
where id = '16200000-0000-0000-0000-000000000002') ? 'replay'),
|
|
52
|
+
'ambiguous legacy row remains non-replayable'
|
|
53
|
+
);
|
|
54
|
+
select is(
|
|
55
|
+
(select metadata #>> '{federation,subject}' from agent_board.agents
|
|
56
|
+
where id = '16200000-0000-0000-0000-000000000001'),
|
|
57
|
+
'legacy-complete',
|
|
58
|
+
'backfill does not overwrite the immutable original federation snapshot'
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
select is(
|
|
62
|
+
(select count(*)::int from agent_board.agent_signing_keys
|
|
63
|
+
where agent_id = '16200000-0000-0000-0000-000000000001'),
|
|
64
|
+
1,
|
|
65
|
+
'the pre-migration fixture contains exactly one proven legacy key'
|
|
66
|
+
);
|
|
67
|
+
select is(
|
|
68
|
+
(select count(*)::int from agent_board.enrollment_federation_audit
|
|
69
|
+
where agent_id = '16200000-0000-0000-0000-000000000001'),
|
|
70
|
+
1,
|
|
71
|
+
'the pre-migration fixture contains exactly one immutable legacy audit claim'
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
update agent_board.identity_providers
|
|
75
|
+
set policy_approved = true
|
|
76
|
+
where id = 'legacy-atomic-provider';
|
|
77
|
+
|
|
78
|
+
create temp table _legacy_replay as
|
|
79
|
+
select * from agent_board.enroll_federated_identity(
|
|
80
|
+
'https://legacy.atomic.test', 'message-board', 'legacy-complete',
|
|
81
|
+
'{"iss":"https://legacy.atomic.test","aud":["message-board","secondary-audience"],"uid":"legacy-complete","iat":900,"exp":9999999999,"jti":"rotated"}'::jsonb,
|
|
82
|
+
'atomic-backfill-complete',
|
|
83
|
+
'TauOMxwU-TW-deqQjil1DLDy_AvJrfoG_eXGwwvaRUk',
|
|
84
|
+
'raw_ed25519_base64url',
|
|
85
|
+
'sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
|
|
86
|
+
true, null, 'agent', ARRAY['board:read','board:send'], ARRAY[]::text[], null
|
|
87
|
+
);
|
|
88
|
+
select is((select agent_id from _legacy_replay),
|
|
89
|
+
'16200000-0000-0000-0000-000000000001'::uuid,
|
|
90
|
+
'rotating claims replay to the pre-migration agent');
|
|
91
|
+
select is((select signing_key_id from _legacy_replay),
|
|
92
|
+
'16200000-0000-0000-0000-000000000011'::uuid,
|
|
93
|
+
'rotating claims replay to the pre-migration proven key');
|
|
94
|
+
select is((select granted_scopes from _legacy_replay),
|
|
95
|
+
ARRAY['board:read']::text[],
|
|
96
|
+
'legacy replay returns the original server-granted scope rather than requested scopes');
|
|
97
|
+
select is((select count(*)::int from agent_board.agents
|
|
98
|
+
where handle = 'atomic-backfill-complete'), 1,
|
|
99
|
+
'legacy replay creates no duplicate agent');
|
|
100
|
+
select is((select count(*)::int from agent_board.agent_signing_keys
|
|
101
|
+
where fingerprint = 'sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I'), 1,
|
|
102
|
+
'legacy replay creates no duplicate key');
|
|
103
|
+
|
|
104
|
+
select throws_ok(
|
|
105
|
+
$$select * from agent_board.enroll_federated_identity(
|
|
106
|
+
'https://legacy.atomic.test','message-board','legacy-complete',
|
|
107
|
+
'{"iss":"https://legacy.atomic.test","aud":["message-board","new-audience"],"uid":"legacy-complete"}'::jsonb,
|
|
108
|
+
'atomic-backfill-complete','TauOMxwU-TW-deqQjil1DLDy_AvJrfoG_eXGwwvaRUk',
|
|
109
|
+
'raw_ed25519_base64url','sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
|
|
110
|
+
true,null,'agent',ARRAY['board:read','board:send'],ARRAY[]::text[],null)$$,
|
|
111
|
+
'23505', null, 'changed normalized audience projection conflicts'
|
|
112
|
+
);
|
|
113
|
+
select throws_ok(
|
|
114
|
+
$$select * from agent_board.enroll_federated_identity(
|
|
115
|
+
'https://legacy.atomic.test','message-board','changed-subject',
|
|
116
|
+
'{"iss":"https://legacy.atomic.test","aud":["message-board","secondary-audience"],"uid":"changed-subject"}'::jsonb,
|
|
117
|
+
'atomic-backfill-complete','TauOMxwU-TW-deqQjil1DLDy_AvJrfoG_eXGwwvaRUk',
|
|
118
|
+
'raw_ed25519_base64url','sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
|
|
119
|
+
true,null,'agent',ARRAY['board:read','board:send'],ARRAY[]::text[],null)$$,
|
|
120
|
+
'23505', null, 'changed stable subject conflicts'
|
|
121
|
+
);
|
|
122
|
+
select throws_ok(
|
|
123
|
+
$$select * from agent_board.enroll_federated_identity(
|
|
124
|
+
'https://legacy.atomic.test','message-board','legacy-complete',
|
|
125
|
+
'{"iss":"https://legacy.atomic.test","aud":["message-board","secondary-audience"],"uid":"legacy-complete"}'::jsonb,
|
|
126
|
+
'changed-slug','TauOMxwU-TW-deqQjil1DLDy_AvJrfoG_eXGwwvaRUk',
|
|
127
|
+
'raw_ed25519_base64url','sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
|
|
128
|
+
true,null,'agent',ARRAY['board:read','board:send'],ARRAY[]::text[],null)$$,
|
|
129
|
+
'23505', null, 'changed requested slug conflicts'
|
|
130
|
+
);
|
|
131
|
+
select throws_ok(
|
|
132
|
+
$$select * from agent_board.enroll_federated_identity(
|
|
133
|
+
'https://legacy.atomic.test','message-board','legacy-complete',
|
|
134
|
+
'{"iss":"https://legacy.atomic.test","aud":["message-board","secondary-audience"],"uid":"legacy-complete"}'::jsonb,
|
|
135
|
+
'atomic-backfill-complete','TauOMxwU-TW-deqQjil1DLDy_AvJrfoG_eXGwwvaRUk',
|
|
136
|
+
'raw_ed25519_base64url','sha256:QnDuPiA99wAIcCJlk4ZS_ZJV4gQPW8cX0LVmKQJNl0I',
|
|
137
|
+
true,'new-actor','agent',ARRAY['board:read','board:send'],ARRAY[]::text[],null)$$,
|
|
138
|
+
'23505', null, 'changed independent actor subject conflicts'
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
select * from finish();
|
|
142
|
+
rollback;
|