# Ethical Attractors in Complex Networks (paper A): archived research code

> ## Status: SUSPENDED (September 2026)
>
> This research direction is **suspended and will not be continued in this
> form**. This is a scrubbed code archive of the published work. The full
> manuscript (with author attribution) is available only through the archived
> DOI record on Zenodo, which is permanent and cannot be withdrawn.
>
> **Successor work is being rebuilt from the ground up with real-world data
> at [fact.ngo](https://fact.ngo).** The durable part of this project was never
> the "ethical attractor" framing, which was, in hindsight, overclaiming: this
> code never demonstrated attractors in the dynamical-systems sense. What is
> worth keeping is the observation architecture:
>
> - privacy-compatible monitoring from **aggregated observables** (no identity-resolved traces),
> - a **Bayesian belief state** over constraint satisfaction with explicit uncertainty,
> - **calibration-first evaluation** (Brier score / log loss against ground truth).
>
> Known issues with this version, for the record: the paper under-describes
> the actuation (heat also modulates the payoff parameter theta, not just
> noise and selection), the sweep result CSVs backing the figures were never
> published, replicates are thin (n=5), and the measurement-window
> description in the manuscript does not match the code (5 sweeps, not
> 5 micro-updates).

## Contents

- `paper_a_sim/`: simulation code and canonical config.
- `paper_a_manuscript/`: figure plotting script, bibliography, and result figures.
- `requirements.txt`: plotting dependencies (the simulation itself is stdlib-only).

## Python environment

- `python3 -m venv .venv`
- `source .venv/bin/activate`
- `pip install -r requirements.txt`

## Reproduce the canonical closed-loop run

From `paper_a_sim/`:

- `python3 run_closed_loop.py --config example_config_sbm_topology_actuator_quantiles_cooldown.json`
- `python3 validate_output.py --out_dir paper_a_sim_out_sbm_topology_actuator_quantiles_cooldown_sep_d12`

## Regenerate figures

Sweep result CSVs were not retained in this archive. `paper_a_manuscript/figures/`
holds the published figures; `paper_a_manuscript/plot_figures.py` will
regenerate them if you first produce sweep CSVs with `paper_a_sim/run_sweep.py`
and `paper_a_sim/extract_sweep_results.py`.
