Help us improve
Share bugs, ideas, or general feedback.
From chittyos-legal
Evidence fact governance for a specified case. Triggers on "fact", "evidence", "verify", "verification", case materials, dates/amounts/claims, or chittyevidence-db operations. REQUIRES an explicit `case` parameter — refuses to run without one. Manages fact lifecycle (draft→verified→locked), versioning, corrections, and Notion sync.
npx claudepluginhub chittyos/chittymarket --plugin chittyos-legalHow this skill is triggered — by the user, by Claude, or both
Slash command
/chittyos-legal:fact-governanceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill **requires** an explicit case identifier on every invocation. It MUST NOT default to any particular case.
Creates p5.js generative art with seeded randomness, noise fields, and interactive parameter exploration. Use for algorithmic art, flow fields, or particle systems.
Share bugs, ideas, or general feedback.
case parameterThis skill requires an explicit case identifier on every invocation. It MUST NOT default to any particular case.
Accept either:
case_id — the chittyevidence-db case identifier (e.g. arias-v-bianchi-2024d007847)case_slug — a registered case slug (resolve via evidence_cases or the chittyrouter case registry)If no case is specified, stop and ask the caller for one. Do not fall back to any previously-used case.
Every SQL example below uses <case_id> as a placeholder — substitute the resolved case at runtime. Do not paste literal case IDs.
evidence_statement_of_facts (
id TEXT PRIMARY KEY,
case_id TEXT,
fact_number INTEGER NOT NULL,
fact_date TEXT,
fact_text TEXT NOT NULL,
exhibit_reference TEXT NOT NULL, -- REQUIRED
document_id TEXT,
source_quote TEXT,
has_conflict INTEGER DEFAULT 0,
conflict_with_fact_id TEXT,
created_at TEXT,
status TEXT DEFAULT 'draft', -- draft|verified|locked|disputed|archived|rejected
version INTEGER DEFAULT 1,
category TEXT, -- CORP|PROP|TIME|FIN|CONT|PROC|ADM|EVID
verified_by TEXT,
verified_at TEXT,
supersedes_id TEXT,
updated_at TEXT,
submitted_by TEXT
)
evidence_correction_queue — Corrections workflowevidence_correction_audit_log — Audit trailevidence_review_queue — Review workflowevidence_provenance_records — State trackingevidence_chain_of_custody — Chain of custody| Status | Can Edit | Transitions To |
|---|---|---|
| draft | Yes | verified, rejected, disputed |
| verified | Correction only | locked, disputed, archived |
| locked | Never | (immutable) |
| disputed | Notes only | draft, verified |
| archived | Never | (immutable) |
| rejected | Never | (immutable) |
| Code | Name |
|---|---|
| CORP | Corporate (LLC, membership, governance) |
| PROP | Property (real estate, deeds) |
| TIME | Timeline (dated events) |
| FIN | Financial (amounts, transactions) |
| CONT | Contradiction (claim vs counter-evidence) |
| PROC | Procedural (docket, filings, orders) |
| ADM | Admission (party statements) |
| EVID | Evidence (document existence/location) |
In every SQL below, <case_id> means the resolved case identifier for THIS invocation. Never paste a literal case string.
INSERT INTO evidence_statement_of_facts (
id, case_id, fact_number, fact_date, fact_text,
exhibit_reference, document_id, source_quote,
status, version, category, submitted_by, created_at, updated_at
) VALUES (
'FACT-' || hex(randomblob(8)),
?, -- <case_id>
(SELECT COALESCE(MAX(fact_number), 0) + 1 FROM evidence_statement_of_facts WHERE case_id = ?),
?, ?, ?, ?, ?, 'draft', 1, ?, ?, datetime('now'), datetime('now')
);
UPDATE evidence_statement_of_facts
SET status = 'verified', verified_by = ?, verified_at = datetime('now'), updated_at = datetime('now')
WHERE id = ? AND case_id = ? AND status = 'draft';
UPDATE evidence_statement_of_facts
SET status = 'locked', updated_at = datetime('now')
WHERE id = ? AND case_id = ? AND status = 'verified';
UPDATE ... SET status = 'archived' WHERE id = ? AND case_id = ? AND status IN ('draft', 'verified')supersedes_id pointing to old, version + 1, status = 'draft', same case_idevidence_correction_audit_logUPDATE evidence_statement_of_facts
SET status = 'disputed', has_conflict = 1, conflict_with_fact_id = ?, updated_at = datetime('now')
WHERE id = ? AND case_id = ?;
Every query is case-scoped via case_id = ?. Never omit it.
-- All active facts for the resolved case
SELECT * FROM evidence_statement_of_facts
WHERE case_id = ?
AND status NOT IN ('archived', 'rejected')
ORDER BY category, fact_number;
-- Pending review within the resolved case
SELECT * FROM evidence_statement_of_facts
WHERE case_id = ? AND status = 'draft'
ORDER BY created_at;
-- Fact history (within the resolved case)
WITH RECURSIVE fact_history AS (
SELECT * FROM evidence_statement_of_facts WHERE id = ? AND case_id = ?
UNION ALL
SELECT f.* FROM evidence_statement_of_facts f
JOIN fact_history h ON f.id = h.supersedes_id AND f.case_id = h.case_id
)
SELECT * FROM fact_history ORDER BY version DESC;
exhibit_reference is REQUIRED — every fact needs a source.case_id = ? in its WHERE clause. Cross-case leaks are the exact class of bug this skill must prevent.case_id matches the resolved case from the invocation parameter — reject mismatches.Notion Evidence Tracker lives under ChittyLedger → <case workspace> → Evidence Tracker. The target workspace is selected from the resolved case's Notion mapping (via case registry metadata or Notion Projects DB lookup by case_slug). Never write facts from case A into case B's Notion workspace.
Can I edit?
ID Formats:
FACT-{hex} (e.g., FACT-a1b2c3d4e5f6){CAT}-{NUM}.{VER} (e.g., CORP-001.1, TIME-042.2) — fact_number is scoped per-caseIf invoked without a case parameter, the skill MUST:
case specified — refusing to run. Provide case_id=<id> or case_slug=<slug>."