audit-engine — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited audit-engine (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
Orchestration Log: When this skill is activated, append a log entry tooutputs/orchestration_log.md: ``### Skill Activation: Audit Engine **Timestamp:** [current date/time] **Actor:** AI Agent (audit-engine) **Input:** [paper + repo being audited] **Output:** [brief summary — e.g., "Audited 18 claims: 12 CONFIRMED, 3 PARTIAL, 2 MISSING, 1 MISMATCH"]``
Papers make claims. Code embodies what was actually done. This engine systematically checks whether the two agree. For every empirical or technical claim in the paper — datasets used, models trained, metrics reported, hyperparameters set, ablations run — the engine locates supporting evidence in the linked repository and classifies the match.
This is the complement to verification-engine, which checks citations against external sources. Audit-engine checks the paper's own claims against the paper's own code. Together they cover both failure modes of LLM-assisted writing: mis-cited prior work and unsupported own-work claims.
Inspired by the /audit command in the Feynman research agent (Companion AI, 2026), adapted to the IS/CS methodological style of this plugin.
"reproducibility audit", "does the code match what I wrote"
before prepare-submission)
without computational analysis) → say so and exit
verification-engine instead/analyze-writing command
Required:
paper.tex, draft.md, or explicit $ARGUMENTS path./experiments/, ~/repos/myproject)gh repo view / WebFetch on raw files)If the repo location is not supplied, scan the paper for common signals:
code_availability sectionREPRODUCIBILITY.md, ARTIFACT.md, or similar file sibling to the paperIf still not found: ask the user once, then exit.
Scan the paper for claims that can be checked against code. Ignore claims that are purely conceptual, historical, or theoretical.
| Category | What to look for | Priority |
|---|---|---|
| Dataset | Named datasets, split sizes, sample counts, data sources | HIGH |
| Model | Model names, architectures, parameter counts, checkpoints | HIGH |
| Training | Epochs, batch size, learning rate, optimizer, hardware | HIGH |
| Metrics | Reported numbers (accuracy, F1, BLEU, loss values, percentages) | HIGH |
| Experiments | Named experimental conditions, ablations, baselines | HIGH |
| Hyperparameters | Specific values in tables or "Training Details" | MEDIUM |
| Preprocessing | Tokenization, normalization, filtering steps | MEDIUM |
| Evaluation | Test protocol, prompt templates, judge models, seeds | MEDIUM |
| Infrastructure | GPUs, training time, framework versions | LOW |
| Figures | Plots claimed to come from "our experiments" | MEDIUM |
For each claim, record:
{
id: "C01",
category: "Model",
section: "4.2 Model Training",
claim_text: "We fine-tune LLaMA-3-8B for 3 epochs with a learning rate of 2e-5.",
testable_facts: [
"model == LLaMA-3-8B",
"epochs == 3",
"learning_rate == 2e-5"
],
priority: "HIGH"
}Claims with concrete numbers, names, or identifiers are testable. Vague claims ("we use a standard transformer") are not auditable — mark them as NOT_AUDITABLE and skip.
Output: outputs/audit_claims.md — numbered list of all testable claims.
Before searching, build a lightweight mental map of the repo. Do not read every file.
Glob on **/*.{py,ipynb,yaml,yml,json,toml,sh,md}at depth 2-3
train.py, main.py, run_experiments.py, eval.py → entry pointsconfig.yaml, hparams.json, sweep.yaml, *.toml → configurationrequirements.txt, pyproject.toml, environment.yml → dependenciesREADME.md, REPRODUCE.md, docs/ → documentationresults/, outputs/, logs/, wandb/ → experiment artifactsdatasets/, data/, load_data.py → data loadersthis guides search patterns
Record this as an internal map; do not output it unless the user asks.
For each testable claim, systematically search for supporting code evidence.
Use Grep and Read — NOT an agent — for transparency. Each lookup should produce a file path and line number that can be cited in the report.
Example — Model claim "`LLaMA-3-8B, 3 epochs, lr=2e-5`":
Grep "llama-?3-?8b|Llama-3-8B" --type pyGrep "2e-?5|0.00002|learning_rate.*2e-5"Grep "epochs\s*[:=]\s*3|num_epochs.*3"Read config/*.yaml for matching valuesExample — Metric claim "`we report an F1 of 0.87`":
Grep "0\.87" --type json --type csv --type mdGrep -l "f1_score|F1" eval*.pyExample — Dataset claim "`trained on 12,000 examples from OpenReview`":
Grep "openreview" -iGrep "12000|12_000|len\(.*\).*12"For each claim, record:
{
id: "C01",
searches: ["llama-3-8b", "lr=2e-5", "epochs=3"],
hits: [
{file: "train.py", line: 42, snippet: "model_name = 'meta-llama/Llama-3-8B'"},
{file: "config/train.yaml", line: 7, snippet: "learning_rate: 2e-5"},
{file: "config/train.yaml", line: 8, snippet: "epochs: 5"} // NOTE mismatch
]
}Do not hallucinate hits. If Grep returns nothing, record an empty hits list.
| Status | Criteria | Evidence |
|---|---|---|
| CONFIRMED | Every testable fact in the claim has matching code evidence | File + line for each fact |
| PARTIAL | Some facts confirmed, others missing or unchecked | Confirmed facts listed; gaps called out |
| MISSING | No code evidence found for any fact in the claim | Which searches returned empty |
| MISMATCH | Code evidence exists but contradicts the claim | Side-by-side: paper says X, code says Y |
| NOT_AUDITABLE | Claim is too vague to check, or code is not available | Brief reason |
mark PARTIAL and explain what's missing.
in the training script" is not evidence.
prominently — these are the findings the user most needs to know.
checkable but no evidence exists (red flag). NOT_AUDITABLE means the claim itself is too vague (usually fine, but worth rewriting).
job of a separate replication step (future extension point).
Save to outputs/audit_report.md.
# Paper-vs-Code Audit Report
**Paper:** [paper title]
**Paper source:** [paper.tex | draft.md | path]
**Code repository:** [local path or URL]
**Commit / version audited:** [git SHA if available, else "working tree"]
**Date:** [YYYY-MM-DD]
**Auditor:** audit-engine (Open Academic Paper Machine v6.4)
## Summary
| Status | Count | % |
|--------|-------|---|
| CONFIRMED | [n] | [%] |
| PARTIAL | [n] | [%] |
| MISSING | [n] | [%] |
| MISMATCH | [n] | [%] |
| NOT_AUDITABLE | [n] | [%] |
**Overall signal:** [one sentence — e.g., "Core experiments check out; 2 mismatches
in reported hyperparameters need attention before submission."]
## Critical Findings
### MISMATCH — Paper and Code Disagree
#### [C03] [Section 4.2] "We train for 3 epochs with learning rate 2e-5"
- **Paper says:** epochs = 3, lr = 2e-5
- **Code says:**
- `config/train.yaml:8` → `epochs: 5`
- `config/train.yaml:7` → `learning_rate: 2e-5` ✓
- **Recommendation:** Update the paper to say 5 epochs, or re-run with 3 and
re-check the reported numbers.
[repeat for each mismatch]
### MISSING — Claim Not Supported by Code
#### [C07] [Section 5.1] "We evaluate on the held-out 10% split (1,200 examples)"
- **Paper says:** held-out split of 1,200 examples
- **Searched:** `held.out`, `test_split`, `1200`, `0\.1`
- **Result:** No split logic found in `data/loader.py`. `eval.py` loads the entire
dataset without stratification.
- **Recommendation:** Either add split logic to the repo or remove the claim from
the paper.
[repeat for each missing]
## Detailed Findings by Section
### Section 4 — Method
| # | Claim | Category | Status | Evidence |
|---|-------|----------|--------|----------|
| C01 | LLaMA-3-8B model | Model | CONFIRMED | `train.py:42` |
| C02 | 2e-5 learning rate | Training | CONFIRMED | `config/train.yaml:7` |
| C03 | 3 epochs | Training | MISMATCH | see Critical Findings |
| C04 | AdamW optimizer | Training | CONFIRMED | `train.py:88` |
### Section 5 — Experiments
| # | Claim | Category | Status | Evidence |
|---|-------|----------|--------|----------|
| C05 | F1 = 0.87 on test set | Metric | CONFIRMED | `results/test_metrics.json:12` |
| C06 | 3 random seeds | Training | PARTIAL | seeds {42,43} found in `run.sh`, third seed unclear |
| C07 | Held-out 10% split | Dataset | MISSING | see Critical Findings |
[repeat for each section]
## Not Auditable
Claims that are too vague to check or depend on external state:
| # | Claim | Reason |
|---|-------|--------|
| C12 | "A standard transformer architecture" | Vague — no specific config to check |
| C15 | "Comparable to human performance" | Depends on external human benchmark |
## Repository Map (for context)
- **Entry points:** `train.py`, `eval.py`, `run_sweep.sh`
- **Configs:** `config/train.yaml`, `config/eval.yaml`
- **Data loading:** `data/loader.py`
- **Dependencies:** `requirements.txt` (53 packages)
- **Experiment tracking:** wandb (runs in `wandb/`)
- **Results:** `results/` (JSON + CSV logs)
## Methodology Note
This audit was a **static audit**: code was read and grepped, but no experiments
were re-run. Matches indicate that the paper's claims are consistent with the code
*as written*, not that the code was verified to produce the reported numbers.
A full reproducibility check would additionally:
1. Install dependencies in a clean environment
2. Re-run training with the exact config
3. Re-run evaluation and compare numbers to the paper
See Extension Points below.
## Extension Points
- **Dynamic replication:** re-run the training/eval pipeline in a Docker container
and compare metrics to the paper (Feynman-style `/replicate`, not yet implemented
in this plugin)
- **Diff-based re-audit:** after fixing mismatches, re-run on changed claims only
- **Multi-repo audits:** audit a paper that uses code from multiple repos (e.g.,
baseline models from external sources)If the paper has many claims, process in this order and save intermediate results after each tier so the user can act early:
Tier 1 — High-stakes claims (verify first)
Tier 2 — Method details
Tier 3 — Context
After Tier 1, present a progress snapshot:
AUDIT PROGRESS
Tier 1 (High-stakes): [12/12] Complete
CONFIRMED: 9 | PARTIAL: 1 | MISSING: 1 | MISMATCH: 1
>> 1 mismatch found — see audit_report.md
Tier 2 (Method): [0/8] Queued
Tier 3 (Context): [0/4] Queued
Continue to Tier 2? [proceeding unless you redirect]train.py hard-codesanother. Always check both.
run.sh may pass --epochs 10 that overridesthe YAML. Grep shell scripts too.
Match the config to the paper, not the other way around.
.ipynb files are JSON; Grep works but read carefully.audit-engine checks own-work claims against own code. Run both before submission for full coverage.
input to a simulated reviewer.
with submissions to venues that accept reproducibility statements (e.g. NeurIPS Reproducibility Checklist, ML Reproducibility Challenge).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.