@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,103 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: retry_begin retry_onboard revoke_begin revoke_binding retry_commit revoke_commit check_binding
4
+ count
5
+ -----
6
+ 1
7
+ (1 row)
8
+
9
+ step retry_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
10
+ step retry_onboard:
11
+ select binding_disposition from agent_board.onboard_federated_fleet_agent(
12
+ 'https://atomic-binding.test', 'message-board', 'human-binding',
13
+ jsonb_build_object('iss','https://atomic-binding.test','aud','message-board','sub','human-binding','iat',200),
14
+ 'atomic-binding-agent','yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk',
15
+ 'raw_ed25519_base64url','sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA',
16
+ true,null,'agent',ARRAY['board:send'],ARRAY[]::text[],
17
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='16230000-0000-0000-0000-000000000001'),
18
+ (select id from agent_board.boards where slug='atomic-binding-board'),
19
+ '16230000-0000-0000-0000-000000000003','codex','phase-loop',
20
+ 'message-board','sha256:atomic-binding-repo','worker','phase_worker','atomic-binding-agent'
21
+ );
22
+
23
+ binding_disposition
24
+ -------------------
25
+ reused
26
+ (1 row)
27
+
28
+ step revoke_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
29
+ step revoke_binding:
30
+ select lifecycle_state from agent_board.revoke_fleet_machine_agent_binding(
31
+ (select id from agent_board.fleet_machine_agents where machine_id='16230000-0000-0000-0000-000000000003'),
32
+ '16230000-0000-0000-0000-000000000001','isolation proof',jsonb_build_object()
33
+ );
34
+ <waiting ...>
35
+ step retry_commit: COMMIT;
36
+ step revoke_binding: <... completed>
37
+ lifecycle_state
38
+ ---------------
39
+ revoked
40
+ (1 row)
41
+
42
+ step revoke_commit: COMMIT;
43
+ step check_binding:
44
+ select count(*) filter (where lifecycle_state='active') as active,
45
+ count(*) filter (where lifecycle_state='revoked') as revoked,
46
+ count(*) as total
47
+ from agent_board.fleet_machine_agents
48
+ where machine_id='16230000-0000-0000-0000-000000000003';
49
+
50
+ active|revoked|total
51
+ ------+-------+-----
52
+ 0| 1| 1
53
+ (1 row)
54
+
55
+
56
+ starting permutation: revoke_begin revoke_binding retry_begin retry_onboard revoke_commit retry_commit check_binding
57
+ count
58
+ -----
59
+ 1
60
+ (1 row)
61
+
62
+ step revoke_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
63
+ step revoke_binding:
64
+ select lifecycle_state from agent_board.revoke_fleet_machine_agent_binding(
65
+ (select id from agent_board.fleet_machine_agents where machine_id='16230000-0000-0000-0000-000000000003'),
66
+ '16230000-0000-0000-0000-000000000001','isolation proof',jsonb_build_object()
67
+ );
68
+
69
+ lifecycle_state
70
+ ---------------
71
+ revoked
72
+ (1 row)
73
+
74
+ step retry_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
75
+ step retry_onboard:
76
+ select binding_disposition from agent_board.onboard_federated_fleet_agent(
77
+ 'https://atomic-binding.test', 'message-board', 'human-binding',
78
+ jsonb_build_object('iss','https://atomic-binding.test','aud','message-board','sub','human-binding','iat',200),
79
+ 'atomic-binding-agent','yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk',
80
+ 'raw_ed25519_base64url','sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA',
81
+ true,null,'agent',ARRAY['board:send'],ARRAY[]::text[],
82
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='16230000-0000-0000-0000-000000000001'),
83
+ (select id from agent_board.boards where slug='atomic-binding-board'),
84
+ '16230000-0000-0000-0000-000000000003','codex','phase-loop',
85
+ 'message-board','sha256:atomic-binding-repo','worker','phase_worker','atomic-binding-agent'
86
+ );
87
+ <waiting ...>
88
+ step revoke_commit: COMMIT;
89
+ step retry_onboard: <... completed>
90
+ ERROR: fleet onboarding invite is not usable
91
+ step retry_commit: COMMIT;
92
+ step check_binding:
93
+ select count(*) filter (where lifecycle_state='active') as active,
94
+ count(*) filter (where lifecycle_state='revoked') as revoked,
95
+ count(*) as total
96
+ from agent_board.fleet_machine_agents
97
+ where machine_id='16230000-0000-0000-0000-000000000003';
98
+
99
+ active|revoked|total
100
+ ------+-------+-----
101
+ 0| 1| 1
102
+ (1 row)
103
+
@@ -0,0 +1,117 @@
1
+ Parsed test spec with 4 sessions
2
+
3
+ starting permutation: archive_begin archive_board retry_begin retry_onboard archive_commit retry_commit check
4
+ count
5
+ -----
6
+ 1
7
+ (1 row)
8
+
9
+ step archive_begin: BEGIN;
10
+ step archive_board:
11
+ update agent_board.boards set status='archived'
12
+ where slug='atomic-archive-board' returning status;
13
+
14
+ status
15
+ --------
16
+ archived
17
+ (1 row)
18
+
19
+ step retry_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
20
+ step retry_onboard:
21
+ select identity_disposition, binding_disposition
22
+ from agent_board.onboard_federated_fleet_agent(
23
+ 'https://atomic-archive.test', 'message-board', 'human-archive',
24
+ jsonb_build_object('iss','https://atomic-archive.test','aud','message-board','sub','human-archive','iat',200),
25
+ 'atomic-archive-agent',
26
+ 'yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk',
27
+ 'raw_ed25519_base64url',
28
+ 'sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA',
29
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
30
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='16290000-0000-0000-0000-000000000001'),
31
+ (select id from agent_board.boards where slug='atomic-archive-board'),
32
+ '16290000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
33
+ 'message-board', 'sha256:atomic-archive-repo', 'worker', 'phase_worker',
34
+ 'atomic-archive-agent'
35
+ );
36
+ <waiting ...>
37
+ step archive_commit: COMMIT;
38
+ step retry_onboard: <... completed>
39
+ ERROR: fleet onboarding board is not usable
40
+ step retry_commit: COMMIT;
41
+ step check:
42
+ select
43
+ (select status from agent_board.boards where slug='atomic-archive-board') as board_status,
44
+ (select uses_count from agent_board.board_invite_tokens where created_by_agent_id='16290000-0000-0000-0000-000000000001') as uses_count,
45
+ (select count(*) from agent_board.fleet_machine_agents where machine_id='16290000-0000-0000-0000-000000000003') as bindings;
46
+
47
+ board_status|uses_count|bindings
48
+ ------------+----------+--------
49
+ archived | 1| 1
50
+ (1 row)
51
+
52
+
53
+ starting permutation: blocker_begin block_machine retry_begin retry_onboard archive_begin archive_board blocker_commit retry_commit archive_commit check
54
+ count
55
+ -----
56
+ 1
57
+ (1 row)
58
+
59
+ step blocker_begin: BEGIN;
60
+ step block_machine:
61
+ select id from agent_board.fleet_machines
62
+ where id='16290000-0000-0000-0000-000000000003' for update;
63
+
64
+ id
65
+ ------------------------------------
66
+ 16290000-0000-0000-0000-000000000003
67
+ (1 row)
68
+
69
+ step retry_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
70
+ step retry_onboard:
71
+ select identity_disposition, binding_disposition
72
+ from agent_board.onboard_federated_fleet_agent(
73
+ 'https://atomic-archive.test', 'message-board', 'human-archive',
74
+ jsonb_build_object('iss','https://atomic-archive.test','aud','message-board','sub','human-archive','iat',200),
75
+ 'atomic-archive-agent',
76
+ 'yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk',
77
+ 'raw_ed25519_base64url',
78
+ 'sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA',
79
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
80
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='16290000-0000-0000-0000-000000000001'),
81
+ (select id from agent_board.boards where slug='atomic-archive-board'),
82
+ '16290000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
83
+ 'message-board', 'sha256:atomic-archive-repo', 'worker', 'phase_worker',
84
+ 'atomic-archive-agent'
85
+ );
86
+ <waiting ...>
87
+ step archive_begin: BEGIN;
88
+ step archive_board:
89
+ update agent_board.boards set status='archived'
90
+ where slug='atomic-archive-board' returning status;
91
+ <waiting ...>
92
+ step blocker_commit: COMMIT;
93
+ step retry_onboard: <... completed>
94
+ identity_disposition|binding_disposition
95
+ --------------------+-------------------
96
+ reused |reused
97
+ (1 row)
98
+
99
+ step retry_commit: COMMIT;
100
+ step archive_board: <... completed>
101
+ status
102
+ --------
103
+ archived
104
+ (1 row)
105
+
106
+ step archive_commit: COMMIT;
107
+ step check:
108
+ select
109
+ (select status from agent_board.boards where slug='atomic-archive-board') as board_status,
110
+ (select uses_count from agent_board.board_invite_tokens where created_by_agent_id='16290000-0000-0000-0000-000000000001') as uses_count,
111
+ (select count(*) from agent_board.fleet_machine_agents where machine_id='16290000-0000-0000-0000-000000000003') as bindings;
112
+
113
+ board_status|uses_count|bindings
114
+ ------------+----------+--------
115
+ archived | 1| 1
116
+ (1 row)
117
+
@@ -0,0 +1,136 @@
1
+ Parsed test spec with 4 sessions
2
+
3
+ starting permutation: blocker_begin block_creator onboard_begin onboard_fresh revoke_begin revoke_human blocker_commit onboard_commit revoke_commit check
4
+ count
5
+ -----
6
+ 1
7
+ (1 row)
8
+
9
+ step blocker_begin: BEGIN;
10
+ step block_creator:
11
+ select id from agent_board.agents
12
+ where id='16280000-0000-0000-0000-000000000001' for update;
13
+
14
+ id
15
+ ------------------------------------
16
+ 16280000-0000-0000-0000-000000000001
17
+ (1 row)
18
+
19
+ step onboard_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
20
+ step onboard_fresh:
21
+ select identity_disposition, binding_disposition
22
+ from agent_board.onboard_federated_fleet_agent(
23
+ 'https://atomic-human.test', 'message-board', 'human-fresh-race',
24
+ jsonb_build_object('iss','https://atomic-human.test','aud','message-board','sub','human-fresh-race','iat',200),
25
+ 'atomic-human-fresh',
26
+ 'TDyof3w0SMg4SDYuj-qenolHC_n05cZbrLSckKVGtMo',
27
+ 'raw_ed25519_base64url',
28
+ 'sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M',
29
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
30
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='16280000-0000-0000-0000-000000000001'),
31
+ (select id from agent_board.boards where slug='atomic-human-board'),
32
+ '16280000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
33
+ 'message-board', 'sha256:atomic-human-repo', 'worker', 'phase_worker',
34
+ 'atomic-human-fresh'
35
+ );
36
+ <waiting ...>
37
+ step revoke_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
38
+ step revoke_human:
39
+ select revoked_agent_count
40
+ from agent_board.revoke_human_subtree(
41
+ (select owner_user_id from agent_board.agents where handle='atomic-human-existing'),
42
+ '16280000-0000-0000-0000-000000000001', 'fresh race revoke'
43
+ );
44
+ <waiting ...>
45
+ step blocker_commit: COMMIT;
46
+ step onboard_fresh: <... completed>
47
+ identity_disposition|binding_disposition
48
+ --------------------+-------------------
49
+ created |created
50
+ (1 row)
51
+
52
+ step onboard_commit: COMMIT;
53
+ step revoke_human: <... completed>
54
+ revoked_agent_count
55
+ -------------------
56
+ 2
57
+ (1 row)
58
+
59
+ step revoke_commit: COMMIT;
60
+ step check:
61
+ select
62
+ (select count(*) from agent_board.fleet_human_revocations) as human_revocations,
63
+ (select count(*) from agent_board.agents where handle='atomic-human-fresh') as fresh_agents,
64
+ (select coalesce(max(status),'absent') from agent_board.agents where handle='atomic-human-fresh') as fresh_status,
65
+ (select count(*) from agent_board.agent_signing_keys where fingerprint='sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M') as fresh_keys;
66
+
67
+ human_revocations|fresh_agents|fresh_status|fresh_keys
68
+ -----------------+------------+------------+----------
69
+ 1| 1|revoked | 1
70
+ (1 row)
71
+
72
+
73
+ starting permutation: blocker_begin block_existing revoke_begin revoke_human onboard_begin onboard_fresh blocker_commit revoke_commit onboard_commit check
74
+ count
75
+ -----
76
+ 1
77
+ (1 row)
78
+
79
+ step blocker_begin: BEGIN;
80
+ step block_existing:
81
+ select handle from agent_board.agents where handle='atomic-human-existing' for update;
82
+
83
+ handle
84
+ ---------------------
85
+ atomic-human-existing
86
+ (1 row)
87
+
88
+ step revoke_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
89
+ step revoke_human:
90
+ select revoked_agent_count
91
+ from agent_board.revoke_human_subtree(
92
+ (select owner_user_id from agent_board.agents where handle='atomic-human-existing'),
93
+ '16280000-0000-0000-0000-000000000001', 'fresh race revoke'
94
+ );
95
+ <waiting ...>
96
+ step onboard_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
97
+ step onboard_fresh:
98
+ select identity_disposition, binding_disposition
99
+ from agent_board.onboard_federated_fleet_agent(
100
+ 'https://atomic-human.test', 'message-board', 'human-fresh-race',
101
+ jsonb_build_object('iss','https://atomic-human.test','aud','message-board','sub','human-fresh-race','iat',200),
102
+ 'atomic-human-fresh',
103
+ 'TDyof3w0SMg4SDYuj-qenolHC_n05cZbrLSckKVGtMo',
104
+ 'raw_ed25519_base64url',
105
+ 'sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M',
106
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
107
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='16280000-0000-0000-0000-000000000001'),
108
+ (select id from agent_board.boards where slug='atomic-human-board'),
109
+ '16280000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
110
+ 'message-board', 'sha256:atomic-human-repo', 'worker', 'phase_worker',
111
+ 'atomic-human-fresh'
112
+ );
113
+ <waiting ...>
114
+ step blocker_commit: COMMIT;
115
+ step revoke_human: <... completed>
116
+ revoked_agent_count
117
+ -------------------
118
+ 1
119
+ (1 row)
120
+
121
+ step revoke_commit: COMMIT;
122
+ step onboard_fresh: <... completed>
123
+ ERROR: human owner has been revoked
124
+ step onboard_commit: COMMIT;
125
+ step check:
126
+ select
127
+ (select count(*) from agent_board.fleet_human_revocations) as human_revocations,
128
+ (select count(*) from agent_board.agents where handle='atomic-human-fresh') as fresh_agents,
129
+ (select coalesce(max(status),'absent') from agent_board.agents where handle='atomic-human-fresh') as fresh_status,
130
+ (select count(*) from agent_board.agent_signing_keys where fingerprint='sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M') as fresh_keys;
131
+
132
+ human_revocations|fresh_agents|fresh_status|fresh_keys
133
+ -----------------+------------+------------+----------
134
+ 1| 0|absent | 0
135
+ (1 row)
136
+
@@ -0,0 +1,61 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: legacy_begin legacy_enroll fleet_begin fleet_onboard legacy_commit fleet_commit check
4
+ count
5
+ -----
6
+ 1
7
+ (1 row)
8
+
9
+ step legacy_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
10
+ step legacy_enroll:
11
+ select agent_handle
12
+ from agent_board.enroll_federated_identity(
13
+ 'https://atomic-disposition.test', 'message-board', 'human-disposition',
14
+ jsonb_build_object('iss','https://atomic-disposition.test','aud','message-board','sub','human-disposition','iat',100),
15
+ 'atomic-disposition-agent',
16
+ '5TG73fnNhqeYkoSvPf9QwmWkvKWe0yA7B8YinAWQ8m4', 'raw_ed25519_base64url',
17
+ 'sha256:qhjEQe9R_x26TBZyBsd-LrpR1fh7Mvnz86rbsCKtjz8', true, null, 'agent',
18
+ ARRAY['board:send'], ARRAY[]::text[], null
19
+ );
20
+
21
+ agent_handle
22
+ ------------------------
23
+ atomic-disposition-agent
24
+ (1 row)
25
+
26
+ step fleet_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
27
+ step fleet_onboard:
28
+ select identity_disposition, membership_disposition, binding_disposition
29
+ from agent_board.onboard_federated_fleet_agent(
30
+ 'https://atomic-disposition.test', 'message-board', 'human-disposition',
31
+ jsonb_build_object('iss','https://atomic-disposition.test','aud','message-board','sub','human-disposition','iat',101),
32
+ 'atomic-disposition-agent',
33
+ '5TG73fnNhqeYkoSvPf9QwmWkvKWe0yA7B8YinAWQ8m4', 'raw_ed25519_base64url',
34
+ 'sha256:qhjEQe9R_x26TBZyBsd-LrpR1fh7Mvnz86rbsCKtjz8', true, null, 'agent',
35
+ ARRAY['board:send'], ARRAY[]::text[],
36
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='16260000-0000-0000-0000-000000000001'),
37
+ (select id from agent_board.boards where slug='atomic-disposition-board'),
38
+ '16260000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
39
+ 'message-board', 'sha256:atomic-disposition-repo', 'worker', 'phase_worker',
40
+ 'atomic-disposition-agent'
41
+ );
42
+ <waiting ...>
43
+ step legacy_commit: COMMIT;
44
+ step fleet_onboard: <... completed>
45
+ identity_disposition|membership_disposition|binding_disposition
46
+ --------------------+----------------------+-------------------
47
+ reused |created |recovered
48
+ (1 row)
49
+
50
+ step fleet_commit: COMMIT;
51
+ step check:
52
+ select
53
+ (select count(*) from agent_board.agents where handle='atomic-disposition-agent') as agents,
54
+ (select count(*) from agent_board.agent_signing_keys where fingerprint='sha256:qhjEQe9R_x26TBZyBsd-LrpR1fh7Mvnz86rbsCKtjz8') as keys,
55
+ (select count(*) from agent_board.fleet_machine_agents where machine_id='16260000-0000-0000-0000-000000000003') as bindings;
56
+
57
+ agents|keys|bindings
58
+ ------+----+--------
59
+ 1| 1| 1
60
+ (1 row)
61
+