KB-87EA rev 2

P3D Pack 1 Phase 5C2B — Publication Authority Vocab Seed — Agent Prompt (DRAFT rev2)

9 min read Revision 2
p3dpack1phase5c2bpromptdraftrev2authority-vocab-seed

P3D Pack 1 Phase 5C2B — Publication Authority Vocab Seed — Agent Prompt (DRAFT rev2)

Date: 2026-05-12 Author: Opus (Claude) Rev: 2 (transaction-scoped lock, conflict handling, verify-before-commit, execution log) Authority: GPT directive gpt-directive-opus-p3d-pack1-phase5c2b-prompt-rev2-transaction-log-conflict-2026-05-12.md Mode: DRAFT — not approved for dispatch Design: knowledge/dev/laws/dieu44-trien-khai/design/p3d-pack1-phase5c2b-publication-authority-vocab-seed-design.md


Mission

Seed exactly 1 vocab row into dot_config for publication_authority. This unblocks Phase 5C2 DIEU-35 pilot migration which requires a governed publication_authority_ref_value.

Effort: low.


Required reading

knowledge/dev/laws/dieu44-trien-khai/design/p3d-pack1-phase5c2b-publication-authority-vocab-seed-design.md
knowledge/dev/laws/dieu44-trien-khai/reports/p3d-pack1-phase5c2a-publication-authority-ref-probe-report.md

Hard boundaries

  • No TAC mutation (no INSERT/UPDATE/DELETE on tac_publication, tac_logical_unit, tac_unit_version, tac_publication_member).
  • No IU mutation (no INSERT/UPDATE/DELETE on information_unit, unit_version).
  • No DDL (no CREATE/ALTER/DROP TABLE, no CREATE/ALTER FUNCTION, no CREATE/ALTER TRIGGER).
  • No function/trigger patch.
  • No Directus/Nuxt/Qdrant changes.
  • No nested/secondary Agent dispatch.
  • No overwrite of existing dot_config row.
  • Scope: dot_config INSERT of exactly 1 row.

Execution log

All phases must be logged to:

/opt/incomex/logs/p3d-pack1-phase5c2b-$(date -u +%Y%m%dT%H%M%SZ).log

Log must capture: introspection results, resolved columns, pre-existing state, lock result, insert outcome, verify outcome, COMMIT/ROLLBACK decision, KB report upload status. Use tee or equivalent to capture both stdout and file.

Record RUN_STARTED_AT at script start:

RUN_STARTED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

Execution phases

Phase 0 — Schema introspection

SELECT column_name, data_type, is_nullable
FROM information_schema.columns
WHERE table_schema = 'public'
  AND table_name = 'dot_config'
ORDER BY ordinal_position;

STOP condition: If dot_config does not exist or has fewer than 2 columns → report phase5c2b_status=BLOCKED, reason=SCHEMA_MISSING.

Phase 1 — Column resolution

From Phase 0 result, resolve these concepts to actual column names:

Concept Expected column Expected type
config_key key text
config_value value text
config_description description text
config_updated_at updated_at timestamptz

If any concept resolves to a different column name than expected, use the resolved name in ALL subsequent queries and in the final response. If a concept cannot be resolved (FIELD_ABSENT), report phase5c2b_status=BLOCKED, reason=COLUMN_RESOLUTION_FAILED.

Phase 2 — Pre-transaction conflict check

SELECT <config_key>, <config_value>, <config_description>
FROM dot_config
WHERE <config_key> = 'vocab.publication_authority.incomex_council';

If 0 rows: Proceed to Phase 3.

If 1+ rows and value = incomex_council and description contains Publication authority: Report phase5c2b_status=ALREADY_EXISTS_OK. Skip INSERT. Proceed to Phase 6 (vocab landscape). This is not an error — idempotent handling of prior successful run.

If 1+ rows but value ≠ incomex_council OR description conflicts: Report phase5c2b_status=BLOCKED_EXISTING_CONFLICT. Do NOT overwrite. Do NOT INSERT. Report the existing row values for GPT/User decision. STOP.

Phase 3 — Write transaction (lock + recheck + insert + verify + commit)

Execute as one transaction:

BEGIN;

-- 3A: Transaction-scoped advisory lock
SELECT pg_try_advisory_xact_lock(hashtext('p3d_pack1_phase5c2b_publication_authority_vocab_seed')) AS lock_acquired;
-- If lock_acquired = false → ROLLBACK, report LOCK_BUSY. No retry.

-- 3B: In-transaction recheck (race protection)
SELECT COUNT(*) AS cnt,
       MAX(<config_value>) AS existing_value
FROM dot_config
WHERE <config_key> = 'vocab.publication_authority.incomex_council';
-- If cnt > 0 AND existing_value = 'incomex_council' → ROLLBACK, report ALREADY_EXISTS_OK
-- If cnt > 0 AND existing_value ≠ 'incomex_council' → ROLLBACK, report BLOCKED_EXISTING_CONFLICT
-- If cnt = 0 → proceed

-- 3C: INSERT
INSERT INTO dot_config (<config_key>, <config_value>, <config_description>, <config_updated_at>)
VALUES (
  'vocab.publication_authority.incomex_council',
  'incomex_council',
  'Publication authority for Incomex AI Council-governed law pilots; introduced by P3D Pack1 Phase5C2B before DIEU-35 migration.',
  now()
);

-- 3D: Verify exact row BEFORE commit
SELECT <config_key>, <config_value>, <config_description>, <config_updated_at>
FROM dot_config
WHERE <config_key> = 'vocab.publication_authority.incomex_council';

-- Verify:
--   key   = 'vocab.publication_authority.incomex_council'
--   value = 'incomex_council'
--   description contains 'Publication authority' AND 'P3D Pack1 Phase5C2B'
--   updated_at IS NOT NULL AND updated_at >= RUN_STARTED_AT
-- If ANY field wrong → ROLLBACK, report VERIFY_FAIL
-- If ALL correct → COMMIT

COMMIT;

If INSERT fails: ROLLBACK. Report phase5c2b_status=BLOCKED, reason=INSERT_FAILED, include error message. Do not retry.

If verify fails: ROLLBACK. Report phase5c2b_status=VERIFY_FAIL, include actual vs expected values.

Phase 4 — Post-commit confirmation (read-only)

After successful COMMIT, confirm the row persists:

SELECT <config_key>, <config_value>, <config_description>, <config_updated_at>
FROM dot_config
WHERE <config_key> = 'vocab.publication_authority.incomex_council';

If 0 rows → report phase5c2b_status=POST_COMMIT_MISSING (critical anomaly).

Phase 5 — (reserved, advisory lock auto-released by transaction-scoped lock)

No action needed. pg_try_advisory_xact_lock releases automatically at COMMIT/ROLLBACK.

Phase 6 — Vocab landscape after seed (read-only, informational)

SELECT <config_key>, <config_value>
FROM dot_config
WHERE <config_key> LIKE 'vocab.publication_%'
ORDER BY <config_key>;

Report all rows. Expected: publication_type.design_doc, publication_type.law, and new publication_authority.incomex_council.


Rollback instructions

If rollback is needed after successful commit (GPT/User decision, or downstream 5C2 failure):

DELETE FROM dot_config
WHERE <config_key> = 'vocab.publication_authority.incomex_council';

Where <config_key> is the resolved column name from Phase 1.

Verify 0 rows remain:

SELECT COUNT(*) FROM dot_config
WHERE <config_key> = 'vocab.publication_authority.incomex_council';
-- Expected: 0

Report path

Save report to:

knowledge/dev/laws/dieu44-trien-khai/reports/p3d-pack1-phase5c2b-publication-authority-vocab-seed-execution-report.md

Final response format

phase5c2b_status=PASS|ALREADY_EXISTS_OK|BLOCKED_EXISTING_CONFLICT|BLOCKED|LOCK_BUSY|VERIFY_FAIL|INSERT_FAILED|POST_COMMIT_MISSING
report_path=knowledge/dev/laws/dieu44-trien-khai/reports/p3d-pack1-phase5c2b-publication-authority-vocab-seed-execution-report.md
log_path=/opt/incomex/logs/p3d-pack1-phase5c2b-<timestamp>.log
no_tac_mutation=true
no_iu_mutation=true
no_ddl=true
no_function_patch=true
no_overwrite=true
rows_inserted=1|0
vocab_key_seeded=vocab.publication_authority.incomex_council
vocab_value_seeded=incomex_council
post_insert_verified=true|false
verify_before_commit=true
publication_vocab_landscape_count=<N>
rollback_key_column=<resolved config_key column name>
rollback_key_value=vocab.publication_authority.incomex_council
next_recommended_action=GPT_REVIEW_THEN_PHASE5C2_DIEU35_PILOT

Return only the final response format plus critical blocker notes. Do not write a long essay.


Phase 5C2B | Publication Authority Vocab Seed | DRAFT rev2 | Transaction-scoped lock, conflict handling, verify-before-commit, execution log | 2026-05-12

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/prompts/p3d-pack1-phase5c2b-publication-authority-vocab-seed-prompt-DRAFT.md