12-agent audit (waves 3+4 Opus+Sonnet) on commit88de01cfound that 2 of my prior fixes had regressions, plus the prev batch missed 8 stale-text sites and 2 latent bugs. This batch closes them all. == Regressions in audit-batch (88de01c) — now fixed == 1. PRAGMA user_version=9 placement — could silently downgrade schema on cross-version install (existing v10 DB → re-run reset to 9 → migrations replay → ALTER TABLE duplicate-column errors) - install/sql/outcome-only-schema.sql: PRAGMA moved OUTSIDE the transaction (after COMMIT) for portability across SQLite versions - install/lib-profile-outcome-only.sh::_outcome_install_ledger: added downgrade guard — reads existing user_version BEFORE running ANY init path; if >9, skips entirely (preserves newer schema) - VERIFIED: simulated v10 DB → re-run prints "skipping init to preserve newer schema"; user_version stays at 10 (was downgraded to 9 in the prior batch) [REAL: ran in this session] 2. backup_file mv→cp workaround left orphan backups + bypassed rollback contract (BACKUP_PAIRS not registered) - install/lib-profile-outcome-only.sh: now manually appends to BACKUP_PAIRS so rollback trap restores on later failure; removes the .bak on success path - Comment updated to explain the workaround vs backup_file mv 3. CLAUDE.md skip-guard "STATUS-TRUTH MARKER" was too broad — false-positive on existing kit users (RULE 0.16 doc text matches) - lib-profile-outcome-only.sh: changed grep to literal HTML comment marker `<!-- outcome-only profile (KeiSeiKit) -->` (specific marker written by the installer itself) == Tier 1 missed in prev batch — now fixed == 4. _ts_packages/package-lock.json referenced packages/cortex-ui which does NOT exist on disk → npm ci would fail with ELSPROBLEMS in CI - Regenerated via fresh `rm package-lock.json && npm install` - npm ci now exits 0 cleanly [REAL: ran in this session] - Lockfile shrunk 2403→0 lines on the cortex-ui section (full regen) 5. v3 triggers (branch length cap ≤256) were MISSING from outcome-only-schema.sql — sqlite3 fallback path skipped a schema feature that the Rust kei-ledger flow enforces, creating cross-flow drift - Added trg_agents_branch_len_ins + trg_agents_branch_len_upd mirroring migrations_list.rs:30-44 - Header comment in outcome-only-schema.sql rewritten to match current behavior (was stale) - VERIFIED: end-to-end install creates 2 triggers [REAL: sqlite3 .schema | grep trg_agents_branch_len returns 2] 6. README.md:232 said "102 crates" while README.md:9 said "105 crates" — internal contradiction in same doc - README:232 → "105 workspace crates" 7. ARCHITECTURE.md:165 "53 Rust crates + 13 shell primitives" stale - Updated to "105 Rust workspace crates (47 declared in MANIFEST.toml `full` profile) + 14 shell primitives" 8. ARCHITECTURE.md:157 "45 /commands" stale - Updated to 68 9. plugin.json + marketplace.json description strings still had pre-fix counts (23 primitives / 39 skills / 9 hooks / 12 agents) - Both rewritten to match README:9 SSoT (38 agents / 68 skills / 38 hooks / 105 workspace crates / 47 installable + 14 shell) 10. PROFILE-OUTCOME-ONLY.md:28-29 "What does NOT get installed" still cited 102/67/37/82 - Updated to 105/68/38/85 11. encyclopedia/substrate-overview.md §6/§11/§12 still said "80-char DNA"; §13 said "495 DNA indices"; §6 said "11 install profiles (.../Cursor/Continue/etc)" - All 4 sites fixed to current language (≥33-char variable, 565 DNAs, 12 install profiles) 12. docs/DNA-INDEX.md:1352 said wire format is "(80 chars)" - Updated to "(≥33 chars; role + caps slugs are variable — see docs/DNA-FORMAT.md)" == Tier 2 honesty fixes == 13. Wagner et al. 2004 citation in SLEEP-LAYER.md:26 lacked [VERIFIED] marker (W3 doc consistency caught it) - Added [VERIFIED: doi:10.1038/nature02223] + clarification that the original study did not isolate a specific sleep stage; SWS attribution comes from secondary literature (Diekelmann/Born) 14. PHILOSOPHY.md:125 attributed "overnight consolidation of un-finished intentions" to Wagner 2004 — that paper is about insight gain on the Number Reduction Task, not Zeigarnik-effect cued memory - Rewritten to accurately describe Wagner 2004's actual finding + [VERIFIED: doi:10.1038/nature02223] Verification: - `npm ci` in _ts_packages/ exits 0 [REAL: ran in this session] - `cargo check --workspace` exits 0 in _primitives/_rust [REAL: ran in this session] - Outcome-only end-to-end fresh install produces user_version=9 + 2 triggers (correct schema shape) - Outcome-only re-run against v10 DB preserves user_version=10 (downgrade guard works) - CLAUDE.md skip-guard now triggers ONLY on literal marker, not on RULE 0.16 phrase NOT addressed in this batch (deferred to a future round): - github KeiSei84/{KeiSeiKit, KeiSeiKit-1.0} 404 (user-side action: publish repo or update refs) - keigit user `keisei` does not exist (user-side: create org or rename scope) - KEIGIT_TOKEN secret not configured (user-side action) - Forgejo registration disabled (admin-side) - safeEqual timing leak in TS server (LOW per W3 reassessment) - HTTP bind 0.0.0.0 default (MEDIUM) - Unbounded request body (MEDIUM) - Outcome-only confirm-screen bypass (RULE 0.1 spirit) - Ledger fallthrough false summary - Node 20 deprecation (deadline 2026-06-02, 30 days) - Hook count triple-discrepancy (38 README / 53 DNA-INDEX / 35 maturity-row) - 100-row router claim still in README:117 + PROFILE-OUTCOME-ONLY.md - INSTALL.md numerics without [REAL:] markers - Stale .bak files accumulation policy (cosmetic) - README per-claim [REAL: ] markers for 6 of 7 numerics Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
102 lines
4.3 KiB
SQL
102 lines
4.3 KiB
SQL
-- outcome-only-schema.sql — minimal SQLite schema for the outcome-only
|
|
-- profile. Mirrors `_primitives/_rust/kei-ledger/src/migrations_list.rs`
|
|
-- but flattened: a single transaction that creates the v9-equivalent
|
|
-- shape of `agents` + `skill_invocations`, plus the v3 BEFORE-INSERT/
|
|
-- UPDATE triggers that enforce branch length ≤256.
|
|
--
|
|
-- PRAGMA user_version = 9 is set OUTSIDE the transaction (after COMMIT)
|
|
-- so it lands atomically and is portable across SQLite versions
|
|
-- (transaction-aware PRAGMA writes are documented-undefined on
|
|
-- pre-3.37 builds). The shell installer (`_outcome_install_ledger`
|
|
-- in `lib-profile-outcome-only.sh`) guards re-runs against an
|
|
-- already-upgraded DB by reading user_version BEFORE invoking this
|
|
-- file; that prevents silent downgrade if the user later runs full
|
|
-- kit which bumps schema past v9.
|
|
--
|
|
-- Two tables:
|
|
-- agents → outcome rows (kei-model-router posterior)
|
|
-- skill_invocations → per-skill load events (Phase D metrics)
|
|
|
|
BEGIN IMMEDIATE;
|
|
|
|
CREATE TABLE IF NOT EXISTS agents (
|
|
id TEXT PRIMARY KEY,
|
|
branch TEXT NOT NULL,
|
|
parent_branch TEXT,
|
|
spec_sha TEXT NOT NULL,
|
|
status TEXT NOT NULL CHECK (status IN ('running','done','failed','merged','rejected')),
|
|
started_ts INTEGER NOT NULL,
|
|
finished_ts INTEGER,
|
|
summary TEXT,
|
|
worktree_path TEXT,
|
|
dna TEXT,
|
|
creator_id TEXT,
|
|
fork_parent_id TEXT,
|
|
cost_cents INTEGER DEFAULT 0,
|
|
provider TEXT DEFAULT '',
|
|
model TEXT DEFAULT '',
|
|
cost_micro_cents INTEGER DEFAULT 0,
|
|
tokens_in INTEGER,
|
|
tokens_out INTEGER,
|
|
stubs_count INTEGER DEFAULT 0,
|
|
outcome TEXT CHECK (outcome IS NULL OR outcome IN ('functional','partial','scaffolding','fail')),
|
|
escalation_depth INTEGER DEFAULT 0,
|
|
task_class_dna TEXT GENERATED ALWAYS AS (
|
|
CASE
|
|
WHEN dna IS NULL OR dna = '' THEN NULL
|
|
WHEN length(dna) > 9
|
|
AND substr(dna, length(dna) - 8, 1) = '-'
|
|
THEN substr(dna, 1, length(dna) - 9)
|
|
ELSE dna
|
|
END
|
|
) VIRTUAL
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_parent ON agents(parent_branch);
|
|
CREATE INDEX IF NOT EXISTS idx_status ON agents(status);
|
|
CREATE INDEX IF NOT EXISTS idx_agents_dna_prefix ON agents(substr(dna, 1, 30));
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_agents_dna_unique ON agents(dna);
|
|
CREATE INDEX IF NOT EXISTS idx_agents_creator ON agents(creator_id);
|
|
CREATE INDEX IF NOT EXISTS idx_agents_fork_parent ON agents(fork_parent_id);
|
|
CREATE INDEX IF NOT EXISTS idx_agents_task_class ON agents(task_class_dna);
|
|
|
|
CREATE TABLE IF NOT EXISTS skill_invocations (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
skill_name TEXT NOT NULL,
|
|
ts INTEGER NOT NULL,
|
|
agent_id TEXT,
|
|
success INTEGER NOT NULL CHECK(success IN (0, 1)),
|
|
trajectory_id TEXT,
|
|
duration_ms INTEGER
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_skill_invocations_name_ts
|
|
ON skill_invocations(skill_name, ts DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_skill_invocations_success
|
|
ON skill_invocations(skill_name, success);
|
|
|
|
-- v3 triggers — enforce branch length ≤256 chars (mirrors
|
|
-- `migrations_list.rs:30-44` v3 migration). Without these, the flat
|
|
-- schema would silently accept rows that the Rust kei-ledger flow
|
|
-- rejects, creating cross-version drift.
|
|
CREATE TRIGGER IF NOT EXISTS trg_agents_branch_len_ins
|
|
BEFORE INSERT ON agents
|
|
BEGIN
|
|
SELECT RAISE(ABORT, 'branch length exceeds 256')
|
|
WHERE length(NEW.branch) > 256;
|
|
SELECT RAISE(ABORT, 'parent_branch length exceeds 256')
|
|
WHERE NEW.parent_branch IS NOT NULL AND length(NEW.parent_branch) > 256;
|
|
END;
|
|
CREATE TRIGGER IF NOT EXISTS trg_agents_branch_len_upd
|
|
BEFORE UPDATE OF branch, parent_branch ON agents
|
|
BEGIN
|
|
SELECT RAISE(ABORT, 'branch length exceeds 256')
|
|
WHERE length(NEW.branch) > 256;
|
|
SELECT RAISE(ABORT, 'parent_branch length exceeds 256')
|
|
WHERE NEW.parent_branch IS NOT NULL AND length(NEW.parent_branch) > 256;
|
|
END;
|
|
|
|
COMMIT;
|
|
|
|
-- PRAGMA user_version is set OUTSIDE the transaction so the write is
|
|
-- portable across SQLite versions. The shell installer guards against
|
|
-- silent downgrade by checking user_version BEFORE invoking this file.
|
|
PRAGMA user_version = 9;
|