Stage 14 generation convergence

Documentation index · Forward/reverse projection API · AI-agent and 1080p gaming follow-on · WebAssembly quick start · Stage 13 implementation ledger · Stage 15 GPU benchmark ledger · Release runbook

Purpose and boundary

Stage 14 begins with the post-v13 projection-runtime work on 2026-08-09. Its first development objective is a stable, headless forward/reverse projection API for native C++ and JavaScript consumers. Stage 14 does not alter the geometry command-buffer protocol: runtime API 3 deliberately retains geometry ABI 1 so existing render consumers remain compatible.

This document is the Stage 14 working plan and implementation ledger. It will record changes as they land, the evidence used to verify them, and the remaining release gates. A checked item means its scoped implementation is in the working tree; it does not by itself mean that the eventual v14 release has been built or published.

Plan

Change ledger

2026-08-09 — projection runtime API 2

Status: implemented and focused checks passing.

Native runtime changes:

JavaScript-consumer changes:

Documentation changes:

Build compatibility changes:

2026-08-10 — Cahill–Keyes reverse support

Status: implemented; focused verification passing.

The polar longitude returned for a qualified cell is deliberately the center of that octant. Latitude and residual remain authoritative at the pole; longitude is a stable representative because every meridian converges there.

2026-08-10 — current Star-X cap specification

Status: implemented; focused native and visual verification passing.

Natural Earth remains a source of physical feature geometry for Earth and water plates. It no longer chooses any Star-X cutoff or placement parameter.

2026-08-10 — complete all-family reverse, runtime API 3

Status: implemented; native, Node, worker, D3, and browser checks passing.

The inverse implementation is family-specific rather than one generic numerical guess. Every candidate is forced through its selected forward transform and rejected when its pixel residual exceeds the caller’s tolerance.

The Stage 14 API and its checks are designed to run without a display, interactive prompts, network access, credentials, publication, or external side effects. The operator authorized this completion run to perform focused, sanitizer, browser, and repository-wide local verification without another prompt. That authorization does not publish a release, upload assets, or alter an external service.

Visual hierarchy and opacity

Stage 14 applies a common rule to dense resource and temperature data: keep the base geography legible by limiting the observed field to 60% opacity, and double the primary plate title without changing its wording or evidence metadata.

The source profiles, native defaults, generator assertions, and focused tests now agree on data_graphic_opacity = 0.60 for all resource plates and the 2025/2026 Anthropocene temperature fields. Bathymetry art passes retain their separately documented 30% opacity because their filled curve fields follow a different visual system. Immutable v12 and v13 assets are not rewritten; the 60% rule applies to newly generated Stage 14 output.

Verification ledger

Check Scope Current result
make check-forward-reverse-projection-api Native API, 1,560 Cahill–Keyes zone samples plus seams/poles, all 24 AuthaGraph sectors and four singular vertices plus a global lattice, all 23 Dymaxion faces/subfaces plus a global lattice and edge cut, all 30,720 Myriahedral face centers, all 20 Voronoi face centers, Star-X carrier/cap/cut/overlap/pole behavior, three additional frame scales, batches, outside states, and invalid qualifiers Passed 2026-08-10 for all six families
Native projection-runtime regression Geometry ABI 1 and runtime API 3 coexistence Passed 2026-08-10
make wasm-projections Rebuild bindings and browser distribution Passed 2026-08-10 with Emscripten warnings treated as errors
make check-wasm-projections Node API 3, immutable component metadata, all-family single/batch reverse, typed arrays, Star-X cap/pole/component behavior, and D3 candidates Passed 2026-08-10
make check-wasm-projections-browser Headless Chrome API 3 plus main-thread and module-worker reverse, including the Star-X cap Passed 2026-08-10; its temporary server was restricted to loopback
make check-wasm-cahill-keyes check-wasm-cahill-myriahedral Legacy compatibility modules after canonical Izzi include migration Passed 2026-08-10
Focused UBSan/ASan builds Complete all-family projection-neutral reverse campaign; UBSan at -O2, ASan at -O1 Passed 2026-08-10; leak detection was disabled only because LeakSanitizer cannot run under the executor’s ptrace boundary
Static syntax and git diff --check Module syntax and patch hygiene Passed 2026-08-10
Resource and temperature generator tests 60% observed fields, 2× titles, metadata, and profile validation Passed 2026-08-09
Resource checksum manifest Source-profile digest after the 60% change and all pinned resource payloads Passed 2026-08-09
make check-print-contract Canonical SVG/PDF geometry, 44-inch-leading-edge print products, A0 placement, and authoritative 3840-pixel parents Passed 2026-08-10
make audit-dymaxion-ulp 1,883 edge/vertex/subface/tie/clamp probes and 92 frame-scale boundaries Passed 2026-08-10 with no unclassified gap and no production tolerance change indicated
make check-projection-fixtures 31,008 implementation-neutral cases consumed by native, WebAssembly, Node, and dependency-free Python readers Passed 2026-08-10
make check-reverse-oracles 2,108 independently produced Voronoi, Dymaxion, and Myriahedral cases Passed 2026-08-10 with four retained, classified upstream Dymaxion registration exclusions
make check-artifact-selection Deterministic request/receipt schemas, fallback boundaries, golden decision, browser, Node, and independent Python agreement Passed 2026-08-10
make check-screen-1080p 205 standard PNG/WebP records, 1,025 referenced files, hashes, no-crop transforms, geographic picks, worker cancellation, and offline Three.js r185 Passed 2026-08-10
tests/test-star-x-projection-api plus regenerated graticule/Earth Fixed cutoff/bearing, projection-only registration (including a no-Natural-Earth smoke run), proportional lower clearance, complete in-frame boundary, topmost land composition, and visual unclipping Passed 2026-08-10
Repository-wide make check Full projection, generator, data-integrity, authorization, resources, atmosphere, astronomy, network, bathymetry, slicing, runtime, print, fixtures, oracle, selection, and screen gate Passed 2026-08-10 after replacing two stale pre-Izzi bathymetry curve include names with their canonical Izzi headers
make assets-resilient Standard graph plus locally authorized JAXA cloud-atmosphere products Passed 2026-08-10: 1,320 files, approximately 3.2 GB, no zero-byte files
Projection contact-sheet and focused plate review Six complete standard-projection grids; Star-X water/Antarctica/graticule; network sites/swarm; temperature/resources; six authorized atmosphere plates Passed operator-style visual inspection 2026-08-10; independent collaborator review remains UNAVAILABLE

Expanded Stage 14 completion criteria

The original all-family reverse scope passed the full repository gate and was published as the source-only v20260810 release. The expanded post-release Stage 14 scope is ready to freeze only when:

  1. every advertised reverse capability passes native and WebAssembly checks;
  2. every current registered family remains mechanically reversible, with candidate/component ambiguity explicit rather than silently collapsed;
  3. all generated projection/pass manifests agree with the documented standard, optional, and exploration-only classifications;
  4. the full repository check passes at the authorized release gate;
  5. any independently authorized generated-assets deposit has a projection-organized archive, S3 browser tree, PNG previews, viewer, completion marker, and download verification that agree on one immutable inventory; and
  6. any such UCB AAO deposit produces the canonical Devastation Pacific Active Archive check-in report through the shared headless archive workflow.

Current release state and remaining gates

The all-family reverse implementation is complete. The Stage 14 source is released on GitHub independently of generated-asset preservation. A later v14 UCB AAO deposit is not part of that source release: it requires its own frozen generated manifest, reviewed profile, human invocation of make release-ucb-aao-s3, immutable inventory verification, and canonical Active Archive check-in record. make release-github cannot reach that target.

The numerical-evidence and consumer-contract additions described below are later Stage 14 work and are not claims retroactively attached to the v20260810 source release. Focused checks accompany each addition. The operator authorized the expanded repository-wide gate on 2026-08-10; its result is recorded separately so it cannot be confused with the earlier source-release evidence.

Expanded Stage 14 staging results

GPU-specific products and performance measurements are intentionally excluded from this plan. Stage 14 will freeze the authoritative inputs and portable consumer baseline; Stage 15 will benchmark GPU products from that baseline.

Stage Result Exit evidence
14A — baseline and print contract Implemented contracts/print-products-v1.json plus make check-print-contract preserve canonical SVG/PDF geometry, exact-ratio 44-inch-leading-edge products, A0 placement, and authoritative 3840-pixel parents
14B — numerical closure Implemented; no production tolerance change indicated make audit-dymaxion-ulp classifies 1,883 boundary probes with no gaps and checks 92 frame-scale boundaries
14C — neutral projection fixtures Implemented make check-projection-fixtures verifies 31,008 cases in native C++, WebAssembly, and a dependency-free Python reader
14D — cross-implementation oracle Implemented for the declared first evidence tier make check-reverse-oracles verifies 2,108 Voronoi, Dymaxion, and Myriahedral cases while retaining four classified upstream Dymaxion registration exclusions
14E — agent selection protocol Implemented Node, browser, and independent Python consumers agree on the golden artifact and decision-core SHA-256 9c915fe5fa80dcb4d37c2bfa597277d57753f84d6a33fbe189f65d6b1a82a978
14F — consumer promotion Implemented and locally reviewed The checked manifest names 205 standard products, 31 pass IDs, 11 layouts, and 14 slices; generation, clean-room catalog checks, cancellation, offline Three.js r185 interaction, and projection contact-sheet review passed
14G — freeze gate Expanded local evidence frozen The repository-wide make check, make assets-resilient, and operator-style visual QA passed; any generated-v14 UCB AAO deposit remains a later, separate human invocation

The ignored local QA record is reports/stage-14-visual-qa.md, with one contact sheet per projection and a separate authorized cloud-atmosphere sheet. It records the 1,320-file, approximately 3.2 GB local inventory and the manual findings without treating that review as publication authority or an independent collaborator disposition.

Final authorized-atmosphere regeneration

The first final make assets-resilient run correctly stopped when the pinned GCOM-C AOD observation became 98.6 hours old against a 96-hour hard limit. That exposed a mismatch between an authorized, reproducible offline snapshot and a moving generation-time expiration. The source profile now applies the already established latest-available rule to every enabled JAXA layer: observations must still end no later than source selection and process start, but the configured 6-, 96-, or 336-hour value is a preferred freshness target. An older newest observation is retained with exact end UTC, age, policy, and target in SVG metadata and a visible latest available legend label. Future observations remain rejected, and the generic implementation still supports a strict maximum-age policy for profiles that explicitly request it.

The focused atmosphere contract, the final repository-wide check, and all six projection regenerations passed with that policy. Each generated SVG also verified that cloud-atmosphere-background retains display:none and data-default-visible="false"; the six-PNG atmosphere contact sheet confirms that it is visually absent by default.

Post-release consumer follow-on

Runtime API 3 completes the reverse-projection foundation identified by the special-topics audit. The separate AI-agent and 1080p gaming improvement plan turns the remaining JavaScript/catalog and gaming recommendations into phased, testable work. Its screen derivatives are additive and cannot alter the authoritative SVG/PDF archive and art objects, projection-specific 44-inch or A0 inkjet workflows, 3840-pixel raster, or print-generation contracts.

2026-08-10 — complete 1080p consumer and agent catalog v1

Status: implemented for the checked 205-product standard matrix; focused Node, Python, vendor, and browser checks passing.

make generate-screen-1080p produces the complete set; make check-screen-1080p validates 205 catalog records and 1,025 file references, transforms, hashes, picks, a dependency-free Python reader, and the offline Three.js browser canary. A collaborator clean-room run remains UNAVAILABLE. KTX2, semantic masks, Float32 GPU geometry, and engine-specific GPU-product importers are assigned to the Stage 15 ledger, not this completion gate.

The systematic round-trip audit adds 46,656 face/component-qualified interior samples: 2,592 points × six families × three frame scales. All candidates returned and all statuses were unique on the deliberately seam-avoiding grid. The maximum spherical error was approximately 1.22e-10° for the bounded numerical Cahill–Keyes solver and its Star-X carrier, and approximately 4.20e-13° or less for the analytic families. These round trips are strong implementation consistency evidence, not independent mathematical proof; published anchors, exact seams, poles, face centers, and retained-hinge tests remain necessary independent/structural evidence.

Implemented — Dymaxion ULP-scale classifier and clamp audit

Status: implemented; focused audit passing without a production numerical change.

make audit-dymaxion-ulp executes 1,883 edge, vertex, subface, tie, clamp, and one-sided boundary probes. It found 566 candidate-set differences that were all contained by the declared tolerance, no unclassified gap, and no ordinary interior clamp. The 92 native, 44-inch, 1,920-pixel, and 13,200-pixel frame checks found the expected first accepted and rejected representable widths. The maximum retained forward residual was approximately 1.818989e-12 projected units. The machine-readable local result is reports/dymaxion-ulp-audit.json; the implementation and stable conclusions are recorded in the Dymaxion notes.

The following text retains the reviewed design and acceptance rationale used for the audit.

The 46,656-sample campaign above deliberately avoids seams. It therefore does not establish behavior within a few representable floating-point steps of a Dymaxion face edge, vertex, Australia/Japan subdivision, pole, antimeridian, frame-ratio boundary, or clamp threshold. The current constants are not presumed defective, but the fixed spherical face tolerance, frame classifier, inverse bounds, barycentric tolerance, and forward clamps merit a dedicated ULP-scale audit before Stage 14 numerical work is considered closed.

The implemented audit uses tests/audit-dymaxion-ulp.cc, a focused make audit-dymaxion-ulp target, and an ignored reports/dymaxion-ulp-audit.json evidence file. It should:

  1. inventory and name the numerical role of the spherical classifier’s 8 * epsilon, the frame-ratio classifier’s 16 * epsilon * scale, the inverse angle/equation bounds, the caller-scaled planar barycentric tolerance, and every forward or inverse clamp;
  2. enumerate every unique spherical edge and vertex, including the five registered Australia/Japan subfaces, and probe exact boundaries plus both sides with boundary-normal and std::nextafter displacements from 1 through 4096 ULPs;
  3. compare the production double classifier and Gray transform with an independent test-only long double or multiprecision oracle, recording raw determinants, expected/observed face membership, tie resolution, candidate sets, clamp activation, and forward residual;
  4. audit frame acceptance around the exact Dymaxion ratio at native, 44-inch, 1920-pixel, and 13,200-pixel scales, including the first accepted and rejected representable widths on each side;
  5. require valid interior points to avoid clamping, permit boundary clamping only within a derived roundoff bound, and reject larger excursions rather than silently snapping them onto the frame; and
  6. repeat the acceptance campaign in native and WebAssembly builds without changing the authoritative print, SVG, PDF, or 3840-pixel products.

Acceptance requires no unclassified gaps, the documented lowest-face-index choice for exact ties, the expected adjacent face or subface on each side of a boundary, complete topology-correct reverse candidates, and no non-boundary reference regression. A tolerance or clamp changes only when both the oracle and an explicit floating-point error bound support the replacement. The final result belongs in the Dymaxion implementation notes whether it confirms the existing constants or produces a corrective patch.

Implemented — true cross-implementation reverse oracle

Status: implemented for the declared Voronoi, Dymaxion, and Myriahedral evidence tier; focused check passing.

make check-reverse-oracles checks 2,108 independently produced cases. The pinned d3-geo-polygon v2.0.1 Voronoi route has maximum angular difference 5.08038e-13°; the pinned D3 Airocean/Gray comparison has maximum classified difference 0.000165906° under its declared 0.0003° rounded-registration bound; and the dependency-free Myriahedral route has maximum difference 1.32339e-13°. Four D3 face-19 registration cases remain explicit exclusions, not discarded failures or reasons to change production behavior. AuthaGraph, Cahill–Keyes, and Star-X retain their narrower evidence labels.

The following text retains the reviewed evidence-boundary and acceptance rationale used for the implementation.

The existing round-trip tests use Cartofreako’s forward and reverse paths together. They are strong consistency evidence, but both directions can share one convention or implementation error. This project should compare Cartofreako reverse results with geographic answers produced by independent programs from independently selected projected coordinates.

For the direct Voronoi oracle, pin the latest upstream release verified on 2026-08-10: d3-geo-polygon v2.0.1, commit 45d62833536fde08053a0675a488b937d41cde07. The tagged icosahedral.js constructs the upstream icosahedral projection, and its generic polyhedral/index.js installs inverse traversal when the face projections expose inverses. Fixture generation must also lock and hash the complete npm dependency graph rather than accepting the package’s semver ranges at refresh time.

The production Voronoi compatibility record remains pinned to v1.12.1 until a separate version-delta audit compares v1.12.1 with v2.0.1. Selecting the newer oracle must not silently redefine the current forward projection or cause a version-registration difference to be reported as a reverse defect.

An oracle qualifies as cross-implementation evidence only when it:

The proposed oracle routes and their evidence grades are:

Projection Independent route Evidence grade
Voronoi Pinned d3-geo-polygon v2.0.1 inverse runner after the v1.12.1-to-v2.0.1 delta audit Direct upstream cross-implementation
Dymaxion Clean-room implementation of Crider’s published inverse, checked against Gray’s published/reference coordinates Independent published-mathematics implementation
AuthaGraph Standalone high-precision inverse/root solver derived from Narukawa 2022, with published numeric and A3 registration anchors kept distinct Independent algorithmic implementation
Myriahedral Standalone face-local inverse derived from van Wijk, reading a frozen mesh/layout fixture rather than production headers Independent inverse mathematics over shared declared topology
Cahill–Keyes Separately implemented high-precision search against the published forward construction and external reference material Compatibility evidence until an external inverse exists
Star-X Independent declarative reversal of its CK carrier and fixed-60°S cap composition Derived-composition oracle, not an external base projection

The repository surface should use the implementation-neutral fixture contract below rather than define a competing oracle-only coordinate schema:

Fixture refresh is an explicit maintenance operation and must not run through make all, GitHub release, UCB AAO/S3 release, or ordinary offline checks. The first milestone covers Voronoi, Dymaxion, and Myriahedral interiors, edges, vertices, cuts, one-sided boundary probes, poles, outside points, and native/44-inch/1920-pixel/13,200-pixel frames.

Acceptance requires agreement within a declared angular bound, candidate-set agreement at cuts after longitude canonicalization, scale-independent geographic answers, and retained failing fixtures for every discrepancy. Each disagreement must be classified as convention, registration, oracle, or production error before production code changes. At least two direct or clean-room independent families must pass before documentation claims that a true cross-implementation reverse oracle exists. Cahill–Keyes and Star-X keep their narrower evidence labels until an actual external implementation is available.

Implemented — publish implementation-neutral projection fixtures

Status: implemented; native, WebAssembly, Node, and independent Python checks passing.

The checked v1 bundle contains 31,008 cases: 108 Cahill–Keyes, 28 AuthaGraph, 73 Dymaxion, 30,720 Myriahedral, 17 Star-X, and 62 Voronoi. Stable topology keys, evidence grades, provenance, tolerances, SHA-256 inventory, and a Cartofreako numeric-cell crosswalk are published under fixtures/projections/v1/. See the consumer documentation.

The following text retains the reviewed neutral-contract design and acceptance rationale.

Publish a small, versioned projection-mathematics dataset that JavaScript, Python, Rust, GIS, D3, Mapshaper, and agent workflows can consume without compiling or importing Cartofreako. These fixtures are distinct from rendered maps, runtime tests, and the isolated programs that produce independent oracle evidence.

The neutral contract must:

The proposed public source tree is:

contracts/projection-fixtures-v1.schema.json
fixtures/projections/v1/
  manifest.json
  cahill-keyes.json
  authagraph.json
  dymaxion.json
  myriahedral.json
  star-x.json
  voronoi.json
  topology-crosswalk-cartofreako.json
  oracles/
  SHA256SUMS
docs/pages/runtime/projection-fixtures.md
tests/test-projection-fixtures.cc
scripts/check-projection-fixtures.mjs

The numeric Cartofreako cell crosswalk remains separate from stable geometric identifiers. Each case records a stable case/projection/layout ID, operation, normalized input and expected output, topology keys, expected status and full candidate set, boundary class, tolerances, evidence, and revision history.

Evidence grades are deliberately narrow:

Grade Meaning
published-anchor Coordinate or invariant supplied by a primary publication
upstream-implementation Produced by a pinned independently maintained implementation
independent-reimplementation Produced by a clean-room implementation of published mathematics
structural-invariant Face center, edge, pole, hinge, scale, or topology fact
cartofreako-compatibility Existing behavior preserved for compatibility; not independent evidence

Cartofreako round trips must never be silently promoted to an independent grade. The initial publication set covers all Cahill–Keyes octants and representative A–L zones; all 24 AuthaGraph sectors and singular vertices; all 23 Dymaxion faces/subfaces; representative Myriahedral cases plus a separate 5,120-face-center pack for each registered layout; Star-X carrier/cap quadrants, cutoff, pole, cut, and overlap; and all 20 Voronoi faces, edges, and vertices.

Implementation order is:

  1. define stable topology keys, evidence grades, canonical serialization, and the JSON Schema;
  2. extract existing hard-coded published/reference anchors without changing their values or evidence claims;
  3. make native C++ and WebAssembly checks consume the same fixture records;
  4. add independently generated reverse cases through the oracle workflow above;
  5. add a dependency-free Node checker and a minimal non-Cartofreako Python consumer; and
  6. publish versioned raw JSON, checksums, and a downloadable bundle through GitHub Pages and source releases.

Fixture publication does not depend on generated assets, graphics rendering, S3, or UCB AAO. Schema/fixture major versions change for semantic changes; additions and corrections retain an explicit revision ledger rather than silently rewriting evidence.

Acceptance requires offline schema and checksum validation; identical fixture use by native and WebAssembly adapters; successful parsing by a non-Cartofreako consumer; semantic rather than array-order candidate comparison; scale-independent geographic answers; and provenance plus redistribution clearance for every value. Establish this neutral contract before implementing the cross-implementation producers so every oracle emits one portable evidence format.

Implemented — artifact request and decision-receipt schemas

Status: implemented; Node, browser, and independent Python consumers agree.

The schemas, pure ESM selector, TypeScript declarations, JSON-only CLI, append-only override receipts, reason vocabulary, order-independent selection, and golden fixtures are checked by make check-artifact-selection. Fallbacks are opt-in and limited to projectionIds, formats, maxBytes, viewport, and authorityClasses; lifecycle, checksum, evidence, governance, interaction, and human-review boundaries cannot be relaxed. The current golden decision-core SHA-256 is 9c915fe5fa80dcb4d37c2bfa597277d57753f84d6a33fbe189f65d6b1a82a978. See artifact selection and receipts.

The following text retains the reviewed request/receipt design and acceptance rationale.

Define a deterministic, inspectable interface between an agent’s request and the artifact catalog. The selector uses structured constraints and explicit preference order rather than hidden model judgment, and emits a receipt even when no artifact matches. Neither a request nor a selection receipt authorizes external-source access, license acceptance, publication, release, S3 upload, research interpretation, or training-data transfer.

The two self-contained JSON Schema Draft 2020-12 contracts are:

contracts/artifact-request-v1.schema.json
contracts/artifact-decision-receipt-v1.schema.json

An artifact request records:

Defaults allow only standard passes. Optional passes require explicit opt-in and must already be authorized and present. Exploration-only products require a separate explicit opt-in and a human-review disposition.

The versioned deterministic selector should:

  1. validate and normalize the request;
  2. verify catalog schema and hash;
  3. apply hard constraints;
  4. rank survivors lexicographically using the request’s ordered preferences;
  5. break final ties by stable artifact ID and variant ID;
  6. relax only the constraints named in the explicit fallback sequence;
  7. return no-match instead of inferring an unstated preference; and
  8. emit the receipt before optional file retrieval.

Missing catalog metadata is UNAVAILABLE, never false, zero, unrestricted, or acceptable. Phase one supports only fields actually present in artifacts-v1; source-period, licensing, or governance constraints return METADATA_UNAVAILABLE until a later catalog revision supplies those fields.

The decision receipt records:

Timestamp and host information belong in a run envelope outside the deterministic decision core. An override or later selection creates a new receipt referencing the prior receipt; it never rewrites the original. The initial rejection vocabulary is:

SUBJECT_MISMATCH
YEAR_MISMATCH
LIFECYCLE_DISALLOWED
PROJECTION_DISALLOWED
SLICE_MISMATCH
FORMAT_UNAVAILABLE
VIEWPORT_INCOMPATIBLE
INTERACTION_UNSUPPORTED
AUTHORITY_CLASS_DISALLOWED
MAX_BYTES_EXCEEDED
CHECKSUM_UNAVAILABLE
METADATA_UNAVAILABLE
GOVERNANCE_REVIEW_REQUIRED
LOWER_PREFERENCE_RANK
STABLE_TIE_BREAK

The implementation surface should be:

src.wasm/cartofreako-catalog.mjs
src.wasm/cartofreako-catalog.d.ts
scripts/select-artifact.mjs
tests/fixtures/artifact-selection/
tests/test-artifact-selection.mjs
docs/pages/runtime/artifact-selection.md

Add offline make check-artifact-selection. The selector is pure and performs no network, authorization, generation, release, or upload action.

Acceptance requires identical request/catalog bytes to produce the same decision-core hash; catalog order not to affect the decision; standard-only defaults never to select optional or exploration-only artifacts; missing metadata to yield an explicit rejection or human review; every rejection to have a reason code; no-match to produce a valid receipt; tampered request, catalog, or artifact hashes to fail verification; human overrides to remain append-only; and Node, browser, and a minimal independent consumer to agree on the selected ID. Selecting an artifact never implies permission to publish or authority to interpret its evidence.