Skip to content

Add sourced open-problem database layer - #4

Open
anirudhabspk wants to merge 2 commits into
codex/200-unique-conjecturesfrom
feat/problem-database
Open

Add sourced open-problem database layer#4
anirudhabspk wants to merge 2 commits into
codex/200-unique-conjecturesfrom
feat/problem-database

Conversation

@anirudhabspk

Copy link
Copy Markdown

Base branch

This targets codex/200-unique-conjectures so the diff stays clean. It is meant to merge after #3 lands.

What this adds

A database/ layer that collects open problems from published upstream collections at volume, categorises them, and marks the subset a script can decide. Two layers in one record format: every row is reference material, and benchmark.eligible plus benchmark.verifier separate rows a verifier settles from rows a finite object merely could settle.

This is deliberately looser than tasks/catalog.json and never feeds it. Catalog admission still requires the gates in docs/collection_policy.md.

Contents

Source Maintainers Records Scorable Verifier
La Jolla Covering Repository D. M. Gordon 250 250 poly
Bounds on linear codes (codetables.de) M. Grassl, A. E. Brouwer 250 250 exhaustive-exp
Erdős problems T. Bloom, T. Tao, contributors 43 0 none yet

543 records, 500 with a tested verifier. All rows are unsolved problems.

One verifier per class

A class is a family sharing one witness shape, so one verifier serves all of it. Adding rows adds no verifier work, which is what makes the benchmark layer scale. Validation rejects a class whose records disagree about their verifier.

The two classes stress different ends of the design: covering designs take a set of blocks and check in polynomial time; linear codes take a generator matrix and enumerate all 2^k codewords, which is why verifier_complexity exists.

Credit is a gate

Every source names its maintainers, records how they ask to be cited, and carries forward the caveats they state about their own data. Validation fails if any of it is missing, and docs/database.md is generated from it. The codetables cell pages credit Brouwer's earlier tables, so that upstream-of-upstream is credited too.

Evidence and auditing

Each row stores evidence.url and evidence.quote, verbatim text at that URL supporting the status claim, normalised by stripping tags and collapsing whitespace. scripts/audit_database.py re-fetches and looks for the quote; a row whose quote is absent from its own cited page does not match its source.

That gate caught a real defect during development. The Erdős rows quoted the crowdsourced YAML while citing erdosproblems.com, so nothing was verifiable at the address the row named. They now cite the authoritative problem page and quote the status banner printed on it, and the builder drops any row the site does not confirm. All 43 agreed on the last run.

Current audit: 543/543 quotes found.

Testing

Verifiers are tested against witnesses whose correct answer is already known, since no counterexample can be invented for an open problem:

  • covering designs use the record coverings published by the source, which must be accepted as valid coverings and rejected as improvements on their own record, and must fail coverage when a block is dropped;
  • linear codes use classical constructions whose minimum distance is a theorem, the [2^m-1, m, 2^(m-1)] simplex codes and the [n, 1, n] repetition codes.

Accept paths are exercised by relaxing the target, not by solving anything. VerifierContractTest discovers any future class verifier and requires it to reject junk rather than raise.

29 tests.

Offline re-derivation

Validation recomputes bounds rather than trusting the scrape: the Schonheim bound for every covering row, the Singleton bound for every code row. Codetables rows are additionally cross-checked against their own cell page at build time; 250/250 matched.

Scaling

Row counts are capped by constants at the top of each builder, not by the filters. Upstream has several thousand open cells per source. Fetches are cached under .cache/ and rate limited, so reruns are free and a crash resumes cheaply. Test fixtures are sampled rather than kept per row, so the committed diff stays reviewable as rows grow.

Known limits

  • The 43 Erdős rows have no verifier. Each needs a bespoke predicate read off its own statement, and they are recorded as eligible-but-unimplemented rather than implying coverage that does not exist.
  • Nothing here establishes that a problem is genuinely open. It records who says so, and where.
  • Whether a model can beat any of these records is unmeasured. A baseline run on a sample is the next step.

Validation

python3 scripts/validate_database.py --check
python3 -m unittest discover -s tests
python3 scripts/audit_database.py --sample 25 --no-cache   # needs network

CI runs the first two. The builder and the auditor need network and are run by hand.

claude added 2 commits July 23, 2026 14:05
Collects open problems from published upstream collections at volume, and
marks the subset a script can decide. Two layers in one record format:
every row is reference material, and `benchmark.eligible` plus
`benchmark.verifier` separate rows a verifier settles from rows that merely
could be settled by a finite object.

Smoke scale, two sources chosen to stress opposite ends of the format:

- La Jolla Covering Repository: 20 open cells, one class verifier, poly-time.
- Erdos problems database: 20 finite-witness problems, no verifier, using the
  upstream project's own falsifiable/verifiable/decidable classification.

Attribution is a gate rather than a courtesy. A source that does not name its
maintainers, record how they ask to be cited, and carry forward their stated
caveats fails validation, and docs/database.md is generated from that data.

Verifier tests use the coverings published by the source as planted
witnesses: each must be accepted as a valid covering and rejected as an
improvement on its own record, and must fail coverage when a block is dropped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Second pass over the database layer, to shake out what twenty rows per source
could not. 543 records across three sources, 500 with a tested verifier.

Adds a second verifier class. Binary linear codes from codetables.de use a
different witness (a generator matrix), a different predicate (minimum
Hamming weight), and the first non-polynomial verifier, which is what the
verifier_complexity field was for. Its fixtures are classical codes whose
minimum distance is a theorem, so a wrong verifier fails rather than quietly
agreeing with a scraped number.

Adds scripts/audit_database.py, which re-fetches every evidence URL and checks
the recorded quote is still on the page. This is the gate against invented
rows once sourcing is fanned out.

It earned its place immediately. The Erdos rows quoted the crowdsourced YAML
while citing the website, so no quote was findable at the URL it named and the
audit failed all of them. Those rows now cite the authoritative problem page
and quote the status banner printed on it, and the builder drops any row the
site does not confirm. All 43 agreed on this run.

Other changes from scaling:

- fetches are cached under .cache/ and rate limited, so reruns are free and a
  crash resumes cheaply;
- record coverings are now sampled two per (k, t) shape rather than kept for
  every row, so committed fixtures stay reviewable as rows grow;
- codetables rows are cross-checked against their own cell page before being
  written, and validated against the Singleton bound offline;
- VerifierContractTest discovers any future class verifier and requires it to
  reject junk rather than raise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants