@consiliency/agent-board-schema 1.10.0 → 1.22.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 (109) hide show
  1. package/fixtures/already-applied.json +136 -0
  2. package/migrations/20260729000100_agent_board_fedsession_autojoin_default_board.sql +364 -0
  3. package/migrations/20260730000100_agent_board_gatenull_service_role_bypass.sql +369 -0
  4. package/migrations/20260730000200_agent_board_membstate_authz.sql +195 -0
  5. package/migrations/20260731000100_agent_board_agentsdir_column_scope.sql +88 -0
  6. package/migrations/20260801000100_agent_board_leaveidem_terminal_noop.sql +317 -0
  7. package/migrations/20260802000100_agent_board_rolereset_reentry_clamp.sql +237 -0
  8. package/migrations/20260803000100_agent_board_rowid_total_order.sql +1201 -0
  9. package/migrations/20260804000100_agent_board_hygiene_actor_binding_rls.sql +229 -0
  10. package/migrations/20260806000100_agent_board_consent_substrate.sql +339 -0
  11. package/migrations/20260807000100_agent_board_consent_emission.sql +619 -0
  12. package/migrations/20260808000100_agent_board_rejectsem.sql +145 -0
  13. package/migrations/20260809000100_agent_board_consent_gating.sql +492 -0
  14. package/migrations/20260810000100_agent_board_consent_locking.sql +485 -0
  15. package/migrations/20260811000100_agent_board_retention_metadata_revoke.sql +23 -0
  16. package/migrations/20260812000100_agent_board_pubexec_class_revoke.sql +54 -0
  17. package/migrations/20260813000100_agent_board_invitepolicy_block.sql +420 -0
  18. package/migrations/20260814000100_agent_board_obsgate_thread_post_policy.sql +239 -0
  19. package/migrations/20260815000100_agent_board_obsgate2_authoring_gates.sql +287 -0
  20. package/migrations/20260816000100_agent_board_obsgate3_task_lifecycle.sql +118 -0
  21. package/migrations/20260817000100_agent_board_obsgate4_claims_lifecycle.sql +250 -0
  22. package/migrations/20260818000100_agent_board_fleet_machines_rls_correlation.sql +43 -0
  23. package/migrations/20260819000100_agent_board_resolve_noop_retire.sql +166 -0
  24. package/migrations/20260820000100_agent_board_roomdeleg_lane_b.sql +206 -0
  25. package/migrations/20260821000100_agent_board_claimgate_claimkey.sql +372 -0
  26. package/migrations/20260822000100_agent_board_mint_harden.sql +710 -0
  27. package/migrations/20260822000200_agent_board_mint_harden_fingerprint_backfill.sql +207 -0
  28. package/migrations/20260823000100_agent_board_fleet_machine_hijack.sql +106 -0
  29. package/migrations/20260824000100_agent_board_claimgate_shadow.sql +443 -0
  30. package/migrations/20260825000100_agent_board_claimgate_enforce.sql +660 -0
  31. package/migrations/20260826000100_agent_board_fleet_machine_reactivation.sql +514 -0
  32. package/migrations/20260828000100_agent_board_delegation_cap_ceiling.sql +474 -0
  33. package/migrations/20260829000100_agent_board_fleet_machine_reclaim.sql +432 -0
  34. package/migrations/20260830000100_agent_board_delegation_sole_writer.sql +41 -0
  35. package/migrations/20260831000100_agent_board_fleet_domain_reclaim.sql +389 -0
  36. package/package.json +1 -1
  37. package/schema-manifest.json +309 -3
  38. package/src/tooling.test.mjs +123 -2
  39. package/tests/agent_board_actorspoof.test.sql +349 -0
  40. package/tests/agent_board_agentsdir.test.sql +154 -0
  41. package/tests/agent_board_authbound_boundary.test.sql +9 -1
  42. package/tests/agent_board_claimgate_enforce.test.sql +464 -0
  43. package/tests/agent_board_claimgate_predicate.test.sql +360 -0
  44. package/tests/agent_board_claimkey.test.sql +229 -0
  45. package/tests/agent_board_consent_backfill.test.sql +48 -0
  46. package/tests/agent_board_consent_emission.test.sql +601 -0
  47. package/tests/agent_board_consent_gating.test.sql +489 -0
  48. package/tests/agent_board_consent_substrate.test.sql +720 -0
  49. package/tests/agent_board_delegation_cap_ceiling.test.sql +303 -0
  50. package/tests/agent_board_delegation_enforcement.test.sql +55 -6
  51. package/tests/agent_board_delegation_policies.test.sql +107 -1
  52. package/tests/agent_board_fedsession.test.sql +6 -4
  53. package/tests/agent_board_fedsession_autojoin.test.sql +181 -0
  54. package/tests/agent_board_fleet_domain_reclaim.test.sql +419 -0
  55. package/tests/agent_board_fleet_machine_hijack.test.sql +190 -0
  56. package/tests/agent_board_fleet_machine_reactivation.test.sql +426 -0
  57. package/tests/agent_board_fleet_machine_reclaim.test.sql +509 -0
  58. package/tests/agent_board_fleet_machines_rls.test.sql +79 -0
  59. package/tests/agent_board_fleet_policy.test.sql +2 -2
  60. package/tests/agent_board_gatenull_membstate.test.sql +352 -0
  61. package/tests/agent_board_grants_hygiene.test.sql +408 -0
  62. package/tests/agent_board_identity_providers.test.sql +9 -0
  63. package/tests/agent_board_inbox_reads.test.sql +29 -12
  64. package/tests/agent_board_inbox_rpcs.test.sql +44 -34
  65. package/tests/agent_board_invitepolicy.test.sql +205 -0
  66. package/tests/agent_board_leaveidem.test.sql +194 -0
  67. package/tests/agent_board_mint_fleet_agent_session.test.sql +10 -10
  68. package/tests/agent_board_mint_harden.test.sql +303 -0
  69. package/tests/agent_board_mint_harden_backfill.test.sql +95 -0
  70. package/tests/agent_board_obsgate.test.sql +178 -0
  71. package/tests/agent_board_obsgate2.test.sql +153 -0
  72. package/tests/agent_board_obsgate3.test.sql +170 -0
  73. package/tests/agent_board_obsgate4.test.sql +196 -0
  74. package/tests/agent_board_portal_offline_invariant.test.sql +13 -2
  75. package/tests/agent_board_pubexec_class.test.sql +53 -0
  76. package/tests/agent_board_rejectsem.test.sql +271 -0
  77. package/tests/agent_board_resigning_refresh.test.sql +1 -1
  78. package/tests/agent_board_resolve_noop_retire.test.sql +71 -0
  79. package/tests/agent_board_retention_metadata_acl.test.sql +53 -0
  80. package/tests/agent_board_revoke_agent_subtree.test.sql +3 -3
  81. package/tests/agent_board_rolereset.test.sql +351 -0
  82. package/tests/agent_board_roomdeleg.test.sql +5 -3
  83. package/tests/agent_board_roomdeleg_lane_b.test.sql +144 -0
  84. package/tests/agent_board_roomlink.test.sql +25 -9
  85. package/tests/agent_board_rowid.test.sql +1274 -0
  86. package/tests/agent_board_signature_rls_reads.test.sql +3 -3
  87. package/tests/agent_board_signed_write_gateway.test.sql +3 -3
  88. package/tests/agent_board_signing_challenge_pending_cap.test.sql +2 -2
  89. package/tests/agent_board_signing_challenge_reaper.test.sql +2 -2
  90. package/tests/agent_board_signing_proof_rpcs.test.sql +4 -4
  91. package/tests/agent_board_signing_store.test.sql +6 -6
  92. package/tests/fixtures/isolation-substrate.sql +93 -0
  93. package/tests/fixtures/test-prereqs.sql +33 -0
  94. package/tests/isolation/expected/claimgate_ownerless_quota.out +36 -0
  95. package/tests/isolation/expected/claimkey_renew_race.out +38 -0
  96. package/tests/isolation/expected/consent_approval_lock.out +43 -0
  97. package/tests/isolation/expected/consent_emit_actual_state.out +37 -0
  98. package/tests/isolation/expected/domain_reclaim_revoke_race.out +40 -0
  99. package/tests/isolation/expected/reactivate_revoke_race.out +80 -0
  100. package/tests/isolation/expected/reclaim_revoke_race.out +40 -0
  101. package/tests/isolation/specs/claimgate_ownerless_quota.spec +77 -0
  102. package/tests/isolation/specs/claimkey_renew_race.spec +67 -0
  103. package/tests/isolation/specs/consent_approval_lock.spec +98 -0
  104. package/tests/isolation/specs/consent_emit_actual_state.spec +79 -0
  105. package/tests/isolation/specs/domain_reclaim_revoke_race.spec +88 -0
  106. package/tests/isolation/specs/reactivate_revoke_race.spec +115 -0
  107. package/tests/isolation/specs/reclaim_revoke_race.spec +94 -0
  108. package/tests/seeds/20260806000100_agent_board_consent_substrate.sql.pre.sql +19 -0
  109. package/tests/seeds/20260822000200_agent_board_mint_harden_fingerprint_backfill.sql.pre.sql +39 -0
@@ -2,7 +2,7 @@
2
2
  "schema": "agent_board_schema_manifest.v1",
3
3
  "interface": "IF-0-MBPLANE-BUNDLE-1",
4
4
  "package": "@consiliency/agent-board-schema",
5
- "packageVersion": "1.10.0",
5
+ "packageVersion": "1.22.0",
6
6
  "schemaVersion": 8,
7
7
  "minClientVersion": "1.1.0",
8
8
  "source": {
@@ -46,8 +46,8 @@
46
46
  "usage": "upsert (retention/monitoring defaults; on conflict do nothing)"
47
47
  }
48
48
  ],
49
- "migrationCount": 79,
50
- "aggregateSha256": "6e82ca1943a3848b3f7c871e97cdf82387194ac361e965111785e236a0e850fd",
49
+ "migrationCount": 113,
50
+ "aggregateSha256": "fb690d702458562b331aed192580f1568018d9d007368c8b9edd45d35d18ad96",
51
51
  "migrations": [
52
52
  {
53
53
  "order": 0,
@@ -759,6 +759,312 @@
759
759
  "sourceRef": "message-board",
760
760
  "bytes": 15404,
761
761
  "sha256": "5f300449c29ec05c2cd3c2cd7eca622ca41e8b32b8856c5bc0695b5750a196e7"
762
+ },
763
+ {
764
+ "order": 79,
765
+ "id": "20260729000100_agent_board_fedsession_autojoin_default_board",
766
+ "filename": "20260729000100_agent_board_fedsession_autojoin_default_board.sql",
767
+ "origin": "message-board-forward",
768
+ "sourceRef": "message-board",
769
+ "bytes": 18252,
770
+ "sha256": "6f3a2db6c7349119b3893fe530788236ef5ccf4e6b0f3e21235497b8b7b232c0"
771
+ },
772
+ {
773
+ "order": 80,
774
+ "id": "20260730000100_agent_board_gatenull_service_role_bypass",
775
+ "filename": "20260730000100_agent_board_gatenull_service_role_bypass.sql",
776
+ "origin": "message-board-forward",
777
+ "sourceRef": "message-board",
778
+ "bytes": 17187,
779
+ "sha256": "db8b2a93996c1d61bd34fc58a5e4b3056563c53bb2eb20cbb4a3b0b799a0d91e"
780
+ },
781
+ {
782
+ "order": 81,
783
+ "id": "20260730000200_agent_board_membstate_authz",
784
+ "filename": "20260730000200_agent_board_membstate_authz.sql",
785
+ "origin": "message-board-forward",
786
+ "sourceRef": "message-board",
787
+ "bytes": 11567,
788
+ "sha256": "a4d935614f970a946f27a5925c0166e1d41510a82078e559fb769f4ea39afc2e"
789
+ },
790
+ {
791
+ "order": 82,
792
+ "id": "20260731000100_agent_board_agentsdir_column_scope",
793
+ "filename": "20260731000100_agent_board_agentsdir_column_scope.sql",
794
+ "origin": "message-board-forward",
795
+ "sourceRef": "message-board",
796
+ "bytes": 5715,
797
+ "sha256": "e05ddbbcf778828dbc4ba2631a5a288567d361371a60373c7e9090b718aa7433"
798
+ },
799
+ {
800
+ "order": 83,
801
+ "id": "20260801000100_agent_board_leaveidem_terminal_noop",
802
+ "filename": "20260801000100_agent_board_leaveidem_terminal_noop.sql",
803
+ "origin": "message-board-forward",
804
+ "sourceRef": "message-board",
805
+ "bytes": 17467,
806
+ "sha256": "72b20a3a365d0c84969cd1129cbc04578ee487a70e28a4245171c2abc68ec779"
807
+ },
808
+ {
809
+ "order": 84,
810
+ "id": "20260802000100_agent_board_rolereset_reentry_clamp",
811
+ "filename": "20260802000100_agent_board_rolereset_reentry_clamp.sql",
812
+ "origin": "message-board-forward",
813
+ "sourceRef": "message-board",
814
+ "bytes": 12983,
815
+ "sha256": "d04f596cdc97dc2ddc83348ee49c48888b334d12c31394586e7058409fa48cce"
816
+ },
817
+ {
818
+ "order": 85,
819
+ "id": "20260803000100_agent_board_rowid_total_order",
820
+ "filename": "20260803000100_agent_board_rowid_total_order.sql",
821
+ "origin": "message-board-forward",
822
+ "sourceRef": "message-board",
823
+ "bytes": 56061,
824
+ "sha256": "a3c58ff1f55d3134c6096d10bf56df09db573938e7b4b92c13b7389451dd4c3c"
825
+ },
826
+ {
827
+ "order": 86,
828
+ "id": "20260804000100_agent_board_hygiene_actor_binding_rls",
829
+ "filename": "20260804000100_agent_board_hygiene_actor_binding_rls.sql",
830
+ "origin": "message-board-forward",
831
+ "sourceRef": "message-board",
832
+ "bytes": 10114,
833
+ "sha256": "3feac0b5002bbff56c89adc3b9f071e21e1bb5ab2c4eea1571cfb61f254caa88"
834
+ },
835
+ {
836
+ "order": 87,
837
+ "id": "20260806000100_agent_board_consent_substrate",
838
+ "filename": "20260806000100_agent_board_consent_substrate.sql",
839
+ "origin": "message-board-forward",
840
+ "sourceRef": "message-board",
841
+ "bytes": 17238,
842
+ "sha256": "91ba2ec5885dfcaaa138ab3da3665a6779b6149147045773dfcbb707cfd9db07"
843
+ },
844
+ {
845
+ "order": 88,
846
+ "id": "20260807000100_agent_board_consent_emission",
847
+ "filename": "20260807000100_agent_board_consent_emission.sql",
848
+ "origin": "message-board-forward",
849
+ "sourceRef": "message-board",
850
+ "bytes": 31140,
851
+ "sha256": "b6fb6f8254169d4fc3ab8016ab2f9ec2a2800c800178aebb602ff1db4aa0e7ee"
852
+ },
853
+ {
854
+ "order": 89,
855
+ "id": "20260808000100_agent_board_rejectsem",
856
+ "filename": "20260808000100_agent_board_rejectsem.sql",
857
+ "origin": "message-board-forward",
858
+ "sourceRef": "message-board",
859
+ "bytes": 7879,
860
+ "sha256": "945a719e127573816cb9d18e318cf0778a99f3b0f8239b8e6ae0f8e62b04d919"
861
+ },
862
+ {
863
+ "order": 90,
864
+ "id": "20260809000100_agent_board_consent_gating",
865
+ "filename": "20260809000100_agent_board_consent_gating.sql",
866
+ "origin": "message-board-forward",
867
+ "sourceRef": "message-board",
868
+ "bytes": 26782,
869
+ "sha256": "666e413ae1474e5e00de4d2bf2e7f7733f6ad149c91c3ef9a938e049115e387c"
870
+ },
871
+ {
872
+ "order": 91,
873
+ "id": "20260810000100_agent_board_consent_locking",
874
+ "filename": "20260810000100_agent_board_consent_locking.sql",
875
+ "origin": "message-board-forward",
876
+ "sourceRef": "message-board",
877
+ "bytes": 25104,
878
+ "sha256": "d027468d3adb8563563f4fac4b13140013b68f28f39abe37c1de487c7fd36978"
879
+ },
880
+ {
881
+ "order": 92,
882
+ "id": "20260811000100_agent_board_retention_metadata_revoke",
883
+ "filename": "20260811000100_agent_board_retention_metadata_revoke.sql",
884
+ "origin": "message-board-forward",
885
+ "sourceRef": "message-board",
886
+ "bytes": 1476,
887
+ "sha256": "8d08dc986d532862d6593fe49b2e38e7447e57006360cae3406127c820ec19d6"
888
+ },
889
+ {
890
+ "order": 93,
891
+ "id": "20260812000100_agent_board_pubexec_class_revoke",
892
+ "filename": "20260812000100_agent_board_pubexec_class_revoke.sql",
893
+ "origin": "message-board-forward",
894
+ "sourceRef": "message-board",
895
+ "bytes": 2946,
896
+ "sha256": "34dabae96c11ab7fce68d71f1aa782eccef1bce5de4ad0567013d73949815606"
897
+ },
898
+ {
899
+ "order": 94,
900
+ "id": "20260813000100_agent_board_invitepolicy_block",
901
+ "filename": "20260813000100_agent_board_invitepolicy_block.sql",
902
+ "origin": "message-board-forward",
903
+ "sourceRef": "message-board",
904
+ "bytes": 18997,
905
+ "sha256": "8ee82c196483bf7d80091a46f6189328934fda2345947aea905505e37090719d"
906
+ },
907
+ {
908
+ "order": 95,
909
+ "id": "20260814000100_agent_board_obsgate_thread_post_policy",
910
+ "filename": "20260814000100_agent_board_obsgate_thread_post_policy.sql",
911
+ "origin": "message-board-forward",
912
+ "sourceRef": "message-board",
913
+ "bytes": 11686,
914
+ "sha256": "b36433d8aa78413b3d1e5119c45f8a24d37de053d03f4c4fd47b449814c4becb"
915
+ },
916
+ {
917
+ "order": 96,
918
+ "id": "20260815000100_agent_board_obsgate2_authoring_gates",
919
+ "filename": "20260815000100_agent_board_obsgate2_authoring_gates.sql",
920
+ "origin": "message-board-forward",
921
+ "sourceRef": "message-board",
922
+ "bytes": 14033,
923
+ "sha256": "7e76aa13aef8450aba50eb08d9da66b75a55457f41e3c92662137a1f6d7e2850"
924
+ },
925
+ {
926
+ "order": 97,
927
+ "id": "20260816000100_agent_board_obsgate3_task_lifecycle",
928
+ "filename": "20260816000100_agent_board_obsgate3_task_lifecycle.sql",
929
+ "origin": "message-board-forward",
930
+ "sourceRef": "message-board",
931
+ "bytes": 6623,
932
+ "sha256": "921cc40511e4070c61f7b164a7528362a9662da2b902252a3e92091f01ebf0fd"
933
+ },
934
+ {
935
+ "order": 98,
936
+ "id": "20260817000100_agent_board_obsgate4_claims_lifecycle",
937
+ "filename": "20260817000100_agent_board_obsgate4_claims_lifecycle.sql",
938
+ "origin": "message-board-forward",
939
+ "sourceRef": "message-board",
940
+ "bytes": 12334,
941
+ "sha256": "6dd2d7928df2dff87c61b52e7edb75c5ec781fec5a85dd7c4273dadfd162f8ef"
942
+ },
943
+ {
944
+ "order": 99,
945
+ "id": "20260818000100_agent_board_fleet_machines_rls_correlation",
946
+ "filename": "20260818000100_agent_board_fleet_machines_rls_correlation.sql",
947
+ "origin": "message-board-forward",
948
+ "sourceRef": "message-board",
949
+ "bytes": 2354,
950
+ "sha256": "f8bca2d75755589a1fa72d0c30ca799bd20db776d73a3a5e27832e112b57ea5d"
951
+ },
952
+ {
953
+ "order": 100,
954
+ "id": "20260819000100_agent_board_resolve_noop_retire",
955
+ "filename": "20260819000100_agent_board_resolve_noop_retire.sql",
956
+ "origin": "message-board-forward",
957
+ "sourceRef": "message-board",
958
+ "bytes": 7804,
959
+ "sha256": "68bcb6d1b7e8ee8424e6d1d13a5a7d2c7d4554f348cc2cbf946ec95999517ac5"
960
+ },
961
+ {
962
+ "order": 101,
963
+ "id": "20260820000100_agent_board_roomdeleg_lane_b",
964
+ "filename": "20260820000100_agent_board_roomdeleg_lane_b.sql",
965
+ "origin": "message-board-forward",
966
+ "sourceRef": "message-board",
967
+ "bytes": 11822,
968
+ "sha256": "2b10b8507b9bc704e9419b93d6d5d0af6d24f0ceef28c3eaa520516158f6c3e2"
969
+ },
970
+ {
971
+ "order": 102,
972
+ "id": "20260821000100_agent_board_claimgate_claimkey",
973
+ "filename": "20260821000100_agent_board_claimgate_claimkey.sql",
974
+ "origin": "message-board-forward",
975
+ "sourceRef": "message-board",
976
+ "bytes": 20128,
977
+ "sha256": "caf8a83d4f39fc0a3d76d5b97077f0c3cf281305e47c50d370e940497a211022"
978
+ },
979
+ {
980
+ "order": 103,
981
+ "id": "20260822000100_agent_board_mint_harden",
982
+ "filename": "20260822000100_agent_board_mint_harden.sql",
983
+ "origin": "message-board-forward",
984
+ "sourceRef": "message-board",
985
+ "bytes": 33756,
986
+ "sha256": "67585b17791598391515e63fa680c35cedaf27edc7ba3296f98242b925b9f490"
987
+ },
988
+ {
989
+ "order": 104,
990
+ "id": "20260822000200_agent_board_mint_harden_fingerprint_backfill",
991
+ "filename": "20260822000200_agent_board_mint_harden_fingerprint_backfill.sql",
992
+ "origin": "message-board-forward",
993
+ "sourceRef": "message-board",
994
+ "bytes": 10716,
995
+ "sha256": "8bfd8e1bde5dbe85f21f5e0eb6c8f34462d16b92a763977ad9930539ac259698"
996
+ },
997
+ {
998
+ "order": 105,
999
+ "id": "20260823000100_agent_board_fleet_machine_hijack",
1000
+ "filename": "20260823000100_agent_board_fleet_machine_hijack.sql",
1001
+ "origin": "message-board-forward",
1002
+ "sourceRef": "message-board",
1003
+ "bytes": 5078,
1004
+ "sha256": "73dcb65af8f8c754e2c6cc1c29f8649619a7653519a36a6b3acddf1a344a2bee"
1005
+ },
1006
+ {
1007
+ "order": 106,
1008
+ "id": "20260824000100_agent_board_claimgate_shadow",
1009
+ "filename": "20260824000100_agent_board_claimgate_shadow.sql",
1010
+ "origin": "message-board-forward",
1011
+ "sourceRef": "message-board",
1012
+ "bytes": 25078,
1013
+ "sha256": "da42126b6cf40b0b044513313b0921394cd25de13426b16bcebd09bbcf5310a1"
1014
+ },
1015
+ {
1016
+ "order": 107,
1017
+ "id": "20260825000100_agent_board_claimgate_enforce",
1018
+ "filename": "20260825000100_agent_board_claimgate_enforce.sql",
1019
+ "origin": "message-board-forward",
1020
+ "sourceRef": "message-board",
1021
+ "bytes": 37587,
1022
+ "sha256": "7264c8ff93f366238788f1a68c72a7ca0651da6e1b0cd9e27516e9acc01e6d3f"
1023
+ },
1024
+ {
1025
+ "order": 108,
1026
+ "id": "20260826000100_agent_board_fleet_machine_reactivation",
1027
+ "filename": "20260826000100_agent_board_fleet_machine_reactivation.sql",
1028
+ "origin": "message-board-forward",
1029
+ "sourceRef": "message-board",
1030
+ "bytes": 23827,
1031
+ "sha256": "fe437413046fba73b5306f1e21de81116369989a5d6e934a57c83c91bd5abb4b"
1032
+ },
1033
+ {
1034
+ "order": 109,
1035
+ "id": "20260828000100_agent_board_delegation_cap_ceiling",
1036
+ "filename": "20260828000100_agent_board_delegation_cap_ceiling.sql",
1037
+ "origin": "message-board-forward",
1038
+ "sourceRef": "message-board",
1039
+ "bytes": 25838,
1040
+ "sha256": "b9556374b6e512cc4f2ffc6a6d80d2abceca9ae1963e0f0ecdcd0485f6580e9e"
1041
+ },
1042
+ {
1043
+ "order": 110,
1044
+ "id": "20260829000100_agent_board_fleet_machine_reclaim",
1045
+ "filename": "20260829000100_agent_board_fleet_machine_reclaim.sql",
1046
+ "origin": "message-board-forward",
1047
+ "sourceRef": "message-board",
1048
+ "bytes": 26058,
1049
+ "sha256": "6ba17d49d5ef9ced3824f4f7ef7dbb40dd9ac3564576dad8b479545b2bab3b19"
1050
+ },
1051
+ {
1052
+ "order": 111,
1053
+ "id": "20260830000100_agent_board_delegation_sole_writer",
1054
+ "filename": "20260830000100_agent_board_delegation_sole_writer.sql",
1055
+ "origin": "message-board-forward",
1056
+ "sourceRef": "message-board",
1057
+ "bytes": 2927,
1058
+ "sha256": "26f5febc3c63f665eeb6eca2909d72187f16bae2c2643065e8ddb7c919086a86"
1059
+ },
1060
+ {
1061
+ "order": 112,
1062
+ "id": "20260831000100_agent_board_fleet_domain_reclaim",
1063
+ "filename": "20260831000100_agent_board_fleet_domain_reclaim.sql",
1064
+ "origin": "message-board-forward",
1065
+ "sourceRef": "message-board",
1066
+ "bytes": 25051,
1067
+ "sha256": "8d24ec4d682969a5d9339aec0573fad65ee95993dce2f8dca214906549b5ebe8"
762
1068
  }
763
1069
  ],
764
1070
  "excludedBridge": {
@@ -37,9 +37,9 @@ describe('manifest integrity', () => {
37
37
  expect(manifest.schemaVersion).toBe(8);
38
38
  expect(manifest.minClientVersion).toMatch(/^\d+\.\d+\.\d+$/);
39
39
  });
40
- it('registers the four MBAUTHZ + four MBSENDAUTHZ + four MBSESSION + four MBDELEG + three MBFED + three MBHARDEN + two MBPORTALGATE + two MBPORTAL-PR32 + two ROOMOWN + two ROOMLINK + one ROOMDELEG + one LOCALAUTH + one ROOMUIAPI + one FEDSESSION forward migrations (migrationCount = prior 78 + 1 = 79)', () => {
40
+ it('registers the four MBAUTHZ + four MBSENDAUTHZ + four MBSESSION + four MBDELEG + three MBFED + three MBHARDEN + two MBPORTALGATE + two MBPORTAL-PR32 + two ROOMOWN + two ROOMLINK + one ROOMDELEG + one LOCALAUTH + one ROOMUIAPI + one FEDSESSION + one FEDSESSION-AUTOJOIN + one GATENULL + one MEMBSTATE + one AGENTSDIR + one LEAVEIDEM + one ROLERESET + one MBROWID + one MBHYGIENE + one MBCONSENT-A + one MBCONSENT-B(a) + one MBCONSENT-B(i) + one MBCONSENT-B(ii) + one MBCONSENT-B(iii) + one MBHARDEN-#97 + one MBHARDEN-#118 + one INVITEPOLICY + one OBSGATE + one OBSGATE-2 + one OBSGATE-3 + one OBSGATE-4 + one FLEETMACHINERLS + one RESOLVENOOP + one ROOMDELEG-LANEB + one CLAIMKEY + two MINTHARDEN + one FLEETMACHINEHIJACK + one CLAIMGATE-SHADOW + one CLAIMGATE-ENFORCE + one FLEETMACHINEREACTIVATION + one DELEGCAPCEILING + one FLEETMACHINERECLAIM + one DELEGSOLEWRITER + one FLEETDOMAINRECLAIM forward migrations (migrationCount = prior 112 + 1 = 113)', () => {
41
41
  expect(manifest.migrationCount).toBe(manifest.migrations.length);
42
- expect(manifest.migrationCount).toBe(79);
42
+ expect(manifest.migrationCount).toBe(113);
43
43
  // MBSESSION switched enforcement on (scoped-send re-grant): the client-visible
44
44
  // schema version bumped to 8. MBDELEG tightens delegation and MBFED adds only
45
45
  // enrollment-only additive surface (identity_providers registry, enrollment audit,
@@ -95,6 +95,51 @@ describe('manifest integrity', () => {
95
95
  // backing the /portal-session Option A self-signed access-token minter. Additive
96
96
  // (adds a nullable mode column to enrollment_federation_audit); schema stays 8.
97
97
  '20260728000100_agent_board_enroll_federated_human.sql',
98
+ // FEDSESSION-AUTOJOIN: per-issuer default_board_id + auto-join a fresh fed-human to it
99
+ // (baseline member, first-time-only, non-fatal) inside enroll_federated_human. Additive;
100
+ // schema stays 8.
101
+ '20260729000100_agent_board_fedsession_autojoin_default_board.sql',
102
+ // GATENULL (#58): service_role-bypass hardening — an authenticated principal with no
103
+ // ACTIVE agent no longer takes the null-actor bypass on the four board-mutating RPCs.
104
+ '20260730000100_agent_board_gatenull_service_role_bypass.sql',
105
+ // MEMBSTATE (#75): update_board_membership gains an authorization model (it previously
106
+ // had none) — self-service transitions only, owner/admin for another agent's row.
107
+ '20260730000200_agent_board_membstate_authz.sql',
108
+ // AGENTSDIR (#80): agent_board.agents column read posture — `authenticated` may select only
109
+ // the directory columns; identity-linkage columns + metadata are withheld. Grants only.
110
+ '20260731000100_agent_board_agentsdir_column_scope.sql',
111
+ // LEAVEIDEM (#81): terminal membership states are true no-ops; left_at is preserved and
112
+ // the reserved ops_* metadata namespace is stripped from caller input.
113
+ '20260801000100_agent_board_leaveidem_terminal_noop.sql',
114
+ // ROLERESET (#79): role is not identity — the mutator clamps role to the table default on
115
+ // any non-active -> joined|subscribed re-entry (UPDATE branch only, never a trigger), and
116
+ // grant_board_role refuses a grant onto a non-active membership (pre-check P0002 + the
117
+ // mirrored UPDATE predicate that closes the TOCTOU window).
118
+ '20260802000100_agent_board_rolereset_reentry_clamp.sql',
119
+ // MBROWID: one authoritative membership row per (board_id, agent_id) — total-order reads
120
+ // (created_at desc, id desc) with duplicate-aware active-row selection, and the R-LINK-7
121
+ // bootstrap guard that suppresses a removed creator without breaking 'left' recovery.
122
+ '20260803000100_agent_board_rowid_total_order.sql',
123
+ // MBHYGIENE (#76): actor bound through _resolved_actor_agent_id in the addressing
124
+ // resolvers; RLS on schema_version as bundle-level defense in depth; and the two dead
125
+ // callback policy arms rewritten from an inner join through RLS-filtered
126
+ // callback_endpoints to a separate exists(...).
127
+ '20260804000100_agent_board_hygiene_actor_binding_rls.sql',
128
+ // MBCONSENT-A (#82/#89/#90): the consent SUBSTRATE only -- ledger, anti-forge
129
+ // rules, privilege posture, the two frozen predicates, backfill. No route changes.
130
+ '20260806000100_agent_board_consent_substrate.sql',
131
+ // MBCONSENT-B(a): emission only. Every membership transition writes one ledger
132
+ // event; nothing reads the predicate yet, so no call that succeeds can start failing.
133
+ '20260807000100_agent_board_consent_emission.sql',
134
+ // MBCONSENT-B(i) (#89): a refusal is not an eviction -- resolve_board_request
135
+ // writes `left`, so one rejection is no longer a permanent self-unrecoverable bar.
136
+ '20260808000100_agent_board_rejectsem.sql',
137
+ // MBCONSENT-B(ii) (#82, #108): route gating -- the change that closes the hole.
138
+ // NOT inert: calls that succeed today begin failing, by design.
139
+ '20260809000100_agent_board_consent_gating.sql',
140
+ // MBCONSENT-B(iii) (#109/#110 + the gating race): validate and mutate the SAME
141
+ // row. The sink gains an optional row identity and event kind.
142
+ '20260810000100_agent_board_consent_locking.sql',
98
143
  ]) {
99
144
  expect(names.has(f)).toBe(true);
100
145
  }
@@ -157,3 +202,79 @@ describe('plan / check postures + exit codes (SemVer contract)', () => {
157
202
  expect(EXIT).toEqual({ exact: 0, behind: 10, ahead: 11, divergent: 12, error: 13 });
158
203
  });
159
204
  });
205
+
206
+ // BACKFILL PRESENCE. The pgTAP suite proves the backfill STATEMENT's semantics by re-running
207
+ // it, so it would stay green if the migration's copy were deleted -- and the migration's own
208
+ // backfill is a no-op under that harness anyway, because the runner applies migrations to an
209
+ // EMPTY schema and there are no pre-existing rows to annotate. Semantics and presence are two
210
+ // different claims and pgTAP can only make the first. This makes the second, by reading the
211
+ // shipped file.
212
+ describe('MBCONSENT-A backfill presence', () => {
213
+ const sql = readFileSync(
214
+ new URL('../migrations/20260806000100_agent_board_consent_substrate.sql', import.meta.url),
215
+ 'utf8',
216
+ );
217
+ const stripped = sql.replace(/^\s*--.*$/gm, '');
218
+
219
+ it('ships a backfill that annotates pre-existing non-active memberships', () => {
220
+ expect(stripped).toMatch(/insert\s+into\s+agent_board\.board_membership_events/i);
221
+ expect(stripped).toMatch(/'backfill_neutral'/);
222
+ expect(stripped).toMatch(/membership_state\s+in\s*\(\s*'requested'\s*,\s*'invited'\s*\)/i);
223
+ });
224
+
225
+ it('deduplicates per subject, so duplicate pending rows cannot emit one event each', () => {
226
+ const idx = stripped.indexOf("'backfill_neutral'");
227
+ expect(idx).toBeGreaterThan(-1);
228
+ const head = stripped.slice(Math.max(0, idx - 400), idx);
229
+ expect(head).toMatch(/distinct\s+on\s*\(\s*bm\.board_id\s*,\s*bm\.agent_id\s*\)/i);
230
+ });
231
+
232
+ it('guards the backfill with not-exists so re-application is idempotent', () => {
233
+ const idx = stripped.indexOf("'backfill_neutral'");
234
+ expect(stripped.slice(idx)).toMatch(/not\s+exists\s*\(/i);
235
+ });
236
+
237
+ it('correlates the not-exists guard on BOTH subject keys', () => {
238
+ // A guard that compares the wrong pair (e.g. e.agent_id = bm.board_id) still contains a
239
+ // `not exists (` token and still reads plausibly, but re-application duplicates every row.
240
+ // The pgTAP idempotency test exercises a hand-copied statement, so only this sees the
241
+ // shipped one.
242
+ const idx = stripped.indexOf("'backfill_neutral'");
243
+ const tail = stripped.slice(idx, idx + 1400);
244
+ expect(tail).toMatch(/e\.board_id\s*=\s*bm\.board_id/i);
245
+ expect(tail).toMatch(/e\.agent_id\s*=\s*bm\.agent_id/i);
246
+ });
247
+
248
+ it('annotates as board-authored, never as consent', () => {
249
+ const idx = stripped.indexOf("'backfill_neutral'");
250
+ const tail = stripped.slice(idx, idx + 800);
251
+ expect(tail).toMatch(/'board-authored'/);
252
+ expect(tail).not.toMatch(/'target-authored'|'operator-designated'/);
253
+ });
254
+
255
+ // These two are not style points -- losing either ABORTS THE MIGRATION on deploy, because a
256
+ // board-authored event requires actor <> subject and the anti-forge CHECK enforces it.
257
+ it('takes the actor from the BOARD creator, not the membership row', () => {
258
+ const idx = stripped.indexOf("'backfill_neutral'");
259
+ const tail = stripped.slice(idx, idx + 800);
260
+ // b.created_by_agent_id (the board's creator). bm.created_by_agent_id is whoever created
261
+ // the MEMBERSHIP row, which can be the subject -- producing board-authored with
262
+ // actor = subject, which the CHECK rejects.
263
+ expect(tail).toMatch(/\bb\.created_by_agent_id\b/);
264
+ expect(tail).not.toMatch(/'board-authored',\s*\n?\s*bm\.created_by_agent_id/);
265
+ });
266
+
267
+ it('joins boards on the membership row board_id', () => {
268
+ // Breaking this join silently drops the production backfill while the pgTAP copy and every
269
+ // looser regex stay green -- the specific mutation the review named.
270
+ const idx = stripped.indexOf("'backfill_neutral'");
271
+ const tail = stripped.slice(idx, idx + 1200);
272
+ expect(tail).toMatch(/join\s+agent_board\.boards\s+b\s+on\s+b\.id\s*=\s*bm\.board_id/i);
273
+ });
274
+
275
+ it('excludes rows where the board creator IS the subject', () => {
276
+ const idx = stripped.indexOf("'backfill_neutral'");
277
+ const tail = stripped.slice(idx, idx + 1200);
278
+ expect(tail).toMatch(/b\.created_by_agent_id\s*<>\s*bm\.agent_id/);
279
+ });
280
+ });