audit-reproducibility — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit-reproducibility (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Source. This skill is jointly adapted frompedrohcgs/claude-code-my-workflowand Scott Cunningham'sMixtapeTools. The 5-phase tolerance-based numeric-claim audit (extract → match → compare → report PASS/FAIL → summarize) draws on both: Pedro's R / Python / Stata multi-language phase structure and Scott's claim-extraction-to-tolerance-comparison flow. This fork tunes the language stack to R / Python only (no Stata) and the manuscript conventions to quantitative-marketing layouts.
Compare numeric claims in a manuscript (point estimates, standard errors, p-values, counts, percentages) against the actual outputs produced by the analysis pipeline. Report PASS / FAIL per claim against documented tolerance thresholds.
Core principle: If the paper says beta = 0.342 (0.091) and the R / Python code produces 0.338 (0.094), we verify — numerically — that the difference is within tolerance. No "looks close enough" eyeballing.
The target stack is R and Python only — there are no Stata .do files, .log files, or master.do runners in scope here. Pipelines are typically R scripts (scripts/00_run_all.R, make, targets) or Python (run.py, snakemake, nbconvert).
$0 — path to the manuscript (.tex, .qmd, .Rmd, .md, .pdf). Required. Projects typically live under <OVERLEAF_ROOT>/<PROJECT_SUBDIR>/.$1 — path to the outputs directory. Defaults to output/ or results/ (try both). Other common locations: tables/, figures/, _targets/objects/, notebooks/output/.Rscript scripts/00_run_all.R or Rscript -e "targets::tar_make()"python run.py or jupyter nbconvert --execute notebooks/main.ipynbsessionInfo.txt, renv.lock, DESCRIPTION, requirements.txt, environment.yml, pyproject.toml. Note its presence in the report.--tolerance-file or by editing a project-local .reproducibility.yml):| Kind | Default tolerance |
|---|---|
| Integers (N, counts) | Exact |
| Point estimates | abs(reported - computed) < 0.01 |
| Standard errors | abs(reported - computed) < 0.05 |
| P-values | Same significance bucket (p<0.001, p<0.01, p<0.05, p<0.10, n.s.) |
| Percentages | Within 0.1 pp |
| Elasticities / large coefficients | Within 1% relative |
Parse the manuscript for numeric claims. Patterns to match:
beta = 0.342 (0.091), $\hat{\beta} = 0.342$ (0.091), 1.28^{***} with starred significance.& 0.342$^{***}$ & (0.091) & inside \begin{tabular} / \begin{table} blocks.our sample of 12,847 observations, $N = 12{,}847$, 2.3 million records.mean = 0.423, SD = 0.087, median rating = 3.4.p < 0.01, $p = 0.003$.42.3% of cases, share = 0.423.Record each claim as a tuple:
{
"claim_id": "Table2_col3_treatX",
"location": "Table 2, Column 3, row 'Treatment X'",
"kind": "point_estimate",
"reported_value": 0.342,
"uncertainty": 0.091,
"significance_stars": 3,
"raw_context": "the treatment X coefficient of 0.342 (0.091) suggests..."
}Write the extracted claims to <project>/audit_claims_<YYYYMMDD>.json so the user can review the extraction before the audit runs.
Scan $1 for corresponding values. Priority order:
Rscript -e "obj <- readRDS('path.rds'); print(broom::tidy(obj))". For qs: Rscript -e "obj <- qs::qread('path.qs'); ...".output/tables/main_results.csv.jupyter nbconvert --to script then grep, or parse JSON cells directly.Record each extracted result:
{
"source": "output/tables/main_results.rds",
"lookup_key": "fit_main$coefficients['treatment_x']",
"value": 0.338,
"uncertainty": 0.094,
"p_value": 0.0004
}Use fuzzy heuristics when exact labels don't align:
"treatment x score" ~ "tx_score" ~ "treatment_x"; "composite complexity" ~ "complexity_idx").raw_context (table number, row label, column header).Claims with match confidence below 0.7 are flagged UNMATCHED — manual review needed rather than silently passing.
For each matched claim, apply the tolerance table from Phase 0. Honour any project-local overrides (.reproducibility.yml) — the user may loosen for Monte Carlo simulation noise (e.g., neural-net training seeds) or tighten for descriptive statistics that should be exact.
Write <project>/audit_<YYYYMMDD>.md:
# Reproducibility Audit: <Manuscript Title>
**Date:** YYYY-MM-DD
**Manuscript:** <path>
**Outputs directory:** <path>
**Tolerance source:** <default or .reproducibility.yml>
## Summary
| Status | Count |
|---|---|
| PASS | N |
| FAIL (diff > tolerance) | M |
| UNMATCHED (manual review) | K |
| **Overall verdict** | **PASS / FAIL** |
## PASS (within tolerance)
| Claim | Reported | Computed | Diff | Tolerance |
|---|---|---|---|---|
| Table2_col3_treatX | 0.342 (0.091) | 0.338 (0.094) | 0.004 / 0.003 | 0.01 / 0.05 |
## FAIL (outside tolerance — BLOCKER)
| Claim | Reported | Computed | Diff | Tolerance | Location in paper |
|---|---|---|---|---|---|
## UNMATCHED (manual review)
| Claim | Raw context | Candidate sources |
|---|---|---|
## Environment
[sessionInfo.txt / renv.lock / requirements.txt excerpt]
## Next steps
1. Fix any FAIL rows — either update the manuscript or rerun the analysis.
2. Resolve UNMATCHED rows — add explicit table-to-file mappings or widen the search scope.
3. After zero FAILs, the paper is replication-ready.When auditing all numeric claims in a paper and the pipeline takes more than a couple of minutes (e.g. neural-net retraining, large feature extraction), background-launch the rerun with Bash run_in_background: true, then use the Monitor tool to stream stdout. The audit can react to errors mid-stream rather than waiting for the whole pipeline to finish before noticing a failed step.
output/, results/, or tables/. Ask for the correct path; do not invent one.{"Table 2": "output/tables/main_results.csv", ...}) and rerun Phase 3..tex / .csv lookups and flag the affected claims as UNMATCHED.set.seed() / np.random.seed() will fail tolerance — flag, but recommend adding seeds rather than loosening tolerance.0.342 is reproducible. Whether 0.342 is the right estimand is a review-paper / domain question.renv.lock, pyproject.toml, environment.yml)..log files, route them through a Stata-aware audit instead./review-paper-code — broader reproducibility + code-quality audit; pair with this skill for a full pre-submission check./review-paper — content review; complementary to this numeric audit./seven-pass-review — adversarial multi-lens review; Lens 4 (Results) overlaps lightly with this skill but stays qualitative.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.