Skip to content

Competitive claim publication contract (Phase 1)

Status: NOT_READY. This document specifies a future publication boundary; it does not add a current benchmark result or a README claim. No production campaign, dataset, ground-truth artifact, or scorer is opened by the publisher.

Contract

configs/slam_benchmark_profiles/competitive_claim_publication_v1.schema.json describes a deterministic publication request. It binds a profile, the scored-evidence document, a v2 suite receipt, an execution-selection receipt, a fresh-holdout authorization document, and one canonical evidence-bundle root/manifest. The publisher reruns evaluate_evidence_v2(..., require_bundle=True) over the sealed scored evidence, then compares the supplied suite receipt with the complete recomputed result and its profile/file/evidence SHA identity. A status or metric edited in the supplied receipt cannot override that result. The scope is derived from the profile and evaluated evidence, then the declared scope is required to match its canonical SHA. It contains the complete system/dataset list, pinned revisions, at least three runs per system/dataset, metrics, thresholds, and a fixed 95% confidence-interval method/seed.

The publisher in scripts/publish_competitive_claim.py reopens every declared document and calls the existing v2 evaluator plus execution-selection, fresh-holdout, rival source-closure, dataset source-closure, and evidence-bundle verifiers. It rejects a status-only receipt, report-only or synthetic receipt, missing or expired authorization, failed closure, changed bytes, invalid bundle manifest, noncanonical revision identity, and any partial or duplicate system/dataset/run binding. It also requires the recomputed suite checks for completion, RTF, RSS, map quality, aggregate APE improvement of at least 10%, and positive fixed-seed 95% bootstrap superiority for every rival.

The sealed failure projection is the canonical concatenation of evaluator errors/failed checks and every event in the authorization failure_log (complete: true is mandatory). The bundle must expose exactly one reopened global failure artifact. For a claim, that artifact is not an opaque file: its bytes must be canonical UTF-8 JSON {"schema_version":1,"failure_log":<exact authorization failure_log>} with sorted keys, compact separators, and one trailing newline. Duplicate JSON keys, non-JSON bytes, extra fields, event/hash-only substitutes, and a different event list are rejected. The publisher reopens the file, checks regular-file/size/SHA identity through the bundle verifier, and compares its parsed content to the authorization mapping before rendering; the artifact SHA and every failure event are included in the receipt and Markdown. The composer enforces the same producer contract whenever claim composition is requested. Candidate/NOT_READY bundles may remain opaque, but they cannot cross the claim publication boundary.

The renderer emits only a deterministic claim.md fragment and a publication_receipt.json into a new output directory. It never writes README.md, invokes a scorer, starts a process, or follows a GT path. The output is staged beside the requested root and atomically renamed; an existing root is never overwritten. The renderer reads aggregate APE (ours/best rival, improvement), 95% CI bounds, completion, maximum RTF, RSS ratio/limit, and map gate only from the recomputed result and emits them deterministically. The rendered sentence explicitly says the result is lower than the pinned best rival only within the fixed scope and is not a universal/all-datasets claim. receipt binds the rendered Markdown, scope, all input hashes, the complete recomputed failure ledger, caveats, and reproduction command. The receipt identity deliberately excludes only its own identity and rendered Markdown hash to avoid a circular hash; the rendered hash is checked separately.

Current gate state

The authoritative competitive profile remains NOT_READY because its fresh holdout authorization, dataset source closure, and rival source closure are not all claim-ready. A real request made from that profile must therefore fail closed and produce no publication root. Synthetic positive fixtures in graph_based_slam/test/test_publish_competitive_claim.py monkeypatch the verifier calls only to exercise deterministic formatting, full coverage, tamper rejection, authorization rejection, and atomic/no-overwrite behavior; they are not evidence and cannot satisfy the production gate.

Phase 2 README publication guard

The dedicated marker in README.md is now guarded by scripts/verify_competitive_claim_readme.py and the configuration/schema pair configs/slam_benchmark_profiles/competitive_claim_readme_publication_v1.{json,schema.json}. The current configuration is deliberately NOT_READY: the marker is empty, the publisher is not invoked, and no claim text can be generated from the current profile. The guard still reopens the README, validates the immutable legacy paragraph identities and hashes, and rejects new comprehensive, universal, or all-dataset superiority wording outside the marker. Existing scoped comparison paragraphs are allowlisted by stable ID, exact heading, and paragraph SHA, so unrelated paragraphs may be inserted above them without changing their identity. A changed paragraph, duplicate identity, or newly added allowlist entry is rejected; revision 1 requires a versioned guard migration for any intentional baseline change. Revision 2 (2026-10-19) is such a migration: the HILTI exp04 summary and table were re-measured on one 4-vCPU VM against a native build of the same pinned GLIM revision, and only those two entries' hashes, the revision constant and the configuration self-hash changed; the entry IDs, the Voxel-SLAM entry and the forbidden patterns are unchanged.

When a future reviewed configuration becomes READY, the guard must reopen the publication spec and sealed root, invoke the Phase 1 publisher into a new temporary root, and compare the generated Markdown and receipt identities with the sealed receipt and marker bytes. It rejects symlinks, traversal, duplicate or nested markers, tampered configuration, manual marker edits, incomplete receipts, publisher failure, and any mismatch. The CI docs-and-release job runs this read-only guard without network, dataset, GT, or scorer access.

Synthetic adversarial coverage is in graph_based_slam/test/test_verify_competitive_claim_readme.py; it does not create or upgrade a production claim. The current gate remains PASS for the guard and claim_eligible: false / publication_status: NOT_READY.