The public benchmark site is deployed only from publishing/
in this project. That folder is the complete site root (HTML, CSS, fonts,
media) and is the single source of truth for what is public. It is gitignored
here only because it is media-heavy (~34 MB); treat it as published content.
Deploy (Cloudflare Pages, project marb, production branch production):
npx wrangler pages deploy publishing --project-name=marb --branch=production --commit-dirty=trueCustom domain marb.cadclaw.io is bound to the marb project. Note the
production branch name differs per project: marb uses production, the
cadclaw project uses main — deploying cadclaw with --branch=production
silently lands a preview.
The old MARB mirror at cadclaw.io/benchmark/* is retired: those paths now
301-redirect to marb.cadclaw.io (see Publications/sites/cadclaw.io/docs/_redirects).
Rules:
- Nothing goes into
publishing/before the pre-publication pass: professionalism, brevity, and the security sweep (no equipment names, hostnames, IPs, local paths, or personal emails —info@sunn3d.comonly). - Drafts and internal notes live in
../MARB-private/, never here. - Figures are built in
results/figures/bygrader/build_*.pyand copied intopublishing/media/— keep both in sync when regenerating.
Answer keys are the one asset class that must never appear in this repo's
history. Canonical key storage lives in the private companion repo; the
gitignored tasks/**/ key paths in this working tree are disposable synced
copies that exist only so the graders' default paths resolve.
Every new task key (task 2 and onward) is born gated:
- Author privately. Create the key in the private companion repo's
keys/<task>/and commit it there. It never touches this working tree except through the sync script, which refuses any destination this repo does not gitignore. - Upload straight to the gated HF dataset (a new revision of
SunnydayTech/marb-m3-crete-answer-key, or the task's own gated dataset), uploading from the private storage — not from a checkout of this repo. - Publish only the hash. Add the key files' sha256 digests (and byte
sizes) to
tasks/<task>/ANSWER_KEY.mdhere. That is the entire public footprint of a key: third parties can verify the graders ran against the canonical revision without ever seeing it. - Revisions repeat the loop. New key revision → new private commit → new gated-dataset revision → updated hashes in the same public commit. Never edit a key in place silently.
Enforcement (all three fire on the same patterns —
scripts/check_no_answer_keys.sh is the single source of truth):
.gitignoreblocks the key paths, including generalized*reference*patterns for future tasks;- the pre-push hook (
scripts/hooks/pre-push, install withcp scripts/hooks/pre-push .git/hooks/pre-push) rejects any push whose commits touch a key path, even a forcedgit add -f; - the
key-guardGitHub Actions workflow re-runs the same check server-side on every push and PR, so an uninstalled hook is not a bypass.