docs(audit): reproducibility audit of the Alpöge–Fable Jacobian counterexample package - #2527
Conversation
…erexample package
Read-only audit of POWERFULMOVES/Pmoves-3bmalpoge-fable-jacobian-counterexample
@ 645eb48b, a frozen verification package for a claimed counterexample to
the Jacobian Conjecture in dimension 3.
SCOPE, stated at the top of the document and repeated here: this
establishes REPRODUCIBILITY ONLY. It says nothing about whether the
counterexample is mathematically correct — that is expert peer review,
not a CI run. The three manifests are UNKEYED sha256: they prove you hold
the author's bytes, not that the author vouched for them. A content hash
names which bytes; only a signature names whose.
Q1 — does it reproduce? Partly.
- the six checks: PASS, exit 0, ~10s containerised, all six
- the integrity manifests: FAIL, exit 1
The manifest failure is real, upstream's, and three weeks old.
README.md was edited in e33ba19 after the manifests were generated in
04d0115 and neither was regenerated. 34/35 and 51/52 entries pass; the
one mismatch is the README.
The authors' own CI corroborates it: green at 04aa29c3, red at e33ba199
("Update README.md"), red at HEAD. The failing step is "Verify original
frozen files" — and because it fails, the step that runs the six checks
is SKIPPED. Upstream CI has not executed the mathematics since
2026-07-20, masked by a stale hash of a README.
Determinism: three runs, byte-identical stdout modulo the timing line.
The six checks import sympy and nothing else — no RNG, clock, env, file
I/O, subprocess, or network, and no floating point anywhere.
Offline: proven under `docker run --network none`, not inferred.
Unpinned transitive dep: sympy==1.14.0 is pinned, mpmath is not (resolves
1.3.0). No hash-pinned lockfile, so the dependency install is the only
step with no integrity check at all.
Two portability defects found, neither affecting the mathematics:
- check_6_galois.py prints U+2229; on a cp1252 Windows console this
raises UnicodeEncodeError AFTER its assertions pass, so the runner
reports a failure that is not one. Ubuntu-only CI would never see it.
- no .gitattributes, so a default Windows checkout CRLF-converts every
text file and the manifests fail on all 35/52 entries instead of the
one real mismatch. Cost me a clone to isolate.
Q2 — Danger Room fixture? Adopt, as a PAIR, scoped repro-only.
Deterministic, offline, no GPU, runs under --memory=256m, ~10s against
a wall_s:120 budget, and unusually: 92 content-hashed artifacts, so a
skill.verified.v1 receipt can name which bytes were verified.
But as shipped it is pure happy path, and the handoff is explicit that
"a fixture that plants nothing verifies nothing" — acceptance (5), the
criterion its author says he would cut last. So I tested convertibility
rather than asserting it: perturbing one coefficient (F3's 2*x -> 3*x)
makes check 1 fail loudly with exit 1, AND the manifest independently
flags the tampered file. Two independent negative controls.
Recommend jacobian-counterexample-repro (expect 0) plus
jacobian-counterexample-mutant (expect 1), pinned to 645eb48b,
nodes:[any] — it is a CPU-floor fixture, wasted as SPARK-only, and must
never be read as an inference fixture.
Six findings tabled, 1-5 upstream's. Not reported upstream per the
read-only boundary on this task; findings 1 and 2 are the ones worth
telling the authors about, and that is the operator's call.
License MIT, clean for PMOVES use.
Anchor ratchet: 435 findings, 435 baselined, 0 new — after it correctly
caught this doc citing the counterexample repo's make targets as if they
were PMOVES's. Rewritten to name the underlying commands, which is also
what actually ran.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 27 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 82d224b7cb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ceptance (2), not (5) Two review findings, both valid, both places where the summary said more than the body supported. The scope paragraph claimed the audit establishes "that the files present hash to the values the authors published" -- immediately contradicted by the audit's own headline integrity finding two sections later. README.md reproduces in NEITHER repository manifest (34 of 35, 51 of 52, that one file the single mismatch in each); only the frozen referee package verifies clean. The paragraph most readers carry away now says so, and separates the two halves: the checks reproduce, two of the three integrity manifests do not. The fixture recommendation labelled the planted-mutant variant as "the acceptance-(5) half". It is acceptance (2). The handoff distinguishes them precisely: (2) is "at least one fixture plants a falsifiable failure"; (5) is "A deliberately broken SKILL fails ... show me a red artifact". Mutating the workload proves the packaged assertion detects that mutation. Breaking the skill proves the harness can say no. A skill that ignored this fixture entirely, or misclassified its exit code, would pass the clean/mutant pair while failing exactly the property (5) exists to establish -- so the pair must not be recorded as discharging it. Neither change touches the scope statement that matters: this remains a reproducibility audit that says nothing about mathematical correctness, and the manifests remain unkeyed sha256 that name which bytes, not whose. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Joins the existing audit lane (#2522 ruleset exposure, #2525 CI enforcement, #2527 reproducibility) rather than opening a new one. Six checks on B850 reported a confident result that did not match reality — a 0-byte exporter behind 200 OK, a launcher that WARNed and exec'd anyway, a submodule audit measuring branch NAME instead of membership, a dmesg evicted by a failing USB keyboard, a health checker that printed 'Health: 0.0%' for a bus it never contacted, and this auditor reading an AttributeError as an ImportError and writing it into a Makefile comment as fact. Two shapes needing different remedies: three are mechanizable (a surface returning success while the payload is absent/stale/malformed — assert content, not status), three are not (a wrong question, unrelated noise destroying evidence, a misread). Deliberately does NOT restate the verification discipline. .claude/agents/verifier.md already specifies it — 'evidence before assertions ... capture verbatim ... state UNVERIFIED (environment) rather than approximating' — and predates this session. The documented gap is INVOCATION: that agent was invoked zero times during a session in which it would have caught finding #6 immediately. Records the mechanical traps, which are the genuinely new material: $() strips trailing newlines (bit four times in one evening), nats-py connect_timeout does not bound DNS, % and ${} in a systemd ExecStart are expanded by systemd, submodule branch name != membership and recorded gitlink != working tree. Notes that #2525's merge-gate finding has already been repaired (pytest_ratchet runs all 264 test files; the gate exit 1s) — verified before relying on it for merges. The audit lane is driving fixes ahead of its own PRs merging, which argues for landing it. Proposes the #2527 package as a calibration fixture: #2525 had to hand-roll a deliberately failing test to prove a check COULD fail; a frozen, hash-manifested, network-isolated package with six deterministic checks of known outcome is the standing form of that — a target whose answer is known, which every instrument in the table lacked. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… wrong — plus the four silent handlers they led to (#2572) * docs(audit): six instruments that reported confidently and were wrong Joins the existing audit lane (#2522 ruleset exposure, #2525 CI enforcement, #2527 reproducibility) rather than opening a new one. Six checks on B850 reported a confident result that did not match reality — a 0-byte exporter behind 200 OK, a launcher that WARNed and exec'd anyway, a submodule audit measuring branch NAME instead of membership, a dmesg evicted by a failing USB keyboard, a health checker that printed 'Health: 0.0%' for a bus it never contacted, and this auditor reading an AttributeError as an ImportError and writing it into a Makefile comment as fact. Two shapes needing different remedies: three are mechanizable (a surface returning success while the payload is absent/stale/malformed — assert content, not status), three are not (a wrong question, unrelated noise destroying evidence, a misread). Deliberately does NOT restate the verification discipline. .claude/agents/verifier.md already specifies it — 'evidence before assertions ... capture verbatim ... state UNVERIFIED (environment) rather than approximating' — and predates this session. The documented gap is INVOCATION: that agent was invoked zero times during a session in which it would have caught finding #6 immediately. Records the mechanical traps, which are the genuinely new material: $() strips trailing newlines (bit four times in one evening), nats-py connect_timeout does not bound DNS, % and ${} in a systemd ExecStart are expanded by systemd, submodule branch name != membership and recorded gitlink != working tree. Notes that #2525's merge-gate finding has already been repaired (pytest_ratchet runs all 264 test files; the gate exit 1s) — verified before relying on it for merges. The audit lane is driving fixes ahead of its own PRs merging, which argues for landing it. Proposes the #2527 package as a calibration fixture: #2525 had to hand-roll a deliberately failing test to prove a check COULD fail; a frozen, hash-manifested, network-isolated package with six deterministic checks of known outcome is the standing form of that — a target whose answer is known, which every instrument in the table lacked. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix(instruments): four silent handlers that reported success outward An AST sweep for finding #7's cause (soft-import + broad except returning a plausible default) hit 157 sites. That number is itself the finding: torch, faiss, sentence_transformers, numpy, tqdm, rich and psutil guards are all CORRECT — the feature degrades and the caller is told. Narrowing to handlers that are silent (no log, no raise, no warn) gave 60; to those in a path that reports outward, 4. The antipattern is not "a broad except on an import". It is a silent handler in a path that reports outward. Fixed (logging only — no behaviour or contract change, best-effort delivery stays best-effort): sign_trail.py:77 substituted the whole agent identity in silence; now warns to stderr naming the reason. It already warned about a missing ALTER twenty lines below — it could report a missing persona but not a missing person. geometry.py:166,583 dropped every live subscriber and returned {"ok": true}. Eight lines up, the persist logs and raises HTTPException(500). Two disciplines, one function. hf-mcp-server:853 hf.model.gguf.converted.v1 never published while the caller was told everything worked. Left alone deliberately, as counterexamples of correct degradation: hf-mcp-server:542 stamps "source":"catalog" vs "registry" chit_security.py:13 sets an explicit _CRYPTO_OK = False common/__init__.py:41 optional exports fail loudly at the call site Verified: pmoves/tests/test_sign_trail.py 2 passed; unregistered agent-id now warns, registered b850-claude still resolves to glyph U+232C / #DC2626 with no warning; detector re-run shows only the two correct sites remaining. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(geometry-bus-health): report the actual failure, and stop lying in JSON Running the merged checker on B850 for the first time exposed two gaps in the NOT MEASURED work itself: 1. The JSON branch still emitted "health_pct": 0.0 when the bus was never contacted. The human-readable branch had been fixed to refuse an unmeasured percentage; any dashboard consuming --json kept receiving the exact false negative. Now null, with an explicit "measured" flag. Fixed the instance, not the class — the same error this audit documents. 2. The failure report offered a list of GUESSES and no facts. The real cause was 'Authorization Violation' (the server requires credentials; this tool deliberately ships no credential-bearing default), but nats-py surfaces that through error_cb and keeps retrying, so the only exception reaching the caller was TimeoutError. The report therefore said "timed out" — reading as a network fault and sending the operator to check host and port, which were both already correct. An error_cb now captures what the server actually said, and the report leads with it before any guesses. Verified: no creds -> measured=False, health_pct=null, error="timed out after 5s connecting to nats://localhost:4222 — last server error: Error: nats: 'Authorization Violation'" connected -> health_pct=4.2, error=null, no NOT MEASURED banner (synthetic BusHealth; success path formatting unchanged) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * docs(audit): postscript — the fix for #5 was confidently wrong on first contact Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Read-only audit of
Pmoves-3bmalpoge-fable-jacobian-counterexample@645eb48b— a frozen verification package for a claimed counterexample to the Jacobian Conjecture in dimension 3.Doc:
pmoves/docs/audit/JACOBIAN_COUNTEREXAMPLE_REPRO_AUDIT_2026-08-10.mdScope — please read this before the results
This establishes reproducibility only. It says nothing about whether the counterexample is mathematically correct. The Jacobian Conjecture is a famous open problem; settling a dimension-3 counterexample is expert peer review, not a CI run.
assert d == -2passing proves SymPy expanded a determinant to-2— not that the surrounding argument establishes what the paper says.The three manifests are unkeyed SHA-256. They prove you hold the author's bytes, not that the author vouched for them. A content hash names which bytes; only a signature names whose. This is stated at the top of the document too, deliberately — it's the same overstatement Codex caught on #2518.
No pushes to the fork, no issues opened upstream. Clones and API reads only.
Q1 — Does it reproduce? Partly.
scripts/run_all_checks.py)sha256sum -c frozen/referee_package-2026-07-20.sha256sha256sum -c MANIFEST.sha256sha256sum -c REPOSITORY_MANIFEST.sha256The checks reproduce; the integrity manifests do not. One stale entry, and it isn't a check:
README.mdwas edited ine33ba19after the manifests were generated in04d0115, and neither was regenerated.The consequence is bigger than the cause. The authors' own CI corroborates it — green at
04aa29c3, red ate33ba199("Update README.md"), red at HEAD. The failing step isVerify original frozen files, and because it fails, the step that runs the six checks is skipped:The run in this document may be the most recent successful execution of those checks anywhere.
Not a fork artifact: fork HEAD and upstream HEAD are the same commit, zero divergence.
Determinism, offline, dependencies
sympyand nothing else: no RNG, clock, env, file I/O, subprocess, network, and no floating point anywhere.docker run --network none, not inferred.sympy==1.14.0is pinned;mpmathis not (resolves1.3.0). No hash-pinned lockfile, so the dependency install is the only step in the pipeline with no integrity check at all.Two portability defects, neither mathematical
check_6_galois.pyprints∩(U+2229). On a cp1252 Windows console that raisesUnicodeEncodeErrorafter the check's assertions have passed — so the runner reports a failure that isn't one.PYTHONIOENCODING=utf-8makes the identical run exit 0. Ubuntu-only CI would never see it..gitattributes. A default Windows checkout CRLF-converts every text file, so the manifests fail on all 35/52 entries instead of the one real mismatch. This cost me a second clone to isolate — and it's why the first integrity result I got was wrong.Q2 — Danger Room fixture? Adopt, as a pair.
Against
SKILL_DANGER_ROOM_VERIFICATION_SPARK_2026-08-08.md: deterministic ✅, offline ✅, no GPU ✅ (completes under--memory=256m), ~10 s against awall_s: 120budget ✅, addressable ✅. Signed ❌ (unkeyed hashes, would need a CHIT wrapper).The unusual part is 92 content-hashed artifacts, so a
skill.verified.v1receipt can name which bytes were verified — the T3 property the handoff describes, available without building anything.But as shipped it's pure happy path, and the handoff is explicit: "a fixture that plants nothing verifies nothing" — acceptance criterion (5), the one its author says he'd cut last. So I tested convertibility rather than asserting it. Perturbing one coefficient (
F3's2*x→3*x):and the manifest catches the same mutation independently:
Two independent negative controls — semantic and structural. Few fixtures offer either.
Recommend
jacobian-counterexample-repro(expect 0) plusjacobian-counterexample-mutant(expect 1), pinned to645eb48b,nodes: [any]— a CPU-floor fixture, wasted as SPARK-only, and never to be read as an inference fixture. The-reprosuffix does load-bearing work: a receipt readingjacobian-counterexample: passwill be misread as a mathematical claim.Findings
Six tabled; 1–5 are upstream's and were not reported there per the read-only boundary. Findings 1 and 2 are the ones worth telling the authors — their pipeline has silently not been running their own checks. That's an operator call.
License MIT, clean for PMOVES use.
Gate
python pmoves/tools/validate_command_anchors.py→ 435 findings, 435 baselined, 0 new.Worth noting it earned its keep here: it caught this doc citing the counterexample repo's make targets (
make verify,make integrity) as if they were PMOVES's — which a reader could have copied and run in the wrong repo. Rewritten to name the underlying commands, which is also what actually ran.🤖 Generated with Claude Code