@consiliency/agent-board-schema 1.12.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 (104) hide show
  1. package/fixtures/already-applied.json +124 -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/package.json +1 -1
  34. package/schema-manifest.json +282 -3
  35. package/src/tooling.test.mjs +113 -2
  36. package/tests/agent_board_actorspoof.test.sql +349 -0
  37. package/tests/agent_board_agentsdir.test.sql +154 -0
  38. package/tests/agent_board_authbound_boundary.test.sql +9 -1
  39. package/tests/agent_board_claimgate_enforce.test.sql +464 -0
  40. package/tests/agent_board_claimgate_predicate.test.sql +360 -0
  41. package/tests/agent_board_claimkey.test.sql +229 -0
  42. package/tests/agent_board_consent_backfill.test.sql +48 -0
  43. package/tests/agent_board_consent_emission.test.sql +601 -0
  44. package/tests/agent_board_consent_gating.test.sql +489 -0
  45. package/tests/agent_board_consent_substrate.test.sql +720 -0
  46. package/tests/agent_board_delegation_cap_ceiling.test.sql +303 -0
  47. package/tests/agent_board_delegation_enforcement.test.sql +55 -6
  48. package/tests/agent_board_delegation_policies.test.sql +107 -1
  49. package/tests/agent_board_fedsession.test.sql +6 -4
  50. package/tests/agent_board_fleet_domain_reclaim.test.sql +419 -0
  51. package/tests/agent_board_fleet_machine_hijack.test.sql +190 -0
  52. package/tests/agent_board_fleet_machine_reactivation.test.sql +426 -0
  53. package/tests/agent_board_fleet_machine_reclaim.test.sql +509 -0
  54. package/tests/agent_board_fleet_machines_rls.test.sql +79 -0
  55. package/tests/agent_board_fleet_policy.test.sql +2 -2
  56. package/tests/agent_board_grants_hygiene.test.sql +408 -0
  57. package/tests/agent_board_identity_providers.test.sql +9 -0
  58. package/tests/agent_board_inbox_reads.test.sql +29 -12
  59. package/tests/agent_board_inbox_rpcs.test.sql +44 -34
  60. package/tests/agent_board_invitepolicy.test.sql +205 -0
  61. package/tests/agent_board_leaveidem.test.sql +194 -0
  62. package/tests/agent_board_mint_fleet_agent_session.test.sql +10 -10
  63. package/tests/agent_board_mint_harden.test.sql +303 -0
  64. package/tests/agent_board_mint_harden_backfill.test.sql +95 -0
  65. package/tests/agent_board_obsgate.test.sql +178 -0
  66. package/tests/agent_board_obsgate2.test.sql +153 -0
  67. package/tests/agent_board_obsgate3.test.sql +170 -0
  68. package/tests/agent_board_obsgate4.test.sql +196 -0
  69. package/tests/agent_board_portal_offline_invariant.test.sql +13 -2
  70. package/tests/agent_board_pubexec_class.test.sql +53 -0
  71. package/tests/agent_board_rejectsem.test.sql +271 -0
  72. package/tests/agent_board_resigning_refresh.test.sql +1 -1
  73. package/tests/agent_board_resolve_noop_retire.test.sql +71 -0
  74. package/tests/agent_board_retention_metadata_acl.test.sql +53 -0
  75. package/tests/agent_board_revoke_agent_subtree.test.sql +3 -3
  76. package/tests/agent_board_rolereset.test.sql +351 -0
  77. package/tests/agent_board_roomdeleg.test.sql +5 -3
  78. package/tests/agent_board_roomdeleg_lane_b.test.sql +144 -0
  79. package/tests/agent_board_roomlink.test.sql +25 -9
  80. package/tests/agent_board_rowid.test.sql +1274 -0
  81. package/tests/agent_board_signature_rls_reads.test.sql +3 -3
  82. package/tests/agent_board_signed_write_gateway.test.sql +3 -3
  83. package/tests/agent_board_signing_challenge_pending_cap.test.sql +2 -2
  84. package/tests/agent_board_signing_challenge_reaper.test.sql +2 -2
  85. package/tests/agent_board_signing_proof_rpcs.test.sql +4 -4
  86. package/tests/agent_board_signing_store.test.sql +6 -6
  87. package/tests/fixtures/isolation-substrate.sql +93 -0
  88. package/tests/fixtures/test-prereqs.sql +33 -0
  89. package/tests/isolation/expected/claimgate_ownerless_quota.out +36 -0
  90. package/tests/isolation/expected/claimkey_renew_race.out +38 -0
  91. package/tests/isolation/expected/consent_approval_lock.out +43 -0
  92. package/tests/isolation/expected/consent_emit_actual_state.out +37 -0
  93. package/tests/isolation/expected/domain_reclaim_revoke_race.out +40 -0
  94. package/tests/isolation/expected/reactivate_revoke_race.out +80 -0
  95. package/tests/isolation/expected/reclaim_revoke_race.out +40 -0
  96. package/tests/isolation/specs/claimgate_ownerless_quota.spec +77 -0
  97. package/tests/isolation/specs/claimkey_renew_race.spec +67 -0
  98. package/tests/isolation/specs/consent_approval_lock.spec +98 -0
  99. package/tests/isolation/specs/consent_emit_actual_state.spec +79 -0
  100. package/tests/isolation/specs/domain_reclaim_revoke_race.spec +88 -0
  101. package/tests/isolation/specs/reactivate_revoke_race.spec +115 -0
  102. package/tests/isolation/specs/reclaim_revoke_race.spec +94 -0
  103. package/tests/seeds/20260806000100_agent_board_consent_substrate.sql.pre.sql +19 -0
  104. 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.12.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": 82,
50
- "aggregateSha256": "f6248b647fc1de859d68650ad8f9e88964820642da712893476429a4edb341f9",
49
+ "migrationCount": 113,
50
+ "aggregateSha256": "fb690d702458562b331aed192580f1568018d9d007368c8b9edd45d35d18ad96",
51
51
  "migrations": [
52
52
  {
53
53
  "order": 0,
@@ -786,6 +786,285 @@
786
786
  "sourceRef": "message-board",
787
787
  "bytes": 11567,
788
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"
789
1068
  }
790
1069
  ],
791
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 + one FEDSESSION-AUTOJOIN + one GATENULL + one MEMBSTATE forward migrations (migrationCount = prior 80 + 2 = 82)', () => {
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(82);
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,
@@ -105,6 +105,41 @@ describe('manifest integrity', () => {
105
105
  // MEMBSTATE (#75): update_board_membership gains an authorization model (it previously
106
106
  // had none) — self-service transitions only, owner/admin for another agent's row.
107
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',
108
143
  ]) {
109
144
  expect(names.has(f)).toBe(true);
110
145
  }
@@ -167,3 +202,79 @@ describe('plan / check postures + exit codes (SemVer contract)', () => {
167
202
  expect(EXIT).toEqual({ exact: 0, behind: 10, ahead: 11, divergent: 12, error: 13 });
168
203
  });
169
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
+ });