@consiliency/agent-board-schema 1.53.0 → 1.55.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 +615 -607
- package/migrations/20261004000100_agent_board_callback_consumer_intent.sql +52 -0
- package/migrations/20261005000100_agent_board_enroll_token_single_use.sql +886 -0
- package/package.json +1 -1
- package/schema-manifest.json +21 -3
- package/src/tooling.test.mjs +5 -2
- package/tests/agent_board_atomic_fleet_onboarding.test.sql +35 -35
- package/tests/agent_board_atomic_fleet_onboarding_backfill.test.sql +5 -5
- package/tests/agent_board_atomic_fleet_onboarding_runtime.test.sql +32 -32
- package/tests/agent_board_enroll_federated_identity.test.sql +11 -10
- package/tests/agent_board_enroll_pop_binding.test.sql +12 -12
- package/tests/agent_board_enroll_resumption.test.sql +1 -1
- package/tests/agent_board_enroll_token_single_use.test.sql +538 -0
- package/tests/agent_board_enrollment_audit_content.test.sql +3 -3
- package/tests/agent_board_federated_lock_order_class.test.sql +5 -5
- package/tests/agent_board_fedsession.test.sql +1 -1
- package/tests/agent_board_fk_lock_edges.test.sql +23 -0
- package/tests/agent_board_identity_providers.test.sql +3 -2
- package/tests/agent_board_portal_offline_invariant.test.sql +1 -1
- package/tests/agent_board_roomlink.test.sql +2 -2
- package/tests/agent_board_write_enforcement_class.test.sql +5 -2
- package/tests/catalog/function_execute_privileges.json +12 -3
- package/tests/catalog/p_metadata_parameters.json +6 -2
- package/tests/isolation/expected/atomic_fedsession_fleet_lock_order.out +1 -1
- package/tests/isolation/expected/atomic_fleet_authority_races.out +8 -8
- package/tests/isolation/expected/atomic_fleet_binding_revoke.out +2 -2
- package/tests/isolation/expected/atomic_fleet_board_archive.out +2 -2
- package/tests/isolation/expected/atomic_fleet_human_fresh_revoke.out +2 -2
- package/tests/isolation/expected/atomic_fleet_identity_disposition.out +2 -2
- package/tests/isolation/expected/atomic_fleet_lifecycle_races.out +22 -22
- package/tests/isolation/expected/atomic_fleet_onboarding.out +2 -2
- package/tests/isolation/expected/atomic_fleet_subtree_lock_order.out +1 -1
- package/tests/isolation/expected/enroll_identity_board_owner_lock_order.out +1 -1
- package/tests/isolation/expected/enroll_token_fleet_abort.out +81 -0
- package/tests/isolation/expected/enroll_token_pk_backstop.out +36 -0
- package/tests/isolation/expected/enroll_token_placement.out +86 -0
- package/tests/isolation/expected/enroll_token_rollback_unstrands.out +59 -0
- package/tests/isolation/expected/enroll_token_route_race_fleet_first.out +72 -0
- package/tests/isolation/expected/enroll_token_route_race_identity_first.out +72 -0
- package/tests/isolation/expected/enroll_token_same_key_fleet_then_identity.out +73 -0
- package/tests/isolation/expected/enroll_token_same_key_identity_then_fleet.out +73 -0
- package/tests/isolation/expected/enroll_token_same_key_resume.out +59 -0
- package/tests/isolation/expected/enroll_token_same_token_race.out +58 -0
- package/tests/isolation/expected/onboarding_ceiling_lock_order.out +2 -2
- package/tests/isolation/specs/atomic_fedsession_fleet_lock_order.spec +1 -1
- package/tests/isolation/specs/atomic_fleet_authority_races.spec +2 -2
- package/tests/isolation/specs/atomic_fleet_binding_revoke.spec +2 -2
- package/tests/isolation/specs/atomic_fleet_board_archive.spec +2 -2
- package/tests/isolation/specs/atomic_fleet_human_fresh_revoke.spec +2 -2
- package/tests/isolation/specs/atomic_fleet_identity_disposition.spec +2 -2
- package/tests/isolation/specs/atomic_fleet_lifecycle_races.spec +2 -2
- package/tests/isolation/specs/atomic_fleet_onboarding.spec +2 -2
- package/tests/isolation/specs/atomic_fleet_subtree_lock_order.spec +2 -2
- package/tests/isolation/specs/enroll_identity_board_owner_lock_order.spec +1 -1
- package/tests/isolation/specs/enroll_token_fleet_abort.spec +138 -0
- package/tests/isolation/specs/enroll_token_pk_backstop.spec +37 -0
- package/tests/isolation/specs/enroll_token_placement.spec +136 -0
- package/tests/isolation/specs/enroll_token_rollback_unstrands.spec +71 -0
- package/tests/isolation/specs/enroll_token_route_race_fleet_first.spec +119 -0
- package/tests/isolation/specs/enroll_token_route_race_identity_first.spec +120 -0
- package/tests/isolation/specs/enroll_token_same_key_fleet_then_identity.spec +112 -0
- package/tests/isolation/specs/enroll_token_same_key_identity_then_fleet.spec +113 -0
- package/tests/isolation/specs/enroll_token_same_key_resume.spec +70 -0
- package/tests/isolation/specs/enroll_token_same_token_race.spec +80 -0
- package/tests/isolation/specs/onboarding_ceiling_lock_order.spec +1 -1
|
@@ -112,7 +112,7 @@ begin
|
|
|
112
112
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0',
|
|
113
113
|
'raw_ed25519_base64url',
|
|
114
114
|
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8',
|
|
115
|
-
true, null, 'agent', '{board:send}', '{}', v_code, v_board, v_machine,
|
|
115
|
+
true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent', '{board:send}', '{}', v_code, v_board, v_machine,
|
|
116
116
|
'codex', 'phase-loop', 'message-board', 'sha256:atomic-runtime-repo',
|
|
117
117
|
'worker', 'phase_worker', 'atomic-runtime-agent'
|
|
118
118
|
) r;
|
|
@@ -130,7 +130,7 @@ begin
|
|
|
130
130
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0',
|
|
131
131
|
'raw_ed25519_base64url',
|
|
132
132
|
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8',
|
|
133
|
-
true, null, 'agent', '{board:send}', '{}', v_code, v_board, v_machine,
|
|
133
|
+
true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent', '{board:send}', '{}', v_code, v_board, v_machine,
|
|
134
134
|
'codex', 'phase-loop', 'message-board', 'sha256:atomic-runtime-repo',
|
|
135
135
|
'worker', 'phase_worker', 'atomic-runtime-agent'
|
|
136
136
|
) r;
|
|
@@ -194,7 +194,7 @@ begin
|
|
|
194
194
|
jsonb_build_object('iss','https://atomic-runtime.test','aud','message-board','sub','human-runtime','iat',p_iat),
|
|
195
195
|
'atomic-runtime-agent',
|
|
196
196
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
197
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
197
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
198
198
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
199
199
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
200
200
|
'codex', 'phase-loop', 'message-board', 'sha256:atomic-runtime-repo',
|
|
@@ -290,7 +290,7 @@ select lives_ok(
|
|
|
290
290
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":250}'::jsonb,
|
|
291
291
|
'atomic-runtime-agent',
|
|
292
292
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
293
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
293
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
294
294
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
295
295
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
296
296
|
'codex', 'phase-loop', 'message-board', 'sha256:atomic-runtime-repo',
|
|
@@ -318,7 +318,7 @@ select throws_ok(
|
|
|
318
318
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
319
319
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":300}'::jsonb, 'atomic-runtime-agent',
|
|
320
320
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
321
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
321
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
322
322
|
'{board:send}', '{}', (select invite_code from _atomic_cfg))$$,
|
|
323
323
|
'42501', null,
|
|
324
324
|
'legacy enrollment rejects the bounded invite before replay'
|
|
@@ -328,7 +328,7 @@ select throws_ok(
|
|
|
328
328
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
329
329
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":300}'::jsonb, 'atomic-runtime-agent',
|
|
330
330
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
331
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
331
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
332
332
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
333
333
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'substituted-label',
|
|
334
334
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -341,7 +341,7 @@ select throws_ok(
|
|
|
341
341
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
342
342
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":350}'::jsonb, 'atomic-runtime-agent',
|
|
343
343
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
344
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
344
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
345
345
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
346
346
|
gen_random_uuid(), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
347
347
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -354,7 +354,7 @@ select throws_ok(
|
|
|
354
354
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
355
355
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":351}'::jsonb, 'atomic-runtime-agent',
|
|
356
356
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
357
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
357
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
358
358
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
359
359
|
(select board_id from _atomic_cfg), gen_random_uuid(), 'codex', 'phase-loop',
|
|
360
360
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -366,7 +366,7 @@ select throws_ok(
|
|
|
366
366
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
367
367
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":352}'::jsonb, 'atomic-runtime-agent',
|
|
368
368
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
369
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
369
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
370
370
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
371
371
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'claude', 'phase-loop',
|
|
372
372
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -378,7 +378,7 @@ select throws_ok(
|
|
|
378
378
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
379
379
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":353}'::jsonb, 'atomic-runtime-agent',
|
|
380
380
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
381
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
381
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
382
382
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
383
383
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
384
384
|
'other-repo', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -390,7 +390,7 @@ select throws_ok(
|
|
|
390
390
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
391
391
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":354}'::jsonb, 'atomic-runtime-agent',
|
|
392
392
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
393
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
393
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
394
394
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
395
395
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
396
396
|
'message-board', 'sha256:substituted-repo', 'worker', 'phase_worker',
|
|
@@ -402,7 +402,7 @@ select throws_ok(
|
|
|
402
402
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
403
403
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":355}'::jsonb, 'atomic-runtime-agent',
|
|
404
404
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
405
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
405
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
406
406
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
407
407
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
408
408
|
'message-board', 'sha256:atomic-runtime-repo', 'reviewer', 'reviewer',
|
|
@@ -414,7 +414,7 @@ select throws_ok(
|
|
|
414
414
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
415
415
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":356}'::jsonb, 'atomic-runtime-agent',
|
|
416
416
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
417
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
417
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
418
418
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
419
419
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
420
420
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -426,7 +426,7 @@ select throws_ok(
|
|
|
426
426
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
427
427
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":357}'::jsonb, 'atomic-runtime-agent',
|
|
428
428
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
429
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
429
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
430
430
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
431
431
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
432
432
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'reviewer',
|
|
@@ -475,7 +475,7 @@ select throws_ok(
|
|
|
475
475
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
476
476
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":360}'::jsonb, 'atomic-runtime-agent',
|
|
477
477
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
478
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
478
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
479
479
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
480
480
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
481
481
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -491,7 +491,7 @@ select throws_ok(
|
|
|
491
491
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
492
492
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":361}'::jsonb, 'atomic-runtime-agent',
|
|
493
493
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
494
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
494
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
495
495
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
496
496
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
497
497
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -511,7 +511,7 @@ select throws_ok(
|
|
|
511
511
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
512
512
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":362}'::jsonb, 'atomic-runtime-agent',
|
|
513
513
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
514
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
514
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
515
515
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
516
516
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
517
517
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -528,7 +528,7 @@ select throws_ok(
|
|
|
528
528
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
529
529
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":363}'::jsonb, 'atomic-runtime-agent',
|
|
530
530
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
531
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
531
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
532
532
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
533
533
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
534
534
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -547,7 +547,7 @@ select throws_ok(
|
|
|
547
547
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
548
548
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":364}'::jsonb, 'atomic-runtime-agent',
|
|
549
549
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
550
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
550
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
551
551
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
552
552
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
553
553
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -570,7 +570,7 @@ select lives_ok(
|
|
|
570
570
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":365}'::jsonb,
|
|
571
571
|
'atomic-runtime-agent',
|
|
572
572
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
573
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
573
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
574
574
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
575
575
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
576
576
|
'codex', 'phase-loop', 'message-board', 'sha256:atomic-runtime-repo',
|
|
@@ -615,7 +615,7 @@ select throws_ok(
|
|
|
615
615
|
'https://atomic-runtime.test', 'message-board', 'human-runtime',
|
|
616
616
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":400}'::jsonb, 'atomic-runtime-agent',
|
|
617
617
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
618
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
618
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
619
619
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
620
620
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg), 'codex', 'phase-loop',
|
|
621
621
|
'message-board', 'sha256:atomic-runtime-repo', 'worker', 'phase_worker',
|
|
@@ -643,7 +643,7 @@ begin
|
|
|
643
643
|
'yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk',
|
|
644
644
|
'raw_ed25519_base64url',
|
|
645
645
|
'sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA',
|
|
646
|
-
true, null, 'agent', '{board:send}', '{}', null
|
|
646
|
+
true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent', '{board:send}', '{}', null
|
|
647
647
|
) e;
|
|
648
648
|
|
|
649
649
|
select invite_id, code into v_invite, v_code
|
|
@@ -667,7 +667,7 @@ select lives_ok(
|
|
|
667
667
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-recovery","iat":501,"jti":"rotated"}'::jsonb,
|
|
668
668
|
'atomic-recovery-agent',
|
|
669
669
|
'yd_DIFGWGusVg3SbktDJQ1bE5UWvtR33xln4b05JIhk', 'raw_ed25519_base64url',
|
|
670
|
-
'sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA', true, null, 'agent',
|
|
670
|
+
'sha256:NeVC2vx1MbTY56jUwJcLLr6YwB4IKCERsXWbUwhf5pA', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
671
671
|
'{board:send}', '{}', (select invite_code from _recovery_cfg),
|
|
672
672
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
673
673
|
'codex', 'recovery-harness', 'message-board', 'sha256:recovery-repo',
|
|
@@ -718,7 +718,7 @@ select throws_ok(
|
|
|
718
718
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-collision","iat":600}'::jsonb,
|
|
719
719
|
'atomic-collision-agent',
|
|
720
720
|
'4KAcBIlVxExOCkFemWSjOREACgi90CE_2-EFbmRYAzM', 'raw_ed25519_base64url',
|
|
721
|
-
'sha256:M-L7uu74kuf1rPVyZcW9Ar-LD1ZULN3E36HKqy93O3Q', true, null, 'agent',
|
|
721
|
+
'sha256:M-L7uu74kuf1rPVyZcW9Ar-LD1ZULN3E36HKqy93O3Q', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
722
722
|
'{board:send}', '{}', (select invite_code from _collision_cfg),
|
|
723
723
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
724
724
|
'codex', 'collision-harness', 'message-board', 'sha256:collision-repo',
|
|
@@ -822,7 +822,7 @@ select throws_ok(
|
|
|
822
822
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":700}'::jsonb,
|
|
823
823
|
'atomic-runtime-agent',
|
|
824
824
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
825
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
825
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
826
826
|
'{board:send}', '{}', (select invite_code from _matrix_invites where case_name='generic'),
|
|
827
827
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
828
828
|
'codex', 'phase-loop', 'message-board', 'sha256:atomic-runtime-repo',
|
|
@@ -848,7 +848,7 @@ select throws_ok(
|
|
|
848
848
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":701}'::jsonb,
|
|
849
849
|
'atomic-runtime-agent',
|
|
850
850
|
'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f0', 'raw_ed25519_base64url',
|
|
851
|
-
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, null, 'agent',
|
|
851
|
+
'sha256:z8d5LQPfBMYnfZfvu8wVz684_jkp578-SPDU2OMObS8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
852
852
|
'{board:send}', '{}', (select invite_code from _atomic_cfg),
|
|
853
853
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
854
854
|
'codex', 'phase-loop', 'message-board', 'sha256:atomic-runtime-repo',
|
|
@@ -894,7 +894,7 @@ select throws_ok(
|
|
|
894
894
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-conflict","iat":702}'::jsonb,
|
|
895
895
|
'atomic-conflict-agent',
|
|
896
896
|
'5TG73fnNhqeYkoSvPf9QwmWkvKWe0yA7B8YinAWQ8m4', 'raw_ed25519_base64url',
|
|
897
|
-
'sha256:qhjEQe9R_x26TBZyBsd-LrpR1fh7Mvnz86rbsCKtjz8', true, null, 'agent',
|
|
897
|
+
'sha256:qhjEQe9R_x26TBZyBsd-LrpR1fh7Mvnz86rbsCKtjz8', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
898
898
|
'{board:send}', '{}', (select invite_code from _matrix_invites where case_name='conflict'),
|
|
899
899
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
900
900
|
'codex', 'conflict-harness', 'message-board', 'sha256:conflict-repo',
|
|
@@ -920,7 +920,7 @@ begin
|
|
|
920
920
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-blocked","iat":703}'::jsonb,
|
|
921
921
|
'atomic-blocked-agent',
|
|
922
922
|
'HdUqLbj-jcUwvwE4rf9WXeDQrjrAtYUT6YmnsGMKcNQ', 'raw_ed25519_base64url',
|
|
923
|
-
'sha256:d115bUBikhOk-QFOCc-lItU2nRZMKf79kAHmvgLsKng', true, null, 'agent',
|
|
923
|
+
'sha256:d115bUBikhOk-QFOCc-lItU2nRZMKf79kAHmvgLsKng', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
924
924
|
'{board:send}', '{}', null
|
|
925
925
|
);
|
|
926
926
|
insert into agent_board.board_memberships(
|
|
@@ -945,7 +945,7 @@ select throws_ok(
|
|
|
945
945
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-blocked","iat":704}'::jsonb,
|
|
946
946
|
'atomic-blocked-agent',
|
|
947
947
|
'HdUqLbj-jcUwvwE4rf9WXeDQrjrAtYUT6YmnsGMKcNQ', 'raw_ed25519_base64url',
|
|
948
|
-
'sha256:d115bUBikhOk-QFOCc-lItU2nRZMKf79kAHmvgLsKng', true, null, 'agent',
|
|
948
|
+
'sha256:d115bUBikhOk-QFOCc-lItU2nRZMKf79kAHmvgLsKng', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
949
949
|
'{board:send}', '{}', (select invite_code from _matrix_invites where case_name='blocked'),
|
|
950
950
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
951
951
|
'codex', 'blocked-harness', 'message-board', 'sha256:blocked-repo',
|
|
@@ -985,7 +985,7 @@ select throws_ok(
|
|
|
985
985
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-late-failure","iat":705}'::jsonb,
|
|
986
986
|
'atomic-late-failure-agent',
|
|
987
987
|
'TDyof3w0SMg4SDYuj-qenolHC_n05cZbrLSckKVGtMo', 'raw_ed25519_base64url',
|
|
988
|
-
'sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M', true, null, 'agent',
|
|
988
|
+
'sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
989
989
|
'{board:send}', '{}', (select invite_code from _matrix_invites where case_name='late-failure'),
|
|
990
990
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
991
991
|
'codex', 'late-failure-harness', 'message-board', 'sha256:late-failure-repo',
|
|
@@ -1089,7 +1089,7 @@ select throws_ok(
|
|
|
1089
1089
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":801}'::jsonb,
|
|
1090
1090
|
'atomic-revoked-future',
|
|
1091
1091
|
'TDyof3w0SMg4SDYuj-qenolHC_n05cZbrLSckKVGtMo', 'raw_ed25519_base64url',
|
|
1092
|
-
'sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M', true, null, 'agent',
|
|
1092
|
+
'sha256:lSBZnHvmPvQONy8aoygp-fmTg26iZenrZC-L5LN9m7M', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
1093
1093
|
'{board:send}', '{}', (select invite_code from _matrix_invites where case_name='human-revoked'),
|
|
1094
1094
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
1095
1095
|
'codex', 'human-revoked', 'message-board', 'sha256:human-revoked',
|
|
@@ -1233,7 +1233,7 @@ select throws_ok(
|
|
|
1233
1233
|
'{"iss":"https://atomic-runtime.test","aud":"message-board","sub":"human-runtime","iat":802}'::jsonb,
|
|
1234
1234
|
'atomic-revoked-future',
|
|
1235
1235
|
'8lbFi0KooZCbgv7LYQzJ455CsFFnoeOK9qkcsEwUBZg', 'raw_ed25519_base64url',
|
|
1236
|
-
'sha256:SiF8ib634OSMsAhUlMQk44VFekSV1EcRHzkdhv-R8vc', true, null, 'agent',
|
|
1236
|
+
'sha256:SiF8ib634OSMsAhUlMQk44VFekSV1EcRHzkdhv-R8vc', true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent',
|
|
1237
1237
|
'{board:send}', '{}', (select invite_code from _matrix_invites where case_name='human-revoked'),
|
|
1238
1238
|
(select board_id from _atomic_cfg), (select machine_id from _atomic_cfg),
|
|
1239
1239
|
'codex', 'human-revoked', 'message-board', 'sha256:human-revoked',
|
|
@@ -15,11 +15,12 @@ begin;
|
|
|
15
15
|
|
|
16
16
|
select plan(28);
|
|
17
17
|
|
|
18
|
-
--
|
|
18
|
+
-- 16-arg signature exists (ROOMLINK 20260724000200 added a trailing invite code; #521
|
|
19
|
+
-- added p_token_sha256 + p_token_expires_at after p_pop_verified, with no default). -----
|
|
19
20
|
select has_function(
|
|
20
21
|
'agent_board', 'enroll_federated_identity',
|
|
21
|
-
array['text','text','text','jsonb','text','text','text','text','boolean','text','text','text[]','text[]','text'],
|
|
22
|
-
'enroll_federated_identity exists with the ROOMLINK-extended
|
|
22
|
+
array['text','text','text','jsonb','text','text','text','text','boolean','text','timestamp with time zone','text','text','text[]','text[]','text'],
|
|
23
|
+
'enroll_federated_identity exists with the ROOMLINK-extended, #521 token-bound 16-arg PoP signature');
|
|
23
24
|
select hasnt_function(
|
|
24
25
|
'agent_board', 'enroll_federated_identity',
|
|
25
26
|
array['text','text','text','jsonb','text','text','text[]','text[]'],
|
|
@@ -59,7 +60,7 @@ begin
|
|
|
59
60
|
into v_agent_id, v_auth, v_prov, v_key, v_granted
|
|
60
61
|
from _p p, agent_board.enroll_federated_identity(
|
|
61
62
|
p.iss, p.aud, p.sub, p.claim, p.slug, p.pub1, 'raw_ed25519_base64url', p.fp1,
|
|
62
|
-
true, 'act|'||s, 'agent', '{board:send}', '{board:x}') e;
|
|
63
|
+
true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), 'act|'||s, 'agent', '{board:send}', '{board:x}') e;
|
|
63
64
|
insert into _r
|
|
64
65
|
select 'A', v_agent_id, v_auth, v_prov, v_key, v_granted, a.owner_user_id
|
|
65
66
|
from agent_board.agents a where a.id = v_agent_id;
|
|
@@ -69,7 +70,7 @@ begin
|
|
|
69
70
|
into v_agent_id, v_auth, v_prov, v_key, v_granted
|
|
70
71
|
from _p p, agent_board.enroll_federated_identity(
|
|
71
72
|
p.iss, p.aud, p.sub, p.claim, p.slug, p.pub2, 'raw_ed25519_base64url', p.fp2,
|
|
72
|
-
true, 'act|'||s, 'agent', '{board:send}', '{board:x}') e;
|
|
73
|
+
true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), 'act|'||s, 'agent', '{board:send}', '{board:x}') e;
|
|
73
74
|
insert into _r
|
|
74
75
|
select 'B', v_agent_id, v_auth, v_prov, v_key, v_granted, a.owner_user_id
|
|
75
76
|
from agent_board.agents a where a.id = v_agent_id;
|
|
@@ -161,21 +162,21 @@ select is(
|
|
|
161
162
|
|
|
162
163
|
-- Provider / scope / kind rejection matrix still raises ------------------------------
|
|
163
164
|
select throws_ok(
|
|
164
|
-
(select format($q$select agent_board.enroll_federated_identity('https://nope.test',%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
165
|
+
(select format($q$select agent_board.enroll_federated_identity('https://nope.test',%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
165
166
|
aud, sub, (claim || jsonb_build_object('iss','https://nope.test'))::text, 'x-'||slug, pub1, fp1) from _p),
|
|
166
167
|
'42501', null, 'unknown (issuer,audience) is rejected');
|
|
167
168
|
select throws_ok(
|
|
168
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,NULL,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
169
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,NULL,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
169
170
|
iss, aud, claim::text, 'y-'||slug, pub1, fp1) from _p),
|
|
170
171
|
'22023', null, 'a null verified subject is rejected');
|
|
171
172
|
-- requested scope outside the provider allowed_scopes ceiling
|
|
172
173
|
select throws_ok(
|
|
173
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:admin}','{}')$q$,
|
|
174
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:admin}','{}')$q$,
|
|
174
175
|
iss, aud, sub, claim::text, 'z-'||slug, pub1, fp1) from _p),
|
|
175
176
|
'42501', null, 'a requested scope outside allowed_scopes is rejected');
|
|
176
177
|
-- the 'system' kind is never federatable
|
|
177
178
|
select throws_ok(
|
|
178
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'system','{board:send}','{}')$q$,
|
|
179
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'system','{board:send}','{}')$q$,
|
|
179
180
|
iss, aud, sub, claim::text, 'w-'||slug, pub1, fp1) from _p),
|
|
180
181
|
'42501', null, 'the system kind cannot be federated');
|
|
181
182
|
|
|
@@ -199,7 +200,7 @@ begin
|
|
|
199
200
|
from agent_board.enroll_federated_identity(
|
|
200
201
|
'https://fed-b1-'||s||'.test','message-board','portal|'||s,
|
|
201
202
|
jsonb_build_object('iss','https://fed-b1-'||s||'.test','aud','message-board','sub','portal|'||s), 'b1-'||s, v_pub,'raw_ed25519_base64url', v_fp,
|
|
202
|
-
true, null, 'agent', '{board:send}', '{}') e;
|
|
203
|
+
true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1), null, 'agent', '{board:send}', '{}') e;
|
|
203
204
|
insert into _b1 values (v_agent, v_kid, v_kver, v_handle);
|
|
204
205
|
end $$;
|
|
205
206
|
select is(
|
|
@@ -49,7 +49,7 @@ $$;
|
|
|
49
49
|
|
|
50
50
|
-- Happy path with a present, non-empty actor_sub -> succeeds and is audited (key 1).
|
|
51
51
|
select lives_ok(
|
|
52
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,%L,'agent','{board:send}','{}')$q$,
|
|
52
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),%L,'agent','{board:send}','{}')$q$,
|
|
53
53
|
iss, aud, sub, claim::text, 'pop-ok', pub1, fp1, 'act|present') from _p),
|
|
54
54
|
'enroll with a present non-empty actor_sub and verified PoP succeeds');
|
|
55
55
|
select is(
|
|
@@ -60,7 +60,7 @@ select is(
|
|
|
60
60
|
|
|
61
61
|
-- Exact replay: rotating presentation claims do not create a second identity.
|
|
62
62
|
select lives_ok(
|
|
63
|
-
(select format($q$create temp table _exact_replay as select * from agent_board.enroll_federated_identity(%L,%L,%L,(%L::jsonb || '{"iat":200,"exp":9999999999,"jti":"rotated"}'::jsonb),%L,%L,'raw_ed25519_base64url',%L,true,%L,'agent','{board:send}','{}')$q$,
|
|
63
|
+
(select format($q$create temp table _exact_replay as select * from agent_board.enroll_federated_identity(%L,%L,%L,(%L::jsonb || '{"iat":200,"exp":9999999999,"jti":"rotated"}'::jsonb),%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),%L,'agent','{board:send}','{}')$q$,
|
|
64
64
|
iss, aud, sub, claim::text, 'pop-ok', pub1, fp1, 'act|present') from _p),
|
|
65
65
|
'an exact stable-input replay with rotating JWT presentation claims succeeds');
|
|
66
66
|
select is(
|
|
@@ -70,7 +70,7 @@ select is(
|
|
|
70
70
|
|
|
71
71
|
-- A replay mutation (slug and independent actor_sub) fails closed with 23505.
|
|
72
72
|
select throws_ok(
|
|
73
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
73
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
74
74
|
iss, aud, sub, claim::text, 'pop-dup', pub1, fp1) from _p),
|
|
75
75
|
'23505', null, 'a duplicate fingerprint (key already enrolled) is rejected');
|
|
76
76
|
select is(
|
|
@@ -82,11 +82,11 @@ select is(
|
|
|
82
82
|
-- check — so one private key can NEVER back multiple agents (the 4-strings-one-key
|
|
83
83
|
-- aliasing attack that broke revocation isolation).
|
|
84
84
|
select throws_ok(
|
|
85
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
85
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
86
86
|
iss, aud, sub, claim::text, 'pop-alias1', 'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f1', fp1) from _p),
|
|
87
87
|
'22023', null, 'a non-canonical base64url alias of an enrolled key is rejected (aliasing attack blocked)');
|
|
88
88
|
select throws_ok(
|
|
89
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
89
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
90
90
|
iss, aud, sub, claim::text, 'pop-alias2', 'eRHZmllEy_TZHAG2zB-Qe_a5BFLkaavMTazWWfaE3f2', fp1) from _p),
|
|
91
91
|
'22023', null, 'a second non-canonical alias of the same key is also rejected');
|
|
92
92
|
select is(
|
|
@@ -95,20 +95,20 @@ select is(
|
|
|
95
95
|
|
|
96
96
|
-- PoP gate: p_pop_verified false / null -> raise, and NO agent is written.
|
|
97
97
|
select throws_ok(
|
|
98
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,false,null,'agent','{board:send}','{}')$q$,
|
|
98
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,false, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
99
99
|
iss, aud, sub, claim::text, 'pop-false', pub2, fp2) from _p),
|
|
100
100
|
'42501', null, 'p_pop_verified=false is refused');
|
|
101
101
|
select is(
|
|
102
102
|
(select count(*)::int from agent_board.agents a where a.handle = 'pop-false'),
|
|
103
103
|
0, 'a refused (pop=false) enrollment wrote no agent (no partial write)');
|
|
104
104
|
select throws_ok(
|
|
105
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,NULL,null,'agent','{board:send}','{}')$q$,
|
|
105
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,NULL, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
106
106
|
iss, aud, sub, claim::text, 'pop-null', pub2, fp2) from _p),
|
|
107
107
|
'42501', null, 'p_pop_verified=null is refused');
|
|
108
108
|
|
|
109
109
|
-- Fingerprint tamper: supplied fingerprint != in-DB recompute -> raise, no write.
|
|
110
110
|
select throws_ok(
|
|
111
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
111
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
112
112
|
iss, aud, sub, claim::text, 'pop-tamper', pub2, 'sha256:'||repeat('B',43)) from _p),
|
|
113
113
|
'22023', null, 'a tampered fingerprint (!= in-DB derive of the key) is rejected');
|
|
114
114
|
select is(
|
|
@@ -117,22 +117,22 @@ select is(
|
|
|
117
117
|
|
|
118
118
|
-- Malformed / placeholder / wrong-format keys -> raise.
|
|
119
119
|
select throws_ok(
|
|
120
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,'not-a-valid-43char-key','raw_ed25519_base64url','sha256:'||%L,true,null,'agent','{board:send}','{}')$q$,
|
|
120
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,'not-a-valid-43char-key','raw_ed25519_base64url','sha256:'||%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
121
121
|
iss, aud, sub, claim::text, 'pop-malformed', repeat('C',43)) from _p),
|
|
122
122
|
'22023', null, 'a malformed (non-43-base64url) public key is rejected');
|
|
123
123
|
select throws_ok(
|
|
124
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
124
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
125
125
|
iss, aud, sub, claim::text, 'pop-zero', repeat('A',43),
|
|
126
126
|
'sha256:'||rtrim(translate(encode(extensions.digest(convert_to(repeat('A',43),'UTF8'),'sha256'),'base64'),'+/','-_'),'=')) from _p),
|
|
127
127
|
'22023', null, 'the all-zero small-order placeholder key is rejected');
|
|
128
128
|
select throws_ok(
|
|
129
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'spki_pem',%L,true,null,'agent','{board:send}','{}')$q$,
|
|
129
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'spki_pem',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent','{board:send}','{}')$q$,
|
|
130
130
|
iss, aud, sub, claim::text, 'pop-fmt', pub2, fp2) from _p),
|
|
131
131
|
'22023', null, 'a non-raw_ed25519_base64url public_key_format is rejected');
|
|
132
132
|
|
|
133
133
|
-- actor_sub present-but-empty -> raise (present means a real delegated actor).
|
|
134
134
|
select throws_ok(
|
|
135
|
-
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,'','agent','{board:send}','{}')$q$,
|
|
135
|
+
(select format($q$select agent_board.enroll_federated_identity(%L,%L,%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),'','agent','{board:send}','{}')$q$,
|
|
136
136
|
iss, aud, sub, claim::text, 'pop-emptyact', pub2, fp2) from _p),
|
|
137
137
|
'22023', null, 'a present-but-empty actor_sub is rejected');
|
|
138
138
|
|
|
@@ -65,7 +65,7 @@ create function pg_temp.enroll_sql(
|
|
|
65
65
|
) returns text language sql stable as
|
|
66
66
|
$$
|
|
67
67
|
select format(
|
|
68
|
-
$q$select * from agent_board.enroll_federated_identity(%L,'message-board',%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true,null,'agent',%L,'{}')$q$,
|
|
68
|
+
$q$select * from agent_board.enroll_federated_identity(%L,'message-board',%L,%L::jsonb,%L,%L,'raw_ed25519_base64url',%L,true, md5(random()::text) || md5(random()::text), now() + make_interval(hours => 1),null,'agent',%L,'{}')$q$,
|
|
69
69
|
p_iss, p_sub,
|
|
70
70
|
jsonb_build_object('iss', p_iss, 'aud', 'message-board', 'sub', p_sub)::text,
|
|
71
71
|
p_slug, p_pub, p_fp, p_scopes)
|