@consiliency/agent-board-schema 1.64.0 → 1.74.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 (171) hide show
  1. package/README.md +19 -0
  2. package/fixtures/already-applied.json +44 -4
  3. package/migrations/20261015000100_agent_board_session_provenance.sql +367 -0
  4. package/migrations/20261015000200_agent_board_request_preserve_removed.sql +87 -0
  5. package/migrations/20261015000300_agent_board_rls_correlation.sql +132 -0
  6. package/migrations/20261015000400_agent_board_resolution_authority.sql +146 -0
  7. package/migrations/20261026000100_agent_board_thread_association.sql +1287 -0
  8. package/migrations/20261101000100_agent_board_session_measured_mint.sql +145 -0
  9. package/migrations/20261104065658_agent_board_reply_delivery.sql +659 -0
  10. package/migrations/20261104170000_agent_board_tasking_replay_scope.sql +320 -0
  11. package/migrations/20261104180000_agent_board_delivery_writer_execute.sql +51 -0
  12. package/migrations/20261104190000_agent_board_message_replay_scope.sql +373 -0
  13. package/package.json +1 -1
  14. package/schema-manifest.json +93 -3
  15. package/src/deployment-drift-main.test.mjs +156 -0
  16. package/src/deployment-drift-script.test.mjs +14 -1
  17. package/src/policy-comment.test.mjs +17 -0
  18. package/src/tooling.test.mjs +12 -2
  19. package/tests/agent_board_661_reply_delivery.test.sql +185 -0
  20. package/tests/agent_board_667_boundary.test.sql +162 -0
  21. package/tests/agent_board_667_conversion_branches.test.sql +91 -0
  22. package/tests/agent_board_667_conversion_profile.test.sql +112 -0
  23. package/tests/agent_board_667_history_class.test.sql +785 -0
  24. package/tests/agent_board_667_native_cast_effect.test.sql +88 -0
  25. package/tests/agent_board_667_realtime_apply_behavior.test.sql +117 -0
  26. package/tests/agent_board_667_realtime_apply_controls.test.sql +143 -0
  27. package/tests/agent_board_667_realtime_apply_profile.test.sql +61 -0
  28. package/tests/agent_board_667_retention.test.sql +201 -0
  29. package/tests/agent_board_667_routing.test.sql +294 -0
  30. package/tests/agent_board_667_sender_effects.test.sql +100 -0
  31. package/tests/agent_board_667_sender_profile_controls.test.sql +29 -0
  32. package/tests/agent_board_667_storage_delimiter_behavior.test.sql +84 -0
  33. package/tests/agent_board_667_storage_delimiter_controls.test.sql +23 -0
  34. package/tests/agent_board_667_storage_delimiter_profile.test.sql +61 -0
  35. package/tests/agent_board_667_storage_search_behavior.test.sql +93 -0
  36. package/tests/agent_board_667_storage_search_controls.test.sql +22 -0
  37. package/tests/agent_board_667_storage_search_profile.test.sql +60 -0
  38. package/tests/agent_board_667_storage_timestamp_behavior.test.sql +58 -0
  39. package/tests/agent_board_667_storage_timestamp_controls.test.sql +22 -0
  40. package/tests/agent_board_667_storage_timestamp_profile.test.sql +54 -0
  41. package/tests/agent_board_667_writers.test.sql +281 -0
  42. package/tests/agent_board_717_message_replay_scope.test.sql +828 -0
  43. package/tests/agent_board_717_tasking_replay_scope.test.sql +661 -0
  44. package/tests/agent_board_addressing.test.sql +8 -5
  45. package/tests/agent_board_claim_subject_gate.test.sql +7 -3
  46. package/tests/agent_board_claimpolicy_race.test.sql +39 -11
  47. package/tests/agent_board_consent_gating.test.sql +4 -4
  48. package/tests/agent_board_delegate_role_class.test.sql +33 -15
  49. package/tests/agent_board_delivery_writer_execute.test.sql +371 -0
  50. package/tests/agent_board_fk_lock_edges.test.sql +3 -0
  51. package/tests/agent_board_gatenull_membstate.test.sql +7 -4
  52. package/tests/agent_board_hosted_delegates.test.sql +5 -2
  53. package/tests/agent_board_inbox_rpcs.test.sql +5 -3
  54. package/tests/agent_board_obsgate.test.sql +8 -4
  55. package/tests/agent_board_obsgate4.test.sql +2 -2
  56. package/tests/agent_board_outbox_wake_ordering.test.sql +25 -2
  57. package/tests/agent_board_own_post_not_delivered.test.sql +11 -9
  58. package/tests/agent_board_policy_correlation.test.sql +189 -0
  59. package/tests/agent_board_request_removed.test.sql +96 -0
  60. package/tests/agent_board_resolution_authority.test.sql +190 -0
  61. package/tests/agent_board_session_identity_behavior_classes.test.sql +2 -2
  62. package/tests/agent_board_session_identity_limits.test.sql +1 -1
  63. package/tests/agent_board_session_identity_measured_mint.test.sql +342 -0
  64. package/tests/agent_board_session_identity_predicate_isolation.test.sql +146 -0
  65. package/tests/agent_board_session_provenance.test.sql +106 -0
  66. package/tests/agent_board_sidserver_authority.test.sql +69 -0
  67. package/tests/agent_board_sidserver_catalog.test.sql +47 -0
  68. package/tests/agent_board_signed_write_gateway.test.sql +4 -2
  69. package/tests/agent_board_task_thread_lock_order.test.sql +67 -42
  70. package/tests/agent_board_v2_invariants.test.sql +5 -2
  71. package/tests/agent_board_write_enforcement_class.test.sql +3 -3
  72. package/tests/catalog/function_execute_privileges.json +43 -7
  73. package/tests/catalog/p_metadata_parameters.json +16 -0
  74. package/tests/fixtures/agent_board_667_apply_rls_guard.sql +195 -0
  75. package/tests/fixtures/agent_board_667_apply_rls_provenance.md +125 -0
  76. package/tests/fixtures/agent_board_667_apply_rls_reference.sql +1903 -0
  77. package/tests/fixtures/agent_board_667_conversion_guard.sql +162 -0
  78. package/tests/fixtures/agent_board_667_conversion_reference.md +23 -0
  79. package/tests/fixtures/agent_board_667_conversion_reference.sql +5325 -0
  80. package/tests/fixtures/agent_board_667_delimiter_guard.sql +92 -0
  81. package/tests/fixtures/agent_board_667_delimiter_provenance.md +116 -0
  82. package/tests/fixtures/agent_board_667_delimiter_reference.sql +10150 -0
  83. package/tests/fixtures/agent_board_667_search_guard.sql +92 -0
  84. package/tests/fixtures/agent_board_667_search_provenance.md +141 -0
  85. package/tests/fixtures/agent_board_667_search_reference.sql +4779 -0
  86. package/tests/fixtures/agent_board_667_sender_guard.sql +102 -0
  87. package/tests/fixtures/agent_board_667_sender_reference.md +20 -0
  88. package/tests/fixtures/agent_board_667_sender_reference.sql +875 -0
  89. package/tests/fixtures/agent_board_667_timestamp_graph.sql +84 -0
  90. package/tests/fixtures/agent_board_667_timestamp_guard.sql +94 -0
  91. package/tests/fixtures/agent_board_667_timestamp_provenance.md +99 -0
  92. package/tests/fixtures/agent_board_667_timestamp_reference.sql +2938 -0
  93. package/tests/isolation/expected/association_artifact_anchor_order.out +108 -0
  94. package/tests/isolation/expected/association_board_vs_board.out +71 -0
  95. package/tests/isolation/expected/association_post_wait_authority.out +77 -0
  96. package/tests/isolation/expected/association_strong_history_writers.out +203 -0
  97. package/tests/isolation/expected/association_strong_isolation.out +185 -0
  98. package/tests/isolation/expected/association_vs_artifact_claim_escalation.out +199 -0
  99. package/tests/isolation/expected/association_vs_heartbeat.out +78 -0
  100. package/tests/isolation/expected/association_vs_multi_anchor_artifact.out +67 -0
  101. package/tests/isolation/expected/association_vs_private_message.out +67 -0
  102. package/tests/isolation/expected/association_vs_task_and_conflict.out +133 -0
  103. package/tests/isolation/expected/association_vs_taskful_cross_thread.out +133 -0
  104. package/tests/isolation/expected/consent_approval_lock.out +1 -1
  105. package/tests/isolation/expected/message_replay_scope.out +209 -0
  106. package/tests/isolation/expected/tasking_replay_scope.out +125 -0
  107. package/tests/isolation/specs/association_artifact_anchor_order.spec +46 -0
  108. package/tests/isolation/specs/association_board_vs_board.spec +37 -0
  109. package/tests/isolation/specs/association_post_wait_authority.spec +48 -0
  110. package/tests/isolation/specs/association_strong_history_writers.spec +61 -0
  111. package/tests/isolation/specs/association_strong_isolation.spec +50 -0
  112. package/tests/isolation/specs/association_vs_artifact_claim_escalation.spec +41 -0
  113. package/tests/isolation/specs/association_vs_heartbeat.spec +47 -0
  114. package/tests/isolation/specs/association_vs_multi_anchor_artifact.spec +38 -0
  115. package/tests/isolation/specs/association_vs_private_message.spec +33 -0
  116. package/tests/isolation/specs/association_vs_task_and_conflict.spec +38 -0
  117. package/tests/isolation/specs/association_vs_taskful_cross_thread.spec +42 -0
  118. package/tests/isolation/specs/consent_approval_lock.spec +13 -7
  119. package/tests/isolation/specs/message_replay_scope.spec +77 -0
  120. package/tests/isolation/specs/tasking_replay_scope.spec +72 -0
  121. package/tests/mutations/717-f1/M0_prefix_main_acl_and_comments.sql +11 -0
  122. package/tests/mutations/717-f1/M10_wrapper_stops_delegating.sql +7 -0
  123. package/tests/mutations/717-f1/M11_transitive_recipient_content.sql +8 -0
  124. package/tests/mutations/717-f1/M12_transitive_recipient_visibility.sql +8 -0
  125. package/tests/mutations/717-f1/M13_transitive_worker_content.sql +15 -0
  126. package/tests/mutations/717-f1/M1a_regrant_upsert_delivery_recipient.sql +1 -0
  127. package/tests/mutations/717-f1/M1b_regrant_upsert_inbox_item.sql +1 -0
  128. package/tests/mutations/717-f1/M1c_regrant_queue_inbox_callbacks.sql +1 -0
  129. package/tests/mutations/717-f1/M1d_regrant_queue_board_post_callbacks.sql +1 -0
  130. package/tests/mutations/717-f1/M1e_regrant_next_thread_message_sequence.sql +1 -0
  131. package/tests/mutations/717-f1/M2_blanket_schema_grant.sql +1 -0
  132. package/tests/mutations/717-f1/M3_new_overload_of_sink.sql +10 -0
  133. package/tests/mutations/717-f1/M4_new_route_calling_sink.sql +7 -0
  134. package/tests/mutations/717-f1/M5_actor_trusts_supplied_id.sql +5 -0
  135. package/tests/mutations/717-f1/M6_signed_route_granted_to_authenticated.sql +1 -0
  136. package/tests/mutations/717-f1/M7_worker_granted_to_authenticated.sql +1 -0
  137. package/tests/mutations/717-f1/M8_recipient_state_rewrites_visibility.sql +5 -0
  138. package/tests/mutations/717-f1/M9_public_route_revoked_from_service_role.sql +1 -0
  139. package/tests/mutations/717-f1/outbox_wake_ordering/W1_regrant_queue_inbox_callbacks.sql +1 -0
  140. package/tests/mutations/717-f1/outbox_wake_ordering/W2_revoke_worker_from_service_role.sql +1 -0
  141. package/tests/mutations/717-f1/outbox_wake_ordering/W3_invoker_caller_of_sink.sql +1 -0
  142. package/tests/mutations/717-f1/outbox_wake_ordering/W4_public_regrant_board_post_sink.sql +1 -0
  143. package/tests/mutations/717-f1/run.sh +17 -0
  144. package/tests/mutations/717-f2b/C1_new_delivery_route.sql +4 -0
  145. package/tests/mutations/717-f2b/C2_new_replay_lookup.sql +3 -0
  146. package/tests/mutations/717-f2b/C3_internal_regranted.sql +2 -0
  147. package/tests/mutations/717-f2b/C4_wrapper_writes_delivery.sql +9 -0
  148. package/tests/mutations/717-f2b/C5_class_member_dynamic_sql.sql +9 -0
  149. package/tests/mutations/717-f2b/C6_drop_board_scope_constraint.sql +2 -0
  150. package/tests/mutations/717-f2b/C7_state_private_helper_content.sql +14 -0
  151. package/tests/mutations/717-f2b/L1_dm_lock_split_by_recipient.sql +8 -0
  152. package/tests/mutations/717-f2b/L2_dm_lock_removed.sql +12 -0
  153. package/tests/mutations/717-f2b/L3_mc_lock_split_by_recipients.sql +8 -0
  154. package/tests/mutations/717-f2b/L4_mc_lock_removed.sql +12 -0
  155. package/tests/mutations/717-f2b/M0_prefix_definitions.sql +17 -0
  156. package/tests/mutations/717-f2b/M10_mc_lookup_any_author.sql +15 -0
  157. package/tests/mutations/717-f2b/M11_dm_swallow_refusal.sql +8 -0
  158. package/tests/mutations/717-f2b/M12_mc_swallow_refusal.sql +8 -0
  159. package/tests/mutations/717-f2b/M13_signed_dm_swallows_refusal.sql +32 -0
  160. package/tests/mutations/717-f2b/M14_signed_mc_swallows_refusal.sql +20 -0
  161. package/tests/mutations/717-f2b/M15_mc_any_source.sql +7 -0
  162. package/tests/mutations/717-f2b/M1_dm_drop_recipient_proof.sql +16 -0
  163. package/tests/mutations/717-f2b/M2_mc_drop_recipient_proof.sql +16 -0
  164. package/tests/mutations/717-f2b/M3_dm_metadata_as_proof.sql +12 -0
  165. package/tests/mutations/717-f2b/M4_mc_metadata_as_proof.sql +16 -0
  166. package/tests/mutations/717-f2b/M5_dm_any_mode.sql +11 -0
  167. package/tests/mutations/717-f2b/M6_dm_board_delivery_counts.sql +11 -0
  168. package/tests/mutations/717-f2b/M7_mc_any_mode.sql +11 -0
  169. package/tests/mutations/717-f2b/M8_dm_thread_stamp_as_proof.sql +12 -0
  170. package/tests/mutations/717-f2b/M9_dm_lookup_any_author.sql +15 -0
  171. package/tests/mutations/717-f2b/run.sh +82 -0
@@ -0,0 +1,162 @@
1
+ -- Test-only conversion dispatch proof. Reference data is generated from the
2
+ -- captured catalog and PostgreSQL 17.11; it is not a namespace exemption.
3
+ -- All helpers read catalogs. None invokes a captured application routine.
4
+ create or replace function pg_temp.xb_cf_type(p_oid oid) returns text
5
+ language sql volatile set search_path=pg_catalog as $$
6
+ select format('%I.%I',n.nspname,t.typname) from pg_type t
7
+ join pg_namespace n on n.oid=t.typnamespace where t.oid=p_oid
8
+ $$;
9
+ create or replace function pg_temp.xb_cf_fn(p_oid oid) returns text
10
+ language sql volatile set search_path=pg_catalog as $$
11
+ select format('%I.%I(%s)',n.nspname,p.proname,replace(oidvectortypes(p.proargtypes),', ',','))
12
+ from pg_proc p join pg_namespace n on n.oid=p.pronamespace where p.oid=p_oid
13
+ $$;
14
+ create or replace function pg_temp.xb_cf_named(p_oid oid,p_catalog text) returns text
15
+ language plpgsql volatile set search_path=pg_catalog as $$
16
+ begin
17
+ if p_oid=0 then return null; end if;
18
+ if p_catalog='family' then return (select format('%I.%I/%s',n.nspname,f.opfname,a.amname)
19
+ from pg_opfamily f join pg_namespace n on n.oid=f.opfnamespace join pg_am a on a.oid=f.opfmethod where f.oid=p_oid);
20
+ elsif p_catalog='class' then return (select format('%I.%I/%s',n.nspname,c.opcname,a.amname)
21
+ from pg_opclass c join pg_namespace n on n.oid=c.opcnamespace join pg_am a on a.oid=c.opcmethod where c.oid=p_oid);
22
+ elsif p_catalog='operator' then return (select format('%I.%s(%s,%s)',n.nspname,o.oprname,
23
+ pg_temp.xb_cf_type(o.oprleft),pg_temp.xb_cf_type(o.oprright)) from pg_operator o join pg_namespace n on n.oid=o.oprnamespace where o.oid=p_oid);
24
+ elsif p_catalog='parser' then return (select format('%I.%I',n.nspname,p.prsname) from pg_ts_parser p join pg_namespace n on n.oid=p.prsnamespace where p.oid=p_oid);
25
+ elsif p_catalog='template' then return (select format('%I.%I',n.nspname,t.tmplname) from pg_ts_template t join pg_namespace n on n.oid=t.tmplnamespace where t.oid=p_oid);
26
+ elsif p_catalog='dictionary' then return (select format('%I.%I',n.nspname,d.dictname) from pg_ts_dict d join pg_namespace n on n.oid=d.dictnamespace where d.oid=p_oid);
27
+ elsif p_catalog='configuration' then return (select format('%I.%I',n.nspname,c.cfgname) from pg_ts_config c join pg_namespace n on n.oid=c.cfgnamespace where c.oid=p_oid);
28
+ elsif p_catalog='collation' then return (select format('%I.%I',n.nspname,c.collname) from pg_collation c join pg_namespace n on n.oid=c.collnamespace where c.oid=p_oid);
29
+ end if;
30
+ raise exception 'unclassified conversion catalog %',p_catalog;
31
+ end$$;
32
+ create or replace function pg_temp.xb_cf_meta(p_oid oid) returns jsonb
33
+ language sql volatile set search_path=pg_catalog as $$
34
+ select jsonb_build_object('definition_md5',case when p.prokind<>'a' then md5(pg_get_functiondef(p.oid)) end,
35
+ 'owner',pg_get_userbyid(p.proowner),
36
+ 'acl',(select jsonb_agg(a::text order by a::text collate "C") from unnest(p.proacl) a),'kind',p.prokind)
37
+ from pg_proc p where p.oid=p_oid
38
+ $$;
39
+
40
+ -- Every registered conversion, operator and subsidiary callback is discovered
41
+ -- here, including callbacks hidden behind a built-in type input function.
42
+ create or replace function pg_temp.xb_cf_slots() returns table(origin text,fn oid)
43
+ language sql volatile set search_path=pg_catalog as $$
44
+ select 'type '||pg_temp.xb_cf_type(t.oid)||' '||v.slot,v.fn from pg_type t
45
+ cross join lateral(values ('typinput',t.typinput::oid),('typoutput',t.typoutput::oid),
46
+ ('typreceive',t.typreceive::oid),('typsend',t.typsend::oid),('typmodin',t.typmodin::oid),
47
+ ('typmodout',t.typmodout::oid),('typanalyze',t.typanalyze::oid),('typsubscript',t.typsubscript::oid)) v(slot,fn) where v.fn<>0
48
+ union all select 'operator '||pg_temp.xb_cf_named(o.oid,'operator')||' '||v.slot,v.fn from pg_operator o
49
+ cross join lateral(values ('implementation',o.oprcode::oid),('restriction',o.oprrest::oid),('join',o.oprjoin::oid)) v(slot,fn) where v.fn<>0
50
+ union all select 'cast '||pg_temp.xb_cf_type(c.castsource)||' -> '||pg_temp.xb_cf_type(c.casttarget),c.castfunc from pg_cast c where c.castfunc<>0
51
+ union all select 'range '||pg_temp.xb_cf_type(r.rngtypid)||' '||v.slot,v.fn from pg_range r
52
+ cross join lateral(values ('canonical',r.rngcanonical::oid),('subdiff',r.rngsubdiff::oid)) v(slot,fn) where v.fn<>0
53
+ union all select 'family '||pg_temp.xb_cf_named(p.amprocfamily,'family')||' support '||p.amprocnum,p.amproc::oid from pg_amproc p
54
+ union all select 'parser '||pg_temp.xb_cf_named(p.oid,'parser')||' '||v.slot,v.fn from pg_ts_parser p
55
+ cross join lateral(values ('start',p.prsstart::oid),('token',p.prstoken::oid),('end',p.prsend::oid),
56
+ ('headline',p.prsheadline::oid),('lextype',p.prslextype::oid)) v(slot,fn) where v.fn<>0
57
+ union all select 'template '||pg_temp.xb_cf_named(t.oid,'template')||' '||v.slot,v.fn from pg_ts_template t
58
+ cross join lateral(values ('init',t.tmplinit::oid),('lexize',t.tmpllexize::oid)) v(slot,fn) where v.fn<>0
59
+ union all select 'transform '||pg_temp.xb_cf_type(t.trftype)||' '||v.slot,v.fn from pg_transform t
60
+ cross join lateral(values ('from_sql',t.trffromsql::oid),('to_sql',t.trftosql::oid)) v(slot,fn) where v.fn<>0
61
+ union all select 'language '||l.lanname||' '||v.slot,v.fn from pg_language l
62
+ cross join lateral(values ('handler',l.lanplcallfoid::oid),('inline',l.laninline::oid),('validator',l.lanvalidator::oid)) v(slot,fn) where v.fn<>0
63
+ union all select 'access method '||a.amname,a.amhandler::oid from pg_am a
64
+ $$;
65
+
66
+ -- Independently derive the pointer-column class from pg_attribute. A new type
67
+ -- callback column, or an accidentally omitted discovery arm above, names itself.
68
+ create or replace function pg_temp.xb_cf_type_coverage() returns table(identity text)
69
+ language plpgsql volatile set search_path=pg_catalog as $$
70
+ declare a record; discovered jsonb;
71
+ begin
72
+ select jsonb_object_agg(origin,fn::text) into discovered from pg_temp.xb_cf_slots() where origin like 'type %';
73
+ for a in select attname from pg_attribute where attrelid='pg_type'::regclass
74
+ and atttypid='regproc'::regtype and attnum>0 and not attisdropped
75
+ loop
76
+ return query execute format(
77
+ 'select ''type ''||pg_temp.xb_cf_type(t.oid)||%L||pg_temp.xb_cf_fn(t.%I::oid)
78
+ from pg_type t where t.%I::oid<>0 and
79
+ ($1->>(''type ''||pg_temp.xb_cf_type(t.oid)||%L)) is distinct from t.%I::oid::text',
80
+ '.'||a.attname||' -> ',a.attname,a.attname,' '||a.attname,a.attname) using discovered;
81
+ end loop;
82
+ end$$;
83
+
84
+ -- Definitions are bound separately from these portable relationships. Arrays,
85
+ -- composites and enums add no arbitrary dispatch beyond the registered type
86
+ -- hooks; domain expressions and range/opclass/text-search delegation do.
87
+ create or replace function pg_temp.xb_cf_registry() returns table(kind text,identity text,payload jsonb)
88
+ language sql volatile set search_path=pg_catalog as $$
89
+ select 'operator',pg_temp.xb_cf_named(o.oid,'operator'),jsonb_build_array(pg_get_userbyid(o.oprowner),
90
+ pg_temp.xb_cf_type(o.oprresult),o.oprkind,o.oprcanmerge,o.oprcanhash,pg_temp.xb_cf_fn(o.oprcode),
91
+ pg_temp.xb_cf_fn(o.oprrest),pg_temp.xb_cf_fn(o.oprjoin),pg_temp.xb_cf_named(o.oprcom,'operator'),pg_temp.xb_cf_named(o.oprnegate,'operator')) from pg_operator o
92
+ union all select 'cast',pg_temp.xb_cf_type(c.castsource)||' -> '||pg_temp.xb_cf_type(c.casttarget),
93
+ jsonb_build_array(pg_temp.xb_cf_fn(c.castfunc),c.castcontext,c.castmethod) from pg_cast c
94
+ union all select 'domain',pg_temp.xb_cf_type(t.oid),jsonb_build_array(pg_temp.xb_cf_type(t.typbasetype),t.typnotnull,t.typtypmod,
95
+ (select coalesce(jsonb_agg(jsonb_build_array(c.conname,pg_get_constraintdef(c.oid),c.convalidated) order by c.conname),'[]') from pg_constraint c where c.contypid=t.oid))
96
+ from pg_type t where t.typtype='d'
97
+ union all select 'range',pg_temp.xb_cf_type(r.rngtypid),jsonb_build_array(pg_temp.xb_cf_type(r.rngsubtype),pg_temp.xb_cf_type(r.rngmultitypid),
98
+ pg_temp.xb_cf_named(r.rngcollation,'collation'),pg_temp.xb_cf_named(r.rngsubopc,'class'),pg_temp.xb_cf_fn(r.rngcanonical),pg_temp.xb_cf_fn(r.rngsubdiff)) from pg_range r
99
+ union all select 'family',pg_temp.xb_cf_named(f.oid,'family'),jsonb_build_array(pg_get_userbyid(f.opfowner)) from pg_opfamily f
100
+ union all select 'class',pg_temp.xb_cf_named(c.oid,'class'),jsonb_build_array(pg_get_userbyid(c.opcowner),pg_temp.xb_cf_named(c.opcfamily,'family'),
101
+ pg_temp.xb_cf_type(c.opcintype),pg_temp.xb_cf_type(c.opckeytype),c.opcdefault) from pg_opclass c
102
+ union all select 'family operator',pg_temp.xb_cf_named(o.amopfamily,'family')||'/'||pg_temp.xb_cf_type(o.amoplefttype)||'/'||pg_temp.xb_cf_type(o.amoprighttype)||'/'||o.amopstrategy||'/'||o.amoppurpose::text,
103
+ jsonb_build_array(pg_temp.xb_cf_named(o.amopopr,'operator'),pg_temp.xb_cf_named(o.amopsortfamily,'family')) from pg_amop o
104
+ union all select 'family procedure',pg_temp.xb_cf_named(p.amprocfamily,'family')||'/'||pg_temp.xb_cf_type(p.amproclefttype)||'/'||pg_temp.xb_cf_type(p.amprocrighttype)||'/'||p.amprocnum,
105
+ jsonb_build_array(pg_temp.xb_cf_fn(p.amproc)) from pg_amproc p
106
+ union all select 'parser',pg_temp.xb_cf_named(p.oid,'parser'),jsonb_build_array(pg_temp.xb_cf_fn(p.prsstart),pg_temp.xb_cf_fn(p.prstoken),pg_temp.xb_cf_fn(p.prsend),
107
+ pg_temp.xb_cf_fn(p.prsheadline),pg_temp.xb_cf_fn(p.prslextype)) from pg_ts_parser p
108
+ union all select 'template',pg_temp.xb_cf_named(t.oid,'template'),jsonb_build_array(pg_temp.xb_cf_fn(t.tmplinit),pg_temp.xb_cf_fn(t.tmpllexize)) from pg_ts_template t
109
+ union all select 'dictionary',pg_temp.xb_cf_named(d.oid,'dictionary'),jsonb_build_array(pg_get_userbyid(d.dictowner),pg_temp.xb_cf_named(d.dicttemplate,'template'),md5(d.dictinitoption)) from pg_ts_dict d
110
+ union all select 'configuration',pg_temp.xb_cf_named(c.oid,'configuration'),jsonb_build_array(pg_get_userbyid(c.cfgowner),pg_temp.xb_cf_named(c.cfgparser,'parser')) from pg_ts_config c
111
+ union all select 'configuration mapping',pg_temp.xb_cf_named(m.mapcfg,'configuration')||'/'||m.maptokentype||'/'||m.mapseqno,
112
+ jsonb_build_array(pg_temp.xb_cf_named(m.mapdict,'dictionary')) from pg_ts_config_map m
113
+ union all select 'transform',pg_temp.xb_cf_type(t.trftype)||'/'||l.lanname,jsonb_build_array(pg_temp.xb_cf_fn(t.trffromsql),pg_temp.xb_cf_fn(t.trftosql))
114
+ from pg_transform t join pg_language l on l.oid=t.trflang
115
+ $$;
116
+
117
+ \ir agent_board_667_conversion_reference.sql
118
+
119
+ create or replace function pg_temp.xb_cf_function_problem(p_fn oid) returns text
120
+ language sql volatile set search_path=pg_catalog as $$
121
+ select case when r.identity is null then 'unreviewed primitive '||coalesce(pg_temp.xb_cf_fn(p_fn),p_fn::text)
122
+ when r.metadata is distinct from pg_temp.xb_cf_meta(p_fn) then 'primitive drift '||r.identity end
123
+ from (select p_fn as fn) s left join pg_temp.xb_cf_primitives r on r.fn=s.fn
124
+ $$;
125
+ create or replace function pg_temp.xb_cf_problems() returns table(identity text,problem text)
126
+ language sql volatile set search_path=pg_catalog as $$
127
+ with recursive roots(fn) as (
128
+ select fn from pg_temp.xb_cf_slots()
129
+ union select p.oid from pg_proc p join pg_namespace n on n.oid=p.pronamespace
130
+ where n.nspname='pg_catalog' and p.proname in ('format','to_jsonb','upper')
131
+ ), edges(source,target) as (
132
+ select p.oid,p.prosupport::oid from pg_proc p where p.prosupport<>0
133
+ union select d.objid,d.refobjid from pg_depend d
134
+ where d.classid='pg_proc'::regclass and d.refclassid='pg_proc'::regclass
135
+ ), reach(fn) as (
136
+ select fn from roots union select e.target from reach r join edges e on e.source=r.fn
137
+ ), actual as (select * from pg_temp.xb_cf_registry())
138
+ select pg_temp.xb_cf_fn(r.fn),pg_temp.xb_cf_function_problem(r.fn) from reach r
139
+ where pg_temp.xb_cf_function_problem(r.fn) is not null
140
+ union all select a.kind||' '||a.identity,case when e.identity is null then 'unreviewed dispatch' else 'dispatch drift' end
141
+ from actual a left join pg_temp.xb_cf_reference e on e.kind=a.kind and e.identity=a.identity
142
+ where e.identity is null or a.payload is distinct from e.payload
143
+ union all select e.kind||' '||e.identity,'missing reviewed dispatch' from pg_temp.xb_cf_reference e
144
+ where not exists(select 1 from actual a where a.kind=e.kind and a.identity=e.identity)
145
+ union all select pg_temp.xb_cf_fn(p.oid),'shadow of fixed conversion call' from pg_proc p join pg_namespace n on n.oid=p.pronamespace
146
+ where p.proname in ('format','to_jsonb','upper') and n.nspname<>'pg_catalog'
147
+ union all select 'PostgreSQL '||current_setting('server_version'),'unreviewed primitive build'
148
+ where current_setting('server_version_num')<>'170011'
149
+ union all select identity,'missing registered type callback' from pg_temp.xb_cf_type_coverage()
150
+ $$;
151
+ create or replace function pg_temp.xb_cf_wrapper_problems() returns table(identity text,problem text)
152
+ language sql volatile set search_path=pg_catalog as $$
153
+ select e.identity,'native conversion definition or security drift' from pg_temp.xb_cf_wrappers e
154
+ join pg_proc p on p.oid=to_regprocedure(e.identity)
155
+ where pg_temp.xb_cf_meta(p.oid) is distinct from e.metadata
156
+ $$;
157
+ create or replace function pg_temp.xb_cf_admitted() returns table(fn oid)
158
+ language sql volatile set search_path=pg_catalog as $$
159
+ select p.oid from pg_temp.xb_cf_wrappers e join pg_proc p on p.oid=to_regprocedure(e.identity)
160
+ where not exists(select 1 from pg_temp.xb_cf_problems())
161
+ and not exists(select 1 from pg_temp.xb_cf_wrapper_problems())
162
+ $$;
@@ -0,0 +1,23 @@
1
+ The conversion reference is a finite snapshot for PostgreSQL 17.11, not a permission for a schema or for arbitrary dynamic SQL. It covers `realtime.cast` and the two `realtime.check_equality_op` overloads only. `apply_rls`, both senders and the Storage readers have separate relation/policy effects and remain unresolved.
2
+
3
+ The dispatch tables came from CI run [40532374972](https://github.com/Consiliency/message-board/actions/runs/40532374972), head `50c7c9c184c227984c153e061c51b270682978d5`. Protocol-2 catalog SHA-256: `2c4598bd8b03474d54dc2221e17a83c6a47e1c14b48bd4fe2946e51d08a8160f`. The corresponding tables in an owned `public.ecr.aws/supabase/postgres:17.11.0.004` container matched that captured metadata byte for byte. The generator verifies those comparisons and each primitive's observable catalog metadata before producing portable identities.
4
+
5
+ The reference contains declaration fingerprints, owners and ACLs for the relevant registered primitive callbacks, fixed conversion calls and their support/dependency closure. The existing trusted PostgreSQL implementation remains the foundation: a declaration fingerprint is not a binary attestation or a separate behavior proof for every built-in. Fourteen SQL declarations whose standard bodies were absent from `prosrc` were read with `pg_get_functiondef` on the owned reference build. Live native declarations must match these proposed references before admission; those bodies were not present in the original CI artifact.
6
+
7
+ The guard discovers type I/O, casts, operators, ranges, operator-family support, text-search callbacks, transforms, language and access-method callbacks from the catalog. It checks portable relationship records and full primitive declaration/security fingerprints. Domain expressions and fixed-call shadows are checked separately. An independent `pg_attribute` query checks that every actual `regproc` pointer column on `pg_type` was discovered. Unknown or changed paths name themselves and close admission.
8
+
9
+ Arrays, enums and composites use the checked type dispatch; custom domain checks and subsidiary callbacks cannot gain permission merely by sharing a built-in input function. The admitted SQL templates operate on typed scalar literals rather than relations, so this reference does not establish RLS, trigger or table-read closure for the other six routines. Literal-quoting and native-call witnesses are separate from the catalog pins.
10
+
11
+ When the native wrappers are absent, tests report that fact and give no native-call or admission credit. Classifier negative controls still run and must restore the prior profile, including on an unreviewed build. When wrappers are present, an unsupported primitive build remains a named failure.
12
+
13
+ To reproduce the reference, retain the native catalog, an owned reference catalog produced by `pgtap-failure-catalog.sql`, and the owned declaration/relationship packet. The generator performs no database connections. Its `--collect` mode prints a metadata-only collection query for an **owned test database**; it creates only transaction-local test objects and rolls them back. Supply connection credentials through libpq environment, never URL arguments.
14
+
15
+ ```sh
16
+ node scripts/generate-667-conversion-reference.mjs --collect native.json > collect.sql
17
+ # Run collect.sql against the owned reference build, retaining its single JSON result.
18
+ node scripts/generate-667-conversion-reference.mjs native.json owned-reference.json owned-catalog.json --check
19
+ # After reviewing a legitimate new reference:
20
+ node scripts/generate-667-conversion-reference.mjs native.json owned-reference.json owned-catalog.json --output proposed-reference.sql
21
+ ```
22
+
23
+ Review the evidence and generated diff before replacing the checked-in reference. CI never regenerates it to make a failure pass. The native wrapper identities, declaration fingerprints and security context must also remain within the explicitly reviewed three-routine scope.