Reading the repo
Reading the repo
Saved setup from 3 h ago
Will it work on my device?
CONTRIBUTING.mdThank you for contributing. OBLITERATUS is a research tool that mutates model weights, evaluates behavior, persists results, and can cross local, accelerator, network, and remote-execution trust boundaries. Changes therefore need both ordinary software tests and evidence appropriate to the risk they affect.
The authoritative requirements are the current CI workflow, the machine-readable quality policies, and the BT6 maintainer profile:
.github/workflows/ci.ymlci/test-quality-policy.jsonci/test-risk-map.jsonci/conditional-test-policy.json.aiwg/bt6-maintainer.yamldocs/RELEASE_PROCESS.mdIf this guide and an enforced policy disagree, the enforced policy wins. Update the guide in the same pull request when intentionally changing a standard.
The supported Python versions are 3.10 through 3.12. Use the committed lock so local resolution matches CI and Linux/Windows use the official CPU-only PyTorch source by default:
python -m pip install "uv==0.12.4"
uv sync --locked --extra dev
Run project commands in the environment with uv run --extra dev ..., or activate
.venv. Never update uv.lock merely to make setup succeed. Dependency updates
must be deliberate and follow docs/SUPPLY_CHAIN_POLICY.md.
main.The repository does not permit force-pushes. Add corrective commits, or coordinate with a maintainer when a history change is genuinely necessary.
All commits must have a cryptographically verifiable signature. Contributors sign with a key associated with their own forge identity; GitHub's verified web-flow signature is also acceptable. Do not request, copy, or use a maintainer or project private key.
Maintainer-authored and integration commits use the configured project publish key,
currently fingerprint
62297562B1C7053088F405DB0117DAAA677A5BF2, through the approved vault-backed
signing path. Maintainers preserve the original contributor as author when carrying
their work and keep maintainer hardening or test commits separately attributable.
Canonical integration must preserve a verifiable signature. Pull requests use the
repository's configured merge-commit method; squash and rebase merges are not used.
Maintainers confirm the exact accepted head at merge time, then verify the resulting
canonical commit and its post-merge CI on main. A signed pull-request head does not
substitute for verification of the commit that actually landed.
Verify your local commit before pushing:
git verify-commit HEAD
git log -1 --show-signature
The mandatory baseline is deterministic, offline, credential-free, and CPU-safe. Tests must not download models or datasets, contact services, require an accelerator, launch a UI, or use remote credentials unless they are explicitly assigned to a conditional marker and gate.
CI keeps the contributor gate intentionally small enough to return useful review feedback quickly. It currently requires:
ci/test-risk-map.json;PR core tests and Gloo tests share one selection, balanced using
ci/core-test-durations.json and ci/gloo-test-durations.json respectively.
CORE_SHARD_COUNT and GLOO_SHARD_COUNT in CI control the matrices. The required
"Pull request core" gate validates every shard's candidate-bound evidence before
combining coverage and enforcing the changed-line floor.
These values are floors, not targets. A change should strengthen behavioral confidence rather than consume existing margin.
A green pull-request gate means the submission is ready for maintainer review. It does not certify a release and does not guarantee immediate merge. Maintainers own the additional risk-driven tests, cross-version checks, packaging depth, and hardening needed for the merge decision.
The v* tag workflow, or an explicit manual release-validation run, executes the
full Python 3.10-3.12 matrix and retains the stricter repository, branch,
critical-module, touched-module, mature-scope, repeat, mutation, packaging,
Windows, and supply-chain gates. The full suite remains mandatory for a release;
the faster pull-request lane is not a release exemption.
In each Python version's release lane, Gloo tests run in four duration-balanced
release-gloo-tests shards with ten-minute timeouts. The remaining suite runs in the
Tests job, which has a thirty-minute timeout. That job checks that every collected
Gloo test ran in a shard, then combines the shard coverage with its own before
enforcing the floors. For the Python 3.12 touched-module comparison,
release-base-core and matching base Gloo shards rerun the exact base suite in
parallel, so the comparison stays like-for-like.
Gloo testcases count toward the per-test and marker duration budgets. The suite
budget measures the Tests job's own run; the parallel Gloo shards are bounded by
their timeouts instead.
The complete lifecycle, acceptance states, immutable-tag rule, artifact reuse rule,
and publication gates are documented in
docs/RELEASE_PROCESS.md. In particular, a failed tag is
never moved or reused: the corrected candidate receives a new version and signed
tag. Releases publish the exact tested source snapshot and evidence, not a newly
rebuilt archive.
Each behavior-changing pull request must include:
Do not weaken assertions, delete tests, add unconditional skips, suppress warnings, or lower a threshold to make a change pass. A temporary exception must be narrowly scoped, issue-linked, owner-assigned, reviewed, and time-bounded by the relevant machine-readable policy.
Update ci/test-risk-map.json whenever source ownership,
contract coverage, or the conditional boundary changes. Validate it with:
uv run --extra dev python scripts/check_test_risk_map.py
uv run --extra dev python scripts/check_conditional_policy.py
Issue #306 tracks seven
release-lane cases in owned_slow_tests. Their existing budgets expire on
2027-01-12; source-level improvements do not justify renewing or removing them.
Collect fresh GitHub-hosted Python 3.10–3.12 JUnit timings for the exact candidate,
including fixture setup and teardown, before changing ownership or limits.
Local timings are diagnostic evidence only.
| Case | Avoidable work and remaining boundary |
|---|---|
| Offline checkpoint-to-report CLI | Combine environment/origin probes and avoid a duplicate model reload. Keep separate isolated python -I -m obliteratus mutation and study commands, offline homes, real checkpoint reload and report assertions. Interpreter/torch startup remains. |
| Rank-local manifest determinism | Share the first successful group with the manifest tiling assertions. Still compare two independent spawned two-rank Gloo groups and rendezvous files. Running determinism alone still needs both groups. |
| Bounded rank hang | Keep the intentional seven-second rank sleep, five-second process-group timeout, twelve-second operation bound and failure assertions. Cold start has its own twenty-second bound. |
| Repository sentence scan | Incrementally hash overlapping prose windows. Keep the tracked-file inventory, all directory scopes, existing binary/size exclusions, structured parsers, sentence normalization and 32-line wrapping coverage. This guard does not replace supply-chain secret or vulnerability scans. |
| Disk-offloaded export RSS | Already measures native then legacy in one fresh interpreter against one real offloaded model, resetting the high-water mark between modes. Keep the model size, allocation bounds and legacy negative control. Import, disk I/O and native allocation measurement remain. |
| Installed-wheel model info CLI | Combine environment/origin probes. Keep the installed-artifact origin check and isolated offline CLI process outside the repository. Interpreter/torch startup remains. |
| Missing-rank preflight | Keep the real five-second Gloo rendezvous timeout, quarantine, worker reaping and failure assertions. The launcher has a forty-second outer bound. |
All seven still need fresh hosted timing. In particular, intentional hang and missing-rank failures spend real time proving their timeout contracts; shortening those waits or mocking Gloo changes the proof. RSS and installed-wheel cases also retain process isolation that an in-process shortcut would lose. The tiny model runtime fixture bounds threads and freezes pre-existing garbage in the pytest process; that state does not carry into isolated CLI interpreters. Do not claim its savings for child processes or merge CLI commands just to amortize torch startup.
Run the focused pull-request baseline while developing. Replace origin/main with
the exact base commit when needed:
uv lock --check
uv run --extra dev python -m ruff check --select F app.py obliteratus tests scripts
mkdir -p test-results
uv run --extra dev python scripts/select_pr_tests.py --base-ref origin/main \
> test-results/selected-tests.txt
mapfile -t selected_tests < test-results/selected-tests.txt
uv run --extra dev python -m pytest "${selected_tests[@]}" \
--cov=app --cov-branch --cov-fail-under=0 \
--cov-report=json:test-results/coverage-pr-core.json
uv run --extra dev python scripts/check_coverage_thresholds.py \
test-results/coverage-pr-core.json --min-line 0 --min-branch 0 \
--min-changed 50 --base-ref origin/main
uv run --extra dev python -c 'import obliteratus; print(obliteratus.__version__)'
uv run --extra dev python -m obliteratus --help
uv run --extra dev python scripts/check_conditional_policy.py
uv run --extra dev python scripts/check_test_risk_map.py
If package inputs changed, also run
uv run --extra dev python -m build --sdist --wheel. Maintainers run the complete
python -m pytest, package-install,
cross-version, and quality-depth suite before a tagged release.
Ruff E501 remains a non-blocking legacy-debt report; new code should still respect the configured 100-character line length. The exact reporting command lives in CI.
For changes to the quality system or mutation-owned code, also run:
uv sync --locked --extra dev --group quality
uv run --extra dev --group quality python scripts/run_repeat_gate.py \
--output test-results/repeat-gate.json
uv run --extra dev --group quality python scripts/check_mutation_targets.py prepare
uv run --extra dev --group quality python scripts/prepare_mutation_coverage.py \
prepare-coverage --max-children 4
uv run --extra dev --group quality python scripts/prepare_mutation_coverage.py \
prepare-stats --max-children 4
uv run --extra dev --group quality python scripts/run_prepared_mutmut.py \
run --max-children 4
uv run --extra dev --group quality mutmut export-cicd-stats
uv run --extra dev --group quality python scripts/check_mutation_score.py \
mutants/mutmut-cicd-stats.json --minimum 85
CI remains authoritative for exact-base changed-line coverage, actionlint, selected test evidence, release platform-matrix results, installed-distribution checks, and retained evidence.
Run the focused checks for every risk surface your change touches, in addition to the full baseline:
| Risk surface | Typical paths | Required focused checks |
|---|---|---|
| Model loading | obliteratus/models/**, obliteratus/device.py, scripts/** | python -m pytest tests/test_strategies.py tests/test_module_imports.py |
| Abliteration core | obliteratus/abliterate.py, obliteratus/strategies/** | python -m pytest tests/test_abliterate.py |
| Research metrics | obliteratus/evaluation/**, obliteratus/analysis/**, paper/**, community_results/** | python -m pytest tests/test_advanced_metrics.py tests/test_breakthrough_modules.py tests/test_community.py |
| User contracts | obliteratus/cli.py, obliteratus/local_ui.py, app.py, notebooks/** | python -m pytest tests/test_cli.py tests/test_module_imports.py and CLI help |
| CI and supply chain | .github/workflows/**, ci/**, dependency and policy files | uv lock --check, policy tests, and package build |
Use uv run --extra dev before the Python commands shown in the table when running
them in the managed environment.
GPU, Jetson, MPS, MLX, model-download, external-evaluation, network, operator-UI, and remote-execution checks are conditional release or risk-surface gates. A unit test with a mocked device is still required; hardware evidence complements deterministic contract coverage and never replaces it.
Follow docs/conditional-testing.md for the exact
runner labels, pinned resources, commands, credentials, evidence schema, freshness,
and waiver rules. Evidence must identify the exact candidate commit. A skipped or
unselected gate is not positive support evidence, and a waiver blocks the associated
support claim.
Current operator hardware includes Titan for CUDA/bitsandbytes probes and Mutsu, a 16 GB Apple Silicon builder, for MPS/MLX probes. Contributors must not assume those machines are attached to a public pull-request workflow; CI or a maintainer will record whether the mapped conditional gate ran.
Jetson contributors do not need project-owned hardware access. Follow the Jetson contributor bootstrap on a physical device, then submit the generated sanitized evidence through the Jetson runtime report. Maintainers will reproduce, add missing test depth, and integrate compatible changes. Never attach a contributor-controlled runner to untrusted pull-request execution.
ci/digests.txt.uv.lock and relevant license,
vulnerability, and SBOM effects.Report vulnerabilities privately as described in SECURITY.md.
Do not open a public issue for an undisclosed vulnerability.
Research, evaluation, and performance claims must be reproducible and scoped to the evidence actually collected. Include, as applicable:
Do not generalize a result beyond tested models, hardware, operating systems, or backends. Performance claims need measured evidence; availability or a successful import is not a performance result.
A review-ready pull request:
Review is performed at an immutable head SHA. Pushing new commits invalidates prior test and review conclusions until the new head is checked. Maintainers may add tests or hardening in a separate attributable commit, resolve review threads, and run deeper gates before merge. Behavior changes with no relevant test coverage remain blocked; contributors are not expected to satisfy release-depth coverage and mutation gates merely to request review.
Acceptance, integration, and release certification are separate decisions. The
maintainer audit and merge must refer to the current exact head; the canonical merge
commit must then be signature-verified and pass post-merge CI. Only a new signed tag
that passes the exhaustive exact-tag suite can identify a release candidate. See
docs/RELEASE_PROCESS.md for the normative sequence.
See docs/recovery.md for the recovery schema, source terms,
operator commands, and checkpoint evidence. Recovery changes require local tiny
fixtures and mocked Hub access in tests/test_recovery_dataset.py and
tests/test_recover.py; default tests must not download data or models. Keep
ci/test-risk-map.json and the conditional coverage graph aligned with new source
files. Use the locked recovery extra for PEFT integration coverage.
Record refusa
Then run powershell -ExecutionPolicy Bypass -File .\setup.ps1. It stops at the first error and is safe to run again. Servers and tests aren't started; it lists them at the end. Read it first.
Needs Git: winget install Git.Git
git clone https://github.com/elder-plinius/OBLITERATUS.git cd OBLITERATUS
Python >=3.11
winget install astral-sh.uv
uv sync
uv run python app.py
uv run pytest
No reports for Windows yet.
Opens a chat with this manual already filled in, for Windows. It uses your own account; gitmanual sends nothing.