@consiliency/agent-board-schema 1.12.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 (156) hide show
  1. package/fixtures/already-applied.json +160 -0
  2. package/migrations/20260731000100_agent_board_agentsdir_column_scope.sql +88 -0
  3. package/migrations/20260801000100_agent_board_leaveidem_terminal_noop.sql +317 -0
  4. package/migrations/20260802000100_agent_board_rolereset_reentry_clamp.sql +237 -0
  5. package/migrations/20260803000100_agent_board_rowid_total_order.sql +1201 -0
  6. package/migrations/20260804000100_agent_board_hygiene_actor_binding_rls.sql +229 -0
  7. package/migrations/20260806000100_agent_board_consent_substrate.sql +339 -0
  8. package/migrations/20260807000100_agent_board_consent_emission.sql +619 -0
  9. package/migrations/20260808000100_agent_board_rejectsem.sql +145 -0
  10. package/migrations/20260809000100_agent_board_consent_gating.sql +492 -0
  11. package/migrations/20260810000100_agent_board_consent_locking.sql +485 -0
  12. package/migrations/20260811000100_agent_board_retention_metadata_revoke.sql +23 -0
  13. package/migrations/20260812000100_agent_board_pubexec_class_revoke.sql +54 -0
  14. package/migrations/20260813000100_agent_board_invitepolicy_block.sql +420 -0
  15. package/migrations/20260814000100_agent_board_obsgate_thread_post_policy.sql +239 -0
  16. package/migrations/20260815000100_agent_board_obsgate2_authoring_gates.sql +287 -0
  17. package/migrations/20260816000100_agent_board_obsgate3_task_lifecycle.sql +118 -0
  18. package/migrations/20260817000100_agent_board_obsgate4_claims_lifecycle.sql +250 -0
  19. package/migrations/20260818000100_agent_board_fleet_machines_rls_correlation.sql +43 -0
  20. package/migrations/20260819000100_agent_board_resolve_noop_retire.sql +166 -0
  21. package/migrations/20260820000100_agent_board_roomdeleg_lane_b.sql +206 -0
  22. package/migrations/20260821000100_agent_board_claimgate_claimkey.sql +372 -0
  23. package/migrations/20260822000100_agent_board_mint_harden.sql +710 -0
  24. package/migrations/20260822000200_agent_board_mint_harden_fingerprint_backfill.sql +207 -0
  25. package/migrations/20260823000100_agent_board_fleet_machine_hijack.sql +106 -0
  26. package/migrations/20260824000100_agent_board_claimgate_shadow.sql +443 -0
  27. package/migrations/20260825000100_agent_board_claimgate_enforce.sql +660 -0
  28. package/migrations/20260826000100_agent_board_fleet_machine_reactivation.sql +514 -0
  29. package/migrations/20260828000100_agent_board_delegation_cap_ceiling.sql +474 -0
  30. package/migrations/20260829000100_agent_board_fleet_machine_reclaim.sql +432 -0
  31. package/migrations/20260830000100_agent_board_delegation_sole_writer.sql +41 -0
  32. package/migrations/20260831000100_agent_board_fleet_domain_reclaim.sql +389 -0
  33. package/migrations/20260901000100_agent_board_atomic_fleet_onboarding.sql +1496 -0
  34. package/migrations/20260901000110_agent_board_fleet_onboarding_ceiling_lock.sql +604 -0
  35. package/migrations/20260901000120_agent_board_human_revocation_evidence_completeness.sql +78 -0
  36. package/migrations/20260901000130_agent_board_fedsession_human_revocation_gate.sql +74 -0
  37. package/migrations/20260901000140_agent_board_fedsession_board_owner_lock_order.sql +102 -0
  38. package/migrations/20260902000100_agent_board_outbox_wake_ordering.sql +184 -0
  39. package/migrations/20260903000100_agent_board_enroll_identity_board_owner_lock_order.sql +604 -0
  40. package/migrations/20260903000200_agent_board_fedsession_provider_absence_gate.sql +177 -0
  41. package/migrations/20260904000100_agent_board_wake_recovery_surface.sql +155 -0
  42. package/package.json +1 -1
  43. package/schema-manifest.json +363 -3
  44. package/src/tooling.test.mjs +113 -2
  45. package/tests/agent_board_actorspoof.test.sql +349 -0
  46. package/tests/agent_board_agentsdir.test.sql +154 -0
  47. package/tests/agent_board_atomic_fleet_onboarding.test.sql +623 -0
  48. package/tests/agent_board_atomic_fleet_onboarding_backfill.test.sql +142 -0
  49. package/tests/agent_board_atomic_fleet_onboarding_runtime.test.sql +1250 -0
  50. package/tests/agent_board_authbound_boundary.test.sql +9 -1
  51. package/tests/agent_board_claimgate_enforce.test.sql +464 -0
  52. package/tests/agent_board_claimgate_predicate.test.sql +360 -0
  53. package/tests/agent_board_claimkey.test.sql +229 -0
  54. package/tests/agent_board_consent_backfill.test.sql +48 -0
  55. package/tests/agent_board_consent_emission.test.sql +601 -0
  56. package/tests/agent_board_consent_gating.test.sql +489 -0
  57. package/tests/agent_board_consent_substrate.test.sql +720 -0
  58. package/tests/agent_board_delegation_cap_ceiling.test.sql +303 -0
  59. package/tests/agent_board_delegation_enforcement.test.sql +55 -6
  60. package/tests/agent_board_delegation_policies.test.sql +107 -1
  61. package/tests/agent_board_enroll_federated_identity.test.sql +3 -3
  62. package/tests/agent_board_enroll_pop_binding.test.sql +13 -3
  63. package/tests/agent_board_enrollment_audit_content.test.sql +11 -7
  64. package/tests/agent_board_federated_lock_order_class.test.sql +390 -0
  65. package/tests/agent_board_fedsession.test.sql +51 -5
  66. package/tests/agent_board_fedsession_provider_absence_gate.test.sql +170 -0
  67. package/tests/agent_board_fleet_domain_reclaim.test.sql +419 -0
  68. package/tests/agent_board_fleet_machine_hijack.test.sql +190 -0
  69. package/tests/agent_board_fleet_machine_reactivation.test.sql +426 -0
  70. package/tests/agent_board_fleet_machine_reclaim.test.sql +509 -0
  71. package/tests/agent_board_fleet_machines_rls.test.sql +79 -0
  72. package/tests/agent_board_fleet_policy.test.sql +2 -2
  73. package/tests/agent_board_grants_hygiene.test.sql +408 -0
  74. package/tests/agent_board_identity_providers.test.sql +9 -0
  75. package/tests/agent_board_inbox_reads.test.sql +45 -31
  76. package/tests/agent_board_inbox_rpcs.test.sql +44 -34
  77. package/tests/agent_board_invitepolicy.test.sql +205 -0
  78. package/tests/agent_board_leaveidem.test.sql +194 -0
  79. package/tests/agent_board_mint_fleet_agent_session.test.sql +10 -10
  80. package/tests/agent_board_mint_harden.test.sql +303 -0
  81. package/tests/agent_board_mint_harden_backfill.test.sql +95 -0
  82. package/tests/agent_board_obsgate.test.sql +178 -0
  83. package/tests/agent_board_obsgate2.test.sql +153 -0
  84. package/tests/agent_board_obsgate3.test.sql +170 -0
  85. package/tests/agent_board_obsgate4.test.sql +196 -0
  86. package/tests/agent_board_outbox_wake_ordering.test.sql +452 -0
  87. package/tests/agent_board_portal_offline_invariant.test.sql +14 -3
  88. package/tests/agent_board_pubexec_class.test.sql +53 -0
  89. package/tests/agent_board_rejectsem.test.sql +271 -0
  90. package/tests/agent_board_resigning_refresh.test.sql +1 -1
  91. package/tests/agent_board_resolve_noop_retire.test.sql +71 -0
  92. package/tests/agent_board_retention_metadata_acl.test.sql +53 -0
  93. package/tests/agent_board_revoke_agent_subtree.test.sql +3 -3
  94. package/tests/agent_board_rolereset.test.sql +351 -0
  95. package/tests/agent_board_roomdeleg.test.sql +5 -3
  96. package/tests/agent_board_roomdeleg_lane_b.test.sql +144 -0
  97. package/tests/agent_board_roomlink.test.sql +27 -11
  98. package/tests/agent_board_rowid.test.sql +1274 -0
  99. package/tests/agent_board_signature_rls_reads.test.sql +3 -3
  100. package/tests/agent_board_signed_write_gateway.test.sql +3 -3
  101. package/tests/agent_board_signing_challenge_pending_cap.test.sql +2 -2
  102. package/tests/agent_board_signing_challenge_reaper.test.sql +2 -2
  103. package/tests/agent_board_signing_proof_rpcs.test.sql +4 -4
  104. package/tests/agent_board_signing_store.test.sql +6 -6
  105. package/tests/agent_board_wake_recovery.test.sql +756 -0
  106. package/tests/fixtures/isolation-substrate.sql +93 -0
  107. package/tests/fixtures/test-prereqs.sql +33 -0
  108. package/tests/isolation/expected/atomic_fedsession_fleet_lock_order.out +79 -0
  109. package/tests/isolation/expected/atomic_fedsession_human_revoke.out +87 -0
  110. package/tests/isolation/expected/atomic_fleet_authority_races.out +469 -0
  111. package/tests/isolation/expected/atomic_fleet_binding_revoke.out +103 -0
  112. package/tests/isolation/expected/atomic_fleet_board_archive.out +117 -0
  113. package/tests/isolation/expected/atomic_fleet_human_fresh_revoke.out +136 -0
  114. package/tests/isolation/expected/atomic_fleet_identity_disposition.out +61 -0
  115. package/tests/isolation/expected/atomic_fleet_lifecycle_races.out +1479 -0
  116. package/tests/isolation/expected/atomic_fleet_onboarding.out +75 -0
  117. package/tests/isolation/expected/atomic_fleet_subtree_lock_order.out +60 -0
  118. package/tests/isolation/expected/ceiling_setter_lock_before_upsert.out +95 -0
  119. package/tests/isolation/expected/claimgate_ownerless_quota.out +36 -0
  120. package/tests/isolation/expected/claimkey_renew_race.out +38 -0
  121. package/tests/isolation/expected/consent_approval_lock.out +43 -0
  122. package/tests/isolation/expected/consent_emit_actual_state.out +37 -0
  123. package/tests/isolation/expected/domain_reclaim_revoke_race.out +40 -0
  124. package/tests/isolation/expected/enroll_identity_board_owner_lock_order.out +55 -0
  125. package/tests/isolation/expected/fedsession_provider_absent_owner_lock.out +37 -0
  126. package/tests/isolation/expected/onboarding_ceiling_lock_order.out +123 -0
  127. package/tests/isolation/expected/outbox_wake_ordering.out +86 -0
  128. package/tests/isolation/expected/reactivate_revoke_race.out +80 -0
  129. package/tests/isolation/expected/reclaim_revoke_race.out +40 -0
  130. package/tests/isolation/expected/wake_recovery_late_commit.out +89 -0
  131. package/tests/isolation/specs/atomic_fedsession_fleet_lock_order.spec +117 -0
  132. package/tests/isolation/specs/atomic_fedsession_human_revoke.spec +66 -0
  133. package/tests/isolation/specs/atomic_fleet_authority_races.spec +235 -0
  134. package/tests/isolation/specs/atomic_fleet_binding_revoke.spec +127 -0
  135. package/tests/isolation/specs/atomic_fleet_board_archive.spec +134 -0
  136. package/tests/isolation/specs/atomic_fleet_human_fresh_revoke.spec +142 -0
  137. package/tests/isolation/specs/atomic_fleet_identity_disposition.spec +118 -0
  138. package/tests/isolation/specs/atomic_fleet_lifecycle_races.spec +244 -0
  139. package/tests/isolation/specs/atomic_fleet_onboarding.spec +106 -0
  140. package/tests/isolation/specs/atomic_fleet_subtree_lock_order.spec +147 -0
  141. package/tests/isolation/specs/ceiling_setter_lock_before_upsert.spec +117 -0
  142. package/tests/isolation/specs/claimgate_ownerless_quota.spec +77 -0
  143. package/tests/isolation/specs/claimkey_renew_race.spec +67 -0
  144. package/tests/isolation/specs/consent_approval_lock.spec +98 -0
  145. package/tests/isolation/specs/consent_emit_actual_state.spec +79 -0
  146. package/tests/isolation/specs/domain_reclaim_revoke_race.spec +88 -0
  147. package/tests/isolation/specs/enroll_identity_board_owner_lock_order.spec +117 -0
  148. package/tests/isolation/specs/fedsession_provider_absent_owner_lock.spec +63 -0
  149. package/tests/isolation/specs/onboarding_ceiling_lock_order.spec +183 -0
  150. package/tests/isolation/specs/outbox_wake_ordering.spec +202 -0
  151. package/tests/isolation/specs/reactivate_revoke_race.spec +115 -0
  152. package/tests/isolation/specs/reclaim_revoke_race.spec +94 -0
  153. package/tests/isolation/specs/wake_recovery_late_commit.spec +207 -0
  154. package/tests/seeds/20260806000100_agent_board_consent_substrate.sql.pre.sql +19 -0
  155. package/tests/seeds/20260822000200_agent_board_mint_harden_fingerprint_backfill.sql.pre.sql +39 -0
  156. package/tests/seeds/20260901000100_agent_board_atomic_fleet_onboarding.sql.pre.sql +110 -0
@@ -0,0 +1,75 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: first_begin first_onboard second_begin second_onboard first_commit second_commit check
4
+ count
5
+ -----
6
+ 1
7
+ (1 row)
8
+
9
+ step first_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
10
+ step first_onboard:
11
+ select identity_disposition, membership_disposition, binding_disposition
12
+ from agent_board.onboard_federated_fleet_agent(
13
+ 'https://atomic-race.test', 'message-board', 'human-race',
14
+ jsonb_build_object('iss','https://atomic-race.test','aud','message-board','sub','human-race','iat',100),
15
+ 'atomic-race-agent',
16
+ 'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0',
17
+ 'raw_ed25519_base64url',
18
+ 'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8',
19
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
20
+ (select code from agent_board.board_invite_tokens where created_by_agent_id = '16220000-0000-0000-0000-000000000001'),
21
+ (select id from agent_board.boards where slug = 'atomic-race-board'),
22
+ '16220000-0000-0000-0000-000000000003',
23
+ 'codex', 'phase-loop', 'message-board', 'sha256:atomic-race-repo',
24
+ 'worker', 'phase_worker', 'atomic-race-agent'
25
+ );
26
+
27
+ identity_disposition|membership_disposition|binding_disposition
28
+ --------------------+----------------------+-------------------
29
+ created |created |created
30
+ (1 row)
31
+
32
+ step second_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
33
+ step second_onboard:
34
+ select identity_disposition, membership_disposition, binding_disposition
35
+ from agent_board.onboard_federated_fleet_agent(
36
+ 'https://atomic-race.test', 'message-board', 'human-race',
37
+ jsonb_build_object('iss','https://atomic-race.test','aud','message-board','sub','human-race','iat',200,'jti','rotated'),
38
+ 'atomic-race-agent',
39
+ 'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0',
40
+ 'raw_ed25519_base64url',
41
+ 'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8',
42
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
43
+ (select code from agent_board.board_invite_tokens where created_by_agent_id = '16220000-0000-0000-0000-000000000001'),
44
+ (select id from agent_board.boards where slug = 'atomic-race-board'),
45
+ '16220000-0000-0000-0000-000000000003',
46
+ 'codex', 'phase-loop', 'message-board', 'sha256:atomic-race-repo',
47
+ 'worker', 'phase_worker', 'atomic-race-agent'
48
+ );
49
+ <waiting ...>
50
+ step first_commit: COMMIT;
51
+ step second_onboard: <... completed>
52
+ identity_disposition|membership_disposition|binding_disposition
53
+ --------------------+----------------------+-------------------
54
+ reused |reused |reused
55
+ (1 row)
56
+
57
+ step second_commit: COMMIT;
58
+ step check:
59
+ select count(*) as agents,
60
+ (select count(*) from agent_board.agent_signing_keys k
61
+ join agent_board.agents a on a.id=k.agent_id
62
+ where a.handle='atomic-race-agent') as keys,
63
+ (select count(*) from agent_board.board_invite_redemptions r
64
+ join agent_board.board_invite_tokens i on i.id=r.invite_id
65
+ where i.created_by_agent_id='16220000-0000-0000-0000-000000000001') as redemptions,
66
+ (select count(*) from agent_board.fleet_machine_agents b
67
+ join agent_board.agents a on a.id=b.agent_id
68
+ where a.handle='atomic-race-agent') as bindings
69
+ from agent_board.agents where handle='atomic-race-agent';
70
+
71
+ agents|keys|redemptions|bindings
72
+ ------+----+-----------+--------
73
+ 1| 1| 1| 1
74
+ (1 row)
75
+
@@ -0,0 +1,60 @@
1
+ Parsed test spec with 4 sessions
2
+
3
+ starting permutation: blocker_begin blocker_lock retry_begin retry_onboard subtree_begin revoke_human_subtree blocker_commit subtree_commit retry_commit check
4
+ step blocker_begin: BEGIN;
5
+ step blocker_lock:
6
+ select pg_advisory_xact_lock(hashtextextended('sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA', 0));
7
+
8
+ pg_advisory_xact_lock
9
+ ---------------------
10
+
11
+ (1 row)
12
+
13
+ step retry_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
14
+ step retry_onboard:
15
+ select identity_disposition, binding_disposition
16
+ from agent_board.onboard_federated_fleet_agent(
17
+ 'https://atomic-subtree.test', 'message-board', 'human-subtree',
18
+ jsonb_build_object('iss','https://atomic-subtree.test','aud','message-board','sub','human-subtree','iat',200),
19
+ 'atomic-subtree-agent',
20
+ 'yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk',
21
+ 'raw_ed25519_base64url',
22
+ 'sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA',
23
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
24
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='ffffffff-ffff-ffff-ffff-ffffffffff01'),
25
+ (select id from agent_board.boards where slug='atomic-subtree-board'),
26
+ '16270000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
27
+ 'message-board', 'sha256:atomic-subtree-repo', 'worker', 'phase_worker',
28
+ 'atomic-subtree-agent'
29
+ );
30
+ <waiting ...>
31
+ step subtree_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
32
+ step revoke_human_subtree:
33
+ select revoked_agent_count
34
+ from agent_board.revoke_human_subtree(
35
+ (select owner_user_id from agent_board.agents where handle='atomic-subtree-agent'),
36
+ 'ffffffff-ffff-ffff-ffff-ffffffffff01', 'isolation subtree revoke'
37
+ );
38
+
39
+ revoked_agent_count
40
+ -------------------
41
+ 2
42
+ (1 row)
43
+
44
+ step blocker_commit: COMMIT;
45
+ step subtree_commit: COMMIT;
46
+ step retry_onboard: <... completed>
47
+ ERROR: human owner has been revoked
48
+ step retry_commit: COMMIT;
49
+ step check:
50
+ select
51
+ (select status from agent_board.agents where id='ffffffff-ffff-ffff-ffff-ffffffffff01') as creator_status,
52
+ (select status from agent_board.agents where handle='atomic-subtree-agent') as enrolled_status,
53
+ (select status from agent_board.agent_signing_keys where fingerprint='sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA') as key_status,
54
+ (select count(*) from agent_board.fleet_machine_agents where machine_id='16270000-0000-0000-0000-000000000003') as bindings;
55
+
56
+ creator_status|enrolled_status|key_status|bindings
57
+ --------------+---------------+----------+--------
58
+ revoked |revoked |revoked | 1
59
+ (1 row)
60
+
@@ -0,0 +1,95 @@
1
+ Parsed test spec with 4 sessions
2
+
3
+ starting permutation: holder_begin hold_ceiling_lock setter_begin set_ceiling probe_begin probe_ceiling_row probe_commit holder_commit setter_commit check
4
+ step holder_begin: BEGIN;
5
+ step hold_ceiling_lock:
6
+ select agent_board._lock_board_authority_ceiling(
7
+ (select id from agent_board.boards where slug='ceiling-order-board')) as locked;
8
+
9
+ locked
10
+ ------
11
+
12
+ (1 row)
13
+
14
+ step setter_begin:
15
+ BEGIN;
16
+ SET LOCAL ROLE authenticated;
17
+ SET LOCAL "request.jwt.claim.role" = 'authenticated';
18
+ SET LOCAL "request.jwt.claim.sub" = '19600000-0000-0000-0000-0000000000a1';
19
+
20
+ step set_ceiling:
21
+ select ceiling_max_grantable_role from agent_board.set_board_authority_ceiling(
22
+ (select id from agent_board.boards where slug='ceiling-order-board'),
23
+ 'member'
24
+ );
25
+ <waiting ...>
26
+ step probe_begin: BEGIN;
27
+ step probe_ceiling_row:
28
+ select max_grantable_role from agent_board.board_authority_ceilings
29
+ where board_id = (select id from agent_board.boards where slug='ceiling-order-board')
30
+ for update nowait;
31
+
32
+ max_grantable_role
33
+ ------------------
34
+ admin
35
+ (1 row)
36
+
37
+ step probe_commit: COMMIT;
38
+ step holder_commit: COMMIT;
39
+ step set_ceiling: <... completed>
40
+ ceiling_max_grantable_role
41
+ --------------------------
42
+ member
43
+ (1 row)
44
+
45
+ step setter_commit: COMMIT;
46
+ step check:
47
+ select max_grantable_role from agent_board.board_authority_ceilings
48
+ where board_id = (select id from agent_board.boards where slug='ceiling-order-board');
49
+
50
+ max_grantable_role
51
+ ------------------
52
+ member
53
+ (1 row)
54
+
55
+
56
+ starting permutation: setter_begin set_ceiling setter_commit probe_begin probe_ceiling_row probe_commit check
57
+ step setter_begin:
58
+ BEGIN;
59
+ SET LOCAL ROLE authenticated;
60
+ SET LOCAL "request.jwt.claim.role" = 'authenticated';
61
+ SET LOCAL "request.jwt.claim.sub" = '19600000-0000-0000-0000-0000000000a1';
62
+
63
+ step set_ceiling:
64
+ select ceiling_max_grantable_role from agent_board.set_board_authority_ceiling(
65
+ (select id from agent_board.boards where slug='ceiling-order-board'),
66
+ 'member'
67
+ );
68
+
69
+ ceiling_max_grantable_role
70
+ --------------------------
71
+ member
72
+ (1 row)
73
+
74
+ step setter_commit: COMMIT;
75
+ step probe_begin: BEGIN;
76
+ step probe_ceiling_row:
77
+ select max_grantable_role from agent_board.board_authority_ceilings
78
+ where board_id = (select id from agent_board.boards where slug='ceiling-order-board')
79
+ for update nowait;
80
+
81
+ max_grantable_role
82
+ ------------------
83
+ member
84
+ (1 row)
85
+
86
+ step probe_commit: COMMIT;
87
+ step check:
88
+ select max_grantable_role from agent_board.board_authority_ceilings
89
+ where board_id = (select id from agent_board.boards where slug='ceiling-order-board');
90
+
91
+ max_grantable_role
92
+ ------------------
93
+ member
94
+ (1 row)
95
+
@@ -0,0 +1,36 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: sa_begin sa_acq sb_begin sb_acq sa_commit sb_commit chk
4
+ step sa_begin: BEGIN; SET LOCAL ROLE authenticated; SET LOCAL "request.jwt.claim.role" = 'authenticated'; SET LOCAL "request.jwt.claim.sub" = 'c0a70000-0000-4000-8000-0000000000aa';
5
+ step sa_acq:
6
+ select resource_key
7
+ from agent_board.acquire_claim(null, 'file', 'cg-iso-sa', now() + interval '1 hour', null, null);
8
+
9
+ resource_key
10
+ ------------
11
+ cg-iso-sa
12
+ (1 row)
13
+
14
+ step sb_begin: BEGIN; SET LOCAL ROLE authenticated; SET LOCAL "request.jwt.claim.role" = 'authenticated'; SET LOCAL "request.jwt.claim.sub" = 'c0a70000-0000-4000-8000-0000000000aa';
15
+ step sb_acq:
16
+ select resource_key
17
+ from agent_board.acquire_claim(null, 'file', 'cg-iso-sb', now() + interval '1 hour', null, null);
18
+ <waiting ...>
19
+ step sa_commit: COMMIT;
20
+ step sb_acq: <... completed>
21
+ ERROR: ownerless active-claim quota reached (50 per agent)
22
+ step sb_commit: COMMIT;
23
+ step chk:
24
+ select count(*)::int as active_file_claims
25
+ from agent_board.claims
26
+ where agent_id = 'c0a70000-0000-4000-8000-0000000000bb'
27
+ and resource_kind = 'file'
28
+ and status = 'active'
29
+ and released_at is null
30
+ and lease_expires_at > now();
31
+
32
+ active_file_claims
33
+ ------------------
34
+ 50
35
+ (1 row)
36
+
@@ -0,0 +1,38 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: ra_begin ra_renew rb_begin rb_renew ra_commit rb_commit chk
4
+ step ra_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
5
+ step ra_renew:
6
+ select resource_key
7
+ from agent_board.renew_claim('00000000-0000-4000-8000-0000000000c1', now() + interval '2 hours');
8
+
9
+ resource_key
10
+ ------------
11
+ fpRace
12
+ (1 row)
13
+
14
+ step rb_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
15
+ step rb_renew:
16
+ select resource_key
17
+ from agent_board.renew_claim('00000000-0000-4000-8000-0000000000c2', now() + interval '2 hours');
18
+ <waiting ...>
19
+ step ra_commit: COMMIT;
20
+ step rb_renew: <... completed>
21
+ resource_key
22
+ ------------
23
+ fpRace
24
+ (1 row)
25
+
26
+ step rb_commit: COMMIT;
27
+ step chk:
28
+ select resource_key
29
+ from agent_board.claims
30
+ where lease_token in ('00000000-0000-4000-8000-0000000000c1','00000000-0000-4000-8000-0000000000c2')
31
+ order by resource_key;
32
+
33
+ resource_key
34
+ ------------
35
+ fpRace
36
+ fpRace
37
+ (2 rows)
38
+
@@ -0,0 +1,43 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: a_begin a_resolve w_begin w_leave a_commit w_commit chk
4
+ step a_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
5
+ step a_resolve:
6
+ select membership_state
7
+ from agent_board.resolve_board_request(
8
+ '115b0000-0000-4000-8000-000000000001',
9
+ '115a0000-0000-4000-8000-000000000002',
10
+ 'joined',
11
+ '115a0000-0000-4000-8000-000000000001');
12
+
13
+ membership_state
14
+ ----------------
15
+ joined
16
+ (1 row)
17
+
18
+ step w_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
19
+ step w_leave:
20
+ select membership_state
21
+ from agent_board.update_board_membership(
22
+ '115b0000-0000-4000-8000-000000000001',
23
+ '115a0000-0000-4000-8000-000000000002',
24
+ 'left');
25
+ <waiting ...>
26
+ step a_commit: COMMIT;
27
+ step w_leave: <... completed>
28
+ membership_state
29
+ ----------------
30
+ left
31
+ (1 row)
32
+
33
+ step w_commit: COMMIT;
34
+ step chk:
35
+ select membership_state
36
+ from agent_board.board_memberships
37
+ where id = '115c0000-0000-4000-8000-0000000000aa';
38
+
39
+ membership_state
40
+ ----------------
41
+ left
42
+ (1 row)
43
+
@@ -0,0 +1,37 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: m_begin m_sub b_begin b_boot m_commit b_commit chk
4
+ step m_begin: BEGIN;
5
+ step m_sub:
6
+ insert into agent_board.board_memberships(board_id, agent_id, membership_state, role, created_by_agent_id)
7
+ values ('105b0000-0000-4000-8000-000000000001', '105a0000-0000-4000-8000-000000000001',
8
+ 'subscribed', 'member', '105a0000-0000-4000-8000-000000000001');
9
+
10
+ step b_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
11
+ step b_boot:
12
+ select board_id, owner_agent_id
13
+ from agent_board.bootstrap_board_owner_memberships()
14
+ where board_id = '105b0000-0000-4000-8000-000000000001';
15
+ <waiting ...>
16
+ step m_commit: COMMIT;
17
+ step b_boot: <... completed>
18
+ board_id |owner_agent_id
19
+ ------------------------------------+------------------------------------
20
+ 105b0000-0000-4000-8000-000000000001|105a0000-0000-4000-8000-000000000001
21
+ (1 row)
22
+
23
+ step b_commit: COMMIT;
24
+ step chk:
25
+ select result_state, event_kind, provenance
26
+ from agent_board.board_membership_events
27
+ where board_id = '105b0000-0000-4000-8000-000000000001'
28
+ and agent_id = '105a0000-0000-4000-8000-000000000001'
29
+ and event_kind = 'operator_repair'
30
+ order by seq desc
31
+ limit 1;
32
+
33
+ result_state|event_kind |provenance
34
+ ------------+---------------+-------------------
35
+ subscribed |operator_repair|operator-designated
36
+ (1 row)
37
+
@@ -0,0 +1,40 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: ra_begin ra_reclaim rb_begin rb_revoke ra_commit rb_commit chk
4
+ step ra_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
5
+ step ra_reclaim:
6
+ select owner_agent_id
7
+ from agent_board.reclaim_fleet_trust_domain(
8
+ 'd2000000-0000-4000-8000-000000000001', 'a2000000-0000-4000-8000-000000000003',
9
+ 'a2000000-0000-4000-8000-000000000001', 'iso operator domain reclaim');
10
+
11
+ owner_agent_id
12
+ ------------------------------------
13
+ a2000000-0000-4000-8000-000000000003
14
+ (1 row)
15
+
16
+ step rb_begin:
17
+ BEGIN;
18
+ SET LOCAL "request.jwt.claim.role" = 'authenticated';
19
+ SET LOCAL "request.jwt.claim.sub" = 'b2000000-0000-4000-8000-000000000002';
20
+
21
+ step rb_revoke:
22
+ select revocation_event_id
23
+ from agent_board.revoke_fleet_subject(
24
+ 'trust_domain', 'd2000000-0000-4000-8000-000000000001', 'a2000000-0000-4000-8000-000000000002',
25
+ 'iso squatter domain revoke', jsonb_build_object('redacted', true));
26
+ <waiting ...>
27
+ step ra_commit: COMMIT;
28
+ step rb_revoke: <... completed>
29
+ ERROR: trust domain is not owned by current_agent_id()
30
+ step rb_commit: COMMIT;
31
+ step chk:
32
+ select owner_agent_id, lifecycle_state
33
+ from agent_board.fleet_trust_domains
34
+ where id = 'd2000000-0000-4000-8000-000000000001';
35
+
36
+ owner_agent_id |lifecycle_state
37
+ ------------------------------------+---------------
38
+ a2000000-0000-4000-8000-000000000003|active
39
+ (1 row)
40
+
@@ -0,0 +1,55 @@
1
+ Parsed test spec with 4 sessions
2
+
3
+ starting permutation: ohold_begin ohold_lock enroll_begin enroll_enroll bprobe_board_nowait ohold_commit enroll_commit check
4
+ step ohold_begin: BEGIN;
5
+ step ohold_lock:
6
+ select 1 as locked from auth.users u
7
+ where u.id = (select uid from lo194_owner)
8
+ for update;
9
+
10
+ locked
11
+ ------
12
+ 1
13
+ (1 row)
14
+
15
+ step enroll_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
16
+ step enroll_enroll:
17
+ select agent_handle, invite_redeemed
18
+ from agent_board.enroll_federated_identity(
19
+ 'https://lo194-iso.test', 'message-board', 'iso-human',
20
+ jsonb_build_object('iss','https://lo194-iso.test','aud','message-board','sub','iso-human'),
21
+ 'lo194-iso-agent',
22
+ public.test_pubkey('lo194-iso-k1'), 'raw_ed25519_base64url',
23
+ public.test_key_fingerprint('lo194-iso-k1'),
24
+ true, null, 'agent', ARRAY[]::text[], ARRAY[]::text[],
25
+ 'lo194-iso-code'
26
+ );
27
+ <waiting ...>
28
+ step bprobe_board_nowait:
29
+ select slug from agent_board.boards where slug='lo194-iso-board' for update nowait;
30
+
31
+ ERROR: could not obtain lock on row in relation "boards"
32
+ step ohold_commit: COMMIT;
33
+ step enroll_enroll: <... completed>
34
+ agent_handle |invite_redeemed
35
+ ---------------+---------------
36
+ lo194-iso-agent|t
37
+ (1 row)
38
+
39
+ step enroll_commit: COMMIT;
40
+ step check:
41
+ select
42
+ (select count(*) from agent_board.board_memberships m
43
+ join agent_board.agents a on a.id = m.agent_id
44
+ where m.board_id = (select id from agent_board.boards where slug='lo194-iso-board')
45
+ and a.handle = 'lo194-iso-agent'
46
+ and m.membership_state = 'joined') as enrolled_agent_memberships,
47
+ (select count(*) from agent_board.board_invite_redemptions r
48
+ join agent_board.board_invite_tokens t on t.id = r.invite_id
49
+ where t.code = 'lo194-iso-code') as redemptions;
50
+
51
+ enrolled_agent_memberships|redemptions
52
+ --------------------------+-----------
53
+ 1| 1
54
+ (1 row)
55
+
@@ -0,0 +1,37 @@
1
+ Parsed test spec with 3 sessions
2
+
3
+ starting permutation: ohold_begin ohold_lock portal_begin portal_enroll ohold_commit portal_commit check
4
+ step ohold_begin: BEGIN;
5
+ step ohold_lock:
6
+ select 1 as locked from auth.users u
7
+ where u.id = (select uid from lo193_owner)
8
+ for update;
9
+
10
+ locked
11
+ ------
12
+ 1
13
+ (1 row)
14
+
15
+ step portal_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
16
+ step portal_enroll:
17
+ select status from agent_board.enroll_federated_human(
18
+ 'https://lo193-iso.test', 'message-board', 'iso-orphan',
19
+ jsonb_build_object('sub','iso-orphan'), 'Iso Orphan'
20
+ );
21
+
22
+ ERROR: issuer/audience not in the identity-provider allowlist (rejected before any owner or board lock)
23
+ step ohold_commit: COMMIT;
24
+ step portal_commit: COMMIT;
25
+ step check:
26
+ select
27
+ (select count(*) from agent_board.agents a
28
+ where a.kind = 'human'
29
+ and a.metadata #>> ARRAY['federation','subject'] = 'iso-orphan') as human_agents,
30
+ (select count(*) from agent_board.identity_providers ip
31
+ where ip.issuer = 'https://lo193-iso.test') as providers;
32
+
33
+ human_agents|providers
34
+ ------------+---------
35
+ 0| 0
36
+ (1 row)
37
+
@@ -0,0 +1,123 @@
1
+ Parsed test spec with 4 sessions
2
+
3
+ starting permutation: holder_begin hold_ceiling_lock onboard_begin onboard_call probe_begin probe_boards_row probe_commit holder_commit onboard_commit check
4
+ count
5
+ -----
6
+ 1
7
+ (1 row)
8
+
9
+ step holder_begin: BEGIN;
10
+ step hold_ceiling_lock:
11
+ select agent_board._lock_board_authority_ceiling(
12
+ (select id from agent_board.boards where slug='onboard-ceiling-board')) as locked;
13
+
14
+ locked
15
+ ------
16
+
17
+ (1 row)
18
+
19
+ step onboard_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
20
+ step onboard_call:
21
+ select identity_disposition, membership_disposition, binding_disposition
22
+ from agent_board.onboard_federated_fleet_agent(
23
+ 'https://onboard-ceiling.test', 'message-board', 'human-onboard-ceiling',
24
+ jsonb_build_object('iss','https://onboard-ceiling.test','aud','message-board','sub','human-onboard-ceiling'),
25
+ 'onboard-ceiling-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='19610000-0000-0000-0000-000000000001'),
31
+ (select id from agent_board.boards where slug='onboard-ceiling-board'),
32
+ '19610000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
33
+ 'message-board', 'sha256:onboard-ceiling-repo', 'worker', 'phase_worker',
34
+ 'onboard-ceiling-agent'
35
+ );
36
+ <waiting ...>
37
+ step probe_begin: BEGIN;
38
+ step probe_boards_row:
39
+ select status from agent_board.boards
40
+ where id = (select id from agent_board.boards where slug='onboard-ceiling-board')
41
+ for update nowait;
42
+
43
+ status
44
+ ------
45
+ active
46
+ (1 row)
47
+
48
+ step probe_commit: COMMIT;
49
+ step holder_commit: COMMIT;
50
+ step onboard_call: <... completed>
51
+ identity_disposition|membership_disposition|binding_disposition
52
+ --------------------+----------------------+-------------------
53
+ created |created |created
54
+ (1 row)
55
+
56
+ step onboard_commit: COMMIT;
57
+ step check:
58
+ select
59
+ (select count(*) from agent_board.agents where handle='onboard-ceiling-agent') as onboarded_agents,
60
+ (select count(*) from agent_board.board_memberships bm
61
+ where bm.board_id=(select id from agent_board.boards where slug='onboard-ceiling-board')
62
+ and bm.agent_id in (select id from agent_board.agents where handle='onboard-ceiling-agent')) as memberships;
63
+
64
+ onboarded_agents|memberships
65
+ ----------------+-----------
66
+ 1| 1
67
+ (1 row)
68
+
69
+
70
+ starting permutation: onboard_begin onboard_call onboard_commit probe_begin probe_boards_row probe_commit check
71
+ count
72
+ -----
73
+ 1
74
+ (1 row)
75
+
76
+ step onboard_begin: BEGIN; SET LOCAL "request.jwt.claim.role" = 'service_role';
77
+ step onboard_call:
78
+ select identity_disposition, membership_disposition, binding_disposition
79
+ from agent_board.onboard_federated_fleet_agent(
80
+ 'https://onboard-ceiling.test', 'message-board', 'human-onboard-ceiling',
81
+ jsonb_build_object('iss','https://onboard-ceiling.test','aud','message-board','sub','human-onboard-ceiling'),
82
+ 'onboard-ceiling-agent',
83
+ 'yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk',
84
+ 'raw_ed25519_base64url',
85
+ 'sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA',
86
+ true, null, 'agent', ARRAY['board:send'], ARRAY[]::text[],
87
+ (select code from agent_board.board_invite_tokens where created_by_agent_id='19610000-0000-0000-0000-000000000001'),
88
+ (select id from agent_board.boards where slug='onboard-ceiling-board'),
89
+ '19610000-0000-0000-0000-000000000003', 'codex', 'phase-loop',
90
+ 'message-board', 'sha256:onboard-ceiling-repo', 'worker', 'phase_worker',
91
+ 'onboard-ceiling-agent'
92
+ );
93
+
94
+ identity_disposition|membership_disposition|binding_disposition
95
+ --------------------+----------------------+-------------------
96
+ created |created |created
97
+ (1 row)
98
+
99
+ step onboard_commit: COMMIT;
100
+ step probe_begin: BEGIN;
101
+ step probe_boards_row:
102
+ select status from agent_board.boards
103
+ where id = (select id from agent_board.boards where slug='onboard-ceiling-board')
104
+ for update nowait;
105
+
106
+ status
107
+ ------
108
+ active
109
+ (1 row)
110
+
111
+ step probe_commit: COMMIT;
112
+ step check:
113
+ select
114
+ (select count(*) from agent_board.agents where handle='onboard-ceiling-agent') as onboarded_agents,
115
+ (select count(*) from agent_board.board_memberships bm
116
+ where bm.board_id=(select id from agent_board.boards where slug='onboard-ceiling-board')
117
+ and bm.agent_id in (select id from agent_board.agents where handle='onboard-ceiling-agent')) as memberships;
118
+
119
+ onboarded_agents|memberships
120
+ ----------------+-----------
121
+ 1| 1
122
+ (1 row)
123
+