|
Some checks are pending
CI / lint-and-test (push) Waiting to run
* feat(kb): apply_proposal engine to land approved proposals into canonical Stage 2 of the KB apply pipeline (approve -> APPLY -> render -> surface). Turns an approved kb_stage.kb_proposals row into canonical public.* rows and flips the ledger to 'applied' in one verified transaction. - Connects as the narrow kb_apply role (never superuser): writes only strategies, strategy_nodes, claim_evidence, claim_edges + kb_proposals ledger. Enforces "agents propose, do not self-apply" at the DB boundary. - Per-type handlers: revise_strategy (versioned strategy + node replace), add_edge, attach_evidence (requires existing source_id; source minting is intentionally out of scope for kb_apply's grants). - Strict apply_payload contract (v1); freeform eval packets are normalized upstream, not applied directly. - --dry-run prints exact SQL; idempotent (refuses non-approved / already-applied); transactional with an in-txn DO-block invariant check that rolls back on failure. - Unit tests cover SQL builders, validation, dispatch, and status guards. * fix(kb): rowcount=1 apply guard + real applied_by FK stamp Closes the three draft-exit review items on the apply engine: - Ledger flip now runs in a DO block asserting exactly one 'approved' row moved to 'applied' (GET DIAGNOSTICS row_count). Closes the concurrent double-apply race — load_proposal (read) and the flip (write) are separate statements, so a row lock cannot span them; only one concurrent apply can match status='approved', so rowcount=1 is the authoritative guard. A loser RAISEs and the whole txn rolls back. - applied_by_agent_id is stamped as a real FK resolved from public.agents by handle, defaulting to the kb-apply service agent — no more NULL FK, no backfill needed. - scripts/kb_apply_prereqs.sql: one-time superuser bootstrap — inserts the kb-apply service-agent row (kb_apply never gets INSERT on agents), grants kb_apply SELECT on public.agents, and ensures the one-active-strategy unique index (idempotent; already present on prod). 18/18 unit tests pass. * fix(kb): hard-resolve applied_by handle, RAISE on NULL FK Resolve applied_by into a variable and assert NOT NULL before the ledger flip, instead of an inline subselect that silently stamps a NULL applied_by_agent_id on an unresolved handle. Since the FK is ON DELETE SET NULL, a bad handle (typo/unseeded agent) was a legal silent NULL -- the perpetually-NULL FK we eliminated. Unresolved handle now hard-fails -> rollback. Non-default --applied-by (operator, future drafters) is the path that goes through the lookup and could strand NULL. |
||
|---|---|---|
| .. | ||
| apply_proposal.py | ||
| audit-wiki-links.py | ||
| backfill-ci.py | ||
| backfill-descriptions.py | ||
| backfill-domains.py | ||
| backfill-events.py | ||
| backfill-research-session-attribution.py | ||
| backfill-reviewer-count.py | ||
| backfill-source-authors.py | ||
| backfill-sourcer-attribution.py | ||
| backfill-sources.py | ||
| backfill-synthetic-recovery-prs.py | ||
| bootstrap-contributors.py | ||
| check_crabbox_ci_contract.py | ||
| check_llm_refinement_contract.py | ||
| check_telegram_leo_wallet_test_runtime.py | ||
| check_telegram_leo_x402_bridge.py | ||
| check_telegram_leo_x402_smart_research_bridge.py | ||
| classify-contributors.py | ||
| contributor-graph.py | ||
| crabbox_phase1b_proof.sh | ||
| cumulative-growth.py | ||
| embed-claims.py | ||
| extract-decisions.py | ||
| extract-graph-data.py | ||
| install_telegram_agent_token.py | ||
| install_telegram_smart_research_gates.py | ||
| kb_apply_prereqs.sql | ||
| migrate-entity-schema.py | ||
| migrate-source-archive.py | ||
| nightly-reweave.sh | ||
| normalize-submitted-by.py | ||
| openrouter-extract-v2.py | ||
| prove_phase1b_local.py | ||
| reattribute-by-branch-prefix.py | ||
| reconcile-source-status.sh | ||
| reconcile-sources.py | ||
| replay_decision_engine_eval.py | ||
| reset-m3taversal-sourcer.py | ||
| scoring_digest.py | ||
| tier0-gate.py | ||
| vector-gc.py | ||