From 394a14660d3b73f58e5e9793b356bd12e5a12767 Mon Sep 17 00:00:00 2001 From: twentyOne2x Date: Fri, 10 Jul 2026 00:17:38 +0200 Subject: [PATCH] Add governance concept schema packet - Create guarded schema and links for governance gates and concept maps - Prove clone apply and rollback while production schema stays unchanged - Retain packet docs, state image, and focused tests for apply review `docs/reports/leo-working-state-20260709/current-truth-index.md` `docs/reports/leo-working-state-20260709/governance-concept-apply-authorized-commit.sql` `docs/reports/leo-working-state-20260709/governance-concept-apply-rollback-rehearsal.sql` `docs/reports/leo-working-state-20260709/governance-concept-clone-rehearsal-current.log` `docs/reports/leo-working-state-20260709/governance-concept-current.md` `docs/reports/leo-working-state-20260709/governance-concept-delete-rollback.sql` `docs/reports/leo-working-state-20260709/governance-concept-packet.json` `docs/reports/leo-working-state-20260709/governance-concept-postflight.sql` `docs/reports/leo-working-state-20260709/governance-concept-preflight.sql` `docs/reports/leo-working-state-20260709/leo-db-state-24-governance-concept-schema.svg` `docs/reports/leo-working-state-20260709/working-leo-current-state-20260709.md` `docs/reports/leo-working-state-20260709/working-leo-execution-plan-current.md` `scripts/kb_governance_concept_packet.py` `tests/test_kb_governance_concept_packet.py` --- .../current-truth-index.md | 9 +- ...rnance-concept-apply-authorized-commit.sql | 128 +++++ ...nance-concept-apply-rollback-rehearsal.sql | 128 +++++ ...rnance-concept-clone-rehearsal-current.log | 181 +++++++ .../governance-concept-current.md | 67 +++ .../governance-concept-delete-rollback.sql | 36 ++ .../governance-concept-packet.json | 100 ++++ .../governance-concept-postflight.sql | 39 ++ .../governance-concept-preflight.sql | 33 ++ ...-db-state-24-governance-concept-schema.svg | 64 +++ .../working-leo-current-state-20260709.md | 11 +- .../working-leo-execution-plan-current.md | 11 +- scripts/kb_governance_concept_packet.py | 499 ++++++++++++++++++ tests/test_kb_governance_concept_packet.py | 104 ++++ 14 files changed, 1403 insertions(+), 7 deletions(-) create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-apply-authorized-commit.sql create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-apply-rollback-rehearsal.sql create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-clone-rehearsal-current.log create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-current.md create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-delete-rollback.sql create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-packet.json create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-postflight.sql create mode 100644 docs/reports/leo-working-state-20260709/governance-concept-preflight.sql create mode 100644 docs/reports/leo-working-state-20260709/leo-db-state-24-governance-concept-schema.svg create mode 100644 scripts/kb_governance_concept_packet.py create mode 100644 tests/test_kb_governance_concept_packet.py diff --git a/docs/reports/leo-working-state-20260709/current-truth-index.md b/docs/reports/leo-working-state-20260709/current-truth-index.md index ef2a18c..c6006b1 100644 --- a/docs/reports/leo-working-state-20260709/current-truth-index.md +++ b/docs/reports/leo-working-state-20260709/current-truth-index.md @@ -42,6 +42,11 @@ Use this file before making status claims. Prefer fresh VPS/GCP readbacks when c - Rio strategy-context authorized commit SQL, not executed in production: `docs/reports/leo-working-state-20260709/rio-strategy-apply-authorized-commit.sql` - Rio strategy-context delete rollback SQL: `docs/reports/leo-working-state-20260709/rio-strategy-delete-rollback.sql` - Rio strategy-context clone commit/delete rollback log: `docs/reports/leo-working-state-20260709/rio-strategy-clone-rehearsal-current.log` +- Governance/concept-map schema companion packet, not executed in production: `docs/reports/leo-working-state-20260709/governance-concept-current.md` +- Governance/concept-map packet JSON: `docs/reports/leo-working-state-20260709/governance-concept-packet.json` +- Governance/concept-map authorized commit SQL, not executed in production: `docs/reports/leo-working-state-20260709/governance-concept-apply-authorized-commit.sql` +- Governance/concept-map delete rollback SQL: `docs/reports/leo-working-state-20260709/governance-concept-delete-rollback.sql` +- Governance/concept-map clone commit/delete rollback log: `docs/reports/leo-working-state-20260709/governance-concept-clone-rehearsal-current.log` - Helmer 7 Powers proposal plan: `docs/reports/leo-working-state-20260709/helmer-7powers-creation-plan.json` - Helmer 7 Powers apply packet, not executed in production: `docs/reports/leo-working-state-20260709/helmer-7powers-production-apply-packet-current.md` - Helmer 7 Powers apply packet JSON: `docs/reports/leo-working-state-20260709/helmer-7powers-production-apply-packet.json` @@ -68,6 +73,7 @@ Use this file before making status claims. Prefer fresh VPS/GCP readbacks when c - Forgejo/load/agent update loop map: `docs/reports/leo-working-state-20260709/leo-db-state-21-forgejo-load-agent-loop.svg` - Identity render / decision matrix / document artifact map: `docs/reports/leo-working-state-20260709/leo-db-state-22-identity-render-matrix-artifacts.svg` - Rio strategy context packet proof: `docs/reports/leo-working-state-20260709/leo-db-state-23-rio-strategy-context.svg` +- Governance/concept-map schema packet proof: `docs/reports/leo-working-state-20260709/leo-db-state-24-governance-concept-schema.svg` - DB loading diagram SVG: `docs/reports/leo-working-state-20260709/leo-db-loading-diagram-20260709T214741Z.svg` - DB loading diagram Mermaid source: `docs/reports/leo-working-state-20260709/leo-db-loading-diagram-20260709T214741Z.mmd` @@ -81,9 +87,10 @@ Use this file before making status claims. Prefer fresh VPS/GCP readbacks when c - Mapped rich approved proposal packet is clone/rehearsal-proven for the supported subset, not production-applied. - The strategy-anchor companion write for mapped rich proposal `14fa5ecc` is clone-proven and reversible, not production-applied. - The Rio strategy-context companion write for mapped rich proposal `14fa5ecc` is clone-proven and reversible: after the mapped base packet exists, it creates `2` Rio strategy nodes and `5` strategy anchors in a disposable clone; production stayed unchanged. +- The governance/concept-map schema companion write is clone-proven and reversible: after the mapped base packet exists, it creates minimal concept-map and claim-to-governance link tables, then inserts `1` concept map, `1` concept link, and `2` governance links in a disposable clone; production stayed unchanged. - DB-first identity rendering is now documented from the July 9 PDFs plus VPS readback: canonical identity rows feed rendered `SOUL.md`, direct SOUL edits are not canonical DB updates, and no active renderer/timer/hook is proven in the current VPS readback. - The decision-matrix approval schema is still a target design on the current VPS: `kb_stage.matrix_voters`, `kb_stage.proposal_votes`, and `kb_stage.proposal_decisions` were not present in live schema readback. - Pending/approved document proposals are real `kb_stage.kb_proposals` rows with `source_ref`s, but inspected `source_ref`s did not directly match `public.sources`; they still need review/apply mapping into canonical sources/evidence/edges. -- Governance-gate and concept-map targets remain explicitly deferred because current schema has no safe direct write path for them. +- Governance-gate and concept-map targets are now schema-packet-proven, but not production-applied; the live VPS production schema still has no generated governance/concept tables. - The live VPS runtime behavior should not be changed while the DB apply path is stabilized. - GCP parity remains blocked by account auth/access facts until a fresh readback proves otherwise. diff --git a/docs/reports/leo-working-state-20260709/governance-concept-apply-authorized-commit.sql b/docs/reports/leo-working-state-20260709/governance-concept-apply-authorized-commit.sql new file mode 100644 index 0000000..3fe6770 --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-apply-authorized-commit.sql @@ -0,0 +1,128 @@ +\set ON_ERROR_STOP on +begin; + +create table if not exists public.concept_maps ( + id uuid primary key default gen_random_uuid(), + key text not null unique, + title text not null, + body text not null, + status text not null default 'active' check (status = any (array['draft'::text, 'active'::text, 'retired'::text])), + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() +); + +create table if not exists public.claim_concept_map_links ( + id uuid primary key default gen_random_uuid(), + claim_id uuid not null references public.claims(id) on delete cascade, + concept_map_id uuid not null references public.concept_maps(id) on delete cascade, + relation text not null check (relation = any (array['derives_from'::text, 'supports'::text, 'contextualizes'::text, 'contains'::text, 'requires'::text, 'relates'::text])), + weight numeric check (weight >= 0 and weight <= 1), + rationale text not null, + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + unique (claim_id, concept_map_id, relation) +); + +create table if not exists public.claim_governance_gate_links ( + id uuid primary key default gen_random_uuid(), + claim_id uuid not null references public.claims(id) on delete cascade, + governance_gate_id uuid not null references public.governance_gates(id) on delete cascade, + relation text not null check (relation = any (array['supports'::text, 'requires'::text, 'constrains'::text, 'documents'::text])), + weight numeric check (weight >= 0 and weight <= 1), + rationale text not null, + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + unique (claim_id, governance_gate_id, relation) +); + +create index if not exists claim_concept_map_links_claim + on public.claim_concept_map_links (claim_id, relation); +create index if not exists claim_concept_map_links_map + on public.claim_concept_map_links (concept_map_id, relation); +create index if not exists claim_governance_gate_links_claim + on public.claim_governance_gate_links (claim_id, relation); +create index if not exists claim_governance_gate_links_gate + on public.claim_governance_gate_links (governance_gate_id, relation); + +do $$ +declare + inserted_concept_maps int; + inserted_concept_links int; + inserted_governance_links int; +begin + if ( + select count(*) from public.claims where id in (select id from (values + ('d009dfc4-9755-58a7-affb-80e3e842a775'::uuid), + ('9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0'::uuid) + ) as v(id)) + ) <> 2 then + raise exception 'governance/concept packet requires mapped base claims to exist before inserts'; + end if; + + if ( + select count(*) from public.governance_gates where id in (select id from (values + ('fa88e31b-6fca-4801-bf72-f5db81950a11'::uuid), + ('45695897-2a9c-4279-ac25-e59f166dec6a'::uuid) + ) as v(id)) + ) <> 2 then + raise exception 'governance/concept packet requires quality/evidence governance gates to exist'; + end if; + + if exists (select 1 from public.concept_maps where id = 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid or key = 'distributed_market_intelligence') then + raise exception 'governance/concept packet generated concept map already exists'; + end if; + + if exists (select 1 from public.claim_concept_map_links where id = 'af4ce1b9-db03-5bde-a21b-0e16ca0f48b8'::uuid) then + raise exception 'governance/concept packet generated concept link already exists'; + end if; + + if exists ( + select 1 from public.claim_governance_gate_links + where id in (select id from (values + ('1f81e105-af5e-5db8-a7be-08cc6cc4e13a'::uuid), + ('af04a87e-c1da-57e9-b11c-60d79daa5648'::uuid) + ) as v(id)) + ) then + raise exception 'governance/concept packet generated governance link already exists'; + end if; + + insert into public.concept_maps (id, key, title, body, status, source_ref, metadata) +values ( + 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid, + 'distributed_market_intelligence', + 'Distributed market intelligence', + 'A concept map for how capital allocation depends on distributed knowledge, incentives, liquidity, feedback loops, and market signals rather than a single central planner.', + 'active', + 'mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence', + '{"base_packet_required_first": "production-apply-packet-mapped-20260709", "proposal_id": "14fa5ecc-ac7a-41c1-807d-a2e85b936617", "source_fragment": "capital_allocation_depends_on_distributed_market_intelligence draws_from concept_map:distributed_market_intelligence"}'::jsonb +); + get diagnostics inserted_concept_maps = row_count; + if inserted_concept_maps <> 1 then + raise exception 'governance/concept packet inserted % concept map row(s), expected 1', inserted_concept_maps; + end if; + + insert into public.claim_concept_map_links + (id, claim_id, concept_map_id, relation, weight, rationale, source_ref, metadata) + values + ('af4ce1b9-db03-5bde-a21b-0e16ca0f48b8'::uuid, 'd009dfc4-9755-58a7-affb-80e3e842a775'::uuid, 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid, 'derives_from', 0.75, 'Mapped proposal 14fa5ecc: the capital-allocation distributed-knowledge claim draws from the distributed market intelligence concept map.', 'mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence', '{"proposal_id": "14fa5ecc-ac7a-41c1-807d-a2e85b936617"}'::jsonb); + get diagnostics inserted_concept_links = row_count; + if inserted_concept_links <> 1 then + raise exception 'governance/concept packet inserted % concept link row(s), expected 1', inserted_concept_links; + end if; + + insert into public.claim_governance_gate_links + (id, claim_id, governance_gate_id, relation, weight, rationale, source_ref, metadata) + values + ('1f81e105-af5e-5db8-a7be-08cc6cc4e13a'::uuid, '9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0'::uuid, 'fa88e31b-6fca-4801-bf72-f5db81950a11'::uuid, 'supports', 0.85, 'Specific enough to disagree with requires more than a compressed headline for ambiguous claims.', 'mapped-rich-proposal-ac036c9d:governance_gate:quality-gate', '{"proposal_id": "ac036c9d-20a0-4ffe-881f-57d6b7bacf22"}'::jsonb), + ('af04a87e-c1da-57e9-b11c-60d79daa5648'::uuid, '9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0'::uuid, '45695897-2a9c-4279-ac25-e59f166dec6a'::uuid, 'supports', 0.85, 'Bodies can state the true evidence tier and scope limits.', 'mapped-rich-proposal-ac036c9d:governance_gate:evidence-bar', '{"proposal_id": "ac036c9d-20a0-4ffe-881f-57d6b7bacf22"}'::jsonb); + get diagnostics inserted_governance_links = row_count; + if inserted_governance_links <> 2 then + raise exception 'governance/concept packet inserted % governance link row(s), expected 2', inserted_governance_links; + end if; +end $$; + +commit; diff --git a/docs/reports/leo-working-state-20260709/governance-concept-apply-rollback-rehearsal.sql b/docs/reports/leo-working-state-20260709/governance-concept-apply-rollback-rehearsal.sql new file mode 100644 index 0000000..19d92bb --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-apply-rollback-rehearsal.sql @@ -0,0 +1,128 @@ +\set ON_ERROR_STOP on +begin; + +create table if not exists public.concept_maps ( + id uuid primary key default gen_random_uuid(), + key text not null unique, + title text not null, + body text not null, + status text not null default 'active' check (status = any (array['draft'::text, 'active'::text, 'retired'::text])), + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() +); + +create table if not exists public.claim_concept_map_links ( + id uuid primary key default gen_random_uuid(), + claim_id uuid not null references public.claims(id) on delete cascade, + concept_map_id uuid not null references public.concept_maps(id) on delete cascade, + relation text not null check (relation = any (array['derives_from'::text, 'supports'::text, 'contextualizes'::text, 'contains'::text, 'requires'::text, 'relates'::text])), + weight numeric check (weight >= 0 and weight <= 1), + rationale text not null, + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + unique (claim_id, concept_map_id, relation) +); + +create table if not exists public.claim_governance_gate_links ( + id uuid primary key default gen_random_uuid(), + claim_id uuid not null references public.claims(id) on delete cascade, + governance_gate_id uuid not null references public.governance_gates(id) on delete cascade, + relation text not null check (relation = any (array['supports'::text, 'requires'::text, 'constrains'::text, 'documents'::text])), + weight numeric check (weight >= 0 and weight <= 1), + rationale text not null, + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + unique (claim_id, governance_gate_id, relation) +); + +create index if not exists claim_concept_map_links_claim + on public.claim_concept_map_links (claim_id, relation); +create index if not exists claim_concept_map_links_map + on public.claim_concept_map_links (concept_map_id, relation); +create index if not exists claim_governance_gate_links_claim + on public.claim_governance_gate_links (claim_id, relation); +create index if not exists claim_governance_gate_links_gate + on public.claim_governance_gate_links (governance_gate_id, relation); + +do $$ +declare + inserted_concept_maps int; + inserted_concept_links int; + inserted_governance_links int; +begin + if ( + select count(*) from public.claims where id in (select id from (values + ('d009dfc4-9755-58a7-affb-80e3e842a775'::uuid), + ('9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0'::uuid) + ) as v(id)) + ) <> 2 then + raise exception 'governance/concept packet requires mapped base claims to exist before inserts'; + end if; + + if ( + select count(*) from public.governance_gates where id in (select id from (values + ('fa88e31b-6fca-4801-bf72-f5db81950a11'::uuid), + ('45695897-2a9c-4279-ac25-e59f166dec6a'::uuid) + ) as v(id)) + ) <> 2 then + raise exception 'governance/concept packet requires quality/evidence governance gates to exist'; + end if; + + if exists (select 1 from public.concept_maps where id = 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid or key = 'distributed_market_intelligence') then + raise exception 'governance/concept packet generated concept map already exists'; + end if; + + if exists (select 1 from public.claim_concept_map_links where id = 'af4ce1b9-db03-5bde-a21b-0e16ca0f48b8'::uuid) then + raise exception 'governance/concept packet generated concept link already exists'; + end if; + + if exists ( + select 1 from public.claim_governance_gate_links + where id in (select id from (values + ('1f81e105-af5e-5db8-a7be-08cc6cc4e13a'::uuid), + ('af04a87e-c1da-57e9-b11c-60d79daa5648'::uuid) + ) as v(id)) + ) then + raise exception 'governance/concept packet generated governance link already exists'; + end if; + + insert into public.concept_maps (id, key, title, body, status, source_ref, metadata) +values ( + 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid, + 'distributed_market_intelligence', + 'Distributed market intelligence', + 'A concept map for how capital allocation depends on distributed knowledge, incentives, liquidity, feedback loops, and market signals rather than a single central planner.', + 'active', + 'mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence', + '{"base_packet_required_first": "production-apply-packet-mapped-20260709", "proposal_id": "14fa5ecc-ac7a-41c1-807d-a2e85b936617", "source_fragment": "capital_allocation_depends_on_distributed_market_intelligence draws_from concept_map:distributed_market_intelligence"}'::jsonb +); + get diagnostics inserted_concept_maps = row_count; + if inserted_concept_maps <> 1 then + raise exception 'governance/concept packet inserted % concept map row(s), expected 1', inserted_concept_maps; + end if; + + insert into public.claim_concept_map_links + (id, claim_id, concept_map_id, relation, weight, rationale, source_ref, metadata) + values + ('af4ce1b9-db03-5bde-a21b-0e16ca0f48b8'::uuid, 'd009dfc4-9755-58a7-affb-80e3e842a775'::uuid, 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid, 'derives_from', 0.75, 'Mapped proposal 14fa5ecc: the capital-allocation distributed-knowledge claim draws from the distributed market intelligence concept map.', 'mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence', '{"proposal_id": "14fa5ecc-ac7a-41c1-807d-a2e85b936617"}'::jsonb); + get diagnostics inserted_concept_links = row_count; + if inserted_concept_links <> 1 then + raise exception 'governance/concept packet inserted % concept link row(s), expected 1', inserted_concept_links; + end if; + + insert into public.claim_governance_gate_links + (id, claim_id, governance_gate_id, relation, weight, rationale, source_ref, metadata) + values + ('1f81e105-af5e-5db8-a7be-08cc6cc4e13a'::uuid, '9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0'::uuid, 'fa88e31b-6fca-4801-bf72-f5db81950a11'::uuid, 'supports', 0.85, 'Specific enough to disagree with requires more than a compressed headline for ambiguous claims.', 'mapped-rich-proposal-ac036c9d:governance_gate:quality-gate', '{"proposal_id": "ac036c9d-20a0-4ffe-881f-57d6b7bacf22"}'::jsonb), + ('af04a87e-c1da-57e9-b11c-60d79daa5648'::uuid, '9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0'::uuid, '45695897-2a9c-4279-ac25-e59f166dec6a'::uuid, 'supports', 0.85, 'Bodies can state the true evidence tier and scope limits.', 'mapped-rich-proposal-ac036c9d:governance_gate:evidence-bar', '{"proposal_id": "ac036c9d-20a0-4ffe-881f-57d6b7bacf22"}'::jsonb); + get diagnostics inserted_governance_links = row_count; + if inserted_governance_links <> 2 then + raise exception 'governance/concept packet inserted % governance link row(s), expected 2', inserted_governance_links; + end if; +end $$; + +rollback; diff --git a/docs/reports/leo-working-state-20260709/governance-concept-clone-rehearsal-current.log b/docs/reports/leo-working-state-20260709/governance-concept-clone-rehearsal-current.log new file mode 100644 index 0000000..d4980ef --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-clone-rehearsal-current.log @@ -0,0 +1,181 @@ +=== service before === +MainPID=3252143 +NRestarts=0 +ActiveState=active +SubState=running +=== production schema/counts before === + prod_concept_maps | prod_claim_concept_map_links | prod_claim_governance_gate_links | prod_base_claims +-------------------+------------------------------+----------------------------------+------------------ + | | | 0 +(1 row) + +=== create disposable clone === +=== clone apply mapped base packet === +BEGIN +SET +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +COMMIT +BEGIN +SET +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +INSERT 0 1 +COMMIT +=== clone base generated counts after base apply === + clone_base_claims | clone_concept_maps | clone_claim_concept_map_links | clone_claim_governance_gate_links +-------------------+--------------------+-------------------------------+----------------------------------- + 7 | | | +(1 row) + +=== clone governance/concept preflight after base apply === + check_name | name | regclass +--------------+------------------------------------+---------- + schema_table | public.concept_maps | + schema_table | public.claim_concept_map_links | + schema_table | public.claim_governance_gate_links | +(3 rows) + + check_name | id | status | text +---------------------+--------------------------------------+--------+------------------------------------------------------------------------------------------------- + required_base_claim | 9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0 | open | KB claim nodes need explanatory bodies, not only one-sentence headlines. + required_base_claim | d009dfc4-9755-58a7-affb-80e3e842a775 | open | Capital allocation depends on distributed knowledge, incentives, liquidity, and feedback loops. +(2 rows) + + check_name | id | name | criteria | evidence_bar +--------------------------+--------------------------------------+--------------+------------------------------------------------------------------------------------------------------------+------------------------------------- + required_governance_gate | 45695897-2a9c-4279-ac25-e59f166dec6a | evidence-bar | likely needs empirical data; experimental = coherent argument, limited validation; speculative = untested. | likely > experimental > speculative + required_governance_gate | fa88e31b-6fca-4801-bf72-f5db81950a11 | quality-gate | Specific enough to disagree with; evidence traceable; not a duplicate; right domain reviewers. | +(2 rows) + +=== clone apply governance/concept packet === +BEGIN +CREATE TABLE +CREATE TABLE +CREATE TABLE +CREATE INDEX +CREATE INDEX +CREATE INDEX +CREATE INDEX +DO +COMMIT +=== clone governance/concept postflight after apply === + generated_concept_map_rows | generated_concept_link_rows | generated_governance_link_rows +----------------------------+-----------------------------+-------------------------------- + 1 | 1 | 2 +(1 row) + + id | key | title | status | source_ref | metadata +--------------------------------------+---------------------------------+---------------------------------+--------+---------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + f013126c-0937-5bc8-b021-9697e59057d0 | distributed_market_intelligence | Distributed market intelligence | active | mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence | {"proposal_id": "14fa5ecc-ac7a-41c1-807d-a2e85b936617", "source_fragment": "capital_allocation_depends_on_distributed_market_intelligence draws_from concept_map:distributed_market_intelligence", "base_packet_required_first": "production-apply-packet-mapped-20260709"} +(1 row) + + id | claim_id | concept_map_id | relation | weight | rationale | source_ref +--------------------------------------+--------------------------------------+--------------------------------------+--------------+--------+------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------- + af4ce1b9-db03-5bde-a21b-0e16ca0f48b8 | d009dfc4-9755-58a7-affb-80e3e842a775 | f013126c-0937-5bc8-b021-9697e59057d0 | derives_from | 0.75 | Mapped proposal 14fa5ecc: the capital-allocation distributed-knowledge claim draws from the distributed market intelligence concept map. | mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence +(1 row) + + id | claim_id | governance_gate_id | relation | weight | rationale | source_ref +--------------------------------------+--------------------------------------+--------------------------------------+----------+--------+-------------------------------------------------------------------------------------------------+------------------------------------------------------------ + af04a87e-c1da-57e9-b11c-60d79daa5648 | 9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0 | 45695897-2a9c-4279-ac25-e59f166dec6a | supports | 0.85 | Bodies can state the true evidence tier and scope limits. | mapped-rich-proposal-ac036c9d:governance_gate:evidence-bar + 1f81e105-af5e-5db8-a7be-08cc6cc4e13a | 9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0 | fa88e31b-6fca-4801-bf72-f5db81950a11 | supports | 0.85 | Specific enough to disagree with requires more than a compressed headline for ambiguous claims. | mapped-rich-proposal-ac036c9d:governance_gate:quality-gate +(2 rows) + +=== clone generated counts after governance/concept apply === + clone_base_claims | clone_concept_maps | clone_concept_links | clone_governance_links +-------------------+--------------------+---------------------+------------------------ + 7 | 1 | 1 | 2 +(1 row) + +=== clone delete rollback governance/concept packet === +BEGIN +DELETE 2 +DELETE 1 +DELETE 1 +DO +COMMIT +=== clone schema readback after governance/concept rollback === + clone_concept_maps | clone_claim_concept_map_links | clone_claim_governance_gate_links +--------------------+-------------------------------+----------------------------------- + | | +(1 row) + +=== clone delete rollback mapped base packet === +BEGIN +DELETE 17 +DELETE 11 +UPDATE 2 +DELETE 15 +DELETE 7 +COMMIT +=== clone generated counts after all rollbacks === + clone_base_claims | clone_concept_maps | clone_claim_concept_map_links | clone_claim_governance_gate_links +-------------------+--------------------+-------------------------------+----------------------------------- + 0 | | | +(1 row) + +=== production schema/counts after clone proof === + prod_concept_maps | prod_claim_concept_map_links | prod_claim_governance_gate_links | prod_base_claims +-------------------+------------------------------+----------------------------------+------------------ + | | | 0 +(1 row) + +=== cleanup disposable clone and temp files === +=== cleanup readback === + disposable_db_exists +---------------------- + 0 +(1 row) + +host_tmp_removed=yes +container_tmp_removed=yes +=== service after === +MainPID=3252143 +NRestarts=0 +ActiveState=active +SubState=running diff --git a/docs/reports/leo-working-state-20260709/governance-concept-current.md b/docs/reports/leo-working-state-20260709/governance-concept-current.md new file mode 100644 index 0000000..46d913e --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-current.md @@ -0,0 +1,67 @@ +# Governance And Concept Map Packet - 2026-07-10 + +Generated UTC: `2026-07-10` + +## Verdict + +Clone-proven, not production-applied. + +The live VPS schema had `public.governance_gates` but no canonical table linking claims to those gates, and no first-class concept-map table. This packet creates the minimal schema needed for the final non-claim fragments from the mapped rich proposals, then inserts exact row-level links after the mapped base packet exists. + +## Schema Created In Clone + +- `public.concept_maps` +- `public.claim_concept_map_links` +- `public.claim_governance_gate_links` + +## Safe Writes + +- `public.concept_maps`: 1 row + - `f013126c-0937-5bc8-b021-9697e59057d0`: `distributed_market_intelligence` +- `public.claim_concept_map_links`: 1 row + - Claim `d009dfc4-9755-58a7-affb-80e3e842a775` derives from concept map `f013126c-0937-5bc8-b021-9697e59057d0` +- `public.claim_governance_gate_links`: 2 rows + - Claim `9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0` supports quality gate `fa88e31b-6fca-4801-bf72-f5db81950a11` + - Claim `9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0` supports evidence bar `45695897-2a9c-4279-ac25-e59f166dec6a` + +## Clone Proof + +Disposable database: `teleo_governance_concept_rehearsal_20260710` + +Sequence: + +1. Created a disposable clone from live `teleo` using `pg_dump | psql`. +2. Applied the mapped base packet in the clone: `7` generated claims. +3. Ran governance/concept preflight: + - schema tables did not already exist. + - required base claims existed. + - required governance gates existed. +4. Ran governance/concept authorized commit SQL in the clone. +5. Postflight read back `1` concept map, `1` concept link, and `2` governance-gate links. +6. Ran governance/concept delete rollback. +7. Rollback removed generated rows and dropped the generated schema tables because they were empty. +8. Ran mapped base packet delete rollback. +9. Clone returned to `0` base claims and no generated governance/concept tables. +10. Production stayed unchanged: no generated governance/concept tables and `0` base generated claims. +11. Dropped the disposable DB and removed host/container temp files. + +Cleanup readback: + +- `disposable_db_exists`: `0` +- host tmp removed: yes +- container tmp removed: yes +- `leoclean-gateway.service`: `active` +- `MainPID`: `3252143` +- `NRestarts`: `0` + +## Evidence + +- Packet JSON: `docs/reports/leo-working-state-20260709/governance-concept-packet.json` +- Authorized commit SQL, not executed in production: `docs/reports/leo-working-state-20260709/governance-concept-apply-authorized-commit.sql` +- Delete rollback SQL: `docs/reports/leo-working-state-20260709/governance-concept-delete-rollback.sql` +- Clone rehearsal log: `docs/reports/leo-working-state-20260709/governance-concept-clone-rehearsal-current.log` +- State image: `docs/reports/leo-working-state-20260709/leo-db-state-24-governance-concept-schema.svg` + +## Claim Ceiling + +This proves the remaining governance-gate and concept-map fragments are representable with a minimal schema packet and reversible in a disposable clone after the mapped base packet exists. It does not prove production has been updated, because production commit was intentionally not executed. diff --git a/docs/reports/leo-working-state-20260709/governance-concept-delete-rollback.sql b/docs/reports/leo-working-state-20260709/governance-concept-delete-rollback.sql new file mode 100644 index 0000000..3ef5d9c --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-delete-rollback.sql @@ -0,0 +1,36 @@ +\set ON_ERROR_STOP on +-- Emergency rollback for governance/concept generated rows only. +-- Drops generated schema only when the generated tables are empty after row delete. +begin; + +delete from public.claim_governance_gate_links +where id in (select id from (values + ('1f81e105-af5e-5db8-a7be-08cc6cc4e13a'::uuid), + ('af04a87e-c1da-57e9-b11c-60d79daa5648'::uuid) + ) as v(id)); + +delete from public.claim_concept_map_links +where id = 'af4ce1b9-db03-5bde-a21b-0e16ca0f48b8'::uuid; + +delete from public.concept_maps +where id = 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid; + +do $$ +begin + if to_regclass('public.claim_governance_gate_links') is not null + and not exists (select 1 from public.claim_governance_gate_links) then + drop table public.claim_governance_gate_links; + end if; + + if to_regclass('public.claim_concept_map_links') is not null + and not exists (select 1 from public.claim_concept_map_links) then + drop table public.claim_concept_map_links; + end if; + + if to_regclass('public.concept_maps') is not null + and not exists (select 1 from public.concept_maps) then + drop table public.concept_maps; + end if; +end $$; + +commit; diff --git a/docs/reports/leo-working-state-20260709/governance-concept-packet.json b/docs/reports/leo-working-state-20260709/governance-concept-packet.json new file mode 100644 index 0000000..6fb080e --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-packet.json @@ -0,0 +1,100 @@ +{ + "base_packet_required_first": "production-apply-packet-mapped-20260709", + "generated_counts": { + "claim_concept_map_links": 1, + "claim_governance_gate_links": 2, + "concept_maps": 1 + }, + "packet_version": 1, + "production_apply_status": "not_executed", + "purpose": "Companion packet for mapped rich proposal governance-gate and concept-map targets.", + "represented_fragments": [ + "capital_allocation_depends_on_distributed_market_intelligence draws_from concept_map:distributed_market_intelligence", + "claim_nodes_need_bodies supports governance_gate:quality-gate", + "claim_nodes_need_bodies supports governance_gate:evidence-bar" + ], + "required_existing_rows": { + "public.claims": [ + "d009dfc4-9755-58a7-affb-80e3e842a775", + "9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0" + ], + "public.governance_gates": [ + "fa88e31b-6fca-4801-bf72-f5db81950a11", + "45695897-2a9c-4279-ac25-e59f166dec6a" + ] + }, + "safe_writes": [ + { + "operation": "insert", + "rows": [ + { + "body": "A concept map for how capital allocation depends on distributed knowledge, incentives, liquidity, feedback loops, and market signals rather than a single central planner.", + "id": "f013126c-0937-5bc8-b021-9697e59057d0", + "key": "distributed_market_intelligence", + "metadata": { + "base_packet_required_first": "production-apply-packet-mapped-20260709", + "proposal_id": "14fa5ecc-ac7a-41c1-807d-a2e85b936617", + "source_fragment": "capital_allocation_depends_on_distributed_market_intelligence draws_from concept_map:distributed_market_intelligence" + }, + "source_ref": "mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence", + "status": "active", + "title": "Distributed market intelligence" + } + ], + "table": "public.concept_maps" + }, + { + "operation": "insert", + "rows": [ + { + "claim_id": "d009dfc4-9755-58a7-affb-80e3e842a775", + "concept_map_id": "f013126c-0937-5bc8-b021-9697e59057d0", + "id": "af4ce1b9-db03-5bde-a21b-0e16ca0f48b8", + "metadata": { + "proposal_id": "14fa5ecc-ac7a-41c1-807d-a2e85b936617" + }, + "rationale": "Mapped proposal 14fa5ecc: the capital-allocation distributed-knowledge claim draws from the distributed market intelligence concept map.", + "relation": "derives_from", + "source_ref": "mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence", + "weight": 0.75 + } + ], + "table": "public.claim_concept_map_links" + }, + { + "operation": "insert", + "rows": [ + { + "claim_id": "9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0", + "governance_gate_id": "fa88e31b-6fca-4801-bf72-f5db81950a11", + "id": "1f81e105-af5e-5db8-a7be-08cc6cc4e13a", + "metadata": { + "proposal_id": "ac036c9d-20a0-4ffe-881f-57d6b7bacf22" + }, + "rationale": "Specific enough to disagree with requires more than a compressed headline for ambiguous claims.", + "relation": "supports", + "source_ref": "mapped-rich-proposal-ac036c9d:governance_gate:quality-gate", + "weight": 0.85 + }, + { + "claim_id": "9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0", + "governance_gate_id": "45695897-2a9c-4279-ac25-e59f166dec6a", + "id": "af04a87e-c1da-57e9-b11c-60d79daa5648", + "metadata": { + "proposal_id": "ac036c9d-20a0-4ffe-881f-57d6b7bacf22" + }, + "rationale": "Bodies can state the true evidence tier and scope limits.", + "relation": "supports", + "source_ref": "mapped-rich-proposal-ac036c9d:governance_gate:evidence-bar", + "weight": 0.85 + } + ], + "table": "public.claim_governance_gate_links" + } + ], + "schema_writes": [ + "public.concept_maps", + "public.claim_concept_map_links", + "public.claim_governance_gate_links" + ] +} diff --git a/docs/reports/leo-working-state-20260709/governance-concept-postflight.sql b/docs/reports/leo-working-state-20260709/governance-concept-postflight.sql new file mode 100644 index 0000000..f252885 --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-postflight.sql @@ -0,0 +1,39 @@ +\set ON_ERROR_STOP on +-- Governance/concept companion postflight row-level readback. + +select + (select count(*) from public.concept_maps where id = 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid) as generated_concept_map_rows, + (select count(*) from public.claim_concept_map_links where id = 'af4ce1b9-db03-5bde-a21b-0e16ca0f48b8'::uuid) as generated_concept_link_rows, + (select count(*) from public.claim_governance_gate_links where id in (select id from (values + ('1f81e105-af5e-5db8-a7be-08cc6cc4e13a'::uuid), + ('af04a87e-c1da-57e9-b11c-60d79daa5648'::uuid) + ) as v(id))) as generated_governance_link_rows; + + +select id::text, key, title, status, source_ref, metadata::text +from public.concept_maps +where id = 'f013126c-0937-5bc8-b021-9697e59057d0'::uuid; + +select id::text, + claim_id::text, + concept_map_id::text, + relation, + weight, + left(rationale, 220) as rationale, + source_ref +from public.claim_concept_map_links +where id = 'af4ce1b9-db03-5bde-a21b-0e16ca0f48b8'::uuid; + +select id::text, + claim_id::text, + governance_gate_id::text, + relation, + weight, + left(rationale, 220) as rationale, + source_ref +from public.claim_governance_gate_links +where id in (select id from (values + ('1f81e105-af5e-5db8-a7be-08cc6cc4e13a'::uuid), + ('af04a87e-c1da-57e9-b11c-60d79daa5648'::uuid) + ) as v(id)) +order by governance_gate_id; diff --git a/docs/reports/leo-working-state-20260709/governance-concept-preflight.sql b/docs/reports/leo-working-state-20260709/governance-concept-preflight.sql new file mode 100644 index 0000000..ddf34c0 --- /dev/null +++ b/docs/reports/leo-working-state-20260709/governance-concept-preflight.sql @@ -0,0 +1,33 @@ +\set ON_ERROR_STOP on +-- Governance/concept companion preflight. Read-only. +-- Run after the mapped rich proposal packet has been applied. + +select 'schema_table' as check_name, name, to_regclass(name) as regclass +from (values + ('public.concept_maps'), + ('public.claim_concept_map_links'), + ('public.claim_governance_gate_links') +) as v(name); + +select 'required_base_claim' as check_name, + c.id::text, + c.status, + left(c.text, 220) as text +from public.claims c +where c.id in (select id from (values + ('d009dfc4-9755-58a7-affb-80e3e842a775'::uuid), + ('9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0'::uuid) + ) as v(id)) +order by c.id; + +select 'required_governance_gate' as check_name, + id::text, + name, + left(criteria, 180) as criteria, + left(evidence_bar, 180) as evidence_bar +from public.governance_gates +where id in (select id from (values + ('fa88e31b-6fca-4801-bf72-f5db81950a11'::uuid), + ('45695897-2a9c-4279-ac25-e59f166dec6a'::uuid) + ) as v(id)) +order by name; diff --git a/docs/reports/leo-working-state-20260709/leo-db-state-24-governance-concept-schema.svg b/docs/reports/leo-working-state-20260709/leo-db-state-24-governance-concept-schema.svg new file mode 100644 index 0000000..4602798 --- /dev/null +++ b/docs/reports/leo-working-state-20260709/leo-db-state-24-governance-concept-schema.svg @@ -0,0 +1,64 @@ + + Working Leo DB State 24 - Governance and concept map schema packet + Diagram of the clone-proven governance gate and concept map schema packet. + + Working Leo DB State 24: Governance + Concept Map Packet + Minimal schema packet for the final non-claim fragments. Clone-proven; production untouched. + + + Base Mapped Claims + public.claims + d009dfc4... distributed knowledge + 9bcf7e6b... claim nodes need bodies + Prerequisite: mapped base packet creates rows first. + + + New Concept Schema + public.concept_maps + distributed_market_intelligence + public.claim_concept_map_links + claim derives_from concept map + + + New Governance Links + public.claim_governance_gate_links + claim supports quality-gate + claim supports evidence-bar + public.governance_gates already existed. + + + derives_from + + supports gates + + + Disposable Clone Proof + Clone DB: teleo_governance_concept_rehearsal_20260710 + After apply: concept maps 1, concept links 1, gate links 2 + After rollback: generated tables absent, base claims 0 + Production schema stayed unchanged. + + + Apply Boundary + No production commit executed. + No live VPS Leo runtime changed. + leoclean-gateway active, NRestarts=0. + Ready for separate schema/apply review. + + + Still Not Live + Tables do not exist in production yet. + Generated canonical rows remain unapplied. + GCP parity remains separate. + + This packet resolves the schema shape for governance-gate and concept-map fragments without forcing them into public.claim_edges. + + + + + + + + + + diff --git a/docs/reports/leo-working-state-20260709/working-leo-current-state-20260709.md b/docs/reports/leo-working-state-20260709/working-leo-current-state-20260709.md index 26e6dbf..fefc83f 100644 --- a/docs/reports/leo-working-state-20260709/working-leo-current-state-20260709.md +++ b/docs/reports/leo-working-state-20260709/working-leo-current-state-20260709.md @@ -93,6 +93,12 @@ A working Leo, for Cory/m3taversal's current expectation, is a Telegram-facing a - Rio packet then inserted `Rio capital deployment layer` and `Rio internet-finance capital product` - anchors connect Claim A to the capital layer, Claim C and Claim D to the product, the product to the capital layer, and the capital layer to the Back shared root - Rio rollback deleted the `5` anchors and `2` nodes; base rollback returned generated base claims to `0`; production stayed unchanged at `0/0/0`; temp files and clone were removed; service remained active with `MainPID=3252143`, `NRestarts=0` +- Governance/concept-map schema companion packet is now clone-proven: + - live schema had `public.governance_gates` but no claim-to-governance link table, and no first-class concept-map table + - packet creates minimal `public.concept_maps`, `public.claim_concept_map_links`, and `public.claim_governance_gate_links` tables in-transaction + - disposable DB `teleo_governance_concept_rehearsal_20260710` applied the mapped base packet first (`7` claims) + - governance/concept packet then inserted `1` concept map, `1` claim-concept link, and `2` claim-governance links + - rollback deleted generated rows and dropped the generated tables because they were empty; base rollback returned generated base claims to `0`; production stayed unchanged with no generated tables; temp files and clone were removed; service remained active with `MainPID=3252143`, `NRestarts=0` - VPS/Hermes/DB identity and document-linking map is now documented: - the supplied July 9 master/build and database-reference PDFs confirm the intended architecture is DB-first identity: canonical Postgres identity graph rows render to `SOUL.md`, and evidence depth remains on demand through `teleo-kb` - direct `SOUL.md` edits are profile/runtime artifact edits, not canonical DB updates; they can drift or be overwritten unless represented in canonical rows first @@ -124,6 +130,8 @@ A working Leo, for Cory/m3taversal's current expectation, is a Telegram-facing a - Cross-surface strategy anchor clone proof log: `outputs/rich-proposal-creation-plan-20260709/cross-surface-resolution-20260709/cross-surface-clone-rehearsal-current.log` - Rio strategy-context packet: `outputs/rich-proposal-creation-plan-20260709/rio-strategy-context-20260710/rio-strategy-packet.json` - Rio strategy-context clone proof log: `outputs/rich-proposal-creation-plan-20260709/rio-strategy-context-20260710/rio-strategy-clone-rehearsal-current.log` +- Governance/concept-map packet: `outputs/rich-proposal-creation-plan-20260709/governance-concept-20260710/governance-concept-packet.json` +- Governance/concept-map clone proof log: `outputs/rich-proposal-creation-plan-20260709/governance-concept-20260710/governance-concept-clone-rehearsal-current.log` - VPS/Hermes/DB mapping: `outputs/vps-hermes-db-mapping-20260709.md` - Identity render / decision matrix / document artifact image: `outputs/leo-db-state-22-identity-render-matrix-artifacts.svg` - Execution plan: `outputs/working-leo-execution-plan-20260709/working-leo-execution-plan-current.md` @@ -142,11 +150,12 @@ A working Leo, for Cory/m3taversal's current expectation, is a Telegram-facing a - Claim/body/metadata schema image: `outputs/leo-db-state-19-claims-body-metadata.svg` - Cross-surface strategy anchor proof image: `outputs/leo-db-state-20-cross-surface-anchor.svg` - Rio strategy context proof image: `outputs/leo-db-state-23-rio-strategy-context.svg` +- Governance/concept-map schema proof image: `outputs/leo-db-state-24-governance-concept-schema.svg` - GCP parity blocker: `outputs/gcp-db-parity-current-blocker-20260709.json` ## Next Actions 1. Keep the live Telegram canary as the top-level regression proof for Cory-working memory + KB audit. 2. Do not auto-apply old freeform approvals. -3. Resolve the remaining non-claim target decisions: governance gates and concept-map storage. The active policy-to-Claim-D strategy anchor and Rio strategy context are clone-proven but not production-applied. +3. Do not run production apply without explicit authorization. The mapped base, cross-surface anchor, Rio strategy, and governance/concept packets are clone-proven but not production-applied. 4. Keep VPS Leo runtime behavior unchanged while the DB apply path is stabilized. diff --git a/docs/reports/leo-working-state-20260709/working-leo-execution-plan-current.md b/docs/reports/leo-working-state-20260709/working-leo-execution-plan-current.md index 274bd97..2ff7711 100644 --- a/docs/reports/leo-working-state-20260709/working-leo-execution-plan-current.md +++ b/docs/reports/leo-working-state-20260709/working-leo-execution-plan-current.md @@ -1,6 +1,6 @@ # Working Leo Execution Plan - 2026-07-09 -Claim ceiling: VPS Telegram memory/KB audit, open-ended Cory-style triage, Telegram-to-`kb_stage` proposal staging, and strict existing-ID apply are working. Helmer 7 Powers is full-coverage packet and ledger clone-proven, but not production-applied. The mapped rich packet is clone-proven for its supported subset, the strategy-anchor companion write is clone-proven, and the Rio strategy-context companion write is clone-proven; none are production-applied. Governance-gate storage, concept-map storage, and GCP parity remain pending. +Claim ceiling: VPS Telegram memory/KB audit, open-ended Cory-style triage, Telegram-to-`kb_stage` proposal staging, and strict existing-ID apply are working. Helmer 7 Powers is full-coverage packet and ledger clone-proven, but not production-applied. The mapped rich packet is clone-proven for its supported subset, the strategy-anchor companion write is clone-proven, the Rio strategy-context companion write is clone-proven, and the governance/concept-map schema companion write is clone-proven; none are production-applied. GCP parity remains pending. ## WL-EXEC-01 - VPS Telegram-visible memory + KB audit - Status: `done` @@ -73,12 +73,13 @@ Claim ceiling: VPS Telegram memory/KB audit, open-ended Cory-style triage, Teleg - `/Users/user/Documents/Codex/2026-07-09/019f34eb-d297-72d0-b7e2-b222d5515ab9-load/outputs/rich-proposal-creation-plan-20260709/rio-strategy-context-20260710/rio-strategy-clone-rehearsal-current.log` ## WL-EXEC-06 - Reviewed decisions for unsupported rich-packet fragments -- Status: `partially_resolved_pending_governance_and_concept_map_decisions` -- Result: Edge-type mappings, one canonical capital-allocation target, the active policy-to-Claim-D strategy anchor, and Rio strategy context are clone-proven. Remaining blockers are explicit non-claim/cross-table targets: governance gates and concept-map storage. -- Next action: Create a separate reviewed governance/concept-map storage lane before any canonical production apply of those fragments, or explicitly defer them from the production apply contract. -- Not done condition: No production apply until these decisions are resolved. +- Status: `done_packet_ready_not_executed` +- Result: Edge-type mappings, one canonical capital-allocation target, the active policy-to-Claim-D strategy anchor, Rio strategy context, and governance/concept-map storage are clone-proven. The governance/concept-map packet creates minimal tables and row-level links in a disposable clone, then rollback removes the rows and drops the generated tables. +- Next action: If production apply is authorized, apply packets in dependency order in a maintenance window: mapped base packet, cross-surface anchor packet, Rio strategy packet, governance/concept schema packet, then postflight readback. +- Not done condition: Production canonical rows/schema remain unapplied until explicit production apply authorization. - Evidence: - `/Users/user/Documents/Codex/2026-07-09/019f34eb-d297-72d0-b7e2-b222d5515ab9-load/outputs/rich-proposal-creation-plan-20260709/rich-proposal-creation-plan-mapped-current.md` + - `/Users/user/Documents/Codex/2026-07-09/019f34eb-d297-72d0-b7e2-b222d5515ab9-load/outputs/rich-proposal-creation-plan-20260709/governance-concept-20260710/governance-concept-clone-rehearsal-current.log` ## WL-EXEC-07 - Leo-in-the-loop staging from Telegram - Status: `done_for_guarded_kb_stage_canary` diff --git a/scripts/kb_governance_concept_packet.py b/scripts/kb_governance_concept_packet.py new file mode 100644 index 0000000..8d827fc --- /dev/null +++ b/scripts/kb_governance_concept_packet.py @@ -0,0 +1,499 @@ +#!/usr/bin/env python3 +"""Generate a governance/concept-map companion packet for mapped KB proposals. + +The current live schema has governance gate rows but no canonical table linking +claims to those gates, and it has no first-class concept-map table. This packet +creates the minimal schema needed for the remaining mapped proposal fragments, +then inserts exact row-level links after the mapped base packet has created the +required claim rows. + +The packet builder is not an executor. Production apply remains a separate +authorization boundary. +""" + +from __future__ import annotations + +import argparse +import json +import sys +import uuid +from pathlib import Path +from typing import Any + +HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(HERE)) + +from kb_rich_proposal_creation_plan import _sql_literal # noqa: E402 + +BASE_PACKET_REQUIRED_FIRST = "production-apply-packet-mapped-20260709" + +PROPOSAL_CONCEPT_ID = "14fa5ecc-ac7a-41c1-807d-a2e85b936617" +PROPOSAL_GOVERNANCE_ID = "ac036c9d-20a0-4ffe-881f-57d6b7bacf22" + +CLAIM_DISTRIBUTED_MARKET_INTELLIGENCE_ID = "d009dfc4-9755-58a7-affb-80e3e842a775" +CLAIM_NODES_NEED_BODIES_ID = "9bcf7e6b-4e98-52b1-91ef-96cfc15e3df0" + +QUALITY_GATE_ID = "fa88e31b-6fca-4801-bf72-f5db81950a11" +EVIDENCE_BAR_ID = "45695897-2a9c-4279-ac25-e59f166dec6a" + +CONCEPT_MAP_KEY = "distributed_market_intelligence" +ID_NAMESPACE = uuid.uuid5(uuid.NAMESPACE_URL, "teleo:working-leo:governance-concept-packet") + + +def stable_id(key: str) -> str: + return str(uuid.uuid5(ID_NAMESPACE, key)) + + +CONCEPT_MAP_ID = stable_id("concept-map:distributed-market-intelligence") +CONCEPT_LINK_ID = stable_id("claim-concept-map-link:capital-allocation-distributed-knowledge") +QUALITY_GATE_LINK_ID = stable_id("claim-governance-link:claim-bodies:quality-gate") +EVIDENCE_BAR_LINK_ID = stable_id("claim-governance-link:claim-bodies:evidence-bar") + + +def _uuid_values(values: list[str], *, column_name: str = "id") -> str: + rows = ",\n ".join(f"('{value}'::uuid)" for value in values) + return f"(values\n {rows}\n ) as v({column_name})" + + +def _jsonb(value: Any) -> str: + return _sql_literal(json.dumps(value, sort_keys=True)) + "::jsonb" + + +def concept_map_row() -> dict[str, Any]: + return { + "id": CONCEPT_MAP_ID, + "key": CONCEPT_MAP_KEY, + "title": "Distributed market intelligence", + "body": ( + "A concept map for how capital allocation depends on distributed knowledge, incentives, " + "liquidity, feedback loops, and market signals rather than a single central planner." + ), + "status": "active", + "source_ref": "mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence", + "metadata": { + "base_packet_required_first": BASE_PACKET_REQUIRED_FIRST, + "proposal_id": PROPOSAL_CONCEPT_ID, + "source_fragment": ( + "capital_allocation_depends_on_distributed_market_intelligence draws_from " + "concept_map:distributed_market_intelligence" + ), + }, + } + + +def concept_links() -> list[dict[str, Any]]: + return [ + { + "id": CONCEPT_LINK_ID, + "claim_id": CLAIM_DISTRIBUTED_MARKET_INTELLIGENCE_ID, + "concept_map_id": CONCEPT_MAP_ID, + "relation": "derives_from", + "weight": 0.75, + "rationale": ( + "Mapped proposal 14fa5ecc: the capital-allocation distributed-knowledge claim draws " + "from the distributed market intelligence concept map." + ), + "source_ref": "mapped-rich-proposal-14fa5ecc:concept_map:distributed_market_intelligence", + "metadata": {"proposal_id": PROPOSAL_CONCEPT_ID}, + } + ] + + +def governance_links() -> list[dict[str, Any]]: + return [ + { + "id": QUALITY_GATE_LINK_ID, + "claim_id": CLAIM_NODES_NEED_BODIES_ID, + "governance_gate_id": QUALITY_GATE_ID, + "relation": "supports", + "weight": 0.85, + "rationale": ( + "Specific enough to disagree with requires more than a compressed headline for ambiguous claims." + ), + "source_ref": "mapped-rich-proposal-ac036c9d:governance_gate:quality-gate", + "metadata": {"proposal_id": PROPOSAL_GOVERNANCE_ID}, + }, + { + "id": EVIDENCE_BAR_LINK_ID, + "claim_id": CLAIM_NODES_NEED_BODIES_ID, + "governance_gate_id": EVIDENCE_BAR_ID, + "relation": "supports", + "weight": 0.85, + "rationale": "Bodies can state the true evidence tier and scope limits.", + "source_ref": "mapped-rich-proposal-ac036c9d:governance_gate:evidence-bar", + "metadata": {"proposal_id": PROPOSAL_GOVERNANCE_ID}, + }, + ] + + +def build_schema_sql() -> str: + return """create table if not exists public.concept_maps ( + id uuid primary key default gen_random_uuid(), + key text not null unique, + title text not null, + body text not null, + status text not null default 'active' check (status = any (array['draft'::text, 'active'::text, 'retired'::text])), + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + updated_at timestamptz not null default now() +); + +create table if not exists public.claim_concept_map_links ( + id uuid primary key default gen_random_uuid(), + claim_id uuid not null references public.claims(id) on delete cascade, + concept_map_id uuid not null references public.concept_maps(id) on delete cascade, + relation text not null check (relation = any (array['derives_from'::text, 'supports'::text, 'contextualizes'::text, 'contains'::text, 'requires'::text, 'relates'::text])), + weight numeric check (weight >= 0 and weight <= 1), + rationale text not null, + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + unique (claim_id, concept_map_id, relation) +); + +create table if not exists public.claim_governance_gate_links ( + id uuid primary key default gen_random_uuid(), + claim_id uuid not null references public.claims(id) on delete cascade, + governance_gate_id uuid not null references public.governance_gates(id) on delete cascade, + relation text not null check (relation = any (array['supports'::text, 'requires'::text, 'constrains'::text, 'documents'::text])), + weight numeric check (weight >= 0 and weight <= 1), + rationale text not null, + source_ref text, + metadata jsonb not null default '{}'::jsonb, + created_at timestamptz not null default now(), + unique (claim_id, governance_gate_id, relation) +); + +create index if not exists claim_concept_map_links_claim + on public.claim_concept_map_links (claim_id, relation); +create index if not exists claim_concept_map_links_map + on public.claim_concept_map_links (concept_map_id, relation); +create index if not exists claim_governance_gate_links_claim + on public.claim_governance_gate_links (claim_id, relation); +create index if not exists claim_governance_gate_links_gate + on public.claim_governance_gate_links (governance_gate_id, relation);""" + + +def build_generated_counts_sql() -> str: + return f"""select + (select count(*) from public.concept_maps where id = {_sql_literal(CONCEPT_MAP_ID)}::uuid) as generated_concept_map_rows, + (select count(*) from public.claim_concept_map_links where id = {_sql_literal(CONCEPT_LINK_ID)}::uuid) as generated_concept_link_rows, + (select count(*) from public.claim_governance_gate_links where id in (select id from {_uuid_values([QUALITY_GATE_LINK_ID, EVIDENCE_BAR_LINK_ID])})) as generated_governance_link_rows; +""" + + +def _concept_map_insert_sql() -> str: + row = concept_map_row() + return f"""insert into public.concept_maps (id, key, title, body, status, source_ref, metadata) +values ( + {_sql_literal(row['id'])}::uuid, + {_sql_literal(row['key'])}, + {_sql_literal(row['title'])}, + {_sql_literal(row['body'])}, + {_sql_literal(row['status'])}, + {_sql_literal(row['source_ref'])}, + {_jsonb(row['metadata'])} +);""" + + +def _concept_link_insert_values() -> str: + rows = [] + for row in concept_links(): + rows.append( + "(" + f"{_sql_literal(row['id'])}::uuid, " + f"{_sql_literal(row['claim_id'])}::uuid, " + f"{_sql_literal(row['concept_map_id'])}::uuid, " + f"{_sql_literal(row['relation'])}, " + f"{row['weight']}, " + f"{_sql_literal(row['rationale'])}, " + f"{_sql_literal(row['source_ref'])}, " + f"{_jsonb(row['metadata'])}" + ")" + ) + return ",\n ".join(rows) + + +def _governance_link_insert_values() -> str: + rows = [] + for row in governance_links(): + rows.append( + "(" + f"{_sql_literal(row['id'])}::uuid, " + f"{_sql_literal(row['claim_id'])}::uuid, " + f"{_sql_literal(row['governance_gate_id'])}::uuid, " + f"{_sql_literal(row['relation'])}, " + f"{row['weight']}, " + f"{_sql_literal(row['rationale'])}, " + f"{_sql_literal(row['source_ref'])}, " + f"{_jsonb(row['metadata'])}" + ")" + ) + return ",\n ".join(rows) + + +def build_preflight_sql() -> str: + required_claim_ids = [CLAIM_DISTRIBUTED_MARKET_INTELLIGENCE_ID, CLAIM_NODES_NEED_BODIES_ID] + required_gate_ids = [QUALITY_GATE_ID, EVIDENCE_BAR_ID] + return f"""\\set ON_ERROR_STOP on +-- Governance/concept companion preflight. Read-only. +-- Run after the mapped rich proposal packet has been applied. + +select 'schema_table' as check_name, name, to_regclass(name) as regclass +from (values + ('public.concept_maps'), + ('public.claim_concept_map_links'), + ('public.claim_governance_gate_links') +) as v(name); + +select 'required_base_claim' as check_name, + c.id::text, + c.status, + left(c.text, 220) as text +from public.claims c +where c.id in (select id from {_uuid_values(required_claim_ids)}) +order by c.id; + +select 'required_governance_gate' as check_name, + id::text, + name, + left(criteria, 180) as criteria, + left(evidence_bar, 180) as evidence_bar +from public.governance_gates +where id in (select id from {_uuid_values(required_gate_ids)}) +order by name; +""" + + +def build_apply_sql(*, commit: bool) -> str: + terminator = "commit;" if commit else "rollback;" + required_claim_ids = [CLAIM_DISTRIBUTED_MARKET_INTELLIGENCE_ID, CLAIM_NODES_NEED_BODIES_ID] + required_gate_ids = [QUALITY_GATE_ID, EVIDENCE_BAR_ID] + return f"""\\set ON_ERROR_STOP on +begin; + +{build_schema_sql()} + +do $$ +declare + inserted_concept_maps int; + inserted_concept_links int; + inserted_governance_links int; +begin + if ( + select count(*) from public.claims where id in (select id from {_uuid_values(required_claim_ids)}) + ) <> {len(required_claim_ids)} then + raise exception 'governance/concept packet requires mapped base claims to exist before inserts'; + end if; + + if ( + select count(*) from public.governance_gates where id in (select id from {_uuid_values(required_gate_ids)}) + ) <> {len(required_gate_ids)} then + raise exception 'governance/concept packet requires quality/evidence governance gates to exist'; + end if; + + if exists (select 1 from public.concept_maps where id = {_sql_literal(CONCEPT_MAP_ID)}::uuid or key = {_sql_literal(CONCEPT_MAP_KEY)}) then + raise exception 'governance/concept packet generated concept map already exists'; + end if; + + if exists (select 1 from public.claim_concept_map_links where id = {_sql_literal(CONCEPT_LINK_ID)}::uuid) then + raise exception 'governance/concept packet generated concept link already exists'; + end if; + + if exists ( + select 1 from public.claim_governance_gate_links + where id in (select id from {_uuid_values([QUALITY_GATE_LINK_ID, EVIDENCE_BAR_LINK_ID])}) + ) then + raise exception 'governance/concept packet generated governance link already exists'; + end if; + + {_concept_map_insert_sql()} + get diagnostics inserted_concept_maps = row_count; + if inserted_concept_maps <> 1 then + raise exception 'governance/concept packet inserted % concept map row(s), expected 1', inserted_concept_maps; + end if; + + insert into public.claim_concept_map_links + (id, claim_id, concept_map_id, relation, weight, rationale, source_ref, metadata) + values + {_concept_link_insert_values()}; + get diagnostics inserted_concept_links = row_count; + if inserted_concept_links <> {len(concept_links())} then + raise exception 'governance/concept packet inserted % concept link row(s), expected {len(concept_links())}', inserted_concept_links; + end if; + + insert into public.claim_governance_gate_links + (id, claim_id, governance_gate_id, relation, weight, rationale, source_ref, metadata) + values + {_governance_link_insert_values()}; + get diagnostics inserted_governance_links = row_count; + if inserted_governance_links <> {len(governance_links())} then + raise exception 'governance/concept packet inserted % governance link row(s), expected {len(governance_links())}', inserted_governance_links; + end if; +end $$; + +{terminator} +""" + + +def build_postflight_sql() -> str: + return f"""\\set ON_ERROR_STOP on +-- Governance/concept companion postflight row-level readback. + +{build_generated_counts_sql()} + +select id::text, key, title, status, source_ref, metadata::text +from public.concept_maps +where id = {_sql_literal(CONCEPT_MAP_ID)}::uuid; + +select id::text, + claim_id::text, + concept_map_id::text, + relation, + weight, + left(rationale, 220) as rationale, + source_ref +from public.claim_concept_map_links +where id = {_sql_literal(CONCEPT_LINK_ID)}::uuid; + +select id::text, + claim_id::text, + governance_gate_id::text, + relation, + weight, + left(rationale, 220) as rationale, + source_ref +from public.claim_governance_gate_links +where id in (select id from {_uuid_values([QUALITY_GATE_LINK_ID, EVIDENCE_BAR_LINK_ID])}) +order by governance_gate_id; +""" + + +def build_delete_rollback_sql() -> str: + return f"""\\set ON_ERROR_STOP on +-- Emergency rollback for governance/concept generated rows only. +-- Drops generated schema only when the generated tables are empty after row delete. +begin; + +delete from public.claim_governance_gate_links +where id in (select id from {_uuid_values([QUALITY_GATE_LINK_ID, EVIDENCE_BAR_LINK_ID])}); + +delete from public.claim_concept_map_links +where id = {_sql_literal(CONCEPT_LINK_ID)}::uuid; + +delete from public.concept_maps +where id = {_sql_literal(CONCEPT_MAP_ID)}::uuid; + +do $$ +begin + if to_regclass('public.claim_governance_gate_links') is not null + and not exists (select 1 from public.claim_governance_gate_links) then + drop table public.claim_governance_gate_links; + end if; + + if to_regclass('public.claim_concept_map_links') is not null + and not exists (select 1 from public.claim_concept_map_links) then + drop table public.claim_concept_map_links; + end if; + + if to_regclass('public.concept_maps') is not null + and not exists (select 1 from public.concept_maps) then + drop table public.concept_maps; + end if; +end $$; + +commit; +""" + + +def build_packet() -> dict[str, Any]: + return { + "packet_version": 1, + "purpose": "Companion packet for mapped rich proposal governance-gate and concept-map targets.", + "production_apply_status": "not_executed", + "base_packet_required_first": BASE_PACKET_REQUIRED_FIRST, + "schema_writes": [ + "public.concept_maps", + "public.claim_concept_map_links", + "public.claim_governance_gate_links", + ], + "generated_counts": { + "concept_maps": 1, + "claim_concept_map_links": len(concept_links()), + "claim_governance_gate_links": len(governance_links()), + }, + "required_existing_rows": { + "public.claims": [ + CLAIM_DISTRIBUTED_MARKET_INTELLIGENCE_ID, + CLAIM_NODES_NEED_BODIES_ID, + ], + "public.governance_gates": [QUALITY_GATE_ID, EVIDENCE_BAR_ID], + }, + "safe_writes": [ + { + "table": "public.concept_maps", + "operation": "insert", + "rows": [concept_map_row()], + }, + { + "table": "public.claim_concept_map_links", + "operation": "insert", + "rows": concept_links(), + }, + { + "table": "public.claim_governance_gate_links", + "operation": "insert", + "rows": governance_links(), + }, + ], + "represented_fragments": [ + "capital_allocation_depends_on_distributed_market_intelligence draws_from concept_map:distributed_market_intelligence", + "claim_nodes_need_bodies supports governance_gate:quality-gate", + "claim_nodes_need_bodies supports governance_gate:evidence-bar", + ], + "sql": { + "preflight": build_preflight_sql(), + "apply_rollback_rehearsal": build_apply_sql(commit=False), + "apply_commit": build_apply_sql(commit=True), + "postflight": build_postflight_sql(), + "delete_rollback": build_delete_rollback_sql(), + }, + } + + +def write_packet_files(packet: dict[str, Any], output_dir: Path) -> None: + output_dir.mkdir(parents=True, exist_ok=True) + sql = packet["sql"] + (output_dir / "governance-concept-preflight.sql").write_text(sql["preflight"], encoding="utf-8") + (output_dir / "governance-concept-apply-rollback-rehearsal.sql").write_text( + sql["apply_rollback_rehearsal"], encoding="utf-8" + ) + (output_dir / "governance-concept-apply-authorized-commit.sql").write_text( + sql["apply_commit"], encoding="utf-8" + ) + (output_dir / "governance-concept-postflight.sql").write_text(sql["postflight"], encoding="utf-8") + (output_dir / "governance-concept-delete-rollback.sql").write_text(sql["delete_rollback"], encoding="utf-8") + summary = {key: value for key, value in packet.items() if key != "sql"} + (output_dir / "governance-concept-packet.json").write_text( + json.dumps(summary, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + + +def parse_args(argv: list[str]) -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output-dir", type=Path, help="directory to write packet files") + return parser.parse_args(argv) + + +def main(argv: list[str] | None = None) -> int: + args = parse_args(sys.argv[1:] if argv is None else argv) + packet = build_packet() + if args.output_dir: + write_packet_files(packet, args.output_dir) + print(json.dumps({key: value for key, value in packet.items() if key != "sql"}, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_kb_governance_concept_packet.py b/tests/test_kb_governance_concept_packet.py new file mode 100644 index 0000000..7da3347 --- /dev/null +++ b/tests/test_kb_governance_concept_packet.py @@ -0,0 +1,104 @@ +"""Tests for scripts/kb_governance_concept_packet.py.""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(REPO_ROOT / "scripts")) + +import kb_governance_concept_packet as packet # noqa: E402 + + +def test_packet_declares_minimal_schema_and_generated_rows(): + result = packet.build_packet() + assert result["base_packet_required_first"] == "production-apply-packet-mapped-20260709" + assert result["production_apply_status"] == "not_executed" + assert result["schema_writes"] == [ + "public.concept_maps", + "public.claim_concept_map_links", + "public.claim_governance_gate_links", + ] + assert result["generated_counts"] == { + "claim_concept_map_links": 1, + "claim_governance_gate_links": 2, + "concept_maps": 1, + } + assert result["required_existing_rows"] == { + "public.claims": [ + packet.CLAIM_DISTRIBUTED_MARKET_INTELLIGENCE_ID, + packet.CLAIM_NODES_NEED_BODIES_ID, + ], + "public.governance_gates": [packet.QUALITY_GATE_ID, packet.EVIDENCE_BAR_ID], + } + + +def test_concept_map_row_and_links_represent_remaining_fragments(): + concept = packet.concept_map_row() + assert concept["id"] == packet.CONCEPT_MAP_ID + assert concept["key"] == "distributed_market_intelligence" + assert concept["metadata"]["proposal_id"] == packet.PROPOSAL_CONCEPT_ID + + concept_link = packet.concept_links()[0] + assert concept_link["claim_id"] == packet.CLAIM_DISTRIBUTED_MARKET_INTELLIGENCE_ID + assert concept_link["concept_map_id"] == packet.CONCEPT_MAP_ID + assert concept_link["relation"] == "derives_from" + + gate_links = {row["governance_gate_id"]: row for row in packet.governance_links()} + assert gate_links[packet.QUALITY_GATE_ID]["claim_id"] == packet.CLAIM_NODES_NEED_BODIES_ID + assert gate_links[packet.EVIDENCE_BAR_ID]["claim_id"] == packet.CLAIM_NODES_NEED_BODIES_ID + assert {row["relation"] for row in gate_links.values()} == {"supports"} + + +def test_schema_sql_creates_first_class_tables_without_runtime_changes(): + sql = packet.build_schema_sql() + assert "create table if not exists public.concept_maps" in sql + assert "create table if not exists public.claim_concept_map_links" in sql + assert "create table if not exists public.claim_governance_gate_links" in sql + assert "references public.claims(id) on delete cascade" in sql + assert "references public.governance_gates(id) on delete cascade" in sql + assert "references public.concept_maps(id) on delete cascade" in sql + + +def test_apply_sql_is_guarded_and_commit_or_rollback_specific(): + commit_sql = packet.build_packet()["sql"]["apply_commit"] + rollback_sql = packet.build_packet()["sql"]["apply_rollback_rehearsal"] + assert "requires mapped base claims" in commit_sql + assert "requires quality/evidence governance gates" in commit_sql + assert "generated concept map already exists" in commit_sql + assert "expected 1" in commit_sql + assert "expected 2" in commit_sql + assert commit_sql.strip().endswith("commit;") + assert rollback_sql.strip().endswith("rollback;") + + +def test_delete_rollback_drops_schema_only_after_generated_rows_deleted(): + sql = packet.build_packet()["sql"]["delete_rollback"] + concept_link_delete = sql.index("delete from public.claim_concept_map_links") + concept_delete = sql.index("delete from public.concept_maps") + drop_link = sql.index("drop table public.claim_concept_map_links") + drop_concept = sql.index("drop table public.concept_maps") + assert concept_link_delete < concept_delete < drop_concept + assert concept_link_delete < drop_link + assert "and not exists (select 1 from public.claim_governance_gate_links)" in sql + assert "and not exists (select 1 from public.claim_concept_map_links)" in sql + assert "and not exists (select 1 from public.concept_maps)" in sql + + +def test_write_packet_files(tmp_path: Path): + result = packet.build_packet() + packet.write_packet_files(result, tmp_path) + expected = { + "governance-concept-apply-authorized-commit.sql", + "governance-concept-apply-rollback-rehearsal.sql", + "governance-concept-delete-rollback.sql", + "governance-concept-packet.json", + "governance-concept-postflight.sql", + "governance-concept-preflight.sql", + } + assert {path.name for path in tmp_path.iterdir()} == expected + summary = json.loads((tmp_path / "governance-concept-packet.json").read_text()) + assert "sql" not in summary + assert summary["generated_counts"]["claim_governance_gate_links"] == 2