-= Governance Model
-:toc: preamble
+== Governance
-This document describes the governance model for this repository.
+=== Overview
-== Overview
+This project is governed by the following principles and structures to
+ensure transparent, inclusive, and effective decision-making.
-This repository follows a **Sole Maintainer Governance Model**:
+=== Roles and Responsibilities
-* Single maintainer (@hyperpolymath) has full authority over the project
-* All contributions are welcome and reviewed by the maintainer
-* Decisions are made transparently through GitHub issues and discussions
-* The project adheres to the hyperpolymath estate policies where applicable
+==== Maintainers
-== Core Principles
+Maintainers are responsible for: - Reviewing and merging pull requests -
+Managing releases and versioning - Ensuring code quality and standards -
+Triaging issues and bug reports - Community engagement and support
-[cols="1,2"]
-|===
-| Principle | Description
+==== Contributors
-| **Benevolent Dictatorship** | Maintainer has final decision authority but seeks community input
+Contributors are expected to: - Follow the code of conduct - Submit
+well-documented pull requests - Write tests for new functionality -
+Maintain existing tests - Update documentation as needed
-| **Meritocracy** | Contributions are judged on technical merit, not contributor identity
+=== Decision Making
-| **Transparency** | All significant decisions are documented publicly
+==== Minor Changes
-| **Consensus-Seeking** | Maintainer prefers consensus but will decide when necessary
+* Can be made by any maintainer
+* Include bug fixes, documentation updates, dependency updates
-| **Open Contribution** | Anyone can contribute via fork and pull request
+==== Major Changes
-|===
+* Require discussion in issues or pull requests
+* Include new features, architectural changes, API changes
+* Need approval from at least 2 maintainers
-== Roles and Permissions
+==== Breaking Changes
-[cols="1,2,2"]
-|===
-| Role | Permissions | Assignment
+* Require RFC (Request for Comments) process
+* Need approval from majority of maintainers
+* Must include migration guide
-| **Maintainer** | Write access, merge rights, admin | @hyperpolymath
-| **Contributors** | Read access, fork, submit PRs | All GitHub users
-| **Users** | Use the software, report issues | All GitHub users
+=== Code of Conduct
-|===
+All participants are expected to follow our Code of Conduct. Violations
+can be reported to the maintainers.
-== Decision Making Framework
+=== Communication
-=== Routine Decisions
+* *Issues*: For bug reports and feature requests
+* *Discussions*: For questions and general discussion
+* *Pull Requests*: For code contributions
-* Bug fixes
-* Documentation improvements
-* Minor feature additions
-* Dependency updates
+=== Licensing
-**Process**: Maintainer reviews and merges PRs that meet quality standards.
+All contributions are made under the terms of the repository’s LICENSE
+file. By submitting a pull request, you agree to license your
+contributions accordingly.
-=== Significant Changes
+'''''
-* New major features
-* API changes
-* Architecture modifications
-* Breaking changes
-
-**Process**:
-. Open issue describing the change
-. Discuss with community (minimum 72 hours)
-. Maintainer makes final decision
-. Document rationale in issue/PR
-
-=== Structural Decisions
-
-* Repository purpose/renaming
-* License changes
-* Ownership transfer
-* Deprecation/archival
-
-**Process**:
-. Extended discussion (minimum 1 week)
-. Maintainer makes final decision
-. Document in CHANGELOG and governance docs
-
-== Contribution Lifecycle
-
-[cols="1,2"]
-|===
-| Stage | Process
-
-| **Ideation** | Open issue, discuss feasibility
-
-| **Development** | Fork, implement, test thoroughly
-
-| **Review** | Submit PR, maintainer reviews within 7 days
-
-| **Merge** | Maintainer merges or requests changes
-
-| **Release** | Maintainer publishes according to project conventions
-
-|===
-
-== Conflict Resolution
-
-In case of disagreements:
-
-. Discuss in the relevant GitHub issue or PR
-. Provide technical justification for positions
-. Maintainer mediates and makes final decision
-. Decision is documented and can be revisited later
-
-== Project Policies
-
-This repository adheres to hyperpolymath estate-wide policies:
-
-* **License**: MPL-2.0 for code, CC-BY-SA-4.0 for prose (per standards/LICENCE-POLICY.adoc)
-* **Code of Conduct**: Follows hyperpolymath CODE_OF_CONDUCT.md
-* **Security**: Follows hyperpolymath SECURITY.md
-* **Contributing**: Follows hyperpolymath CONTRIBUTING.adoc conventions
-
-== Repository-Specific Conventions
-
-[cols="1,2"]
-|===
-| Convention | Description
-
-| **Signing** | All commits must be signed (SSH or GPG)
-
-| **SPDX Headers** | All source files must have SPDX license identifiers
-
-| **Contractiles** | Mustfile, Trustfile, Intendfile, Adjustfile in root
-
-| **Machine Readable** | META.a2ml in .machine_readable/6a2/
-
-| **CI/CD** | GitHub Actions workflows in .github/workflows/
-
-|===
-
-== Governance Evolution
-
-As the project grows, this governance model may evolve:
-
-* **Adding Co-Maintainers**: When contribution volume warrants it
-* **Forming a Team**: For complex multi-maintainer projects
-* **Adopting TPCF**: For large, multi-repository projects (see rhodium-standard-repositories)
-
-Changes to this document require the same process as Significant Changes above.
-
-== See Also
-
-* link:MAINTAINERS.adoc[Maintainers]
-* link:CODE_OF_CONDUCT.md[Code of Conduct]
-* link:CONTRIBUTING.adoc[Contributing Guide]
-* link:https://github.com/hyperpolymath/standards/blob/main/LICENCE-POLICY.adoc[Estate License Policy]
-* link:https://github.com/hyperpolymath/standards[rhodium-standard-repositories (TPCF)]
-
-== Changelog
-
-[cols="1,1,1"]
-|===
-| Date | Change | By
-
-| 2026-06-07 | Initial governance model established | @hyperpolymath
-|===
+_Last updated: 2026-07-18_
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
deleted file mode 100644
index e27364c..0000000
--- a/GOVERNANCE.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Governance
-
-## Overview
-
-This project is governed by the following principles and structures to ensure transparent, inclusive, and effective decision-making.
-
-## Roles and Responsibilities
-
-### Maintainers
-
-Maintainers are responsible for:
-- Reviewing and merging pull requests
-- Managing releases and versioning
-- Ensuring code quality and standards
-- Triaging issues and bug reports
-- Community engagement and support
-
-### Contributors
-
-Contributors are expected to:
-- Follow the code of conduct
-- Submit well-documented pull requests
-- Write tests for new functionality
-- Maintain existing tests
-- Update documentation as needed
-
-## Decision Making
-
-### Minor Changes
-- Can be made by any maintainer
-- Include bug fixes, documentation updates, dependency updates
-
-### Major Changes
-- Require discussion in issues or pull requests
-- Include new features, architectural changes, API changes
-- Need approval from at least 2 maintainers
-
-### Breaking Changes
-- Require RFC (Request for Comments) process
-- Need approval from majority of maintainers
-- Must include migration guide
-
-## Code of Conduct
-
-All participants are expected to follow our Code of Conduct. Violations can be reported to the maintainers.
-
-## Communication
-
-- **Issues**: For bug reports and feature requests
-- **Discussions**: For questions and general discussion
-- **Pull Requests**: For code contributions
-
-## Licensing
-
-All contributions are made under the terms of the repository's LICENSE file.
-By submitting a pull request, you agree to license your contributions accordingly.
-
----
-
-*Last updated: 2026-07-18*
diff --git a/PROOF-NEEDS.adoc b/PROOF-NEEDS.adoc
new file mode 100644
index 0000000..5306eae
--- /dev/null
+++ b/PROOF-NEEDS.adoc
@@ -0,0 +1,13 @@
+== PROOF-NEEDS.md
+
+=== Template ABI Cleanup (2026-03-29)
+
+Template ABI removed – was creating false impression of formal
+verification. The removed files (Types.idr, Layout.idr, Foreign.idr)
+contained only RSR template scaffolding with unresolved
+CAUSALS_JL/Jonathan D.A. Jewell placeholders and no domain-specific
+proofs.
+
+When this project needs formal ABI verification, create domain-specific
+Idris2 proofs following the pattern in repos like `+typed-wasm+`,
+`+proven+`, `+echidna+`, or `+boj-server+`.
diff --git a/PROOF-NEEDS.md b/PROOF-NEEDS.md
deleted file mode 100644
index 8016a2c..0000000
--- a/PROOF-NEEDS.md
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# PROOF-NEEDS.md
-
-## Template ABI Cleanup (2026-03-29)
-
-Template ABI removed -- was creating false impression of formal verification.
-The removed files (Types.idr, Layout.idr, Foreign.idr) contained only RSR template
-scaffolding with unresolved CAUSALS_JL/Jonathan D.A. Jewell placeholders and no domain-specific proofs.
-
-When this project needs formal ABI verification, create domain-specific Idris2 proofs
-following the pattern in repos like `typed-wasm`, `proven`, `echidna`, or `boj-server`.
diff --git a/README.adoc b/README.adoc
new file mode 100644
index 0000000..4af5df7
--- /dev/null
+++ b/README.adoc
@@ -0,0 +1,246 @@
+https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/Causals.jl[image:https://img.shields.io/badge/OpenSSF-Best_Practices-green?logo=opensourcesecurity[OpenSSF
+Best Practices]]
+https://www.mozilla.org/MPL/2.0/[image:https://img.shields.io/badge/License-MPL--2.0-blue.svg[License:
+MPL-2.0]]
+
+*Comprehensive causal inference toolkit for Julia - Eclipse all existing
+causal packages with unified, production-grade implementations.*
+
+link:TOPOLOGY.md[image:https://img.shields.io/badge/Project-Topology-9558B2[Topology]]
+link:TOPOLOGY.md[image:https://img.shields.io/badge/Completion-95%25-green[95]]
+
+[[toc]]
+
+== What is Causals.jl?
+
+Causals.jl brings together the major approaches to causal reasoning
+under one roof:
+
+* *Dempster-Shafer theory* - combine uncertain evidence from multiple
+experts
+* *Bradford Hill criteria* - assess causality in observational studies
+* *Causal DAGs* - graphical models, d-separation, identification
+* *Granger causality* - time series causal analysis
+* *Propensity scores* - matching, weighting, stratification for
+observational data
+* *Do-calculus* - Pearl’s intervention framework
+* *Counterfactuals* - "`what if`" reasoning about alternate realities
+
+== Why Causals.jl?
+
+*Existing Julia packages are fragmented:* - `+CausalInference.jl+` -
+only DAGs - `+Causal.jl+` - simulation only - `+CausalityTools.jl+` -
+basic stats only
+
+*Causals.jl eclipses them with:* - Complete coverage of causal inference
+methods - Production-grade implementations - Comprehensive documentation
+- Active development - RSR compliance (Rust/Deno standards adapted for
+Julia)
+
+== Quick Examples
+
+=== Dempster-Shafer Evidence Combination
+
+[source,julia]
+----
+using Causals
+
+# Expert 1: 60% confident in hypothesis A
+frame = [:A, :B, :C]
+expert1 = MassAssignment(frame, Dict(
+ Set([:A]) => 0.6,
+ Set([:A, :B, :C]) => 0.4 # ignorance
+))
+
+# Expert 2: 70% confident in A or B
+expert2 = MassAssignment(frame, Dict(
+ Set([:A, :B]) => 0.7,
+ Set([:A, :B, :C]) => 0.3
+))
+
+# Combine evidence
+combined = combine_dempster(expert1, expert2)
+@show belief(combined, Set([:A])) # Lower bound
+@show plausibility(combined, Set([:A])) # Upper bound
+----
+
+=== Bradford Hill Causal Assessment
+
+[source,julia]
+----
+criteria = BradfordHillCriteria(
+ strength = 0.85, # Strong correlation
+ consistency = 0.90, # Replicated across studies
+ specificity = 0.60, # Moderate specificity
+ temporality = 1.0, # Cause precedes effect (REQUIRED)
+ biological_gradient = 0.75,# Clear dose-response
+ plausibility = 0.80, # Biologically plausible
+ coherence = 0.70, # Fits known facts
+ experiment = 0.0, # No RCT (observational)
+ analogy = 0.65 # Similar known relationships
+)
+
+verdict, confidence = assess_causality(criteria)
+# verdict: :strong, confidence: 0.78
+----
+
+=== Granger Causality (Time Series)
+
+[source,julia]
+----
+# Does oil price Granger-cause inflation?
+oil_price = [....] # historical data
+inflation = [....]
+
+causes, F_stat, p_value, lag = granger_test(oil_price, inflation, max_lag=12)
+
+if causes
+ println("Oil price Granger-causes inflation with lag $lag months")
+ println("F-statistic: $F_stat, p-value: $p_value")
+end
+----
+
+=== Causal DAG and Backdoor Criterion
+
+[source,julia]
+----
+# Build causal graph: Education → Income, Ability → Education, Ability → Income
+g = CausalGraph([:Education, :Income, :Ability, :ParentIncome])
+add_edge!(g, :Education, :Income)
+add_edge!(g, :Ability, :Education)
+add_edge!(g, :Ability, :Income)
+add_edge!(g, :ParentIncome, :Education)
+
+# To estimate effect of Education on Income, must control for Ability
+@assert backdoor_criterion(g, :Education, :Income, Set([:Ability]))
+
+# Ability blocks backdoor path: Education ← Ability → Income
+----
+
+=== Propensity Score Matching
+
+[source,julia]
+----
+# Observational study: does training program increase wages?
+treatment = [....] # received training (Bool)
+wages = [....] # outcome
+covariates = [....] # age, education, experience (Matrix)
+
+# Estimate propensity scores
+ps = propensity_score(treatment, covariates)
+
+# Match treated to similar controls
+matches, ate, std_err = matching(treatment, wages, ps, caliper=0.1)
+
+println("Average treatment effect: $(ate) ± $(1.96*std_err)")
+----
+
+=== Counterfactual Reasoning
+
+[source,julia]
+----
+# Among those who got treatment and recovered, would they have recovered without it?
+treatment = [:Treatment => true]
+outcome = :Recovered
+data = Dict(
+ :Treatment => [...], # Bool vector
+ :Recovered => [...] # Bool vector
+)
+
+pn = probability_of_necessity(:Treatment, :Recovered, data)
+println("Probability treatment was necessary: $(pn)")
+----
+
+== Installation
+
+=== From Julia REPL
+
+[source,julia]
+----
+using Pkg
+Pkg.add("Causals")
+----
+
+=== From Git (Development)
+
+[source,julia]
+----
+using Pkg
+Pkg.add(url="https://github.com/hyperpolymath/Causals.jl")
+----
+
+== Quick Start
+
+[source,julia]
+----
+using Causals
+
+# Combine evidence from multiple experts using Dempster-Shafer
+frame = [:A, :B, :C]
+expert1 = MassAssignment(frame, Dict(Set([:A]) => 0.6, Set([:A, :B, :C]) => 0.4))
+expert2 = MassAssignment(frame, Dict(Set([:A, :B]) => 0.7, Set([:A, :B, :C]) => 0.3))
+
+combined = combine_dempster(expert1, expert2)
+println(belief(combined, Set([:A]))) # Lower bound on probability of A
+----
+
+== Documentation
+
+Full documentation at: https://hyperpolymath.github.io/Causals.jl
+
+== Modules
+
+[cols=",",options="header",]
+|===
+|Module |Purpose
+|`+DempsterShafer+` |Belief functions, evidence combination
+|`+BradfordHill+` |9-criterion causal assessment framework
+|`+CausalDAG+` |Graphical models, d-separation, identification
+|`+Granger+` |Time series causality (VAR models, F-tests)
+|`+PropensityScore+` |Matching, IPW, stratification, doubly-robust
+|`+DoCalculus+` |Intervention framework, effect identification
+|`+Counterfactuals+` |Twin networks, necessity/sufficiency
+|===
+
+== Comparison to Existing Packages
+
+[width="100%",cols="26%,14%,24%,23%,13%",options="header",]
+|===
+|Feature |Causals.jl |CausalInference.jl |CausalityTools.jl |Causal.jl
+|Dempster-Shafer |✓ |✗ |✗ |✗
+|Bradford Hill |✓ |✗ |✗ |✗
+|Causal DAGs |✓ |✓ |✗ |✗
+|Granger causality |✓ |✗ |✓ |✗
+|Propensity scores |✓ |✗ |✗ |✗
+|Do-calculus |✓ |Partial |✗ |✗
+|Counterfactuals |✓ |✗ |✗ |✗
+|Production docs |✓ |Partial |Partial |✗
+|Active maintenance |✓ |✓ |✓ |✗
+|===
+
+== Status
+
+*Alpha* - Core implementations complete, pending extensive testing and
+validation against reference implementations.
+
+== Contributing
+
+See CONTRIBUTING for development guidelines.
+
+== License
+
+Palimpsest-MPL License v1.0 (MPL-2.0) - see LICENSE.
+
+PMPL-1.0 is MPL-2.0 compatible and accepted by Julia General registry.
+
+== Citation
+
+[source,bibtex]
+----
+@software{causals_jl,
+ title = {Causals.jl: Comprehensive Causal Inference for Julia},
+ author = {Hyperpolymath},
+ year = {2025},
+ url = {https://github.com/hyperpolymath/Causals.jl}
+}
+----
diff --git a/README.md b/README.md
deleted file mode 100644
index 334267a..0000000
--- a/README.md
+++ /dev/null
@@ -1,252 +0,0 @@
-
-
-[](https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/Causals.jl)
-[](https://www.mozilla.org/MPL/2.0/)
-
-
-
-
-**Comprehensive causal inference toolkit for Julia - Eclipse all
-existing causal packages with unified, production-grade
-implementations.**
-
-
-
-[](TOPOLOGY.md)
-[](TOPOLOGY.md)
-
-
-
-
-
-# What is Causals.jl?
-
-Causals.jl brings together the major approaches to causal reasoning
-under one roof:
-
-- **Dempster-Shafer theory** - combine uncertain evidence from multiple
- experts
-
-- **Bradford Hill criteria** - assess causality in observational studies
-
-- **Causal DAGs** - graphical models, d-separation, identification
-
-- **Granger causality** - time series causal analysis
-
-- **Propensity scores** - matching, weighting, stratification for
- observational data
-
-- **Do-calculus** - Pearl’s intervention framework
-
-- **Counterfactuals** - "what if" reasoning about alternate realities
-
-# Why Causals.jl?
-
-**Existing Julia packages are fragmented:** - `CausalInference.jl` -
-only DAGs - `Causal.jl` - simulation only - `CausalityTools.jl` - basic
-stats only
-
-**Causals.jl eclipses them with:** - Complete coverage of causal
-inference methods - Production-grade implementations - Comprehensive
-documentation - Active development - RSR compliance (Rust/Deno standards
-adapted for Julia)
-
-# Quick Examples
-
-## Dempster-Shafer Evidence Combination
-
-```julia
-using Causals
-
-# Expert 1: 60% confident in hypothesis A
-frame = [:A, :B, :C]
-expert1 = MassAssignment(frame, Dict(
- Set([:A]) => 0.6,
- Set([:A, :B, :C]) => 0.4 # ignorance
-))
-
-# Expert 2: 70% confident in A or B
-expert2 = MassAssignment(frame, Dict(
- Set([:A, :B]) => 0.7,
- Set([:A, :B, :C]) => 0.3
-))
-
-# Combine evidence
-combined = combine_dempster(expert1, expert2)
-@show belief(combined, Set([:A])) # Lower bound
-@show plausibility(combined, Set([:A])) # Upper bound
-```
-
-## Bradford Hill Causal Assessment
-
-```julia
-criteria = BradfordHillCriteria(
- strength = 0.85, # Strong correlation
- consistency = 0.90, # Replicated across studies
- specificity = 0.60, # Moderate specificity
- temporality = 1.0, # Cause precedes effect (REQUIRED)
- biological_gradient = 0.75,# Clear dose-response
- plausibility = 0.80, # Biologically plausible
- coherence = 0.70, # Fits known facts
- experiment = 0.0, # No RCT (observational)
- analogy = 0.65 # Similar known relationships
-)
-
-verdict, confidence = assess_causality(criteria)
-# verdict: :strong, confidence: 0.78
-```
-
-## Granger Causality (Time Series)
-
-```julia
-# Does oil price Granger-cause inflation?
-oil_price = [....] # historical data
-inflation = [....]
-
-causes, F_stat, p_value, lag = granger_test(oil_price, inflation, max_lag=12)
-
-if causes
- println("Oil price Granger-causes inflation with lag $lag months")
- println("F-statistic: $F_stat, p-value: $p_value")
-end
-```
-
-## Causal DAG and Backdoor Criterion
-
-```julia
-# Build causal graph: Education → Income, Ability → Education, Ability → Income
-g = CausalGraph([:Education, :Income, :Ability, :ParentIncome])
-add_edge!(g, :Education, :Income)
-add_edge!(g, :Ability, :Education)
-add_edge!(g, :Ability, :Income)
-add_edge!(g, :ParentIncome, :Education)
-
-# To estimate effect of Education on Income, must control for Ability
-@assert backdoor_criterion(g, :Education, :Income, Set([:Ability]))
-
-# Ability blocks backdoor path: Education ← Ability → Income
-```
-
-## Propensity Score Matching
-
-```julia
-# Observational study: does training program increase wages?
-treatment = [....] # received training (Bool)
-wages = [....] # outcome
-covariates = [....] # age, education, experience (Matrix)
-
-# Estimate propensity scores
-ps = propensity_score(treatment, covariates)
-
-# Match treated to similar controls
-matches, ate, std_err = matching(treatment, wages, ps, caliper=0.1)
-
-println("Average treatment effect: $(ate) ± $(1.96*std_err)")
-```
-
-## Counterfactual Reasoning
-
-```julia
-# Among those who got treatment and recovered, would they have recovered without it?
-treatment = [:Treatment => true]
-outcome = :Recovered
-data = Dict(
- :Treatment => [...], # Bool vector
- :Recovered => [...] # Bool vector
-)
-
-pn = probability_of_necessity(:Treatment, :Recovered, data)
-println("Probability treatment was necessary: $(pn)")
-```
-
-# Installation
-
-## From Julia REPL
-
-```julia
-using Pkg
-Pkg.add("Causals")
-```
-
-## From Git (Development)
-
-```julia
-using Pkg
-Pkg.add(url="https://github.com/hyperpolymath/Causals.jl")
-```
-
-# Quick Start
-
-```julia
-using Causals
-
-# Combine evidence from multiple experts using Dempster-Shafer
-frame = [:A, :B, :C]
-expert1 = MassAssignment(frame, Dict(Set([:A]) => 0.6, Set([:A, :B, :C]) => 0.4))
-expert2 = MassAssignment(frame, Dict(Set([:A, :B]) => 0.7, Set([:A, :B, :C]) => 0.3))
-
-combined = combine_dempster(expert1, expert2)
-println(belief(combined, Set([:A]))) # Lower bound on probability of A
-```
-
-# Documentation
-
-Full documentation at:
-
-# Modules
-
-| Module | Purpose |
-|-------------------|------------------------------------------------|
-| `DempsterShafer` | Belief functions, evidence combination |
-| `BradfordHill` | 9-criterion causal assessment framework |
-| `CausalDAG` | Graphical models, d-separation, identification |
-| `Granger` | Time series causality (VAR models, F-tests) |
-| `PropensityScore` | Matching, IPW, stratification, doubly-robust |
-| `DoCalculus` | Intervention framework, effect identification |
-| `Counterfactuals` | Twin networks, necessity/sufficiency |
-
-# Comparison to Existing Packages
-
-| Feature | Causals.jl | CausalInference.jl | CausalityTools.jl | Causal.jl |
-|--------------------|------------|--------------------|-------------------|-----------|
-| Dempster-Shafer | ✓ | ✗ | ✗ | ✗ |
-| Bradford Hill | ✓ | ✗ | ✗ | ✗ |
-| Causal DAGs | ✓ | ✓ | ✗ | ✗ |
-| Granger causality | ✓ | ✗ | ✓ | ✗ |
-| Propensity scores | ✓ | ✗ | ✗ | ✗ |
-| Do-calculus | ✓ | Partial | ✗ | ✗ |
-| Counterfactuals | ✓ | ✗ | ✗ | ✗ |
-| Production docs | ✓ | Partial | Partial | ✗ |
-| Active maintenance | ✓ | ✓ | ✓ | ✗ |
-
-# Status
-
-**Alpha** - Core implementations complete, pending extensive testing and
-validation against reference implementations.
-
-# Contributing
-
-See CONTRIBUTING for
-development guidelines.
-
-# License
-
-Palimpsest-MPL License v1.0 (MPL-2.0) - see [LICENSE](LICENSE).
-
-PMPL-1.0 is MPL-2.0 compatible and accepted by Julia General registry.
-
-# Citation
-
-```bibtex
-@software{causals_jl,
- title = {Causals.jl: Comprehensive Causal Inference for Julia},
- author = {Hyperpolymath},
- year = {2025},
- url = {https://github.com/hyperpolymath/Causals.jl}
-}
-```
diff --git a/REQUIRES_INITIALISATION.adoc b/REQUIRES_INITIALISATION.adoc
new file mode 100644
index 0000000..1fd9246
--- /dev/null
+++ b/REQUIRES_INITIALISATION.adoc
@@ -0,0 +1,92 @@
+== REQUIRES INITIALISATION
+
+*This repository is not finished being set up.* 5 substitution token(s)
+across 3 file(s) still have no value.
+
+=== Why this is not already done
+
+This repo was created from `+hyperpolymath/rsr-template-repo+`. The mint
+(`+just repo-init+`) fills every token that has a single mechanical
+answer — owner, repo, author, dates, licence, branch — and it has done
+so here.
+
+The tokens below are the ones it _deliberately cannot_ answer. They need
+a decision or a fact that exists only in your head: what this project is
+for, what command builds it, which port the service listens on, whether
+a PGP key is held at all. The template’s own token vocabulary says as
+much — you cannot sensibly answer "`required invariants`" in a
+thirty-second bootstrap.
+
+They were left *visibly unfilled on purpose*. The alternatives were both
+worse: inventing plausible values would put confident falsehoods into a
+security policy and an architecture document, and silently deleting the
+sections would hide the fact that a decision is owed. A visible gap is
+honest; a fabricated answer is not.
+
+=== Do not delete this file until every item below is resolved
+
+This file is the only marker that the work is outstanding. Deleting it
+early does not finish the setup, it just conceals it — and the next
+person or agent to arrive will reasonably assume the repo is complete.
+
+* *If you are a person:* delete this file yourself once the last item is
+done.
+* *If you are an agent:* resolve what you legitimately can, leave the
+rest, and delete this file only when no token below remains anywhere in
+the tree. Do not delete it to make a gate go green.
+
+Re-running the estate top-up tool will remove this file automatically
+once nothing is outstanding, so the safest way to finish is to fix the
+tokens and let the check confirm it.
+
+=== What is needed, and where it goes
+
+==== `+{{CONDUCT_TEAM}}+`
+
+Name of the conduct body. If there is no committee, rewrite the sentence
+rather than substituting a plural noun into '`a \{\{CONDUCT_TEAM}}
+member`'.
+
+Appears in:
+
+* `+CODE_OF_CONDUCT.md+`
+
+==== `+{{PGP_KEY_URL}}+`
+
+Public URL the PGP key can be fetched from. Same caveat as
+PGP_FINGERPRINT.
+
+Appears in:
+
+* `+SECURITY.md+`
+
+==== `+{{PROJECT_UNIQUE_STRENGTH}}+`
+
+What this does that its alternatives do not.
+
+Appears in:
+
+* `+.machine_readable/bot_directives/methodology.a2ml+`
+
+==== `+{{RESPONSE_TIME}}+`
+
+Initial-response SLA for a security or conduct report. Promise only what
+a solo maintainer can actually meet.
+
+Appears in:
+
+* `+CODE_OF_CONDUCT.md+`
+
+==== `+{{WEBSITE}}+`
+
+Project homepage URL, or delete the field if there is none.
+
+Appears in:
+
+* `+SECURITY.md+`
+
+'''''
+
+Generated by the estate top-up pass. Rationale and the governing rulings
+are in `+hyperpolymath/standards+`; the token vocabulary is
+`+.machine_readable/ai/PLACEHOLDERS.adoc+` in `+rsr-template-repo+`.
diff --git a/REQUIRES_INITIALISATION.md b/REQUIRES_INITIALISATION.md
deleted file mode 100644
index f1a4f66..0000000
--- a/REQUIRES_INITIALISATION.md
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-# REQUIRES INITIALISATION
-
-**This repository is not finished being set up.** 5 substitution token(s) across 3 file(s) still have no value.
-
-## Why this is not already done
-
-This repo was created from `hyperpolymath/rsr-template-repo`. The mint
-(`just repo-init`) fills every token that has a single mechanical answer —
-owner, repo, author, dates, licence, branch — and it has done so here.
-
-The tokens below are the ones it *deliberately cannot* answer. They need a
-decision or a fact that exists only in your head: what this project is for,
-what command builds it, which port the service listens on, whether a PGP key
-is held at all. The template's own token vocabulary says as much — you cannot
-sensibly answer "required invariants" in a thirty-second bootstrap.
-
-They were left **visibly unfilled on purpose**. The alternatives were both
-worse: inventing plausible values would put confident falsehoods into a
-security policy and an architecture document, and silently deleting the
-sections would hide the fact that a decision is owed. A visible gap is
-honest; a fabricated answer is not.
-
-## Do not delete this file until every item below is resolved
-
-This file is the only marker that the work is outstanding. Deleting it early
-does not finish the setup, it just conceals it — and the next person or agent
-to arrive will reasonably assume the repo is complete.
-
-- **If you are a person:** delete this file yourself once the last item is done.
-- **If you are an agent:** resolve what you legitimately can, leave the rest,
- and delete this file only when no token below remains anywhere in the tree.
- Do not delete it to make a gate go green.
-
-Re-running the estate top-up tool will remove this file automatically once
-nothing is outstanding, so the safest way to finish is to fix the tokens and
-let the check confirm it.
-
-## What is needed, and where it goes
-
-### `{{CONDUCT_TEAM}}`
-
-Name of the conduct body. If there is no committee, rewrite the sentence rather than substituting a plural noun into 'a {{CONDUCT_TEAM}} member'.
-
-Appears in:
-
-- `CODE_OF_CONDUCT.md`
-
-### `{{PGP_KEY_URL}}`
-
-Public URL the PGP key can be fetched from. Same caveat as PGP_FINGERPRINT.
-
-Appears in:
-
-- `SECURITY.md`
-
-### `{{PROJECT_UNIQUE_STRENGTH}}`
-
-What this does that its alternatives do not.
-
-Appears in:
-
-- `.machine_readable/bot_directives/methodology.a2ml`
-
-### `{{RESPONSE_TIME}}`
-
-Initial-response SLA for a security or conduct report. Promise only what a solo maintainer can actually meet.
-
-Appears in:
-
-- `CODE_OF_CONDUCT.md`
-
-### `{{WEBSITE}}`
-
-Project homepage URL, or delete the field if there is none.
-
-Appears in:
-
-- `SECURITY.md`
-
----
-
-Generated by the estate top-up pass. Rationale and the governing rulings are
-in `hyperpolymath/standards`; the token vocabulary is
-`.machine_readable/ai/PLACEHOLDERS.adoc` in `rsr-template-repo`.
diff --git a/ROADMAP.adoc b/ROADMAP.adoc
new file mode 100644
index 0000000..90e9992
--- /dev/null
+++ b/ROADMAP.adoc
@@ -0,0 +1,163 @@
+== Causals.jl Development Roadmap
+
+=== Current State (v0.2 Alpha)
+
+In-development implementation of 7 causal inference modules: -
+*DempsterShafer*: Evidence combination (mostly complete) -
+*BradfordHill*: Causal criteria assessment (complete) - *CausalDAG*:
+Directed acyclic graphs (d-separation, backdoor, frontdoor criteria
+working) - *Granger*: Time series causality (complete with proper
+F-distribution) - *PropensityScore*: Observational study methods
+(propensity scores, matching, IPW, stratification, doubly robust all
+working) - *DoCalculus*: Interventional queries (do-intervention, effect
+identification, confounding adjustment, do-calculus rules implemented) -
+*Counterfactuals*: "`What if`" reasoning (counterfactual function with
+structural equations working)
+
+*Status:* Alpha release with 105 passing tests, working examples,
+comprehensive documentation. All core algorithms implemented and
+verified.
+
+'''''
+
+=== v1.0 → v1.2 Roadmap (Near-term)
+
+==== v1.1 - Performance & Usability (3-6 months)
+
+*MUST:* - [ ] *Performance benchmarking suite* - Baseline all 7 methods
+against synthetic datasets (10³, 10⁴, 10⁵ elements) - [ ] *Memoization
+for Dempster-Shafer* - Cache intermediate combination results to avoid
+recomputation - [ ] *Sparse matrix support in Causal DAGs* - Use
+SparseArrays.jl for large conditional probability tables - [ ] *Progress
+indicators* - Add @showprogress for long-running computations (>1s
+expected runtime) - [ ] *Input validation helpers* -
+`+validate_mass_function()+`, `+validate_cpt()+` convenience functions
+
+*SHOULD:* - [ ] *Parallel belief propagation* - Use Threads.@threads for
+independent message passing in large graphs - [ ] *JSON export/import* -
+Serialize causal models to JSON for interoperability - [ ]
+*Visualization integration* - GraphMakie.jl support for rendering
+Bayesian networks - [ ] *Uncertainty quantification* - Add confidence
+intervals to all inference outputs
+
+*COULD:* - [ ] *Interactive tutorial notebook* - Pluto.jl walkthrough of
+all 7 methods with live examples - [ ] *Domain-specific presets* -
+Medical diagnosis, fault detection, risk assessment templates - [ ]
+*Model comparison metrics* - AIC/BIC for Bayesian networks, conflict
+metrics for Dempster-Shafer
+
+==== v1.2 - Advanced Methods & Integration (6-12 months)
+
+*MUST:* - [ ] *Causal discovery algorithms* - PC algorithm, Fast Causal
+Inference for structure learning - [ ] *Intervention modeling* -
+do-calculus support for causal effect estimation - [ ] *Missing data
+handling* - EM algorithm for incomplete observations in Bayesian
+networks - [ ] *Model validation suite* - Cross-validation, holdout
+testing, bootstrap confidence intervals
+
+*SHOULD:* - [ ] *Temporal causal models* - Dynamic Bayesian networks for
+time-series causality - [ ] *Counterfactual reasoning* - Pearl’s
+structural causal model framework - [ ] *Sensitivity analysis* -
+Robustness testing for prior distributions and model parameters - [ ]
+*Integration with BowtieRisk.jl* - Bidirectional causal pathway analysis
+
+*COULD:* - [ ] *GPU acceleration* - CUDA.jl support for matrix
+operations in large networks - [ ] *Federated learning* -
+Privacy-preserving causal inference across distributed datasets - [ ]
+*AutoML for structure learning* - Hyperparameter tuning for causal
+discovery algorithms
+
+'''''
+
+=== v1.3+ Roadmap (Speculative)
+
+==== Research Frontiers
+
+*Causal AI & Machine Learning:* - Neural causal models (integration with
+Flux.jl/Lux.jl) - Causal representation learning (disentangled
+representations) - Causal reinforcement learning (counterfactual policy
+evaluation) - Large-scale causal inference (billions of variables,
+distributed computing)
+
+*Quantum Causal Models:* - Quantum Bayesian networks - Causal
+indefiniteness (no fixed causal order) - Quantum interventions and
+counterfactuals
+
+*Formal Verification:* - Proof export to Coq/Lean (causal reasoning
+proofs) - Certified causal inference (verified correctness guarantees) -
+Integration with Axiom.jl for theorem proving
+
+*Domain Expansions:* - Genomic causality (gene regulatory networks,
+GWAS) - Climate modeling (attribution of extreme events) - Economic
+causality (policy impact analysis) - Social network dynamics (influence
+propagation)
+
+==== Ecosystem Integration
+
+* *Turing.jl:* Probabilistic programming interface for Bayesian causal
+models
+* *DifferentialEquations.jl:* Continuous-time causal dynamics
+* *Graphs.jl:* Advanced graph algorithms for causal structure
+* *MLJ.jl:* Causal feature selection and causal prediction
+
+==== Ambitious Features
+
+* *Causal foundation models* - Pre-trained causal reasoning on knowledge
+graphs
+* *Natural language causal extraction* - Parse causal claims from text
+* *Interactive causal sandbox* - Visual programming for causal modeling
+(Makie.jl + web UI)
+* *Causal explanation engine* - Generate human-readable justifications
+for inferences
+
+'''''
+
+=== Future Horizons (v2.0+)
+
+==== Synthetic Twin Universes (STU)
+
+* [ ] *High-Fidelity Counterfactual Simulation*: Create
+causal-consistent "`Alternative History`" simulators using `+Agents.jl+`
+to test the long-term impact of policy interventions before deployment.
+* [ ] *Stochastic Causal Worlds*: Support for branching causal realities
+where probabilities themselves are subject to interventional shifts.
+
+==== Causal Ethics & Moral Attribution
+
+* [ ] *Moral Responsibility Scoring*: Integrate with `+Axiology.jl+` to
+formally attribute "`Blame`" or "`Credit`" based on causal necessity and
+sufficiency in multi-agent systems.
+* [ ] *Equitable Causal Chains*: Verify that causal paths from protected
+attributes to outcomes do not violate specific fairness invariants
+(linking to `+Axiology.jl+` fairness metrics).
+
+==== Neuro-Symbolic Causal Discovery
+
+* [ ] *Visual Causal Discovery*: Use deep learning (Flux.jl/Lux.jl) to
+extract symbolic causal DAGs directly from raw video or sensor streams.
+* [ ] *Latent Causal Search*: Discover "`hidden`" causal variables in
+high-dimensional latent spaces of Generative AI models.
+
+==== Causal Legal & Forensic Oracles
+
+* [ ] *Automated "`But-For`" Briefs*: Generate human-readable forensic
+reports that meet legal standards for "`Causation in Fact`" and
+"`Proximate Cause`".
+* [ ] *Blockchain Causal Audits*: Store causal intervention logs on an
+immutable ledger for verifiable post-incident forensic analysis.
+
+'''''
+
+=== Migration Path
+
+*v1.0 → v1.1:* Backward compatible (performance improvements only) *v1.1
+→ v1.2:* Mostly compatible (new features, minor API additions) *v1.2 →
+v1.3+:* Breaking changes possible (research features may require API
+redesign)
+
+=== Community Goals
+
+* *10 citations* in academic papers by v1.2
+* *100 GitHub stars* by v1.2
+* *JuliaCon talk* submission for v1.2 release
+* *Collaboration* with causal inference research groups (MIT, UCL, CMU)
diff --git a/ROADMAP.md b/ROADMAP.md
deleted file mode 100644
index 0b656ab..0000000
--- a/ROADMAP.md
+++ /dev/null
@@ -1,138 +0,0 @@
-
-# Causals.jl Development Roadmap
-
-## Current State (v0.2 Alpha)
-
-In-development implementation of 7 causal inference modules:
-- **DempsterShafer**: Evidence combination (mostly complete)
-- **BradfordHill**: Causal criteria assessment (complete)
-- **CausalDAG**: Directed acyclic graphs (d-separation, backdoor, frontdoor criteria working)
-- **Granger**: Time series causality (complete with proper F-distribution)
-- **PropensityScore**: Observational study methods (propensity scores, matching, IPW, stratification, doubly robust all working)
-- **DoCalculus**: Interventional queries (do-intervention, effect identification, confounding adjustment, do-calculus rules implemented)
-- **Counterfactuals**: "What if" reasoning (counterfactual function with structural equations working)
-
-**Status:** Alpha release with 105 passing tests, working examples, comprehensive documentation. All core algorithms implemented and verified.
-
----
-
-## v1.0 → v1.2 Roadmap (Near-term)
-
-### v1.1 - Performance & Usability (3-6 months)
-
-**MUST:**
-- [ ] **Performance benchmarking suite** - Baseline all 7 methods against synthetic datasets (10³, 10⁴, 10⁵ elements)
-- [ ] **Memoization for Dempster-Shafer** - Cache intermediate combination results to avoid recomputation
-- [ ] **Sparse matrix support in Causal DAGs** - Use SparseArrays.jl for large conditional probability tables
-- [ ] **Progress indicators** - Add @showprogress for long-running computations (>1s expected runtime)
-- [ ] **Input validation helpers** - `validate_mass_function()`, `validate_cpt()` convenience functions
-
-**SHOULD:**
-- [ ] **Parallel belief propagation** - Use Threads.@threads for independent message passing in large graphs
-- [ ] **JSON export/import** - Serialize causal models to JSON for interoperability
-- [ ] **Visualization integration** - GraphMakie.jl support for rendering Bayesian networks
-- [ ] **Uncertainty quantification** - Add confidence intervals to all inference outputs
-
-**COULD:**
-- [ ] **Interactive tutorial notebook** - Pluto.jl walkthrough of all 7 methods with live examples
-- [ ] **Domain-specific presets** - Medical diagnosis, fault detection, risk assessment templates
-- [ ] **Model comparison metrics** - AIC/BIC for Bayesian networks, conflict metrics for Dempster-Shafer
-
-### v1.2 - Advanced Methods & Integration (6-12 months)
-
-**MUST:**
-- [ ] **Causal discovery algorithms** - PC algorithm, Fast Causal Inference for structure learning
-- [ ] **Intervention modeling** - do-calculus support for causal effect estimation
-- [ ] **Missing data handling** - EM algorithm for incomplete observations in Bayesian networks
-- [ ] **Model validation suite** - Cross-validation, holdout testing, bootstrap confidence intervals
-
-**SHOULD:**
-- [ ] **Temporal causal models** - Dynamic Bayesian networks for time-series causality
-- [ ] **Counterfactual reasoning** - Pearl's structural causal model framework
-- [ ] **Sensitivity analysis** - Robustness testing for prior distributions and model parameters
-- [ ] **Integration with BowtieRisk.jl** - Bidirectional causal pathway analysis
-
-**COULD:**
-- [ ] **GPU acceleration** - CUDA.jl support for matrix operations in large networks
-- [ ] **Federated learning** - Privacy-preserving causal inference across distributed datasets
-- [ ] **AutoML for structure learning** - Hyperparameter tuning for causal discovery algorithms
-
----
-
-## v1.3+ Roadmap (Speculative)
-
-### Research Frontiers
-
-**Causal AI & Machine Learning:**
-- Neural causal models (integration with Flux.jl/Lux.jl)
-- Causal representation learning (disentangled representations)
-- Causal reinforcement learning (counterfactual policy evaluation)
-- Large-scale causal inference (billions of variables, distributed computing)
-
-**Quantum Causal Models:**
-- Quantum Bayesian networks
-- Causal indefiniteness (no fixed causal order)
-- Quantum interventions and counterfactuals
-
-**Formal Verification:**
-- Proof export to Coq/Lean (causal reasoning proofs)
-- Certified causal inference (verified correctness guarantees)
-- Integration with Axiom.jl for theorem proving
-
-**Domain Expansions:**
-- Genomic causality (gene regulatory networks, GWAS)
-- Climate modeling (attribution of extreme events)
-- Economic causality (policy impact analysis)
-- Social network dynamics (influence propagation)
-
-### Ecosystem Integration
-
-- **Turing.jl:** Probabilistic programming interface for Bayesian causal models
-- **DifferentialEquations.jl:** Continuous-time causal dynamics
-- **Graphs.jl:** Advanced graph algorithms for causal structure
-- **MLJ.jl:** Causal feature selection and causal prediction
-
-### Ambitious Features
-
-- **Causal foundation models** - Pre-trained causal reasoning on knowledge graphs
-- **Natural language causal extraction** - Parse causal claims from text
-- **Interactive causal sandbox** - Visual programming for causal modeling (Makie.jl + web UI)
-- **Causal explanation engine** - Generate human-readable justifications for inferences
-
----
-
-## Future Horizons (v2.0+)
-
-### Synthetic Twin Universes (STU)
-- [ ] **High-Fidelity Counterfactual Simulation**: Create causal-consistent "Alternative History" simulators using `Agents.jl` to test the long-term impact of policy interventions before deployment.
-- [ ] **Stochastic Causal Worlds**: Support for branching causal realities where probabilities themselves are subject to interventional shifts.
-
-### Causal Ethics & Moral Attribution
-- [ ] **Moral Responsibility Scoring**: Integrate with `Axiology.jl` to formally attribute "Blame" or "Credit" based on causal necessity and sufficiency in multi-agent systems.
-- [ ] **Equitable Causal Chains**: Verify that causal paths from protected attributes to outcomes do not violate specific fairness invariants (linking to `Axiology.jl` fairness metrics).
-
-### Neuro-Symbolic Causal Discovery
-- [ ] **Visual Causal Discovery**: Use deep learning (Flux.jl/Lux.jl) to extract symbolic causal DAGs directly from raw video or sensor streams.
-- [ ] **Latent Causal Search**: Discover "hidden" causal variables in high-dimensional latent spaces of Generative AI models.
-
-### Causal Legal & Forensic Oracles
-- [ ] **Automated "But-For" Briefs**: Generate human-readable forensic reports that meet legal standards for "Causation in Fact" and "Proximate Cause".
-- [ ] **Blockchain Causal Audits**: Store causal intervention logs on an immutable ledger for verifiable post-incident forensic analysis.
-
----
-
-## Migration Path
-
-**v1.0 → v1.1:** Backward compatible (performance improvements only)
-**v1.1 → v1.2:** Mostly compatible (new features, minor API additions)
-**v1.2 → v1.3+:** Breaking changes possible (research features may require API redesign)
-
-## Community Goals
-
-- **10 citations** in academic papers by v1.2
-- **100 GitHub stars** by v1.2
-- **JuliaCon talk** submission for v1.2 release
-- **Collaboration** with causal inference research groups (MIT, UCL, CMU)
diff --git a/RSR_OUTLINE.adoc b/RSR_OUTLINE.adoc
index 3151911..d36bc0c 100644
--- a/RSR_OUTLINE.adoc
+++ b/RSR_OUTLINE.adoc
@@ -148,8 +148,8 @@ project/
=== Language Tiers
-* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, ReScript
-* **Tier 2** (Silver): Nickel, Racket, Guile Scheme, Nix
+* **Tier 1** (Gold): Rust, Elixir, Zig, Ada, Haskell, AffineScript
+* **Tier 2** (Silver): Nickel, Racket, Guile Scheme, Guix
* **Infrastructure**: Guix channels, derivations
=== Required Files
@@ -163,12 +163,12 @@ project/
* `.well-known/security.txt`
* `.well-known/ai.txt`
* `.well-known/humans.txt`
-* `guix.scm` OR `flake.nix`
+* `guix.scm` OR `flake.guix`
=== Prohibited
* Python outside `salt/` directory
-* TypeScript/JavaScript (use ReScript)
+* TypeScript/JavaScript (use AffineScript)
* CUE (use Guile/Nickel)
* `Dockerfile` (use `Containerfile`)
diff --git a/SECURITY.adoc b/SECURITY.adoc
new file mode 100644
index 0000000..18a22dd
--- /dev/null
+++ b/SECURITY.adoc
@@ -0,0 +1,452 @@
+== Security Policy
+
+We take security seriously. We appreciate your efforts to responsibly
+disclose vulnerabilities and will make every effort to acknowledge your
+contributions.
+
+=== Table of Contents
+
+* link:#reporting-a-vulnerability[Reporting a Vulnerability]
+* link:#what-to-include[What to Include]
+* link:#response-timeline[Response Timeline]
+* link:#disclosure-policy[Disclosure Policy]
+* link:#scope[Scope]
+* link:#safe-harbour[Safe Harbour]
+* link:#recognition[Recognition]
+* link:#security-updates[Security Updates]
+* link:#security-best-practices[Security Best Practices]
+
+'''''
+
+=== Reporting a Vulnerability
+
+==== Preferred Method: GitHub Security Advisories
+
+The preferred method for reporting security vulnerabilities is through
+GitHub’s Security Advisory feature:
+
+[arabic]
+. Navigate to
+https://github.com/hyperpolymath/Causals.jl/security/advisories/new[Report
+a Vulnerability]
+. Click *"`Report a vulnerability`"*
+. Complete the form with as much detail as possible
+. Submit — we’ll receive a private notification
+
+This method ensures:
+
+* End-to-end encryption of your report
+* Private discussion space for collaboration
+* Coordinated disclosure tooling
+* Automatic credit when the advisory is published
+
+==== Alternative: Encrypted Email
+
+If you cannot use GitHub Security Advisories, you may email us directly:
+
+[cols=",",]
+|===
+|*Email* |6759885+hyperpolymath@users.noreply.github.com
+|*PGP Key* |link:%7B%7BPGP_KEY_URL%7D%7D[Download Public Key]
+|*Fingerprint* |`+[PGP fingerprint not set]+`
+|===
+
+[source,bash]
+----
+# Import our PGP key
+curl -sSL {{PGP_KEY_URL}} | gpg --import
+
+# Verify fingerprint
+gpg --fingerprint 6759885+hyperpolymath@users.noreply.github.com
+
+# Encrypt your report
+gpg --armor --encrypt --recipient 6759885+hyperpolymath@users.noreply.github.com report.txt
+----
+
+____
+*⚠️ Important:* Do not report security vulnerabilities through public
+GitHub issues, pull requests, discussions, or social media.
+____
+
+'''''
+
+=== What to Include
+
+A good vulnerability report helps us understand and reproduce the issue
+quickly.
+
+==== Required Information
+
+* *Description*: Clear explanation of the vulnerability
+* *Impact*: What an attacker could achieve (confidentiality, integrity,
+availability)
+* *Affected versions*: Which versions/commits are affected
+* *Reproduction steps*: Detailed steps to reproduce the issue
+
+==== Helpful Additional Information
+
+* *Proof of concept*: Code, scripts, or screenshots demonstrating the
+vulnerability
+* *Attack scenario*: Realistic attack scenario showing exploitability
+* *CVSS score*: Your assessment of severity (use
+https://www.first.org/cvss/calculator/3.1[CVSS 3.1 Calculator])
+* *CWE ID*: Common Weakness Enumeration identifier if known
+* *Suggested fix*: If you have ideas for remediation
+* *References*: Links to related vulnerabilities, research, or
+advisories
+
+==== Example Report Structure
+
+[source,markdown]
+----
+## Summary
+[One-sentence description of the vulnerability]
+
+## Vulnerability Type
+[e.g., SQL Injection, XSS, SSRF, Path Traversal, etc.]
+
+## Affected Component
+[File path, function name, API endpoint, etc.]
+
+## Affected Versions
+[Version range or specific commits]
+
+## Severity Assessment
+- CVSS 3.1 Score: [X.X]
+- CVSS Vector: [CVSS:3.1/AV:X/AC:X/PR:X/UI:X/S:X/C:X/I:X/A:X]
+
+## Description
+[Detailed technical description]
+
+## Steps to Reproduce
+1. [First step]
+2. [Second step]
+3. [...]
+
+## Proof of Concept
+[Code, curl commands, screenshots, etc.]
+
+## Impact
+[What can an attacker achieve?]
+
+## Suggested Remediation
+[Optional: your ideas for fixing]
+
+## References
+[Links to related issues, CVEs, research]
+----
+
+'''''
+
+=== Response Timeline
+
+We commit to the following response times:
+
+[width="100%",cols="24%,35%,41%",options="header",]
+|===
+|Stage |Timeframe |Description
+|*Initial Response* |48 hours |We acknowledge receipt and confirm we’re
+investigating
+
+|*Triage* |7 days |We assess severity, confirm the vulnerability, and
+estimate timeline
+
+|*Status Update* |Every 7 days |Regular updates on remediation progress
+
+|*Resolution* |90 days |Target for fix development and release (complex
+issues may take longer)
+
+|*Disclosure* |90 days |Public disclosure after fix is available
+(coordinated with you)
+|===
+
+____
+*Note:* These are targets, not guarantees. Complex vulnerabilities may
+require more time. We’ll communicate openly about any delays.
+____
+
+'''''
+
+=== Disclosure Policy
+
+We follow *coordinated disclosure* (also known as responsible
+disclosure):
+
+[arabic]
+. *You report* the vulnerability privately
+. *We acknowledge* and begin investigation
+. *We develop* a fix and prepare a release
+. *We coordinate* disclosure timing with you
+. *We publish* security advisory and fix simultaneously
+. *You may publish* your research after disclosure
+
+==== Our Commitments
+
+* We will not take legal action against researchers who follow this
+policy
+* We will work with you to understand and resolve the issue
+* We will credit you in the security advisory (unless you prefer
+anonymity)
+* We will notify you before public disclosure
+* We will publish advisories with sufficient detail for users to assess
+risk
+
+==== Your Commitments
+
+* Report vulnerabilities promptly after discovery
+* Give us reasonable time to address the issue before disclosure
+* Do not access, modify, or delete data beyond what’s necessary to
+demonstrate the vulnerability
+* Do not degrade service availability (no DoS testing on production)
+* Do not share vulnerability details with others until coordinated
+disclosure
+
+==== Disclosure Timeline
+
+....
+Day 0 You report vulnerability
+Day 1-2 We acknowledge receipt
+Day 7 We confirm vulnerability and share initial assessment
+Day 7-90 We develop and test fix
+Day 90 Coordinated public disclosure
+ (earlier if fix is ready; later by mutual agreement)
+....
+
+If we cannot reach agreement on disclosure timing, we default to 90 days
+from your initial report.
+
+'''''
+
+=== Scope
+
+==== In Scope ✅
+
+The following are within scope for security research:
+
+* This repository (`+hyperpolymath/Causals.jl+`) and all its code
+* Official releases and packages published from this repository
+* Documentation that could lead to security issues
+* Build and deployment configurations in this repository
+* Dependencies (report here, we’ll coordinate with upstream)
+
+==== Out of Scope ❌
+
+The following are *not* in scope:
+
+* Third-party services we integrate with (report directly to them)
+* Social engineering attacks against maintainers
+* Physical security
+* Denial of service attacks against production infrastructure
+* Spam, phishing, or other non-technical attacks
+* Issues already reported or publicly known
+* Theoretical vulnerabilities without proof of concept
+
+==== Qualifying Vulnerabilities
+
+We’re particularly interested in:
+
+* Remote code execution
+* SQL injection, command injection, code injection
+* Authentication/authorisation bypass
+* Cross-site scripting (XSS) and cross-site request forgery (CSRF)
+* Server-side request forgery (SSRF)
+* Path traversal / local file inclusion
+* Information disclosure (credentials, PII, secrets)
+* Cryptographic weaknesses
+* Deserialisation vulnerabilities
+* Memory safety issues (buffer overflows, use-after-free, etc.)
+* Supply chain vulnerabilities (dependency confusion, etc.)
+* Significant logic flaws
+
+==== Non-Qualifying Issues
+
+The following generally do not qualify as security vulnerabilities:
+
+* Missing security headers on non-sensitive pages
+* Clickjacking on pages without sensitive actions
+* Self-XSS (requires victim to paste code)
+* Missing rate limiting (unless it enables a specific attack)
+* Username/email enumeration (unless high-risk context)
+* Missing cookie flags on non-sensitive cookies
+* Software version disclosure
+* Verbose error messages (unless exposing secrets)
+* Best practice deviations without demonstrable impact
+
+'''''
+
+=== Safe Harbour
+
+We support security research conducted in good faith.
+
+==== Our Promise
+
+If you conduct security research in accordance with this policy:
+
+* ✅ We will not initiate legal action against you
+* ✅ We will not report your activity to law enforcement
+* ✅ We will work with you in good faith to resolve issues
+* ✅ We consider your research authorised under the Computer Fraud and
+Abuse Act (CFAA), UK Computer Misuse Act, and similar laws
+* ✅ We waive any potential claim against you for circumvention of
+security controls
+
+==== Good Faith Requirements
+
+To qualify for safe harbour, you must:
+
+* Comply with this security policy
+* Report vulnerabilities promptly
+* Avoid privacy violations (do not access others’ data)
+* Avoid service degradation (no destructive testing)
+* Not exploit vulnerabilities beyond proof-of-concept
+* Not use vulnerabilities for profit (beyond bug bounties where offered)
+
+____
+*⚠️ Important:* This safe harbour does not extend to third-party
+systems. Always check their policies before testing.
+____
+
+'''''
+
+=== Recognition
+
+We believe in recognising security researchers who help us improve.
+
+==== Hall of Fame
+
+Researchers who report valid vulnerabilities will be acknowledged in our
+link:SECURITY-ACKNOWLEDGMENTS.md[Security Acknowledgments] (unless they
+prefer anonymity).
+
+Recognition includes:
+
+* Your name (or chosen alias)
+* Link to your website/profile (optional)
+* Brief description of the vulnerability class
+* Date of report
+
+==== What We Offer
+
+* ✅ Public credit in security advisories
+* ✅ Acknowledgment in release notes
+* ✅ Entry in our Hall of Fame
+* ✅ Reference/recommendation letter upon request (for significant
+findings)
+
+==== What We Don’t Currently Offer
+
+* ❌ Monetary bug bounties
+* ❌ Hardware or swag
+* ❌ Paid security research contracts
+
+____
+*Note:* We’re a community project with limited resources. Your
+contributions help everyone who uses this software.
+____
+
+'''''
+
+=== Security Updates
+
+==== Receiving Updates
+
+To stay informed about security updates:
+
+* *Watch this repository*: Click "`Watch`" → "`Custom`" → Select
+"`Security alerts`"
+* *GitHub Security Advisories*: Published at
+https://github.com/hyperpolymath/Causals.jl/security/advisories[Security
+Advisories]
+* *Release notes*: Security fixes noted in link:CHANGELOG.md[CHANGELOG]
+
+==== Update Policy
+
+[cols=",",options="header",]
+|===
+|Severity |Response
+|*Critical/High* |Patch release as soon as fix is ready
+|*Medium* |Included in next scheduled release (or earlier)
+|*Low* |Included in next scheduled release
+|===
+
+==== Supported Versions
+
+[cols=",,",options="header",]
+|===
+|Version |Supported |Notes
+|`+main+` branch |✅ Yes |Latest development
+|Latest release |✅ Yes |Current stable
+|Previous minor release |✅ Yes |Security fixes backported
+|Older versions |❌ No |Please upgrade
+|===
+
+'''''
+
+=== Security Best Practices
+
+When using Causals.Jl, we recommend:
+
+==== General
+
+* Keep dependencies up to date
+* Use the latest stable release
+* Subscribe to security notifications
+* Review configuration against security documentation
+* Follow principle of least privilege
+
+==== For Contributors
+
+* Never commit secrets, credentials, or API keys
+* Use signed commits (`+git config commit.gpgsign true+`)
+* Review dependencies before adding them
+* Run security linters locally before pushing
+* Report any concerns about existing code
+
+'''''
+
+=== Additional Resources
+
+* link:%7B%7BPGP_KEY_URL%7D%7D[Our PGP Public Key]
+* https://github.com/hyperpolymath/Causals.jl/security/advisories[Security
+Advisories]
+* link:CHANGELOG.md[Changelog]
+* link:CONTRIBUTING.md[Contributing Guidelines]
+* https://cve.mitre.org/[CVE Database]
+* https://www.first.org/cvss/calculator/3.1[CVSS Calculator]
+
+'''''
+
+=== Contact
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|Purpose |Contact
+|*Security issues*
+|https://github.com/hyperpolymath/Causals.jl/security/advisories/new[Report
+via GitHub] or 6759885+hyperpolymath@users.noreply.github.com
+
+|*General questions*
+|https://github.com/hyperpolymath/Causals.jl/discussions[GitHub
+Discussions]
+
+|*Other enquiries* |See link:README.md[README] for contact information
+|===
+
+'''''
+
+=== Policy Changes
+
+This security policy may be updated from time to time. Significant
+changes will be:
+
+* Committed to this repository with a clear commit message
+* Noted in the changelog
+* Announced via GitHub Discussions (for major changes)
+
+'''''
+
+_Thank you for helping keep Causals.Jl and its users safe._ 🛡️
+
+'''''
+
+Last updated: 2026 · Policy version: 1.0.0
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index 60fda68..0000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,410 +0,0 @@
-
-# Security Policy
-
-
-
-We take security seriously. We appreciate your efforts to responsibly disclose vulnerabilities and will make every effort to acknowledge your contributions.
-
-## Table of Contents
-
-- [Reporting a Vulnerability](#reporting-a-vulnerability)
-- [What to Include](#what-to-include)
-- [Response Timeline](#response-timeline)
-- [Disclosure Policy](#disclosure-policy)
-- [Scope](#scope)
-- [Safe Harbour](#safe-harbour)
-- [Recognition](#recognition)
-- [Security Updates](#security-updates)
-- [Security Best Practices](#security-best-practices)
-
----
-
-## Reporting a Vulnerability
-
-### Preferred Method: GitHub Security Advisories
-
-The preferred method for reporting security vulnerabilities is through GitHub's Security Advisory feature:
-
-1. Navigate to [Report a Vulnerability](https://github.com/hyperpolymath/Causals.jl/security/advisories/new)
-2. Click **"Report a vulnerability"**
-3. Complete the form with as much detail as possible
-4. Submit — we'll receive a private notification
-
-This method ensures:
-
-- End-to-end encryption of your report
-- Private discussion space for collaboration
-- Coordinated disclosure tooling
-- Automatic credit when the advisory is published
-
-### Alternative: Encrypted Email
-
-If you cannot use GitHub Security Advisories, you may email us directly:
-
-| | |
-|---|---|
-| **Email** | 6759885+hyperpolymath@users.noreply.github.com |
-| **PGP Key** | [Download Public Key]({{PGP_KEY_URL}}) |
-| **Fingerprint** | `[PGP fingerprint not set]` |
-
-```bash
-# Import our PGP key
-curl -sSL {{PGP_KEY_URL}} | gpg --import
-
-# Verify fingerprint
-gpg --fingerprint 6759885+hyperpolymath@users.noreply.github.com
-
-# Encrypt your report
-gpg --armor --encrypt --recipient 6759885+hyperpolymath@users.noreply.github.com report.txt
-```
-
-> **⚠️ Important:** Do not report security vulnerabilities through public GitHub issues, pull requests, discussions, or social media.
-
----
-
-## What to Include
-
-A good vulnerability report helps us understand and reproduce the issue quickly.
-
-### Required Information
-
-- **Description**: Clear explanation of the vulnerability
-- **Impact**: What an attacker could achieve (confidentiality, integrity, availability)
-- **Affected versions**: Which versions/commits are affected
-- **Reproduction steps**: Detailed steps to reproduce the issue
-
-### Helpful Additional Information
-
-- **Proof of concept**: Code, scripts, or screenshots demonstrating the vulnerability
-- **Attack scenario**: Realistic attack scenario showing exploitability
-- **CVSS score**: Your assessment of severity (use [CVSS 3.1 Calculator](https://www.first.org/cvss/calculator/3.1))
-- **CWE ID**: Common Weakness Enumeration identifier if known
-- **Suggested fix**: If you have ideas for remediation
-- **References**: Links to related vulnerabilities, research, or advisories
-
-### Example Report Structure
-
-```markdown
-## Summary
-[One-sentence description of the vulnerability]
-
-## Vulnerability Type
-[e.g., SQL Injection, XSS, SSRF, Path Traversal, etc.]
-
-## Affected Component
-[File path, function name, API endpoint, etc.]
-
-## Affected Versions
-[Version range or specific commits]
-
-## Severity Assessment
-- CVSS 3.1 Score: [X.X]
-- CVSS Vector: [CVSS:3.1/AV:X/AC:X/PR:X/UI:X/S:X/C:X/I:X/A:X]
-
-## Description
-[Detailed technical description]
-
-## Steps to Reproduce
-1. [First step]
-2. [Second step]
-3. [...]
-
-## Proof of Concept
-[Code, curl commands, screenshots, etc.]
-
-## Impact
-[What can an attacker achieve?]
-
-## Suggested Remediation
-[Optional: your ideas for fixing]
-
-## References
-[Links to related issues, CVEs, research]
-```
-
----
-
-## Response Timeline
-
-We commit to the following response times:
-
-| Stage | Timeframe | Description |
-|-------|-----------|-------------|
-| **Initial Response** | 48 hours | We acknowledge receipt and confirm we're investigating |
-| **Triage** | 7 days | We assess severity, confirm the vulnerability, and estimate timeline |
-| **Status Update** | Every 7 days | Regular updates on remediation progress |
-| **Resolution** | 90 days | Target for fix development and release (complex issues may take longer) |
-| **Disclosure** | 90 days | Public disclosure after fix is available (coordinated with you) |
-
-> **Note:** These are targets, not guarantees. Complex vulnerabilities may require more time. We'll communicate openly about any delays.
-
----
-
-## Disclosure Policy
-
-We follow **coordinated disclosure** (also known as responsible disclosure):
-
-1. **You report** the vulnerability privately
-2. **We acknowledge** and begin investigation
-3. **We develop** a fix and prepare a release
-4. **We coordinate** disclosure timing with you
-5. **We publish** security advisory and fix simultaneously
-6. **You may publish** your research after disclosure
-
-### Our Commitments
-
-- We will not take legal action against researchers who follow this policy
-- We will work with you to understand and resolve the issue
-- We will credit you in the security advisory (unless you prefer anonymity)
-- We will notify you before public disclosure
-- We will publish advisories with sufficient detail for users to assess risk
-
-### Your Commitments
-
-- Report vulnerabilities promptly after discovery
-- Give us reasonable time to address the issue before disclosure
-- Do not access, modify, or delete data beyond what's necessary to demonstrate the vulnerability
-- Do not degrade service availability (no DoS testing on production)
-- Do not share vulnerability details with others until coordinated disclosure
-
-### Disclosure Timeline
-
-```
-Day 0 You report vulnerability
-Day 1-2 We acknowledge receipt
-Day 7 We confirm vulnerability and share initial assessment
-Day 7-90 We develop and test fix
-Day 90 Coordinated public disclosure
- (earlier if fix is ready; later by mutual agreement)
-```
-
-If we cannot reach agreement on disclosure timing, we default to 90 days from your initial report.
-
----
-
-## Scope
-
-### In Scope ✅
-
-The following are within scope for security research:
-
-- This repository (`hyperpolymath/Causals.jl`) and all its code
-- Official releases and packages published from this repository
-- Documentation that could lead to security issues
-- Build and deployment configurations in this repository
-- Dependencies (report here, we'll coordinate with upstream)
-
-### Out of Scope ❌
-
-The following are **not** in scope:
-
-- Third-party services we integrate with (report directly to them)
-- Social engineering attacks against maintainers
-- Physical security
-- Denial of service attacks against production infrastructure
-- Spam, phishing, or other non-technical attacks
-- Issues already reported or publicly known
-- Theoretical vulnerabilities without proof of concept
-
-### Qualifying Vulnerabilities
-
-We're particularly interested in:
-
-- Remote code execution
-- SQL injection, command injection, code injection
-- Authentication/authorisation bypass
-- Cross-site scripting (XSS) and cross-site request forgery (CSRF)
-- Server-side request forgery (SSRF)
-- Path traversal / local file inclusion
-- Information disclosure (credentials, PII, secrets)
-- Cryptographic weaknesses
-- Deserialisation vulnerabilities
-- Memory safety issues (buffer overflows, use-after-free, etc.)
-- Supply chain vulnerabilities (dependency confusion, etc.)
-- Significant logic flaws
-
-### Non-Qualifying Issues
-
-The following generally do not qualify as security vulnerabilities:
-
-- Missing security headers on non-sensitive pages
-- Clickjacking on pages without sensitive actions
-- Self-XSS (requires victim to paste code)
-- Missing rate limiting (unless it enables a specific attack)
-- Username/email enumeration (unless high-risk context)
-- Missing cookie flags on non-sensitive cookies
-- Software version disclosure
-- Verbose error messages (unless exposing secrets)
-- Best practice deviations without demonstrable impact
-
----
-
-## Safe Harbour
-
-We support security research conducted in good faith.
-
-### Our Promise
-
-If you conduct security research in accordance with this policy:
-
-- ✅ We will not initiate legal action against you
-- ✅ We will not report your activity to law enforcement
-- ✅ We will work with you in good faith to resolve issues
-- ✅ We consider your research authorised under the Computer Fraud and Abuse Act (CFAA), UK Computer Misuse Act, and similar laws
-- ✅ We waive any potential claim against you for circumvention of security controls
-
-### Good Faith Requirements
-
-To qualify for safe harbour, you must:
-
-- Comply with this security policy
-- Report vulnerabilities promptly
-- Avoid privacy violations (do not access others' data)
-- Avoid service degradation (no destructive testing)
-- Not exploit vulnerabilities beyond proof-of-concept
-- Not use vulnerabilities for profit (beyond bug bounties where offered)
-
-> **⚠️ Important:** This safe harbour does not extend to third-party systems. Always check their policies before testing.
-
----
-
-## Recognition
-
-We believe in recognising security researchers who help us improve.
-
-### Hall of Fame
-
-Researchers who report valid vulnerabilities will be acknowledged in our [Security Acknowledgments](SECURITY-ACKNOWLEDGMENTS.md) (unless they prefer anonymity).
-
-Recognition includes:
-
-- Your name (or chosen alias)
-- Link to your website/profile (optional)
-- Brief description of the vulnerability class
-- Date of report
-
-### What We Offer
-
-- ✅ Public credit in security advisories
-- ✅ Acknowledgment in release notes
-- ✅ Entry in our Hall of Fame
-- ✅ Reference/recommendation letter upon request (for significant findings)
-
-### What We Don't Currently Offer
-
-- ❌ Monetary bug bounties
-- ❌ Hardware or swag
-- ❌ Paid security research contracts
-
-> **Note:** We're a community project with limited resources. Your contributions help everyone who uses this software.
-
----
-
-## Security Updates
-
-### Receiving Updates
-
-To stay informed about security updates:
-
-- **Watch this repository**: Click "Watch" → "Custom" → Select "Security alerts"
-- **GitHub Security Advisories**: Published at [Security Advisories](https://github.com/hyperpolymath/Causals.jl/security/advisories)
-- **Release notes**: Security fixes noted in [CHANGELOG](CHANGELOG.md)
-
-### Update Policy
-
-| Severity | Response |
-|----------|----------|
-| **Critical/High** | Patch release as soon as fix is ready |
-| **Medium** | Included in next scheduled release (or earlier) |
-| **Low** | Included in next scheduled release |
-
-### Supported Versions
-
-
-
-| Version | Supported | Notes |
-|---------|-----------|-------|
-| `main` branch | ✅ Yes | Latest development |
-| Latest release | ✅ Yes | Current stable |
-| Previous minor release | ✅ Yes | Security fixes backported |
-| Older versions | ❌ No | Please upgrade |
-
----
-
-## Security Best Practices
-
-When using Causals.Jl, we recommend:
-
-### General
-
-- Keep dependencies up to date
-- Use the latest stable release
-- Subscribe to security notifications
-- Review configuration against security documentation
-- Follow principle of least privilege
-
-### For Contributors
-
-- Never commit secrets, credentials, or API keys
-- Use signed commits (`git config commit.gpgsign true`)
-- Review dependencies before adding them
-- Run security linters locally before pushing
-- Report any concerns about existing code
-
----
-
-## Additional Resources
-
-- [Our PGP Public Key]({{PGP_KEY_URL}})
-- [Security Advisories](https://github.com/hyperpolymath/Causals.jl/security/advisories)
-- [Changelog](CHANGELOG.md)
-- [Contributing Guidelines](CONTRIBUTING.md)
-- [CVE Database](https://cve.mitre.org/)
-- [CVSS Calculator](https://www.first.org/cvss/calculator/3.1)
-
----
-
-## Contact
-
-| Purpose | Contact |
-|---------|---------|
-| **Security issues** | [Report via GitHub](https://github.com/hyperpolymath/Causals.jl/security/advisories/new) or 6759885+hyperpolymath@users.noreply.github.com |
-| **General questions** | [GitHub Discussions](https://github.com/hyperpolymath/Causals.jl/discussions) |
-| **Other enquiries** | See [README](README.md) for contact information |
-
----
-
-## Policy Changes
-
-This security policy may be updated from time to time. Significant changes will be:
-
-- Committed to this repository with a clear commit message
-- Noted in the changelog
-- Announced via GitHub Discussions (for major changes)
-
----
-
-*Thank you for helping keep Causals.Jl and its users safe.* 🛡️
-
----
-
-Last updated: 2026 · Policy version: 1.0.0
diff --git a/TEST-NEEDS.adoc b/TEST-NEEDS.adoc
new file mode 100644
index 0000000..559efe2
--- /dev/null
+++ b/TEST-NEEDS.adoc
@@ -0,0 +1,47 @@
+== TEST-NEEDS: Causals.jl
+
+=== CRG Grade: C — ACHIEVED 2026-04-04
+
+=== Current State
+
+[cols=",,",options="header",]
+|===
+|Category |Count |Details
+|*Source modules* |14 |1,824 lines
+|*Test files* |1 |771 lines, 192 @test/@testset
+|*Benchmarks* |0 |None
+|*E2E tests* |0 |None
+|===
+
+=== What’s Missing
+
+==== E2E Tests
+
+* [ ] No end-to-end causal inference pipeline test
+
+==== Aspect Tests
+
+* [ ] *Performance*: No benchmarks for causal graph computation
+* [ ] *Error handling*: No tests for cyclic causal graphs, missing data,
+confounders
+
+==== Benchmarks Needed
+
+* [ ] Causal graph construction scaling
+* [ ] Intervention effect estimation time
+
+=== FLAGGED ISSUES
+
+* *192 tests for 14 modules = 13.7 tests/module* – adequate
+* *Single test file* – should be split for 14 modules
+* *0 benchmarks* for computational statistics
+
+=== Priority: P2 (MEDIUM)
+
+=== FAKE-FUZZ ALERT
+
+* `+tests/fuzz/placeholder.txt+` is a scorecard placeholder inherited
+from rsr-template-repo — it does NOT provide real fuzz testing
+* Replace with an actual fuzz harness (see
+rsr-template-repo/tests/fuzz/README.adoc) or remove the file
+* Priority: P2 — creates false impression of fuzz coverage
diff --git a/TEST-NEEDS.md b/TEST-NEEDS.md
deleted file mode 100644
index 3824984..0000000
--- a/TEST-NEEDS.md
+++ /dev/null
@@ -1,42 +0,0 @@
-
-# TEST-NEEDS: Causals.jl
-
-## CRG Grade: C — ACHIEVED 2026-04-04
-
-## Current State
-
-| Category | Count | Details |
-|----------|-------|---------|
-| **Source modules** | 14 | 1,824 lines |
-| **Test files** | 1 | 771 lines, 192 @test/@testset |
-| **Benchmarks** | 0 | None |
-| **E2E tests** | 0 | None |
-
-## What's Missing
-
-### E2E Tests
-- [ ] No end-to-end causal inference pipeline test
-
-### Aspect Tests
-- [ ] **Performance**: No benchmarks for causal graph computation
-- [ ] **Error handling**: No tests for cyclic causal graphs, missing data, confounders
-
-### Benchmarks Needed
-- [ ] Causal graph construction scaling
-- [ ] Intervention effect estimation time
-
-## FLAGGED ISSUES
-- **192 tests for 14 modules = 13.7 tests/module** -- adequate
-- **Single test file** -- should be split for 14 modules
-- **0 benchmarks** for computational statistics
-
-## Priority: P2 (MEDIUM)
-
-## FAKE-FUZZ ALERT
-
-- `tests/fuzz/placeholder.txt` is a scorecard placeholder inherited from rsr-template-repo — it does NOT provide real fuzz testing
-- Replace with an actual fuzz harness (see rsr-template-repo/tests/fuzz/README.adoc) or remove the file
-- Priority: P2 — creates false impression of fuzz coverage
diff --git a/TOPOLOGY.md b/TOPOLOGY.adoc
similarity index 89%
rename from TOPOLOGY.md
rename to TOPOLOGY.adoc
index cf19e29..844ca7d 100644
--- a/TOPOLOGY.md
+++ b/TOPOLOGY.adoc
@@ -1,15 +1,8 @@
-
-
-
+== Causals.jl — Project Topology
-# Causals.jl — Project Topology
+=== System Architecture
-## System Architecture
-
-```
+....
┌─────────────────────────────────────────┐
│ EXTERNALS / ECOSYSTEM │
├─────────────────────────────────────────┤
@@ -51,11 +44,11 @@ Copyright (c) Jonathan D.A. Jewell
│ .github/workflows/ (RSR Gate) │
│ Project.toml │
└─────────────────────────────────────────┘
-```
+....
-## Completion Dashboard
+=== Completion Dashboard
-```
+....
COMPONENT STATUS NOTES
───────────────────────────────── ────────────────── ─────────────────────────────────
CAUSAL METHODS
@@ -75,26 +68,27 @@ INFRASTRUCTURE & DOCS
─────────────────────────────────────────────────────────────────────────────
OVERALL: █████████░ ~95% Core Implementation Complete
-```
+....
-## Key Dependencies
+=== Key Dependencies
-```
+....
Causal DAG ───────────► Do-Calculus ──────────► Counterfactuals
▲
Propensity Score ───────────┘
│
Granger ─────────────► Unified API ◀────────── Bradford Hill
-```
+....
-## Update Protocol
+=== Update Protocol
This file is maintained by both humans and AI agents. When updating:
-1. **After completing a component**: Change its bar and percentage
-2. **After adding a component**: Add a new row in the appropriate section
-3. **After architectural changes**: Update the ASCII diagram
-4. **Date**: Update the `Last updated` comment at the top of this file
+[arabic]
+. *After completing a component*: Change its bar and percentage
+. *After adding a component*: Add a new row in the appropriate section
+. *After architectural changes*: Update the ASCII diagram
+. *Date*: Update the `+Last updated+` comment at the top of this file
-Progress bars use: `█` (filled) and `░` (empty), 10 characters wide.
-Percentages: 0%, 10%, 20%, ... 100% (in 10% increments).
+Progress bars use: `+█+` (filled) and `+░+` (empty), 10 characters wide.
+Percentages: 0%, 10%, 20%, … 100% (in 10% increments).
diff --git a/docs/src/api.md b/docs/src/api.adoc
similarity index 57%
rename from docs/src/api.md
rename to docs/src/api.adoc
index 172a48e..cf86f7c 100644
--- a/docs/src/api.md
+++ b/docs/src/api.adoc
@@ -1,32 +1,32 @@
-
-# API Reference
+== API Reference
-Complete API reference for all exported functions and types in Causals.jl.
+Complete API reference for all exported functions and types in
+Causals.jl.
-## Dempster-Shafer Module
+=== Dempster-Shafer Module
-```@docs
+[source,@docs]
+----
MassAssignment
belief
plausibility
combine_dempster
pignistic_transform
-```
+----
-## Bradford Hill Module
+=== Bradford Hill Module
-```@docs
+[source,@docs]
+----
BradfordHillCriteria
assess_causality
strength_of_evidence
-```
+----
-## Causal DAG Module
+=== Causal DAG Module
-```@docs
+[source,@docs]
+----
CausalGraph
add_edge!
remove_edge!
@@ -36,50 +36,55 @@ descendants
backdoor_criterion
frontdoor_criterion
markov_blanket
-```
+----
-## Granger Causality Module
+=== Granger Causality Module
-```@docs
+[source,@docs]
+----
granger_test
granger_causality
optimal_lag
bidirectional_granger
-```
+----
-## Propensity Score Module
+=== Propensity Score Module
-```@docs
+[source,@docs]
+----
propensity_score
matching
inverse_probability_weighting
stratification
doubly_robust
-```
+----
-## Do-Calculus Module
+=== Do-Calculus Module
-```@docs
+[source,@docs]
+----
do_intervention
identify_effect
adjustment_formula
confounding_adjustment
do_calculus_rules
Query
-```
+----
-## Counterfactuals Module
+=== Counterfactuals Module
-```@docs
+[source,@docs]
+----
counterfactual
twin_network
probability_of_necessity
probability_of_sufficiency
probability_of_necessity_and_sufficiency
Counterfactual
-```
+----
-## Index
+=== Index
-```@index
-```
+[source,@index]
+----
+----
diff --git a/docs/src/bradford_hill.adoc b/docs/src/bradford_hill.adoc
new file mode 100644
index 0000000..824dd75
--- /dev/null
+++ b/docs/src/bradford_hill.adoc
@@ -0,0 +1,25 @@
+== Bradford Hill Criteria
+
+The Bradford Hill module provides systematic assessment of causal
+relationships using the nine Bradford Hill criteria.
+
+=== Key Concepts
+
+* *Strength of Association*: How strong is the relationship?
+* *Consistency*: Is it replicated across studies?
+* *Specificity*: Is the effect specific to the exposure?
+* *Temporality*: Does cause precede effect?
+* *Biological Gradient*: Is there a dose-response relationship?
+* *Plausibility*: Is there a plausible mechanism?
+* *Coherence*: Does it fit with existing knowledge?
+* *Experiment*: Is there experimental evidence?
+* *Analogy*: Are there analogous relationships?
+
+=== API Reference
+
+[source,@docs]
+----
+BradfordHillCriteria
+assess_causality
+strength_of_evidence
+----
diff --git a/docs/src/bradford_hill.md b/docs/src/bradford_hill.md
deleted file mode 100644
index b8be675..0000000
--- a/docs/src/bradford_hill.md
+++ /dev/null
@@ -1,27 +0,0 @@
-
-# Bradford Hill Criteria
-
-The Bradford Hill module provides systematic assessment of causal relationships using the nine Bradford Hill criteria.
-
-## Key Concepts
-
-- **Strength of Association**: How strong is the relationship?
-- **Consistency**: Is it replicated across studies?
-- **Specificity**: Is the effect specific to the exposure?
-- **Temporality**: Does cause precede effect?
-- **Biological Gradient**: Is there a dose-response relationship?
-- **Plausibility**: Is there a plausible mechanism?
-- **Coherence**: Does it fit with existing knowledge?
-- **Experiment**: Is there experimental evidence?
-- **Analogy**: Are there analogous relationships?
-
-## API Reference
-
-```@docs
-BradfordHillCriteria
-assess_causality
-strength_of_evidence
-```
diff --git a/docs/src/causal_dag.adoc b/docs/src/causal_dag.adoc
new file mode 100644
index 0000000..19f8de7
--- /dev/null
+++ b/docs/src/causal_dag.adoc
@@ -0,0 +1,28 @@
+== Causal Directed Acyclic Graphs
+
+The CausalDAG module provides tools for representing and reasoning about
+causal relationships using directed acyclic graphs.
+
+=== Key Concepts
+
+* *DAG*: Directed acyclic graph representing causal structure
+* *D-Separation*: Conditional independence criterion in DAGs
+* *Backdoor Criterion*: Conditions for identifying causal effects
+* *Frontdoor Criterion*: Alternative identification strategy
+* *Markov Blanket*: Set of variables that render a node conditionally
+independent
+
+=== API Reference
+
+[source,@docs]
+----
+CausalGraph
+add_edge!
+remove_edge!
+d_separation
+ancestors
+descendants
+backdoor_criterion
+frontdoor_criterion
+markov_blanket
+----
diff --git a/docs/src/causal_dag.md b/docs/src/causal_dag.md
deleted file mode 100644
index 58ae07f..0000000
--- a/docs/src/causal_dag.md
+++ /dev/null
@@ -1,29 +0,0 @@
-
-# Causal Directed Acyclic Graphs
-
-The CausalDAG module provides tools for representing and reasoning about causal relationships using directed acyclic graphs.
-
-## Key Concepts
-
-- **DAG**: Directed acyclic graph representing causal structure
-- **D-Separation**: Conditional independence criterion in DAGs
-- **Backdoor Criterion**: Conditions for identifying causal effects
-- **Frontdoor Criterion**: Alternative identification strategy
-- **Markov Blanket**: Set of variables that render a node conditionally independent
-
-## API Reference
-
-```@docs
-CausalGraph
-add_edge!
-remove_edge!
-d_separation
-ancestors
-descendants
-backdoor_criterion
-frontdoor_criterion
-markov_blanket
-```
diff --git a/docs/src/counterfactuals.adoc b/docs/src/counterfactuals.adoc
new file mode 100644
index 0000000..3d02c22
--- /dev/null
+++ b/docs/src/counterfactuals.adoc
@@ -0,0 +1,29 @@
+== Counterfactual Reasoning
+
+The Counterfactuals module provides tools for counterfactual reasoning
+and causal responsibility.
+
+=== Key Concepts
+
+* *Counterfactual*: "`What would have happened if…?`" questions
+* *Structural Causal Model (SCM)*: Equations defining how variables are
+generated
+* *Three-Step Process*: Abduction (infer noise), Action (intervene),
+Prediction (compute counterfactual)
+* *Probability of Necessity (PN)*: Was treatment necessary for outcome?
+* *Probability of Sufficiency (PS)*: Would treatment be sufficient for
+outcome?
+* *Twin Network*: Graph representing both factual and counterfactual
+worlds
+
+=== API Reference
+
+[source,@docs]
+----
+counterfactual
+twin_network
+probability_of_necessity
+probability_of_sufficiency
+probability_of_necessity_and_sufficiency
+Counterfactual
+----
diff --git a/docs/src/counterfactuals.md b/docs/src/counterfactuals.md
deleted file mode 100644
index 5b72dc7..0000000
--- a/docs/src/counterfactuals.md
+++ /dev/null
@@ -1,27 +0,0 @@
-
-# Counterfactual Reasoning
-
-The Counterfactuals module provides tools for counterfactual reasoning and causal responsibility.
-
-## Key Concepts
-
-- **Counterfactual**: "What would have happened if...?" questions
-- **Structural Causal Model (SCM)**: Equations defining how variables are generated
-- **Three-Step Process**: Abduction (infer noise), Action (intervene), Prediction (compute counterfactual)
-- **Probability of Necessity (PN)**: Was treatment necessary for outcome?
-- **Probability of Sufficiency (PS)**: Would treatment be sufficient for outcome?
-- **Twin Network**: Graph representing both factual and counterfactual worlds
-
-## API Reference
-
-```@docs
-counterfactual
-twin_network
-probability_of_necessity
-probability_of_sufficiency
-probability_of_necessity_and_sufficiency
-Counterfactual
-```
diff --git a/docs/src/dempster_shafer.adoc b/docs/src/dempster_shafer.adoc
new file mode 100644
index 0000000..1134171
--- /dev/null
+++ b/docs/src/dempster_shafer.adoc
@@ -0,0 +1,24 @@
+== Dempster-Shafer Theory
+
+The Dempster-Shafer module provides evidence combination and belief
+functions for reasoning under uncertainty.
+
+=== Key Concepts
+
+* *Frame of Discernment*: Set of mutually exclusive hypotheses
+* *Mass Assignment*: Probability mass distributed over subsets of
+hypotheses
+* *Belief Function*: Lower probability bound for a proposition
+* *Plausibility Function*: Upper probability bound for a proposition
+* *Dempster’s Rule*: Combines evidence from independent sources
+
+=== API Reference
+
+[source,@docs]
+----
+MassAssignment
+belief
+plausibility
+combine_dempster
+pignistic_transform
+----
diff --git a/docs/src/dempster_shafer.md b/docs/src/dempster_shafer.md
deleted file mode 100644
index 797bba3..0000000
--- a/docs/src/dempster_shafer.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-# Dempster-Shafer Theory
-
-The Dempster-Shafer module provides evidence combination and belief functions for reasoning under uncertainty.
-
-## Key Concepts
-
-- **Frame of Discernment**: Set of mutually exclusive hypotheses
-- **Mass Assignment**: Probability mass distributed over subsets of hypotheses
-- **Belief Function**: Lower probability bound for a proposition
-- **Plausibility Function**: Upper probability bound for a proposition
-- **Dempster's Rule**: Combines evidence from independent sources
-
-## API Reference
-
-```@docs
-MassAssignment
-belief
-plausibility
-combine_dempster
-pignistic_transform
-```
diff --git a/docs/src/do_calculus.adoc b/docs/src/do_calculus.adoc
new file mode 100644
index 0000000..477792c
--- /dev/null
+++ b/docs/src/do_calculus.adoc
@@ -0,0 +1,27 @@
+== Do-Calculus and Interventions
+
+The DoCalculus module provides Pearl’s do-calculus for reasoning about
+causal interventions.
+
+=== Key Concepts
+
+* *Do-Operator*: do(X=x) represents setting X to value x (intervention)
+* *Interventional Query*: P(Y | do(X)) differs from observational P(Y |
+X)
+* *Effect Identification*: Determining if causal effect can be computed
+from observational data
+* *Adjustment Formula*: Computing P(Y | do(X)) using backdoor adjustment
+* *Do-Calculus Rules*: Three rules for simplifying interventional
+queries
+
+=== API Reference
+
+[source,@docs]
+----
+do_intervention
+identify_effect
+adjustment_formula
+confounding_adjustment
+do_calculus_rules
+Query
+----
diff --git a/docs/src/do_calculus.md b/docs/src/do_calculus.md
deleted file mode 100644
index 5e350d9..0000000
--- a/docs/src/do_calculus.md
+++ /dev/null
@@ -1,26 +0,0 @@
-
-# Do-Calculus and Interventions
-
-The DoCalculus module provides Pearl's do-calculus for reasoning about causal interventions.
-
-## Key Concepts
-
-- **Do-Operator**: do(X=x) represents setting X to value x (intervention)
-- **Interventional Query**: P(Y | do(X)) differs from observational P(Y | X)
-- **Effect Identification**: Determining if causal effect can be computed from observational data
-- **Adjustment Formula**: Computing P(Y | do(X)) using backdoor adjustment
-- **Do-Calculus Rules**: Three rules for simplifying interventional queries
-
-## API Reference
-
-```@docs
-do_intervention
-identify_effect
-adjustment_formula
-confounding_adjustment
-do_calculus_rules
-Query
-```
diff --git a/docs/src/examples.adoc b/docs/src/examples.adoc
new file mode 100644
index 0000000..ed12569
--- /dev/null
+++ b/docs/src/examples.adoc
@@ -0,0 +1,48 @@
+== Examples
+
+This page provides examples demonstrating the functionality of
+Causals.jl.
+
+=== Basic Usage
+
+The `+examples/01_basic_usage.jl+` file demonstrates:
+
+* *Dempster-Shafer Evidence Combination*: Combining evidence from
+multiple sources about medical diagnoses
+* *Bradford Hill Causal Assessment*: Assessing the causal relationship
+between smoking and lung cancer
+* *Causal DAG Operations*: Building causal graphs, testing d-separation,
+checking backdoor criterion
+
+To run the basic usage example:
+
+[source,julia]
+----
+include("examples/01_basic_usage.jl")
+----
+
+=== Advanced Analysis
+
+The `+examples/02_advanced_analysis.jl+` file demonstrates:
+
+* *Granger Causality*: Testing whether one time series helps predict
+another
+* *Propensity Score Matching*: Estimating treatment effects from
+observational data with confounding
+* *Do-Calculus and Interventions*: Identifying causal effects and using
+adjustment formulas
+* *Counterfactual Reasoning*: Computing "`what if`" scenarios using
+structural causal models
+
+To run the advanced analysis example:
+
+[source,julia]
+----
+include("examples/02_advanced_analysis.jl")
+----
+
+=== Example Datasets
+
+The examples use synthetic datasets to demonstrate the methods. For
+real-world applications, you can replace these with your own data
+following the same structure.
diff --git a/docs/src/examples.md b/docs/src/examples.md
deleted file mode 100644
index e90605d..0000000
--- a/docs/src/examples.md
+++ /dev/null
@@ -1,40 +0,0 @@
-
-# Examples
-
-This page provides examples demonstrating the functionality of Causals.jl.
-
-## Basic Usage
-
-The `examples/01_basic_usage.jl` file demonstrates:
-
-- **Dempster-Shafer Evidence Combination**: Combining evidence from multiple sources about medical diagnoses
-- **Bradford Hill Causal Assessment**: Assessing the causal relationship between smoking and lung cancer
-- **Causal DAG Operations**: Building causal graphs, testing d-separation, checking backdoor criterion
-
-To run the basic usage example:
-
-```julia
-include("examples/01_basic_usage.jl")
-```
-
-## Advanced Analysis
-
-The `examples/02_advanced_analysis.jl` file demonstrates:
-
-- **Granger Causality**: Testing whether one time series helps predict another
-- **Propensity Score Matching**: Estimating treatment effects from observational data with confounding
-- **Do-Calculus and Interventions**: Identifying causal effects and using adjustment formulas
-- **Counterfactual Reasoning**: Computing "what if" scenarios using structural causal models
-
-To run the advanced analysis example:
-
-```julia
-include("examples/02_advanced_analysis.jl")
-```
-
-## Example Datasets
-
-The examples use synthetic datasets to demonstrate the methods. For real-world applications, you can replace these with your own data following the same structure.
diff --git a/docs/src/granger.adoc b/docs/src/granger.adoc
new file mode 100644
index 0000000..4a5b7a4
--- /dev/null
+++ b/docs/src/granger.adoc
@@ -0,0 +1,24 @@
+== Granger Causality
+
+The Granger module provides Granger causality tests for time series
+analysis.
+
+=== Key Concepts
+
+* *Granger Causality*: X Granger-causes Y if past values of X help
+predict Y beyond Y’s own past
+* *F-Test*: Statistical test comparing restricted and unrestricted VAR
+models
+* *Optimal Lag*: Number of lags that minimizes information criterion
+(AIC)
+* *Bidirectional Causality*: Testing causality in both directions
+
+=== API Reference
+
+[source,@docs]
+----
+granger_test
+granger_causality
+optimal_lag
+bidirectional_granger
+----
diff --git a/docs/src/granger.md b/docs/src/granger.md
deleted file mode 100644
index da09e09..0000000
--- a/docs/src/granger.md
+++ /dev/null
@@ -1,23 +0,0 @@
-
-# Granger Causality
-
-The Granger module provides Granger causality tests for time series analysis.
-
-## Key Concepts
-
-- **Granger Causality**: X Granger-causes Y if past values of X help predict Y beyond Y's own past
-- **F-Test**: Statistical test comparing restricted and unrestricted VAR models
-- **Optimal Lag**: Number of lags that minimizes information criterion (AIC)
-- **Bidirectional Causality**: Testing causality in both directions
-
-## API Reference
-
-```@docs
-granger_test
-granger_causality
-optimal_lag
-bidirectional_granger
-```
diff --git a/docs/src/index.md b/docs/src/index.adoc
similarity index 58%
rename from docs/src/index.md
rename to docs/src/index.adoc
index 2c42bde..48ac40c 100644
--- a/docs/src/index.md
+++ b/docs/src/index.adoc
@@ -1,44 +1,40 @@
-
-# Causals.jl
+== Causals.jl
Comprehensive causal inference toolkit for Julia.
-## Overview
+=== Overview
Causals.jl unifies multiple approaches to causal reasoning:
-- **Dempster-Shafer theory** - Combine uncertain expert opinions
-- **Bradford Hill criteria** - Assess causality in observational studies
-- **Causal DAGs** - Graphical models and identification
-- **Granger causality** - Time series causal analysis
-- **Propensity scores** - Observational study adjustment
-- **Do-calculus** - Pearl's intervention framework
-- **Counterfactuals** - "What if" reasoning
+* *Dempster-Shafer theory* - Combine uncertain expert opinions
+* *Bradford Hill criteria* - Assess causality in observational studies
+* *Causal DAGs* - Graphical models and identification
+* *Granger causality* - Time series causal analysis
+* *Propensity scores* - Observational study adjustment
+* *Do-calculus* - Pearl’s intervention framework
+* *Counterfactuals* - "`What if`" reasoning
-## Why Causals.jl?
+=== Why Causals.jl?
Existing Julia causal packages are fragmented. Causals.jl provides:
-✓ Complete coverage of major causal methods
-✓ Production-quality implementations
-✓ Comprehensive documentation
-✓ Active maintenance
+✓ Complete coverage of major causal methods ✓ Production-quality
+implementations ✓ Comprehensive documentation ✓ Active maintenance
-## Installation
+=== Installation
-```julia
+[source,julia]
+----
using Pkg
Pkg.add(url="https://github.com/hyperpolymath/Causals.jl")
-```
+----
-## Quick Start
+=== Quick Start
-### Combining Expert Evidence
+==== Combining Expert Evidence
-```julia
+[source,julia]
+----
using Causals
# Two experts provide evidence about hypotheses
@@ -59,22 +55,24 @@ combined = combine_dempster(expert1, expert2)
# Get belief interval
lower, upper = uncertainty(combined, Set([:A]))
-```
+----
-### Granger Causality
+==== Granger Causality
-```julia
+[source,julia]
+----
# Test if X Granger-causes Y
causes, F_stat, p_value, lag = granger_test(x_series, y_series)
if causes
println("X Granger-causes Y with lag $lag")
end
-```
+----
-### Causal DAG Analysis
+==== Causal DAG Analysis
-```julia
+[source,julia]
+----
# Build causal graph
g = CausalGraph([:X, :Y, :Z])
add_edge!(g, :Z, :X) # Z → X
@@ -83,16 +81,17 @@ add_edge!(g, :X, :Y) # X → Y
# Check if Z blocks backdoor path
@assert backdoor_criterion(g, :X, :Y, Set([:Z]))
-```
+----
-## Modules
+=== Modules
-```@contents
+[source,@contents]
+----
Pages = ["dempster_shafer.md", "bradford_hill.md", "causal_dag.md",
"granger.md", "propensity.md", "do_calculus.md", "counterfactuals.md"]
Depth = 1
-```
+----
-## License
+=== License
MPL-2.0 (MPL-2.0 compatible)
diff --git a/docs/src/propensity.adoc b/docs/src/propensity.adoc
new file mode 100644
index 0000000..fbd2e47
--- /dev/null
+++ b/docs/src/propensity.adoc
@@ -0,0 +1,28 @@
+== Propensity Score Methods
+
+The PropensityScore module provides methods for causal inference from
+observational data using propensity scores.
+
+=== Key Concepts
+
+* *Propensity Score*: P(treatment=1 | covariates) - probability of
+receiving treatment
+* *Matching*: Pair treated and control units with similar propensity
+scores
+* *Inverse Probability Weighting (IPW)*: Weight observations by inverse
+propensity
+* *Stratification*: Group by propensity score and estimate effects
+within strata
+* *Doubly Robust*: Consistent if either propensity or outcome model is
+correct
+
+=== API Reference
+
+[source,@docs]
+----
+propensity_score
+matching
+inverse_probability_weighting
+stratification
+doubly_robust
+----
diff --git a/docs/src/propensity.md b/docs/src/propensity.md
deleted file mode 100644
index d6970fa..0000000
--- a/docs/src/propensity.md
+++ /dev/null
@@ -1,25 +0,0 @@
-
-# Propensity Score Methods
-
-The PropensityScore module provides methods for causal inference from observational data using propensity scores.
-
-## Key Concepts
-
-- **Propensity Score**: P(treatment=1 | covariates) - probability of receiving treatment
-- **Matching**: Pair treated and control units with similar propensity scores
-- **Inverse Probability Weighting (IPW)**: Weight observations by inverse propensity
-- **Stratification**: Group by propensity score and estimate effects within strata
-- **Doubly Robust**: Consistent if either propensity or outcome model is correct
-
-## API Reference
-
-```@docs
-propensity_score
-matching
-inverse_probability_weighting
-stratification
-doubly_robust
-```
diff --git a/llm-warmup-dev.adoc b/llm-warmup-dev.adoc
new file mode 100644
index 0000000..20987df
--- /dev/null
+++ b/llm-warmup-dev.adoc
@@ -0,0 +1,19 @@
+== LLM Warmup — Causals.jl (Developer)
+
+=== What is Causals.jl?
+
+See README.adoc for overview.
+
+=== Key Commands
+
+* `+just setup+` — set up development environment
+* `+just build+` — build the project
+* `+just test+` — run tests
+* `+just doctor+` — diagnose issues
+* `+just heal+` — attempt auto-repair
+
+=== Quick Context
+
+* License: MPL-2.0
+* Part of hyperpolymath ecosystem
+* See EXPLAINME.adoc for architecture
diff --git a/llm-warmup-dev.md b/llm-warmup-dev.md
deleted file mode 100644
index 0080628..0000000
--- a/llm-warmup-dev.md
+++ /dev/null
@@ -1,20 +0,0 @@
-
-# LLM Warmup — Causals.jl (Developer)
-
-## What is Causals.jl?
-See README.adoc for overview.
-
-## Key Commands
-- `just setup` — set up development environment
-- `just build` — build the project
-- `just test` — run tests
-- `just doctor` — diagnose issues
-- `just heal` — attempt auto-repair
-
-## Quick Context
-- License: MPL-2.0
-- Part of hyperpolymath ecosystem
-- See EXPLAINME.adoc for architecture
diff --git a/llm-warmup-user.adoc b/llm-warmup-user.adoc
new file mode 100644
index 0000000..2cad519
--- /dev/null
+++ b/llm-warmup-user.adoc
@@ -0,0 +1,19 @@
+== LLM Warmup — Causals.jl (User)
+
+=== What is Causals.jl?
+
+See README.adoc for overview.
+
+=== Key Commands
+
+* `+just setup+` — set up development environment
+* `+just build+` — build the project
+* `+just test+` — run tests
+* `+just doctor+` — diagnose issues
+* `+just heal+` — attempt auto-repair
+
+=== Quick Context
+
+* License: MPL-2.0
+* Part of hyperpolymath ecosystem
+* See EXPLAINME.adoc for architecture
diff --git a/llm-warmup-user.md b/llm-warmup-user.md
deleted file mode 100644
index 51c7990..0000000
--- a/llm-warmup-user.md
+++ /dev/null
@@ -1,20 +0,0 @@
-
-# LLM Warmup — Causals.jl (User)
-
-## What is Causals.jl?
-See README.adoc for overview.
-
-## Key Commands
-- `just setup` — set up development environment
-- `just build` — build the project
-- `just test` — run tests
-- `just doctor` — diagnose issues
-- `just heal` — attempt auto-repair
-
-## Quick Context
-- License: MPL-2.0
-- Part of hyperpolymath ecosystem
-- See EXPLAINME.adoc for architecture