Releases: lancegui/causal-powers
Release list
v0.25.0 — analysis-craft legibility axis
0.25.0 — analysis-craft legibility axis (the ponytail layer)
analysis-craft previously governed only code minimalism — remove machinery, smallest
diff. It now also governs legibility: the code that remains must be readable by a
referee, a replication-package reviewer, or a coauthor.
- New
## Legibilitysection. Name intermediates in economic units; one conceptual
step per line (decompose chains that hide a join / filter / winsorize); the referee
test — can someone follow what each block computes and why in one pass, without
running it? - The
# why:convention. Every analytical decision (sample restriction, winsorize
threshold, deflator/base year, fixed effect, cluster level) gets
# why: <decision> — <reason>at the code site — the code-level echo of
data-preparation's decisions log. - Reconciliation note so the two axes don't read as contradictory: minimalism cuts
machinery; legibility keeps annotated logic; a one-liner-vs-named-steps choice is
purely legibility, so legibility wins. - New red-flag and rationalization rows (the slick pipe that hides three decisions; "I
made it a tight one-liner") plus three legibility trigger-eval cases; the description
now also fires on "annotate this" / "make it readable for the replication package".
Adapted from ponytail's "don't write code
you don't need" ladder, inverting its fewest-lines goal to readability.
v0.22.2 — The flow picture, and a tidier repo
Docs-and-presentation release; no skill or hook changes.
- Hand-laid flow SVG replaces the Mermaid diagram in the README. GitHub's Mermaid auto-layout scattered the cross-cutting side rails; the new
docs/flow.svgis a self-contained, hand-laid graphic (inline presentation attributes, no<style>block for the sanitizer to strip) showing the same spine — frame → fork to reduced-form / structural → approval gate → execute → verify → ship, with the always-on layer and the three side rails. - Design specs hidden from the public repo:
docs/specs/is now gitignored (kept on disk, untracked). docs/LESSONS.mdships as an empty template — the log belongs to your project, not the plugin.- GitHub About refreshed to name the reduced-form and structural scope and the superpowers homage.
Update with /plugin update causal-powers@causal-powers, then restart Claude Code.
v0.22.1 — README landing page + gateway jargon
A docs-and-copy release. The README is rewritten as a proper landing page; the one change to a loaded skill is a two-word jargon fix in the gateway.
README
- Three-feature highlight up top — economic framing of mature, proven skills · it grows into your data's domain (per-project learning) · built for day-to-day, resumable research.
- A Mermaid flow diagram of the discipline: frame → fork to reduced-form / structural → write-the-plan approval gate → execute → verify → ship, with the always-on layer, the human-in-the-loop guardrail, and the learn loop drawn in.
- A Motivation section crediting the software-engineering lineage it adapts — superpowers, Karpathy's notes, ECC, planning-with-files — and stating that the name is a homage to superpowers.
- Prose tightened to an applied-micro register; the redundant "Why a separate family" section removed and remaining repetition cut.
Skill
- Gateway (
using-causal-powers): "interactive viz" → "interactive visualization", "PAP" → "pre-analysis plan" in the family table. No description or trigger change (trigger CI unchanged, precision 145/145).
Update: /plugin update causal-powers@causal-powers.
v0.22.0 — Recall, not fold (the two-layer learning model)
Prompted by the right question: are lessons and memory being used effectively, or becoming bloat? The audit found the card had re-bloated (970→1256 words, no eviction rule), the project's LESSONS.md was rich but write-only (4 capture sites in the skills, 0 recall sites), and a 22 KB memory file sat on a dormant project.
The decision (user-driven): lessons stay in the project; skills point to them
Folding domain-specific lessons (ARCOS, CBSA vintage, ring-overlap) into the general skills would bloat the shared family with one project's idiosyncrasies — and ship other users a data-contracts skill muttering about opioid-treatment geocoding. So: two layers — general skills + card carry the method (lean, stable, shareable); the project's LESSONS.md + memory carry the scar tissue (domain-specific, grows there); and a recall link points the skills at the project store at the right moment. The real gap was never "lessons → skill edits" — it was recall. Capture without consult is a write-only journal.
Shipped
- Recall + consolidation-suggestion wiring (the only permanent addition — text in 3 existing files, no new skill): the card gains "consult
LESSONS.md+ memory at start / before a join / before reporting; recalled here, not folded; if bloated/stale while consulting, suggest consolidation";result-verification's "Capture what bit you" → "Consult — and capture —";data-contractsconsults the project log before a merge. Consolidation-suggestion is demand-driven — surfaced when the rot is noticed, never scheduled, never auto-run. - Two domain-free pattern folds (pattern only; instance left in the project): versioned/vintage join keys must assert the same vintage on both sides (
data-contracts); a robustness check returning a number identical to baseline is a silent no-op, not evidence (result-verification). - Card re-diet + eviction rule: 1256 → 1156 words while adding the recall section; a top-of-file budget comment now guards against creep.
- Memory consolidation (via the
consolidate-memoryskill, on the suggestion model): the 22 KB dormant-proxy file → 3 KB (−86%), keeping the orientation + the one durable conclusion + gotchas.
How "evolving" should feel now: the general family changes slowly (it's the method); the project compounds — you'll feel it the first time a session says "this project's LESSONS flags a vintage-join trap here — asserting vintage before I merge."
Update: /plugin update causal-powers@causal-powers + restart.
v0.21.0 — Task-altitude planning (from real-session dogfood)
Reviewing the user's actual analysis sessions gave a sharper diagnosis than any eval: causal-powers plans at the study altitude (estimand / PAP / model card) but hand-waves at the task altitude — "merge these two messy sources", "diagnose why this number is off" get a dive, not a roadmap-you-agree-to-first. On a real co-located-coordinate bug the agent dove into record-dumping and the user had to interrupt to impose an order; the project had zero analysis-plan.md. Full write-up: docs/2026-06-13-task-altitude-rung-and-dogfood.md.
Task-altitude planning rung (carried by skill bodies, card as backstop)
wrong-number-debugging: REPRODUCE now ends by stating the diagnostic roadmap and getting a nod before running scans; LOCATE executes the agreed roadmap.analysis-craft: a multi-step build/refactor gets a numbered roadmap confirmed before coding — an approved upstream study design does not waive the build steps.data-preparation: fires for an ad-hoc mid-analysis merge/reconcile; plan agreed before executing.- card + gateway: "always a written plan" reframed to two altitudes, same
write → agree → loop → checkpoint-on-deviationpattern, same couple-of-steps threshold so trivial edits aren't taxed.
Measured
- Viz-trigger validation (the gate):
eval-triggers --live --competitors, haiku —question-framingwon 17/19 build-from-data cases against the full menu incl.superpowers:brainstorming(all 5 viz cases won; 2 losses to the causal-powers gateway, in-family), negatives 20/20 clean. The v0.19.0 viz broadening is validated and the precision boundary held. pressure-roadmap-firstscenario, card-alone haiku: 0/1 — re-confirming that card text alone doesn't change a weak model's behavior (v0.20.0 redux). The rung is delivered by the skill bodies (which the user's real opus/fable sessions load); body-level validation needs the full-plugin arm.
Also
- Lesson-nudge recurrence (
stop-gate): the lesson gate re-fires as new debugging accumulates without a lesson (capped 2/session); escape hatch is one line toLESSONS.md— the lesson or ano-lesson: <why>note — so a silent skip becomes a recorded decision. Motivated by the live ledger (5 debugging stops, 0 lessons). Per-obligation markers now independent. - Re-trigger context cost: re-trigger now means re-apply the discipline (always) vs reload the body (only when scrolled out/compacted).
What's validated in production: the discipline fires in real sessions (checkpoints / identification / debugging), the Stop-gate shipped in 0.20.0 is firing live, and docs/LESSONS.md is compounding.
Update: /plugin update causal-powers@causal-powers + restart.
v0.20.0 — The ranked-next adoptions, executed and measured
All six ranked candidates from the 0.19.0 evolution survey, adopted in one pass — with the measurements run, not just the machinery built. Full results: docs/2026-06-12-pressure-descopt-subagent-tests.md.
Measured
- Pressure suite (4 scenarios,
--manifest manifest-pressure.json): social-pressure plants — "the join was already validated", "skip the robustness, deadline tonight", "stay consistent with what the board saw", "drop the outliers". First run on haiku: card 1/4 vs baseline 1/4 — the always-on card alone does not rescue a weak model from social pressure (the card arm saw the row fan-out and rationalized it as "valid 1:M"). With 0.19.0's core result (sonnet 8/9 vs 8/9), the picture: protection lives in the enforcement layers + model strength, not in a context string. - Description hill-climbing (
scripts/optimize-description.sh, official skill-creator harness): 3 challenger iterations each onquestion-framingandstructural-estimation— both originals won on held-out test. The flagship descriptions are at a measured local optimum. - Subagent value regression (superpowers v5.0.6 method): 12/12 reviews surfaced the planted issues in both arms — with the instructive confound that
analysis-reviewtriggered natively 6/6 in the "generic" arm. Fresh-pass review catches what the author missed; persona delta null; agent kept pending an isolated rerun.
New enforcement
- Stop-gate + JSONL run ledger (
hooks/stop-gate): a once-per-session soft gate — results written withoutresult-verification, or debugging without a LESSONS entry → the stop is blocked once with a precise reason and an explicit out. Five-condition loop safety; opt-in (analysis projects only);.causal-powers/ledger.jsonlaudit trail. - Injection hardening:
plan-resumeexcerpts sanitized + capped (the plan file is an injection surface). - Kill-switch: all five hooks honor
CAUSAL_POWERS_DISABLED_HOOKS.
Update: /plugin update causal-powers@causal-powers + restart.
v0.19.0 — Measure the value, not just the firing
The family's evals tested whether skills trigger; nothing tested whether following them catches anything. This release measures both halves.
New
- Behavioral benchmark (
evals/behavioral/+scripts/run-behavioral-eval.py): 9 tasks, each with one planted silent failure (fan-out join, silently filtered rollup, cents-vs-dollars, top-coded missingness, train/test overlap, post-treatment "control", diverging pre-trends, spatial silent drop, non-identified elasticity). Deterministic generator (rubric numbers computed from the data),claude -pA/B arms under an isolatedCLAUDE_CONFIG_DIR(baseline verified plugin-free), LLM-graded. First calibration run (sonnet-4-6): card 8/9 vs baseline 8/9 — near-ceiling both arms; the one clean differential was train/test overlap, caught only with the card. Honest analysis + v1 hardening plan:docs/2026-06-12-behavioral-benchmark-v0.md. - Trigger CI (
scripts/eval-triggers.py): the eval corpus through the realprompt-routervs a committed baseline (precision 145/145, recall 54/127 — a backstop by design); fails on regressions.--live --competitorstests description matching against the overlapping superpowers skills — the "brainstorming steals the trigger" failure mode, now measurable. data-contractsships code:references/contract-helpers.md—assert_join/reconcile/na_audit/freeze_baselinepreludes in Python, R, Julia, and Stata.- Stale-plugin warning in
hooks/session-start(counters claude-code#52218 — the mechanism behind "the skills never triggered" on a stale session).
Improved
- Lessons loop closed:
wrong-number-debuggingandanalysis-reviewend by logging the failure class to the project'sdocs/LESSONS.md. - Always-on card diet: 1,258 → 970 words (−23%), zero rules dropped;
AGENTS.mdinherits via symlink. - question-framing → data-viz deliverables: a map/figure/dashboard built from a dataset now triggers framing across all five surfaces (fixes the real-session leaflet-map miss).
- Ecosystem survey:
docs/2026-06-12-evolution-candidates.md(ranked adoption candidates). - CHANGELOG backfilled 0.11.0–0.18.1; tags + releases created for all skipped versions.
Update: /plugin update causal-powers@causal-powers, then restart Claude Code — and from now on the plugin will tell you itself when it's stale.
v0.18.1 — Codex one-liner installer
curl -fsSL https://raw.githubusercontent.com/lancegui/causal-powers/main/scripts/install-codex.sh | bash installs the skills into Codex's scan dir + the always-on discipline as a managed AGENTS.md block. Idempotent; --uninstall removes only the managed block.
v0.18.0 — Codex compatibility
Skills are Codex-native (same SKILL.md format). Adds AGENTS.md (symlink → hooks/session-context.md), a .codex-plugin manifest, and the Claude-Code→Codex tool mapping (Task→spawn_agent, Skill→native, TodoWrite→update_plan). Claude Code behavior unchanged.
v0.17.2 — Post-addition consistency audit
All 14 skills audited for consistency with data-preparation: executing-analysis-plans now routes its build step through data-preparation; data-contracts documents the doer/checker boundary. Corpus precision unchanged at 100%.