From 0910768165734b814cc30f47094f392bd421e75f Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 8 Oct 2026 15:59:25 -0700 Subject: [PATCH 01/37] Specify private Artifact Index projection with external privacy controls --- .../public-artifact-index-bindings.json | 1 + .../public-artifact-index-policy.json | 18 + .../2026-10-08-architecture-interface.md | 99 ++ .../2026-10-08-artifact-index-contract.md | 47 + tests/test_architecture_artifact_index.py | 945 ++++++++++++++++++ 5 files changed, 1110 insertions(+) create mode 100644 architecture/public-artifact-index-bindings.json create mode 100644 architecture/public-artifact-index-policy.json create mode 100644 docs/plans/2026-10-08-architecture-interface.md create mode 100644 docs/plans/2026-10-08-artifact-index-contract.md create mode 100644 tests/test_architecture_artifact_index.py diff --git a/architecture/public-artifact-index-bindings.json b/architecture/public-artifact-index-bindings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/architecture/public-artifact-index-bindings.json @@ -0,0 +1 @@ +[] diff --git a/architecture/public-artifact-index-policy.json b/architecture/public-artifact-index-policy.json new file mode 100644 index 000000000..3dcf1909c --- /dev/null +++ b/architecture/public-artifact-index-policy.json @@ -0,0 +1,18 @@ +{ + "schema_version": 1, + "artifact_ids": [ + "C151-MAIN285-LOG-BINDINGS-20261007-v1", + "C152-MAIN286-FACTUAL-REVIEW-20261007-v1", + "C215-GRAPH-ALIAS-AUDIT-20261008-v1" + ], + "columns": [ + "Artifact ID", + "Title", + "Org", + "Class", + "Status", + "Authority / canonical impact", + "Dependencies or supersession", + "Modified UTC" + ] +} diff --git a/docs/plans/2026-10-08-architecture-interface.md b/docs/plans/2026-10-08-architecture-interface.md new file mode 100644 index 000000000..aad7b7d2f --- /dev/null +++ b/docs/plans/2026-10-08-architecture-interface.md @@ -0,0 +1,99 @@ +# Architecture Interface and Canvas Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Publish an additive Astro reader of pinned graph and explicitly public evidence inputs, with source-bound cubic and finite elder teaching views and a verifiable immutable build identity. + +**Architecture:** A trusted capture/projection stage produces a public-only input bundle. A hosted offline static build consumes that bundle once; browser tests and publication consume the same assembled output artifact. Original graph and native evidence records retain their distinct scope and authority; the reader is a derived view. + +**Tech Stack:** Stdlib Python capture/projection controls; exact Astro/Node/npm candidates and lockfile after hosted verification; vanilla ES modules and Canvas; existing hosted Chrome tooling; GitHub Pages. + +**Spec:** [Research architecture design, sections 1/4 and 7](../superpowers/specs/2026-10-08-research-architecture-design.md); [global implementation plan, Tasks 3 and 7](../superpowers/plans/2026-10-08-research-architecture-plan.md); [evidence adapter contract](2026-10-08-architecture-evidence-adapter.md). + +## Global Constraints + +- Scientific effect is always `NONE`; scientific status authority is exact boolean `false`. Build success, recorded review, source-relative consistency and teaching output do not promote science. +- Preserve source, review, kernel, computation and alignment as five separate axes. Preserve original classifications, records, qualifiers and unknown/stale/unavailable states. The stdin evidence adapter's custody remains `unknown`; the reader cannot convert its `current` applicability into authenticated kernel verification or declaration existence. +- The public graph may display all 49 currently pinned nodes without any guessed Artifact Index or Lean join. Artifact/node/teaching joins require exact reviewed IDs and roles; absence remains unresolved. +- Keep the complete private Artifact Index/source capture outside the public repository and publication bundle. Publish only explicitly allowed rows and columns. No private original packet, raw table, credential or unlisted field is copied into generated assets, logs or failure artifacts. +- Root retained the actual R17 Artifact Index capture and froze its observed metadata, column names, record schema, size limits and public projection boundary in the first-unit contract. Synthetic TEST fixtures exercise that boundary; they do not substitute for the retained real capture or actual public projection delivery. +- Root owns the isolated interface branch and the precise first-unit and runtime-preparation paths recorded in the pickup and amendment. Tests precede implementation, with hosted RED required before product authoring. The earlier source-only checkpoint is superseded operationally by this scoped execution claim. Standing owner authorization creates no additional user-permission checkpoint. +- No project execution or installation on the laptop. Preparation, RED/GREEN, two clean builds and browser execution occur in disposable hosted environments; network is denied during the actual build/test stage. +- PR #317 owns shared site/brand styles, release-key changes and the existing browser harness/tests. Existing `docs/site` generators and release inventory stay owner-controlled until reconciliation after that PR lands. Root currently owns the architecture producer/required-check workflows. +- New public routes use `/main/reader/`. Preserve the complete existing `/docs` publication namespace and `/main/site/*.html` routes. Pages Actions migration and navigation integration require explicit technical coordination with those owners, not renewed owner permission. +- True 500-token retrieval, lease services, routing and broader execution migration remain separate increments. All eight original requirements remain active until their actual end-to-end completion evidence exists. + +## Review Focus + +- A public-column whitelist applied after serializing the full private capture still leaks data; Task 1 must prove private canaries never enter any output or retained failure artifact. +- Matching caller-provided digests do not establish archive custody; Task 1 must bind original ZIP bytes to the native producer outputs and reject contradictory/stale archive identities. +- Generated graph schema differs from the old source viewer schema; Task 2 must consume the exporter directly without inventing `terminal_classifications` or other missing semantics. +- A disjoint-set parent is not the mathematical elder, and neutral events are not deaths; Task 3 must independently verify those distinctions and interval endpoints. +- A green build rebuilt during deployment can publish different inputs; Task 4 must deploy and read back the exact tested output artifact while preserving legacy URLs. + +--- + +## Task 1: Private capture, public projection and native graph custody + +**Create:** `architecture/artifact_index.py`, `tools/artifact_index_export.py`, `tools/interface_artifact_readback.py`, `tools/interface_build_inputs.py`, `tests/test_architecture_artifact_index.py`, `tests/test_interface_artifact_readback.py`, `tests/test_interface_build_inputs.py`. + +**Interfaces:** `project_artifact_index(packet, expected) -> public_projection` follows the [frozen first-unit contract](2026-10-08-artifact-index-contract.md). The packet carries the native capture, explicit public policy, exact bindings and graph-node inventory; `expected` carries five independently supplied identities. The first CLI reads one packet from stdin and writes one admitted canonical public JSON object to stdout. It opens no caller-selected files, performs no network access, and uses the exact opaque refusal line `ARTIFACT_INDEX_REFUSED` on stderr. Policy selects explicit stable artifact IDs and the fixed eight public columns; bindings contain exactly `{node_id, artifact_id, roles}`. Roles are explicit source/review/kernel/computation/alignment/teaching-source associations, never acceptance. A later separately tested trusted collector reads the retained outside-repository private capture and writes the admitted stdout projection to `public-index.json`; its file and archive custody is outside this first CLI unit. + +`interface_artifact_readback.py` consumes a previously downloaded original ZIP plus expected native repository/checked-commit/run/attempt/artifact-ID/name/archive-digest/host-receipt-digest arguments. Expectations come from the current trusted producer job, not ZIP members. It produces a bounded regular-file staging directory and an original-byte readback receipt. `interface_build_inputs.py` consumes that staged graph, public projection, allowed evidence/teaching/brand inputs and renderer identities and emits the public bundle below. + +- [ ] Root freezes the real capture's metadata and parser ABI, exact public row/column allowlist, explicit ID joins, positive public fixture and refusal fixture. Preserve the full private capture in its existing private evidence location; record only its identity/digest publicly when allowed. +- [ ] Write external CLI controls: valid public projection; absent mapping leaves unresolved; unknown/duplicate IDs and contradictory joins refuse; unlisted columns/rows and private canaries remain absent from all public outputs and failure artifacts; mutable references stay labeled; raw capture/policy/binding hash changes refuse. Observe hosted RED before implementation. +- [ ] Write custody controls: native archive identity/digest mismatch; wrong attempt/checked commit/receipt; duplicate ZIP members; absolute/traversing paths; symlink/special members; expanded-size limits; changed graph member; failed or missing producer evidence. Preserve original failure evidence without producing an accepted input bundle. +- [ ] Implement format-specific projection and archive verification without fetching caller-selected paths/URLs or executing captured code. Validate generated graph's exact seven-key schema and source identity, and match its raw hash to the original host receipt. Keep its dated Math source commit separate from the current executing main commit. +- [ ] Run hosted normal/optimized Python controls, inspect public/failure artifacts for the private canaries, and obtain nonauthor source/custody review. Freeze this unit through root before the renderer consumes it. + +**Public bundle boundary:** `inputs.json` has schema version, exact non-scientific fields, checked repository/commit, graph producer binding and raw graph/receipt identities, public index capture/projection/policy/binding identities, public evidence projection identity, teaching/brand file identities, renderer source/lockfile/runtime identities. Each member is an explicitly listed regular file with byte count and SHA-256. The exact public-index record fields are frozen in the first-unit contract before test/code authoring. The full private capture and evidence adapter `original_packet` are never bundle members. + +## Task 2: Offline Astro proof pages and immutable build receipt + +**Create:** `interface/package.json`, `interface/package-lock.json`, `interface/astro.config.mjs`, `interface/src/lib/load-inputs.mjs`, `interface/src/layouts/Reader.astro`, `interface/src/components/EvidenceDimensions.astro`, `interface/src/components/DependencyTable.astro`, `interface/src/pages/index.astro`, `interface/src/pages/nodes/[id].astro`, `interface/tests/inputs.test.mjs`, `interface/tests/pages.test.mjs`, `tools/interface_build_receipt.py`, `tests/test_interface_build_receipt.py`, `.github/workflows/research-interface.yml`. + +**Interfaces:** `loadPublicInputs(inputDirectory, expectedManifestSha256) -> admittedInputs` reads only the already admitted public bundle; it performs no network fetch. `nodePageData(nodeId, admittedInputs) -> pageData` retains exact original node/edge data and explicitly joined evidence, including unresolved joins. `interface_build_receipt.py` binds the identity core and complete sorted output-file inventory. + +- [ ] In a root-owned trusted hosted preparation stage, verify candidates Astro `7.3.8`, Node `24.21.0` and npm `11.19.0`; retain exact package/runtime bytes and identities, install from a committed integrity-bearing lockfile, and test compatibility. These versions were observed during reconnaissance and are candidates until preparation verifies them. Use no new theme, external fonts, client framework or graph library in this bounded unit. +- [ ] Write controls for missing/tampered bundle members, duplicate/nonfinite/incorrectly typed JSON, mixed build inputs, escaped IDs/URLs, unknown roles, all graph nodes without joins, unavailable evidence and native metadata preservation. Observe hosted RED; a setup/import failure or zero discovery is not RED evidence. +- [ ] Implement static routes with `site: 'https://d6g8k5htny-coder.github.io'`, `base: '/main/reader'`, `output: 'static'`, and `build.inlineStylesheets: 'never'`. Keep scripts/styles as local external assets under the existing self-only CSP. Reuse an owner-approved, byte-pinned brand capture without modifying shared brand/release files. +- [ ] Render an accessible dependency table/view and one page per exact graph ID. Display original classification as a recorded source label; render all five evidence axes independently with custody and as-of identity. Escape retained text; never execute embedded HTML/code or synthesize formal mappings from titles/classifications. +- [ ] Define `build_id = SHA256(canonical identity_core)` binding checked commit, graph/projection/evidence/teaching/brand input hashes, source tree, lockfile and runtime identity. Exclude the build ID itself and fresh wall-clock timestamps. Emit `build-receipt.json` with that identity and sorted output path/byte/SHA inventory; external archive identity binds the receipt itself. Every page links to its build receipt. +- [ ] From two clean hosted work directories, with network denied and identical admitted inputs, run `npm ci --offline` then `npm run build` using the prepared dependency cache. Compare complete output membership and bytes; require identical build IDs and no private canary. Retain both manifests/logs and the single tested output archive. Review source and byte identities before freezing. + +## Task 3: Source-bound cubic and finite elder Canvas views + +**Create:** `interface/src/pages/teach/cubic.astro`, `interface/src/pages/teach/elder.astro`, `interface/src/scripts/cubic-model.mjs`, `interface/src/scripts/elder-model.mjs`, `interface/src/scripts/canvas-reader.mjs`, `interface/tests/cubic.test.mjs`, `interface/tests/elder.test.mjs`, `interface/tests/reader-controls.test.mjs`. Public teaching fixtures enter only through Task 1's explicit source policy. + +**Interfaces:** `cubicModel({r, k, b}) -> scales` implements the pinned educational `gap = k*r^3` definition. `finiteElderTrace({values, n, scale}) -> trace` returns finite-filtration threshold/component/elder/merge/neutral events and positive/zero/essential intervals. `renderTeachingView(host, admittedTeachingData)` connects the same data to Canvas and equivalent DOM tables/controls. Source-node links exist only through explicit admitted mappings. + +- [ ] Pin source bytes for the current cubic definition and `experiments/periodic_h0/{EXACT_H0.md,exact_h0.py,test_exact_h0.py}`. Keep their finite/educational scope and source dates visible. No synthetic source identity, continuum sample, Lean declaration or source-to-component certificate is invented. +- [ ] Write independent controls for positive cubic scales, halving `r` dividing gap by eight, normalization and nonrepresentable/invalid values. Write finite elder controls for `[5,1,4,2,3,0]` repeated six times: positive pairs `[[3,2],[4,1]]`, essential birth `5`, zero count `33`; plateau ties prefer the smaller row-major vertex ID. Include periodic seam and no-diagonal controls and a BFS connectivity oracle distinct from the sweep. +- [ ] Pin superlevel `(d/S,b/S]`, lifetime `(b-d)/S`, zero pairs excluded from the positive diagram, essential class separate, and no longest finite bar removal. Test that disjoint-set parents cannot overrule mathematical elders and same-class edges create neutral events rather than deaths. Missing mappings/certificates render unresolved, never a positive source claim. Observe hosted RED before implementing. +- [ ] Implement exact model/event data separately from approximate drawing coordinates. Label the cubic arithmetic as teaching; label the elder scene as a specified finite periodic filtration. Keep immediate mathematical merge relation, global class equality, essential bars and finite conventions distinct from data-structure pointers. +- [ ] Implement keyboard-operable ordinary DOM controls, event/value tables and source disclosures usable without Canvas. Respect reduced motion; avoid mandatory animation. Source absence/tamper leaves readable unavailable state with no inferred result. Run model and DOM controls hosted and obtain mathematical-scope/source review. + +## Task 4: Browser verification, existing namespace preservation and exact-artifact deployment + +**Create:** `tools/interface_browser_check.py`, `tests/test_interface_browser_contract.py`; extend only the new `research-interface.yml` under root's claim. **Later coordinated paths:** assembled Pages workflow/configuration and existing navigation/docs; exact modifications follow PR #317 integration and a refreshed owner claim. + +**Interfaces:** The browser harness serves Task 2/3's assembled artifact, not a fresh build. Publication consumes the same artifact ID/digest and build receipt accepted by tests. The assembled Pages root includes the complete verified existing `/docs` namespace plus the additive `reader/` subtree. + +- [ ] Test the actual built pages in hosted Chrome at desktop/mobile widths, light/dark schemes, keyboard-only interaction, reduced motion, Canvas unavailable, source/index refusal and no-JavaScript DOM fallback. Check graph-node routes, five-axis qualifiers, focus/overflow and source/build identities; retain exact runtime/report/screenshots and failures. Existing PR #317 browser findings remain separate work to reconcile. +- [ ] Freeze a preservation manifest for every legacy `/docs` file/route from the actual integrated source. Assemble that namespace unchanged with the new reader. Detect output collisions and missing legacy routes before publication; exercise existing reader links and release checks under their owner-controlled hosted lane. +- [ ] After PR #317 and current producer scopes are reconciled, root claims the precise navigation and Pages migration paths. Switch to GitHub Actions publication only through available authorized administration capability and retained readback. This is technical integration work, not another owner approval queue. +- [ ] Use reviewed, commit-pinned Pages upload/deploy actions and scoped publication credentials only in the trusted host stage. Deploy the verified assembled artifact; do not rerun Astro, regenerate graph/index data or fetch mutable cloud inputs during deployment. Keep a recoverable prior artifact and source/configuration record. +- [ ] Read back live build receipt, representative graph/source/teaching pages and asset bytes; verify their hashes/build ID and actual reader interactions. Retain native deployment identity and exact source-bound receipts in existing governance surfaces. Mark this increment deployed only after that evidence exists. + +## Handoff and Completion Boundary + +The initial source-only checkpoint is preserved in the root checkpoint below; its operational wait is superseded by root's retained capture, frozen contract and scoped execution claim. First-unit tests are now authored and under nonauthor review; hosted RED and product implementation remain pending. The build does not authenticate mathematical records, establish unknown declarations, repair missing mappings or complete semantic retrieval. Goals 1 and 7 require tested deployed pages/Canvas; the every-PR producer/SSG join and all remaining original goals retain their explicit incomplete scope until separately verified. + +Primary references: [Astro Pages deployment](https://docs.astro.build/en/guides/deploy/github/), [Astro configuration](https://docs.astro.build/en/reference/configuration-reference/), [Astro package metadata](https://registry.npmjs.org/astro/latest), [Node distribution metadata](https://nodejs.org/dist/index.json), [GitHub publishing-source configuration](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site). Package aliases/docs are mutable research inputs; exact preparation receipts and the committed lockfile govern execution. + +## Root capture and first-unit checkpoint + +The source-only handoff above is the earlier checkpoint. Root now owns the new isolated interface worktree/branch based main879fb4f5 under pickup6070431864, with exact initial path scope published on main307. The actual native formattedValue capture is9273 UTF-8 bytes, SHA25603baf67b92c7b31390fd497431abf120204a6ccbde7d8b00395d1d40288f6ebf, captured22:18:57UTC8October; full private bytes remain outside Git. The [frozen first-unit contract](2026-10-08-artifact-index-contract.md) records its observed12-column header, worksheet200004, three ranges, typed packet, five independent pins and exact public output. The explicit policy selects three dated rows and eight public columns; actual bindings are empty. No title-based graph/Lean join is inferred. + +The first CLI is stdout-only with stdin private bytes and fixed refusal codes. A later trusted collector writes its admitted public JSON to the bundle; that later wrapper's filesystem/archive custody is separate work. External tests use synthetic TEST capture data and private canaries and precede implementation. Hosted absent-CLI RED, implementation, normal/optimized GREEN and nonauthor privacy review remain pending. Existing namespace, Astro/model/browser and exact-artifact deployment work remains unchanged in scope and unfinished. diff --git a/docs/plans/2026-10-08-artifact-index-contract.md b/docs/plans/2026-10-08-artifact-index-contract.md new file mode 100644 index 000000000..c1e95087a --- /dev/null +++ b/docs/plans/2026-10-08-artifact-index-contract.md @@ -0,0 +1,47 @@ +# Artifact Index public projection v1 contract + +Root owns this new boundary under main307 pickup6070431864 through00:00UTC9October. Base main879fb4f5. This is the first unit of the architecture interface plan. Standing owner authorization applies; no additional permission checkpoint is introduced. Product execution, RED/GREEN and installation occur only in disposable hosted environments. Full private captures stay outside Git and publication. + +## Actual source and public policy + +The real R17 source is spreadsheet `1O6x8ivmaVUxYqKmCOXmToIHpMXqDI362ibqBl8HY8no`, worksheet ID200004, title `Artifact Index`, native12-column formatted-cell representation. The2026-10-08T22:18:57Z response capture is9273 UTF-8 bytes with SHA256 `03baf67b92c7b31390fd497431abf120204a6ccbde7d8b00395d1d40288f6ebf`. This is serialized native API formattedValue data, not raw Sheet-file bytes or an export. It has one sheet and three grid-data ranges: row0 header, rows935–936, and row1000, all starting at column0. Capture ranges are `'Artifact Index'!A1:L1`, `'Artifact Index'!A936:L937`, and `'Artifact Index'!A1001:L1001`, cell_fields `formattedValue`. No native Sheet write is part of this unit. + +Header exact order: Artifact ID; Title; Org; Class; Priority; Topics / object tags; Status; Authority / canonical impact; Dependencies or supersession; Modified UTC; Source; Notes. + +Public column policy exact order: Artifact ID; Title; Org; Class; Status; Authority / canonical impact; Dependencies or supersession; Modified UTC. Only these eight native values may appear in public row fields. Source and Notes are prohibited even under a caller-forged policy; Priority and Topics are excluded. Do not serialize the original capture into any output or failure artifact. The real policy selects only C151-MAIN285-LOG-BINDINGS-20261007-v1, C152-MAIN286-FACTUAL-REVIEW-20261007-v1, C215-GRAPH-ALIAS-AUDIT-20261008-v1. These are dated source records with their original negative/scope/independence labels, not current acceptance. Actual initial bindings are empty because there is no exact verified Artifact Index-to-graph mapping. All49 graph IDs remain unmapped. Synthetic tests use TEST IDs, synthetic spreadsheet IDs, and private canaries distinct from the real source; synthetic fixtures are not delivery evidence. + +## CLI and typed packet + +`python -B -S tools/artifact_index_export.py` reads one strict JSON document from stdin, emits exactly one public JSON document on stdout on success, and exits0. On every refusal, including CLI arguments, it exits nonzero, emits no stdout and exactly the public opaque ASCII constant `ARTIFACT_INDEX_REFUSED` plus one newline on stderr. Private values, base64, cells, paths and exception text cannot appear in diagnostics. It performs no network fetch, URL/path read, imports of captured code or filesystem writes. Module API is `project_artifact_index(packet, expected) -> projection`. The output is a projection, not an authenticated table or current status claim. + +All five independent flags are required exactly once, with lower-case64-hex values: `--expected-capture-sha256`, `--expected-metadata-sha256`, `--expected-policy-sha256`, `--expected-bindings-sha256`, `--expected-graph-nodes-sha256`. No abbreviation or duplicate arguments. Expectations are supplied from trusted root capture/policy inputs, not inferred from stdin. They prove consistency with declared pins only, not external custody. Canonical identity JSON uses sorted object keys, compact separators, ensure_ascii=true and allow_nan=false, preserving typed values and array order. Capture SHA covers exact decoded raw bytes; metadata SHA covers the capture object with only raw_base64 removed; remaining SHA values cover policy, bindings and graph_nodes respectively. + +Packet exact keys: +- schema_version: exact integer1 (bool refuses). +- capture: exactly {capture_id, captured_at, source, raw_base64}. +- policy: exactly {schema_version, artifact_ids, columns}. +- bindings: array of exactly {node_id, artifact_id, roles}. +- graph_nodes: array of explicit node IDs. + +Capture ID is a nonempty ASCII identifier matching `[A-Za-z0-9][A-Za-z0-9_.:-]{0,191}`. captured_at is a valid UTC second timestamp YYYY-MM-DDTHH:MM:SSZ. Source exact keys are {spreadsheet_id, worksheet_id, title, ranges, cell_fields}. spreadsheet_id is a nonempty ASCII identifier of at most192 characters; worksheet_id exact nonnegative integer; title nonempty string, at most256 UTF-8 bytes, no controls; ranges is a unique nonempty list of exact quoted title A-to-L ranges `'TITLE'!A:L`, nonreversed and ordered by starting row; title containing a quote is unsupported. cell_fields must be exactly formattedValue. Native metadata must agree with the declared spreadsheet ID, worksheet ID and title. Metadata is declared as-of, not immutable native revision authentication. + +Stdin limit16MiB, decoded capture limit4MiB, JSON nesting at most64 container levels (a scalar leaf does not add a level), at most4096 nonheader native data rows plus the one header and4096 graph IDs/bindings/policy IDs, each formatted cell at most8192 UTF-8 bytes. Artifact and graph IDs use the same ASCII identifier pattern and192-character bound as capture_id. Reject duplicate object keys, nonfinite numbers, multiple JSON documents, malformed UTF-8/base64/noncanonical base64, booleans used as integers, overflow, empty or unknown envelope fields, and mismatching pins. Unknown native annotations stay private and inert; no unknown native field is projected. + +Native response is an object containing spreadsheetId and one sheet. The sheet properties must identify the declared worksheet/title. Grid properties must declare rowCount positive <=10000000 and columnCount exactly12. Its data list must have exactly one grid block for each declared range in the same order. Missing startRow/startColumn means0; supplied offsets are exact nonnegative integers and must equal the range's0-based position/column0. Every block has exactly its declared number of rowData rows, every row exactly12 values. Each cell is an object; missing formattedValue means empty string, supplied formattedValue must be a string within the bound. Unknown annotations remain inert. Blocks may not overlap and must be inside declared grid bounds. Exactly one row0 contains the exact12-column header; all other rows have a nonempty valid artifact ID, with no duplicate ID even on unselected rows. Nonselected row values and private columns never enter output. Selected IDs must each exist exactly once; unknown/duplicate/invalid policy IDs refuse. + +Policy columns must equal the fixed eight public columns above, in that exact order. Policy schema_version exact1. artifact_ids is a nonempty unique list of valid IDs; its order is preserved for identity hashing but output rows sort by artifact ID. graph_nodes are valid unique IDs. Bindings require known graph ID and selected artifact ID. Roles are a nonempty unique list drawn from source, review, kernel, computation, alignment, teaching-source; no inferred acceptance or title join. Duplicate node/artifact pairs refuse, even with different roles. Explicit valid bindings sort by node_id, artifact_id; their roles sort lexically. Unknown mappings refuse; absent mappings remain unmapped. + +## Exact public output + +Projection exact root fields: +`{schema_version:1,scientific_effect:"NONE",scientific_status_authority:false,custody:"unknown",source,identities,columns,rows,bindings,unmapped_nodes}`. + +source exactly `{capture_id,captured_at,spreadsheet_id,worksheet_id,worksheet_title,ranges,cell_fields,representation:"native-api-formattedValue-json"}`; preserve declared metadata/range order only. It contains no source URL, original packet, native annotations or raw capture bytes. identities exactly `{capture_sha256,metadata_sha256,policy_sha256,bindings_sha256,graph_nodes_sha256}`, matching the independently supplied pins. columns equals the eight public column names. + +Every row exactly `{artifact_id,source_row,fields}`: source_row is original1-based native row, fields is an object with exactly the eight column names and original formatted strings. Do not interpret status, authority, review prose, URLs or scope into another evidence axis. Empty fields stay empty. Every binding exactly {node_id,artifact_id,roles} with explicit canonical sorting. unmapped_nodes is the sorted graph IDs with no binding. Success JSON is deterministic ASCII with sorted object keys and one terminal newline. No output timestamp, original private input, accepted marker or inferred formal join. + +## External controls and completion + +Tests launch the CLI as a subprocess with -B -S and propagate the active optimized mode. Before implementation, actual hosted RED must identify the missing CLI, not merely fail discovery/import/setup. Cover valid deterministic preservation and typing; multiple native ranges/default offsets/blank cells; every independently pinned identity; each required/duplicate/invalid flag; duplicate/nonfinite/deep/oversized JSON and canonical base64; native source/header/range/row/grid/type contradictions; unknown/duplicate artifact IDs and bindings; six explicit roles; unknown graph IDs; missing mappings; forged columns; private Source/Notes and unselected-row canaries absent from public stdout and refusal stderr; inert code/URL strings never fetched or executed. Positive selected public strings may themselves contain URLs/code as inert escaped data; omission is determined by explicit field/row policy. + +Keep fixtures synthetic and compact. Do not copy any real private capture into tests or the public repository. Complete this unit only after exact candidate hosted normal/optimized controls pass with full discovery, original failure/success archives and nonauthor source/privacy review. Real selected source projection/readback follows that tested parser; the capture SHA alone does not authenticate a Sheet revision. Native graph archive readback, evidence-public projection, Astro/build/browser/deployment and all other architecture outcomes remain separate work. diff --git a/tests/test_architecture_artifact_index.py b/tests/test_architecture_artifact_index.py new file mode 100644 index 000000000..46fc4f736 --- /dev/null +++ b/tests/test_architecture_artifact_index.py @@ -0,0 +1,945 @@ +"""External contract for the inert, explicitly pinned Artifact Index projection. + +Every fixture below is synthetic TEST data. It models formattedValue API JSON, +not a real Sheet capture, native revision authentication, or delivered evidence. +""" + +import base64 +import copy +import hashlib +import http.server +import json +import os +from pathlib import Path +import subprocess +import sys +import tempfile +import threading +import urllib.request +import unittest + + +ROOT = Path(__file__).resolve().parents[1] +CLI = ROOT / "tools" / "artifact_index_export.py" +HEADER = [ + "Artifact ID", "Title", "Org", "Class", "Priority", "Topics / object tags", + "Status", "Authority / canonical impact", "Dependencies or supersession", + "Modified UTC", "Source", "Notes", +] +PUBLIC_COLUMNS = [ + "Artifact ID", "Title", "Org", "Class", "Status", + "Authority / canonical impact", "Dependencies or supersession", "Modified UTC", +] +PIN_FLAGS = { + "capture_sha256": "--expected-capture-sha256", + "metadata_sha256": "--expected-metadata-sha256", + "policy_sha256": "--expected-policy-sha256", + "bindings_sha256": "--expected-bindings-sha256", + "graph_nodes_sha256": "--expected-graph-nodes-sha256", +} +ROLES = ["source", "review", "kernel", "computation", "alignment", "teaching-source"] +TITLE = "TEST Artifact Index" +RANGES = [ + "'TEST Artifact Index'!A1:L1", + "'TEST Artifact Index'!A936:L937", + "'TEST Artifact Index'!A1001:L1001", +] + +# Trusted test launcher, executed only in the external child. Its Python audit +# observer covers the fixture paths; it is not an operating-system sandbox. +AUDIT_LAUNCHER = r''' +import json +import os +import runpy +import sys + +cli_path, report_number, fixture_path, secret_path = sys.argv[1:5] +cli_arguments = sys.argv[5:] +report_fd = int(report_number) +fixture_root = os.path.normcase(os.path.abspath(fixture_path)) +labels = ("read", "write", "mkdir", "remove", "rename", "rmdir") +counts = dict.fromkeys(labels, 0) +calibration = dict(counts) +guard = False + +def fixture_target(path, dir_fd=None): + if isinstance(path, int): + # Standard streams and the trusted report descriptor are allowed. + # Other opaque descriptors conservatively count as fixture attempts. + return path not in (0, 1, 2, report_fd) + if path is None: + path = os.getcwd() + path = os.fsdecode(path) + if not os.path.isabs(path) and dir_fd not in (None, -1): + # A relative dir_fd target cannot safely be assigned to another path + # without extra I/O, so observe/guard it conservatively. + return True + path = os.path.normcase(os.path.abspath(path)) + return path == fixture_root or path.startswith(fixture_root + os.sep) + +def audit(event, arguments): + selected = [] + if event == "open" and fixture_target(arguments[0]): + flags = arguments[2] + if flags & (os.O_WRONLY | os.O_RDWR | os.O_APPEND | os.O_CREAT | os.O_TRUNC): + selected.append("write") + if not flags & os.O_WRONLY: + selected.append("read") + elif event in ("os.listdir", "os.scandir") and fixture_target(arguments[0]): + selected.append("read") + elif event == "os.mkdir" and fixture_target(arguments[0], arguments[2]): + selected.append("mkdir") + elif event in ("os.remove", "os.rmdir") and fixture_target(arguments[0], arguments[1]): + selected.append("remove" if event == "os.remove" else "rmdir") + elif event == "os.rename" and ( + fixture_target(arguments[0], arguments[2]) or fixture_target(arguments[1], arguments[3]) + ): + selected.append("rename") + for label in selected: + counts[label] += 1 + if selected and guard: + raise RuntimeError("TEST_FIXTURE_IO_GUARD") + +sys.addaudithook(audit) +try: + # Positive calibration uses trusted paths, never captured code or values. + with open(secret_path, "rb") as stream: + stream.read() + temporary = os.path.join(fixture_root, "TEST-audit-temporary") + renamed = os.path.join(fixture_root, "TEST-audit-renamed") + directory = os.path.join(fixture_root, "TEST-audit-directory") + with open(temporary, "wb") as stream: + stream.write(b"TEST calibration") + os.rename(temporary, renamed) + os.remove(renamed) + os.mkdir(directory) + os.rmdir(directory) + os.listdir(fixture_root) + calibration = dict(counts) + counts = dict.fromkeys(labels, 0) + guard = True + sys.argv = [cli_path, *cli_arguments] + sys.path[0] = os.path.dirname(cli_path) + runpy.run_path(cli_path, run_name="__main__") +finally: + report = {"calibration": calibration, "attempts": counts, "optimize": sys.flags.optimize} + encoded = (json.dumps(report, sort_keys=True, separators=(",", ":"), ensure_ascii=True) + "\n").encode("ascii") + os.write(report_fd, encoded) + os.close(report_fd) +''' + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":"), + ensure_ascii=True, allow_nan=False).encode("ascii") + + +def digest(raw): + return hashlib.sha256(raw).hexdigest() + + +def native_bytes(value): + return (json.dumps(value, separators=(",", ":"), ensure_ascii=False, + allow_nan=False) + "\n").encode("utf-8") + + +def row(values): + return {"values": [{"formattedValue": value} for value in values]} + + +def selected_values(artifact_id, label): + return [ + artifact_id, label + " — α; TEST.node.a is only title text", "TEST Org", + "dated review record", "PRIVATE_PRIORITY_" + artifact_id, + "PRIVATE_TOPICS_" + artifact_id, "HISTORICAL / NOT ACCEPTED", + "independence=0; scope=historical only; as of 2026-10-01", + "supersedes TEST-OLDER only within the stated scope", "2026-10-01T00:00:00Z", + "PRIVATE_SOURCE_" + artifact_id, "PRIVATE_NOTES_" + artifact_id, + ] + + +def synthetic_native(): + unselected = ["TEST-UNSELECTED"] + ["PRIVATE_UNSELECTED_COL_%02d" % i + for i in range(1, 12)] + return { + "spreadsheetId": "TEST-R17-SPREADSHEET", + "privateAnnotation": "PRIVATE_NATIVE_ANNOTATION", + "sheets": [{ + "properties": { + "sheetId": 4242, "title": TITLE, + "gridProperties": {"rowCount": 1002, "columnCount": 12}, + }, + "data": [ + {"startRow": 0, "startColumn": 0, "rowData": [row(HEADER)]}, + {"startRow": 935, "startColumn": 0, "rowData": [ + row(selected_values("TEST-ZETA", "Zeta title")), + row(selected_values("TEST-ALPHA", "Alpha title")), + ]}, + {"startRow": 1000, "startColumn": 0, "rowData": [row(unselected)]}, + ], + }], + } + + +def synthetic_packet(): + return { + "schema_version": 1, + "capture": { + "capture_id": "TEST-capture-1", "captured_at": "2026-10-01T12:34:56Z", + "source": { + "spreadsheet_id": "TEST-R17-SPREADSHEET", "worksheet_id": 4242, + "title": TITLE, "ranges": list(RANGES), "cell_fields": "formattedValue", + }, + "raw_base64": base64.b64encode(native_bytes(synthetic_native())).decode("ascii"), + }, + "policy": {"schema_version": 1, "artifact_ids": ["TEST-ZETA", "TEST-ALPHA"], + "columns": list(PUBLIC_COLUMNS)}, + "bindings": [], + "graph_nodes": ["TEST.node.z", "TEST.node.a", "TEST.node.m"], + } + + +def pins_for(packet): + capture = packet["capture"] + raw = base64.b64decode(capture["raw_base64"], validate=True) + metadata = {key: value for key, value in capture.items() if key != "raw_base64"} + return { + "capture_sha256": digest(raw), "metadata_sha256": digest(canonical(metadata)), + "policy_sha256": digest(canonical(packet["policy"])), + "bindings_sha256": digest(canonical(packet["bindings"])), + "graph_nodes_sha256": digest(canonical(packet["graph_nodes"])), + } + + +def replace_raw(packet, raw): + packet["capture"]["raw_base64"] = base64.b64encode(raw).decode("ascii") + + +def get_native(packet): + return json.loads(base64.b64decode(packet["capture"]["raw_base64"])) + + +def replace_native(packet, value): + replace_raw(packet, native_bytes(value)) + + +class ArtifactIndexProjectionContractTests(unittest.TestCase): + def setUp(self): + self.packet = synthetic_packet() + self.pins = pins_for(self.packet) + self.temp = tempfile.TemporaryDirectory(prefix="TEST-artifact-index-") + self.addCleanup(self.temp.cleanup) + self.workdir = Path(self.temp.name) + self.private_values = ["PRIVATE_NATIVE_ANNOTATION"] + for block in get_native(self.packet)["sheets"][0]["data"][1:]: + for native_row in block["rowData"]: + values = [cell["formattedValue"] for cell in native_row["values"]] + if values[0] == "TEST-UNSELECTED": + self.private_values.extend(values) + else: + self.private_values.extend(values[index] for index in (4, 5, 10, 11)) + + def flag_args(self, pins): + return [argument for name, flag in PIN_FLAGS.items() for argument in (flag, pins[name])] + + def invoke(self, packet=None, *, expected=None, raw=None, args=None, audit=None): + # Missing exporters must fail every control before launching a child. + self.assertTrue(CLI.is_file(), "missing required external CLI: tools/artifact_index_export.py") + packet = self.packet if packet is None else packet + expected = pins_for(packet) if expected is None else expected + raw = canonical(packet) + b"\n" if raw is None else raw + flags = ["-B", "-S"] + if sys.flags.optimize: + flags.append("-" + "O" * sys.flags.optimize) + env = dict(os.environ) + env.pop("PYTHONOPTIMIZE", None) + arguments = self.flag_args(expected) if args is None else args + + def launch(command, pass_fds=()): + return subprocess.run( + command, input=raw, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + cwd=self.workdir, env=env, timeout=20, check=False, pass_fds=pass_fds, + ) + + if audit is None: + return launch([sys.executable, *flags, str(CLI), *arguments]) + with tempfile.TemporaryDirectory(prefix="TEST-audit-report-") as report_directory: + report_root = Path(report_directory) + launcher = report_root / "trusted_launcher.py" + report_path = report_root / "counts.json" + launcher.write_text(AUDIT_LAUNCHER, encoding="utf-8") + report_fd = os.open(report_path, os.O_CREAT | os.O_RDWR | os.O_TRUNC, 0o600) + try: + result = launch([ + sys.executable, *flags, str(launcher), str(CLI), str(report_fd), + str(self.workdir), str(audit["secret"]), *arguments, + ], pass_fds=(report_fd,)) + finally: + os.close(report_fd) + result.audit_report = json.loads(report_path.read_bytes()) + return result + + def assert_private_absent(self, result): + combined = result.stdout + result.stderr + for value in self.private_values: + self.assertNotIn(value.encode("utf-8"), combined) + self.assertNotIn(self.packet["capture"]["raw_base64"].encode("ascii"), combined) + + def expected_projection(self, packet, expected): + source = packet["capture"]["source"] + selected = set(packet["policy"]["artifact_ids"]) + projected_rows = [] + for block in get_native(packet)["sheets"][0]["data"]: + start = block.get("startRow", 0) + for offset, native_row in enumerate(block["rowData"]): + values = [cell.get("formattedValue", "") for cell in native_row["values"]] + if values[0] in selected: + projected_rows.append({ + "artifact_id": values[0], "source_row": start + offset + 1, + "fields": {name: values[HEADER.index(name)] for name in PUBLIC_COLUMNS}, + }) + bindings = [dict(binding, roles=sorted(binding["roles"])) for binding in packet["bindings"]] + bindings.sort(key=lambda binding: (binding["node_id"], binding["artifact_id"])) + bound_nodes = {binding["node_id"] for binding in bindings} + return { + "schema_version": 1, "scientific_effect": "NONE", "scientific_status_authority": False, + "custody": "unknown", + "source": { + "capture_id": packet["capture"]["capture_id"], + "captured_at": packet["capture"]["captured_at"], + "spreadsheet_id": source["spreadsheet_id"], "worksheet_id": source["worksheet_id"], + "worksheet_title": source["title"], "ranges": source["ranges"], + "cell_fields": source["cell_fields"], "representation": "native-api-formattedValue-json", + }, + "identities": expected, "columns": list(PUBLIC_COLUMNS), + "rows": sorted(projected_rows, key=lambda value: value["artifact_id"]), + "bindings": bindings, "unmapped_nodes": sorted(set(packet["graph_nodes"]) - bound_nodes), + } + + def accept(self, packet=None, *, expected=None, raw=None, audit=None): + packet = self.packet if packet is None else packet + expected = pins_for(packet) if expected is None else expected + result = self.invoke(packet, expected=expected, raw=raw, audit=audit) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stderr, b"") + self.assertTrue(result.stdout.isascii()) + projected = json.loads(result.stdout) + self.assertEqual(projected, self.expected_projection(packet, expected)) + self.assertIs(type(projected["schema_version"]), int) + self.assertIs(projected["scientific_status_authority"], False) + self.assertIs(type(projected["source"]["worksheet_id"]), int) + for value in projected["rows"]: + self.assertIs(type(value["source_row"]), int) + self.assertEqual(result.stdout, canonical(projected) + b"\n") + self.assert_private_absent(result) + return result + + def refuse(self, packet=None, *, expected=None, raw=None, args=None): + result = self.invoke(packet, expected=expected, raw=raw, args=args) + self.assertNotEqual(result.returncode, 0) + self.assertEqual(result.stdout, b"") + self.assertEqual(result.stderr, b"ARTIFACT_INDEX_REFUSED\n") + self.assert_private_absent(result) + return result + + def test_exact_public_projection_is_stable_and_retains_original_row_positions(self): + before = sorted(path.name for path in self.workdir.iterdir()) + first = self.accept() + self.assertEqual(self.accept().stdout, first.stdout) + projected = json.loads(first.stdout) + self.assertEqual([(item["artifact_id"], item["source_row"]) for item in projected["rows"]], + [("TEST-ALPHA", 937), ("TEST-ZETA", 936)]) + self.assertEqual(projected["unmapped_nodes"], ["TEST.node.a", "TEST.node.m", "TEST.node.z"]) + self.assertEqual(sorted(path.name for path in self.workdir.iterdir()), before) + + def test_all_49_explicit_graph_nodes_remain_unmapped_without_a_binding(self): + packet = copy.deepcopy(self.packet) + packet["graph_nodes"] = ["TEST.node.%02d" % index for index in reversed(range(49))] + projected = json.loads(self.accept(packet).stdout) + self.assertEqual(len(projected["unmapped_nodes"]), 49) + self.assertEqual(projected["bindings"], []) + + def test_public_unicode_empty_cells_and_historical_scope_are_preserved_without_promotion(self): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + values = native["sheets"][0]["data"][1]["rowData"][1]["values"] + values[1]["formattedValue"] = "Unicode α / résumé / 雪; declared text only" + values[2] = {"unknownAnnotation": "PRIVATE_EMPTY_CELL_ANNOTATION"} + values[6]["formattedValue"] = "FAILED; skipped; as of 2026-09-30" + values[7]["formattedValue"] = "independence=0; historical scope only" + replace_native(packet, native) + result = self.accept(packet) + fields = json.loads(result.stdout)["rows"][0]["fields"] + self.assertEqual(fields["Org"], "") + self.assertEqual(fields["Status"], "FAILED; skipped; as of 2026-09-30") + self.assertNotIn(b"PRIVATE_EMPTY_CELL_ANNOTATION", result.stdout) + + def test_default_zero_offsets_and_unknown_native_annotations_are_private_and_inert(self): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + header = native["sheets"][0]["data"][0] + del header["startRow"] + for block in native["sheets"][0]["data"]: + del block["startColumn"] + block["annotation"] = {"raw": "PRIVATE_BLOCK_ANNOTATION", "nested": [True, None, 1.5]} + native["sheets"][0]["properties"]["annotation"] = "PRIVATE_PROPERTIES_ANNOTATION" + replace_native(packet, native) + result = self.accept(packet) + self.assertNotIn(b"PRIVATE_BLOCK_ANNOTATION", result.stdout) + self.assertNotIn(b"PRIVATE_PROPERTIES_ANNOTATION", result.stdout) + + def test_explicit_six_roles_and_bindings_sort_without_inferred_acceptance(self): + packet = copy.deepcopy(self.packet) + packet["bindings"] = [ + {"node_id": "TEST.node.z", "artifact_id": "TEST-ZETA", "roles": list(ROLES)}, + {"node_id": "TEST.node.a", "artifact_id": "TEST-ZETA", "roles": ["teaching-source"]}, + {"node_id": "TEST.node.a", "artifact_id": "TEST-ALPHA", "roles": ["review", "source"]}, + ] + projected = json.loads(self.accept(packet).stdout) + self.assertEqual(projected["bindings"][2]["roles"], sorted(ROLES)) + self.assertEqual(projected["unmapped_nodes"], ["TEST.node.m"]) + self.assertEqual(projected["custody"], "unknown") + + def test_policy_array_order_is_pinned_even_when_public_rows_have_the_same_order(self): + packet = copy.deepcopy(self.packet) + packet["policy"]["artifact_ids"].reverse() + original = json.loads(self.accept().stdout) + reordered = json.loads(self.accept(packet).stdout) + self.assertEqual(original["rows"], reordered["rows"]) + self.assertNotEqual(original["identities"]["policy_sha256"], reordered["identities"]["policy_sha256"]) + + def test_each_of_the_five_independent_expected_pins_must_match(self): + for name in PIN_FLAGS: + with self.subTest(pin=name): + expected = dict(self.pins) + expected[name] = "0" * 64 if expected[name] != "0" * 64 else "1" * 64 + self.refuse(expected=expected) + + def test_changed_input_components_cannot_replace_independently_supplied_pins(self): + for component in ("capture", "metadata", "policy", "bindings", "graph_nodes"): + with self.subTest(component=component): + packet = copy.deepcopy(self.packet) + if component == "capture": + replace_raw(packet, base64.b64decode(packet["capture"]["raw_base64"]) + b" ") + elif component == "metadata": + packet["capture"]["captured_at"] = "2026-10-02T12:34:56Z" + elif component == "policy": + packet["policy"]["artifact_ids"].reverse() + elif component == "bindings": + packet["bindings"] = [{"node_id": "TEST.node.a", "artifact_id": "TEST-ALPHA", "roles": ["source"]}] + else: + packet["graph_nodes"].reverse() + self.refuse(packet, expected=self.pins) + + def test_all_cli_flags_are_required_once_and_only_full_names_are_accepted(self): + arguments = self.flag_args(self.pins) + for index, (name, flag) in enumerate(PIN_FLAGS.items()): + with self.subTest(flag=flag, fault="missing"): + self.refuse(args=arguments[:2 * index] + arguments[2 * index + 2:]) + with self.subTest(flag=flag, fault="duplicate"): + self.refuse(args=arguments + [flag, self.pins[name]]) + with self.subTest(flag=flag, fault="abbreviated"): + amended = list(arguments) + amended[2 * index] = flag[:-1] + self.refuse(args=amended) + + def test_invalid_cli_digests_and_private_argument_values_are_never_echoed(self): + for name in PIN_FLAGS: + for value in ("", "a" * 63, "a" * 65, "A" * 64, "g" * 64, "../PRIVATE_ARG_PATH"): + with self.subTest(pin=name, value=value): + expected = dict(self.pins) + expected[name] = value + result = self.refuse(expected=expected) + self.assertNotIn(b"PRIVATE_ARG_PATH", result.stderr) + for extra in (["--PRIVATE_UNKNOWN_FLAG", "PRIVATE_ARGUMENT_VALUE"], ["/PRIVATE_POSITIONAL_PATH"]): + with self.subTest(extra=extra): + result = self.refuse(args=self.flag_args(self.pins) + extra) + self.assertNotIn(b"PRIVATE_", result.stderr) + + def test_packet_wrappers_are_closed_and_schema_versions_have_exact_integer_types(self): + wrapped = copy.deepcopy(self.packet) + wrapped["bindings"] = [{"node_id": "TEST.node.a", "artifact_id": "TEST-ALPHA", "roles": ["source"]}] + + def remaining_pins(packet): + # Pin every remaining component, so an unrelated mismatch cannot + # mask the missing/extra-key control. A wholly absent component has + # no hash to supply and retains the positive fixture's expectation. + expected = pins_for(wrapped) + for name, key in (("policy_sha256", "policy"), ("bindings_sha256", "bindings"), + ("graph_nodes_sha256", "graph_nodes")): + if key in packet: + expected[name] = digest(canonical(packet[key])) + if "capture" in packet: + capture = packet["capture"] + expected["metadata_sha256"] = digest(canonical({ + key: value for key, value in capture.items() if key != "raw_base64" + })) + if "raw_base64" in capture: + expected["capture_sha256"] = digest(base64.b64decode(capture["raw_base64"], validate=True)) + return expected + + paths = [(), ("capture",), ("capture", "source"), ("policy",), ("bindings", 0)] + for path in paths: + target = wrapped + for key in path: + target = target[key] + for key in list(target): + with self.subTest(path=path, missing=key): + packet = copy.deepcopy(wrapped) + changed = packet + for part in path: + changed = changed[part] + del changed[key] + self.refuse(packet, expected=remaining_pins(packet)) + with self.subTest(path=path, extra=True): + packet = copy.deepcopy(wrapped) + changed = packet + for part in path: + changed = changed[part] + changed["PRIVATE_UNRECOGNIZED_WRAPPER"] = "PRIVATE_WRAPPER_VALUE" + result = self.refuse(packet, expected=remaining_pins(packet)) + self.assertNotIn(b"PRIVATE_UNRECOGNIZED_WRAPPER", result.stderr) + self.assertNotIn(b"PRIVATE_WRAPPER_VALUE", result.stderr) + for path in ((), ("policy",)): + for value in (True, 1.0, "1", 0, 2, None): + with self.subTest(path=path, schema=value): + packet = copy.deepcopy(self.packet) + target = packet if not path else packet["policy"] + target["schema_version"] = value + self.refuse(packet) + + def test_capture_identity_timestamp_and_declared_source_are_strictly_typed(self): + cases = { + "capture_id": ("", "x" * 193, " space", "TEST\nID", "é", True, 1, None), + "captured_at": ("2026-02-30T12:00:00Z", "2026-10-01T24:00:00Z", "2026-10-01T12:34:56+00:00", + "2026-10-01T12:34:56.000Z", "2026-10-01", True, None), + } + for key, values in cases.items(): + for value in values: + with self.subTest(field=key, value=value): + packet = copy.deepcopy(self.packet) + packet["capture"][key] = value + self.refuse(packet) + source_cases = { + "spreadsheet_id": ("", "x" * 193, "é", True, None), + "worksheet_id": (True, 4242.0, -1, "4242", None), + "title": ("", "λ" * 129, "TEST\nTitle", "TEST'Quote", True, None), + "cell_fields": ("", "formattedValue,userEnteredValue", ["formattedValue"], None), + } + for key, values in source_cases.items(): + for value in values: + with self.subTest(source_field=key, value=value): + packet = copy.deepcopy(self.packet) + packet["capture"]["source"][key] = value + self.refuse(packet) + + def test_native_spreadsheet_worksheet_and_title_must_match_declared_metadata(self): + for field, value in (("spreadsheetId", "TEST-OTHER-SHEET"), ("sheetId", 4243), + ("sheetId", True), ("sheetId", 4242.0), ("title", "TEST Other Title")): + with self.subTest(field=field, value=value): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + target = native if field == "spreadsheetId" else native["sheets"][0]["properties"] + target[field] = value + replace_native(packet, native) + self.refuse(packet) + + def test_exact_header_order_names_types_and_single_header_are_required(self): + for fault in ("rename", "swap", "empty", "nonstring", "second_header"): + with self.subTest(fault=fault): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + header = native["sheets"][0]["data"][0]["rowData"][0]["values"] + if fault == "rename": + header[10]["formattedValue"] = "Sources" + elif fault == "swap": + header[0], header[1] = header[1], header[0] + elif fault == "empty": + header[11] = {} + elif fault == "nonstring": + header[0]["formattedValue"] = 1 + else: + native["sheets"][0]["data"][2]["rowData"][0] = row(HEADER) + replace_native(packet, native) + self.refuse(packet) + + def test_ranges_require_exact_title_a_to_l_syntax_order_and_nonoverlap(self): + cases = [[], RANGES + [RANGES[1]], list(reversed(RANGES)), + [RANGES[0], "'TEST Artifact Index'!A936:L937", "'TEST Artifact Index'!A937:L1001"], + ["TEST Artifact Index!A1:L1", *RANGES[1:]], + ["'TEST Other Title'!A1:L1", *RANGES[1:]], + ["'TEST Artifact Index'!A0:L1", *RANGES[1:]], + ["'TEST Artifact Index'!A01:L1", *RANGES[1:]], + ["'TEST Artifact Index'!B1:L1", *RANGES[1:]], + ["'TEST Artifact Index'!A1:K1", *RANGES[1:]], + [RANGES[0], "'TEST Artifact Index'!A937:L936", RANGES[2]], + [RANGES[0], True, RANGES[2]], "PRIVATE_RANGES_STRING"] + for value in cases: + with self.subTest(ranges=value): + packet = copy.deepcopy(self.packet) + packet["capture"]["source"]["ranges"] = value + self.refuse(packet) + + def test_grid_dimensions_are_exact_integers_and_bound_all_declared_blocks(self): + for key, value in (("rowCount", 0), ("rowCount", -1), ("rowCount", True), + ("rowCount", 1002.0), ("rowCount", 1000), ("rowCount", 10000001), + ("columnCount", 11), ("columnCount", 13), ("columnCount", 12.0), + ("columnCount", True)): + with self.subTest(field=key, value=value): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + native["sheets"][0]["properties"]["gridProperties"][key] = value + replace_native(packet, native) + self.refuse(packet) + + def test_native_offsets_match_range_positions_and_refuse_boolean_float_or_missing_nonzero(self): + for block_index, key, value in ((0, "startRow", 1), (1, "startRow", 934), + (1, "startRow", True), (1, "startRow", 935.0), + (1, "startRow", -1), (1, "startRow", "935"), + (1, "startRow", None), (2, "startColumn", 1), + (2, "startColumn", False), (2, "startColumn", 0.0)): + with self.subTest(block=block_index, offset=key, value=value): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + block = native["sheets"][0]["data"][block_index] + if value is None: + del block[key] + else: + block[key] = value + replace_native(packet, native) + self.refuse(packet) + + def test_native_sheet_block_row_and_cell_shapes_and_cardinalities_are_enforced(self): + for fault in ("root_array", "no_sheet", "two_sheets", "no_block", "extra_block", "block_order", + "short_rows", "extra_rows", "short_cells", "extra_cells", "cell_not_object", + "row_not_object", "block_not_object", "missing_properties", "missing_grid"): + with self.subTest(fault=fault): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + sheet = native["sheets"][0] + blocks = sheet["data"] + if fault == "root_array": + native = [native] + elif fault == "no_sheet": + native["sheets"] = [] + elif fault == "two_sheets": + native["sheets"].append(copy.deepcopy(sheet)) + elif fault == "no_block": + blocks.pop() + elif fault == "extra_block": + blocks.append(copy.deepcopy(blocks[2])) + elif fault == "block_order": + blocks[1], blocks[2] = blocks[2], blocks[1] + elif fault == "short_rows": + blocks[1]["rowData"].pop() + elif fault == "extra_rows": + blocks[1]["rowData"].append(copy.deepcopy(blocks[1]["rowData"][0])) + elif fault == "short_cells": + blocks[2]["rowData"][0]["values"].pop() + elif fault == "extra_cells": + blocks[2]["rowData"][0]["values"].append({}) + elif fault == "cell_not_object": + blocks[2]["rowData"][0]["values"][10] = "PRIVATE_BAD_CELL" + elif fault == "row_not_object": + blocks[2]["rowData"][0] = [] + elif fault == "block_not_object": + blocks[2] = [] + elif fault == "missing_properties": + del sheet["properties"] + else: + del sheet["properties"]["gridProperties"] + replace_native(packet, native) + result = self.refuse(packet) + self.assertNotIn(b"PRIVATE_BAD_CELL", result.stderr) + + def test_all_formatted_cells_are_strings_including_private_and_unselected_cells(self): + for block_index, row_index, column in ((1, 0, 1), (1, 1, 10), (1, 1, 11), (2, 0, 3)): + for value in (None, True, 3, 3.0, ["PRIVATE_ARRAY_CELL"], {"PRIVATE_OBJECT_CELL": "value"}): + with self.subTest(block=block_index, row=row_index, column=column, value=value): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + native["sheets"][0]["data"][block_index]["rowData"][row_index]["values"][column]["formattedValue"] = value + replace_native(packet, native) + result = self.refuse(packet) + self.assertNotIn(b"PRIVATE_ARRAY_CELL", result.stderr) + self.assertNotIn(b"PRIVATE_OBJECT_CELL", result.stderr) + + def test_formatted_cell_limit_counts_utf8_bytes_in_public_private_and_unselected_rows(self): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + native["sheets"][0]["data"][1]["rowData"][1]["values"][1]["formattedValue"] = "λ" * 4096 + replace_native(packet, native) + self.accept(packet) + for block_index, row_index, column in ((1, 1, 1), (1, 0, 10), (2, 0, 11)): + with self.subTest(block=block_index, row=row_index, column=column): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + native["sheets"][0]["data"][block_index]["rowData"][row_index]["values"][column]["formattedValue"] = "λ" * 4096 + "x" + replace_native(packet, native) + self.refuse(packet) + + def test_forged_column_policies_cannot_publish_source_notes_priority_or_topics(self): + cases = [PUBLIC_COLUMNS + [name] for name in ("Source", "Notes", "Priority", "Topics / object tags")] + cases.extend([list(reversed(PUBLIC_COLUMNS)), PUBLIC_COLUMNS[:-1], + PUBLIC_COLUMNS[:-1] + ["Source"], PUBLIC_COLUMNS[:-1] + [PUBLIC_COLUMNS[0]], + PUBLIC_COLUMNS[:-1] + [True], "PRIVATE_COLUMNS_STRING"]) + for columns in cases: + with self.subTest(columns=columns): + packet = copy.deepcopy(self.packet) + packet["policy"]["columns"] = columns + self.refuse(packet) + + def test_policy_ids_are_nonempty_unique_valid_and_present_in_native_rows(self): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + boundary_id = "T" + "x" * 191 + native["sheets"][0]["data"][1]["rowData"][1]["values"][0]["formattedValue"] = boundary_id + packet["policy"]["artifact_ids"] = ["TEST-ZETA", boundary_id] + replace_native(packet, native) + self.accept(packet) + for ids in ([], ["TEST-UNKNOWN"], ["TEST-ALPHA", "TEST-ALPHA"], [""], [True], [1], + ["TEST\nID"], [" TEST-ALPHA"], "TEST-ALPHA", None): + with self.subTest(ids=ids): + packet = copy.deepcopy(self.packet) + packet["policy"]["artifact_ids"] = ids + self.refuse(packet) + + def test_artifact_ids_are_globally_unique_and_valid_even_on_unselected_native_rows(self): + for value in ("TEST-ALPHA", "TEST-ZETA", "", True, 1, " TEST-UNSELECTED", "TEST\nUNSELECTED", + "T" + "x" * 192, "TEST-é", "TEST/UNSELECTED"): + with self.subTest(unselected_id=value): + packet = copy.deepcopy(self.packet) + native = get_native(packet) + native["sheets"][0]["data"][2]["rowData"][0]["values"][0]["formattedValue"] = value + replace_native(packet, native) + self.refuse(packet) + + def test_graph_ids_and_bindings_require_explicit_known_unique_identities(self): + packet = copy.deepcopy(self.packet) + packet["graph_nodes"] = ["T" + "x" * 191] + self.accept(packet) + for nodes in (["TEST.node.a", "TEST.node.a"], [""], [True], [1], ["TEST\nnode"], + [" TEST.node.a"], ["T" + "x" * 192], ["TEST.é"], ["TEST/node"], "TEST.node.a", None): + with self.subTest(nodes=nodes): + packet = copy.deepcopy(self.packet) + packet["graph_nodes"] = nodes + self.refuse(packet) + cases = [ + [{"node_id": "TEST.unknown", "artifact_id": "TEST-ALPHA", "roles": ["source"]}], + [{"node_id": "TEST.node.a", "artifact_id": "TEST-UNSELECTED", "roles": ["source"]}], + [{"node_id": "TEST.node.a", "artifact_id": "TEST-UNKNOWN", "roles": ["source"]}], + [{"node_id": True, "artifact_id": "TEST-ALPHA", "roles": ["source"]}], + [{"node_id": "TEST.node.a", "artifact_id": True, "roles": ["source"]}], + [{"node_id": "TEST.node.a", "artifact_id": "TEST-ALPHA", "roles": ["source"]}, + {"node_id": "TEST.node.a", "artifact_id": "TEST-ALPHA", "roles": ["review"]}], + [True], {}, None, + ] + for bindings in cases: + with self.subTest(bindings=bindings): + packet = copy.deepcopy(self.packet) + packet["bindings"] = bindings + self.refuse(packet) + + def test_binding_roles_are_nonempty_unique_strings_from_the_exact_six_role_set(self): + for roles in ([], ["accepted"], ["Source"], ["source", "source"], ["kernel", True], + [1], "source", None): + with self.subTest(roles=roles): + packet = copy.deepcopy(self.packet) + packet["bindings"] = [{"node_id": "TEST.node.a", "artifact_id": "TEST-ALPHA", "roles": roles}] + self.refuse(packet) + + def test_collection_limits_accept_4096_and_refuse_4097_without_duplicate_shortcuts(self): + packet = copy.deepcopy(self.packet) + packet["graph_nodes"] = ["TEST.node.%04d" % index for index in range(4096)] + packet["bindings"] = [{"node_id": node, "artifact_id": "TEST-ALPHA", "roles": ["source"]} + for node in packet["graph_nodes"]] + self.accept(packet) + too_many = copy.deepcopy(packet) + too_many["graph_nodes"].append("TEST.node.4096") + self.refuse(too_many) + too_many = copy.deepcopy(packet) + too_many["bindings"].append({"node_id": "TEST.node.0000", "artifact_id": "TEST-ZETA", "roles": ["review"]}) + self.refuse(too_many) + for count in (4096, 4097): + with self.subTest(native_rows_and_policy_ids=count): + many = copy.deepcopy(self.packet) + ids = ["TEST-ROW-%04d" % index for index in range(count)] + native = synthetic_native() + native["sheets"][0]["properties"]["gridProperties"]["rowCount"] = count + 1 + native["sheets"][0]["data"] = [ + {"rowData": [row(HEADER)]}, + {"startRow": 1, "rowData": [row([artifact_id] + ["TEST value"] * 9 + + ["PRIVATE_MANY_SOURCE", "PRIVATE_MANY_NOTES"]) + for artifact_id in ids]}, + ] + many["capture"]["source"]["ranges"] = [RANGES[0], "'TEST Artifact Index'!A2:L%d" % (count + 1)] + many["policy"]["artifact_ids"] = ids + replace_native(many, native) + result = self.accept(many) if count == 4096 else self.refuse(many) + self.assertNotIn(b"PRIVATE_MANY_", result.stdout + result.stderr) + + def test_stdin_limit_is_16_mib_of_bytes_including_legal_json_whitespace(self): + raw = canonical(self.packet) + bounded = raw + b" " * (16 * 1024 * 1024 - len(raw)) + self.accept(raw=bounded) + self.refuse(raw=bounded + b" ") + + def test_decoded_capture_limit_is_4_mib_of_original_bytes_not_base64_length(self): + packet = copy.deepcopy(self.packet) + raw = base64.b64decode(packet["capture"]["raw_base64"]) + bounded = raw + b" " * (4 * 1024 * 1024 - len(raw)) + replace_raw(packet, bounded) + self.accept(packet) + replace_raw(packet, bounded + b" ") + self.refuse(packet) + + def test_duplicate_keys_refuse_in_packet_wrappers_and_native_private_annotations(self): + raw = canonical(self.packet) + mutations = [ + raw[:-1] + b',"schema_version":1}', + raw.replace(b'"schema_version":1', b'"schema_version":1,"schema_version":1', 1), + raw.replace(b'"capture_id":"TEST-capture-1"', b'"capture_id":"TEST-capture-1","capture_id":"TEST-capture-1"', 1), + raw.replace(b'"artifact_ids":[', b'"artifact_ids":[],"artifact_ids":[', 1), + ] + for index, changed in enumerate(mutations): + with self.subTest(packet_duplicate=index): + self.refuse(raw=changed, expected=self.pins) + for marker, replacement in ( + (b'"spreadsheetId":"TEST-R17-SPREADSHEET"', b'"spreadsheetId":"TEST-R17-SPREADSHEET","spreadsheetId":"TEST-R17-SPREADSHEET"'), + (b'"formattedValue":"TEST-ZETA"', b'"formattedValue":"TEST-ZETA","formattedValue":"TEST-ZETA"'), + (b'"privateAnnotation":"PRIVATE_NATIVE_ANNOTATION"', b'"privateAnnotation":{"x":1,"x":1}'), + ): + with self.subTest(native_duplicate=marker): + packet = copy.deepcopy(self.packet) + native_raw = base64.b64decode(packet["capture"]["raw_base64"]) + self.assertIn(marker, native_raw) + replace_raw(packet, native_raw.replace(marker, replacement, 1)) + self.refuse(packet) + + def test_nonfinite_numbers_and_numeric_overflow_refuse_even_in_unknown_native_annotations(self): + for token in (b"NaN", b"Infinity", b"-Infinity", b"1e9999"): + with self.subTest(token=token, location="native_annotation"): + packet = copy.deepcopy(self.packet) + raw = base64.b64decode(packet["capture"]["raw_base64"]) + raw = raw.replace(b'"privateAnnotation":"PRIVATE_NATIVE_ANNOTATION"', b'"privateAnnotation":' + token, 1) + replace_raw(packet, raw) + self.refuse(packet) + with self.subTest(token=token, location="packet_schema"): + raw = canonical(self.packet).replace(b'"schema_version":1', b'"schema_version":' + token, 1) + self.refuse(raw=raw, expected=self.pins) + + def test_json_nesting_is_bounded_in_unknown_native_annotations_without_schema_masking(self): + packet = copy.deepcopy(self.packet) + raw = base64.b64decode(packet["capture"]["raw_base64"]) + marker = b'"privateAnnotation":"PRIVATE_NATIVE_ANNOTATION"' + self.assertIn(marker, raw) + # The native root object plus 63 nested arrays occupies 64 levels. + bounded = b"[" * 63 + b"0" + b"]" * 63 + replace_raw(packet, raw.replace(marker, b'"privateAnnotation":' + bounded, 1)) + self.accept(packet) + # One root object plus 64 arrays is exactly one level over the limit. + deep = b"[" * 64 + b"0" + b"]" * 64 + replace_raw(packet, raw.replace(marker, b'"privateAnnotation":' + deep, 1)) + self.refuse(packet) + + def test_malformed_utf8_json_and_multiple_documents_refuse_at_both_input_layers(self): + for raw in (b"", b"{", b"[]", b"null", canonical(self.packet) + b"{}", b"\xff", + canonical(self.packet).replace(b"TEST-capture-1", b"TEST-\xff-capture", 1)): + with self.subTest(packet_raw=raw[:20]): + self.refuse(raw=raw, expected=self.pins) + for raw in (b"", b"{", b"null", b"\xff", native_bytes(synthetic_native()) + b"{}", + native_bytes(synthetic_native()).replace(b"PRIVATE_NATIVE_ANNOTATION", b"PRIVATE_\xff_NATIVE", 1)): + with self.subTest(native_raw=raw[:20]): + packet = copy.deepcopy(self.packet) + replace_raw(packet, raw) + self.refuse(packet) + + def test_base64_is_strict_canonical_and_not_merely_decodable_to_the_expected_bytes(self): + encoded = self.packet["capture"]["raw_base64"] + for value in ("", "!!PRIVATE_BAD_BASE64!!", encoded + "=", encoded + "\n", " " + encoded, + encoded[:-1], True, None): + with self.subTest(base64_type=type(value).__name__, value_prefix=str(value)[:20]): + packet = copy.deepcopy(self.packet) + packet["capture"]["raw_base64"] = value + result = self.refuse(packet, expected=self.pins) + self.assertNotIn(b"PRIVATE_BAD_BASE64", result.stderr) + packet = copy.deepcopy(self.packet) + raw = base64.b64decode(encoded) + raw += b" " * ((1 - len(raw)) % 3) + replace_raw(packet, raw) + canonical_encoded = packet["capture"]["raw_base64"] + self.assertTrue(canonical_encoded.endswith("==")) + alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + index = alphabet.index(canonical_encoded[-3]) + alternate = canonical_encoded[:-3] + alphabet[index + 1] + "==" + self.assertEqual(base64.b64decode(alternate, validate=True), raw) + expected = pins_for(packet) + self.accept(packet) + packet["capture"]["raw_base64"] = alternate + self.refuse(packet, expected=expected) + + def test_urls_paths_and_code_are_inert_data_without_fetch_execution_or_filesystem_writes(self): + requests = [] + + class Handler(http.server.BaseHTTPRequestHandler): + def do_GET(self): + requests.append(self.path) + self.send_response(200) + self.end_headers() + self.wfile.write(b"PRIVATE_FETCH_RESULT") + + def log_message(self, *args): + pass + + server = http.server.ThreadingHTTPServer(("127.0.0.1", 0), Handler) + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + try: + marker = self.workdir / "PRIVATE_EXECUTION_MARKER" + secret = self.workdir / "PRIVATE_LOCAL_SOURCE" + secret.write_text("PRIVATE_LOCAL_FILE_CONTENT", encoding="utf-8") + packet = copy.deepcopy(self.packet) + native = get_native(packet) + code = "__import__('pathlib').Path(%r).write_text('executed')" % str(marker) + url = "http://127.0.0.1:%d/PRIVATE_URL_PATH" % server.server_port + probe = "http://127.0.0.1:%d/TEST_OBSERVER_PROBE" % server.server_port + opener = urllib.request.build_opener(urllib.request.ProxyHandler({})) + with opener.open(probe, timeout=5) as response: + self.assertEqual(response.read(), b"PRIVATE_FETCH_RESULT") + self.assertEqual(requests, ["/TEST_OBSERVER_PROBE"]) + requests.clear() + public = "inert URL %s; inert code %s; path %s" % (url, code, secret) + values = native["sheets"][0]["data"][1]["rowData"][1]["values"] + values[1]["formattedValue"] = public + values[10]["formattedValue"] = url + values[11]["formattedValue"] = code + native["privateAnnotation"] = {"file": str(secret), "code": code, "url": url} + replace_native(packet, native) + before = sorted(path.name for path in self.workdir.iterdir()) + result = self.accept(packet, audit={"secret": secret}) + report = result.audit_report + labels = {"read", "write", "mkdir", "remove", "rename", "rmdir"} + self.assertEqual(set(report), {"calibration", "attempts", "optimize"}) + self.assertIs(type(report["optimize"]), int) + self.assertEqual(report["optimize"], sys.flags.optimize) + self.assertEqual(set(report["calibration"]), labels) + for count in report["calibration"].values(): + self.assertIs(type(count), int) + self.assertGreater(count, 0) + self.assertEqual(report["attempts"], dict.fromkeys(labels, 0)) + for count in report["attempts"].values(): + self.assertIs(type(count), int) + projected = json.loads(result.stdout) + self.assertEqual(projected["rows"][0]["fields"]["Title"], public) + self.assertEqual(requests, []) + self.assertFalse(marker.exists()) + self.assertEqual(secret.read_text(encoding="utf-8"), "PRIVATE_LOCAL_FILE_CONTENT") + self.assertEqual(sorted(path.name for path in self.workdir.iterdir()), before) + finally: + server.shutdown() + server.server_close() + thread.join(timeout=5) + + +if __name__ == "__main__": + unittest.main() From 9d623398c46791bdb0e98f93364c95f535d064ab Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 8 Oct 2026 16:10:02 -0700 Subject: [PATCH 02/37] Implement inert public Artifact Index projection after hosted missing-CLI RED --- architecture/artifact_index.py | 325 +++++++++++++++++++++++++++++++++ tools/artifact_index_export.py | 56 ++++++ 2 files changed, 381 insertions(+) create mode 100644 architecture/artifact_index.py create mode 100644 tools/artifact_index_export.py diff --git a/architecture/artifact_index.py b/architecture/artifact_index.py new file mode 100644 index 000000000..7cb920cf6 --- /dev/null +++ b/architecture/artifact_index.py @@ -0,0 +1,325 @@ +"""Project a pinned native Artifact Index capture into fixed public fields. + +This module treats captures as inert JSON data. It performs no I/O, interprets +no cell content, and authenticates no external custody or scientific status. +""" +from __future__ import annotations + +import base64 +from datetime import datetime +import hashlib +import json +import math +import re + + +STDIN_LIMIT = 16 * 1024 * 1024 +CAPTURE_LIMIT = 4 * 1024 * 1024 +DEPTH_LIMIT = 64 +COLLECTION_LIMIT = 4096 +CELL_LIMIT = 8192 +GRID_ROW_LIMIT = 10_000_000 + +HEADER = ( + "Artifact ID", "Title", "Org", "Class", "Priority", "Topics / object tags", + "Status", "Authority / canonical impact", "Dependencies or supersession", + "Modified UTC", "Source", "Notes", +) +PUBLIC_COLUMNS = ( + "Artifact ID", "Title", "Org", "Class", "Status", + "Authority / canonical impact", "Dependencies or supersession", "Modified UTC", +) +PUBLIC_INDICES = tuple(HEADER.index(column) for column in PUBLIC_COLUMNS) +ROLES = frozenset(("source", "review", "kernel", "computation", "alignment", "teaching-source")) +PIN_KEYS = frozenset(( + "capture_sha256", "metadata_sha256", "policy_sha256", + "bindings_sha256", "graph_nodes_sha256", +)) +IDENTIFIER = re.compile(r"[A-Za-z0-9][A-Za-z0-9_.:-]{0,191}") +SHA256 = re.compile(r"[0-9a-f]{64}") +UTC_SECOND = re.compile(r"([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z") + + +class ArtifactIndexRefused(ValueError): + """An opaque refusal whose message never includes caller data.""" + + def __init__(self): + super().__init__("ARTIFACT_INDEX_REFUSED") + + +def _require(condition): + if not condition: + raise ArtifactIndexRefused() + + +def _validate_json_value(value, depth=0): + """Validate JSON types, finite numbers, Unicode, and container depth.""" + kind = type(value) + if kind is dict: + _require(depth < DEPTH_LIMIT) + for key, child in value.items(): + _require(type(key) is str) + key.encode("utf-8", errors="strict") + _validate_json_value(child, depth + 1) + elif kind is list: + _require(depth < DEPTH_LIMIT) + for child in value: + _validate_json_value(child, depth + 1) + elif kind is str: + value.encode("utf-8", errors="strict") + elif kind is float: + _require(math.isfinite(value)) + else: + _require(kind in (int, bool, type(None))) + + +def _object_pairs(pairs): + result = {} + for key, value in pairs: + _require(key not in result) + result[key] = value + return result + + +def _nonfinite_constant(_token): + raise ArtifactIndexRefused() + + +def _finite_float(token): + value = float(token) + _require(math.isfinite(value)) + return value + + +def _strict_json(raw, limit): + try: + _require(type(raw) is bytes and 0 < len(raw) <= limit) + value = json.loads( + raw.decode("utf-8", errors="strict"), + object_pairs_hook=_object_pairs, + parse_constant=_nonfinite_constant, + parse_float=_finite_float, + ) + _validate_json_value(value) + return value + except Exception: + raise ArtifactIndexRefused() from None + + +def parse_packet(raw): + """Read one bounded strict JSON packet from caller-supplied bytes.""" + return _strict_json(raw, STDIN_LIMIT) + + +def canonical_json(value): + """Return deterministic ASCII JSON bytes, preserving array order/types.""" + try: + _validate_json_value(value) + return json.dumps( + value, sort_keys=True, separators=(",", ":"), + ensure_ascii=True, allow_nan=False, + ).encode("ascii") + except Exception: + raise ArtifactIndexRefused() from None + + +def _object(value, keys=None): + _require(type(value) is dict) + if keys is not None: + _require(value.keys() == keys) + return value + + +def _integer(value, minimum=0, maximum=None): + _require(type(value) is int and value >= minimum) + if maximum is not None: + _require(value <= maximum) + return value + + +def _identifier(value): + _require(type(value) is str and IDENTIFIER.fullmatch(value) is not None) + return value + + +def _bounded_list(value, minimum=0, maximum=COLLECTION_LIMIT): + _require(type(value) is list and minimum <= len(value) <= maximum) + return value + + +def _unique_identifiers(value, minimum=0): + values = _bounded_list(value, minimum) + seen = set() + for item in values: + _identifier(item) + _require(item not in seen) + seen.add(item) + return seen + + +def _expected_pins(expected): + _object(expected, PIN_KEYS) + for value in expected.values(): + _require(type(value) is str and SHA256.fullmatch(value) is not None) + + +def _capture_metadata(capture): + _object(capture, {"capture_id", "captured_at", "source", "raw_base64"}) + _identifier(capture["capture_id"]) + timestamp = capture["captured_at"] + _require(type(timestamp) is str) + match = UTC_SECOND.fullmatch(timestamp) + _require(match is not None) + # A numeric constructor checks calendar validity without parsing cell text. + datetime(*(int(part) for part in match.groups())) + source = _object(capture["source"], { + "spreadsheet_id", "worksheet_id", "title", "ranges", "cell_fields", + }) + _identifier(source["spreadsheet_id"]) + _integer(source["worksheet_id"]) + title = source["title"] + _require(type(title) is str and 0 < len(title.encode("utf-8")) <= 256) + _require("'" not in title and not any(ord(char) < 32 or 127 <= ord(char) <= 159 for char in title)) + _require(source["cell_fields"] == "formattedValue" and type(source["cell_fields"]) is str) + ranges = _bounded_list(source["ranges"], 1, COLLECTION_LIMIT + 1) + range_pattern = re.compile(r"'" + re.escape(title) + r"'!A([1-9][0-9]*):L([1-9][0-9]*)") + intervals = [] + prior_end = 0 + for declared in ranges: + _require(type(declared) is str) + match = range_pattern.fullmatch(declared) + _require(match is not None) + # Bounds precede integer conversion, including enormous decimal text. + _require(all(len(part) <= 8 for part in match.groups())) + first, last = (int(part) for part in match.groups()) + _require(prior_end < first <= last <= GRID_ROW_LIMIT) + intervals.append((first - 1, last)) + prior_end = last + _require(sum(stop - start for start, stop in intervals) <= COLLECTION_LIMIT + 1) + return source, intervals + + +def _capture_bytes(encoded): + _require(type(encoded) is str and 0 < len(encoded) <= 4 * ((CAPTURE_LIMIT + 2) // 3)) + raw = base64.b64decode(encoded.encode("ascii"), validate=True) + _require(0 < len(raw) <= CAPTURE_LIMIT) + _require(base64.b64encode(raw).decode("ascii") == encoded) + return raw + + +def _native_rows(native, source, intervals): + _object(native) + _require(type(native.get("spreadsheetId")) is str and native["spreadsheetId"] == source["spreadsheet_id"]) + sheets = _bounded_list(native.get("sheets"), 1, 1) + sheet = _object(sheets[0]) + properties = _object(sheet.get("properties")) + _integer(properties.get("sheetId")) + _require(properties["sheetId"] == source["worksheet_id"]) + _require(type(properties.get("title")) is str and properties["title"] == source["title"]) + grid = _object(properties.get("gridProperties")) + row_count = _integer(grid.get("rowCount"), 1, GRID_ROW_LIMIT) + _require(_integer(grid.get("columnCount"), 1) == len(HEADER)) + blocks = _bounded_list(sheet.get("data"), len(intervals), len(intervals)) + rows_by_id = {} + header_count = 0 + for block, (start, stop) in zip(blocks, intervals): + _object(block) + _require(stop <= row_count) + _require(_integer(block.get("startRow", 0)) == start) + _require(_integer(block.get("startColumn", 0)) == 0) + rows = _bounded_list(block.get("rowData"), stop - start, stop - start) + for offset, row in enumerate(rows): + _object(row) + cells = _bounded_list(row.get("values"), len(HEADER), len(HEADER)) + values = [] + for cell in cells: + _object(cell) + value = cell.get("formattedValue", "") + _require(type(value) is str and len(value.encode("utf-8")) <= CELL_LIMIT) + values.append(value) + position = start + offset + if position == 0: + _require(values == list(HEADER)) + header_count += 1 + else: + artifact_id = _identifier(values[0]) + _require(artifact_id not in rows_by_id) + rows_by_id[artifact_id] = (position + 1, values) + _require(len(rows_by_id) <= COLLECTION_LIMIT) + _require(header_count == 1) + return rows_by_id + + +def _project(packet, expected): + _validate_json_value(packet) + _expected_pins(expected) + _object(packet, {"schema_version", "capture", "policy", "bindings", "graph_nodes"}) + _require(_integer(packet["schema_version"]) == 1) + capture = packet["capture"] + source, intervals = _capture_metadata(capture) + raw = _capture_bytes(capture["raw_base64"]) + metadata = {key: value for key, value in capture.items() if key != "raw_base64"} + identities = { + "capture_sha256": hashlib.sha256(raw).hexdigest(), + "metadata_sha256": hashlib.sha256(canonical_json(metadata)).hexdigest(), + "policy_sha256": hashlib.sha256(canonical_json(packet["policy"])).hexdigest(), + "bindings_sha256": hashlib.sha256(canonical_json(packet["bindings"])).hexdigest(), + "graph_nodes_sha256": hashlib.sha256(canonical_json(packet["graph_nodes"])).hexdigest(), + } + _require(identities == expected) + policy = _object(packet["policy"], {"schema_version", "artifact_ids", "columns"}) + _require(_integer(policy["schema_version"]) == 1) + _require(type(policy["columns"]) is list and policy["columns"] == list(PUBLIC_COLUMNS)) + selected = _unique_identifiers(policy["artifact_ids"], 1) + graph_nodes = _unique_identifiers(packet["graph_nodes"]) + bindings = [] + pairs = set() + bound_nodes = set() + for binding in _bounded_list(packet["bindings"]): + _object(binding, {"node_id", "artifact_id", "roles"}) + node = _identifier(binding["node_id"]) + artifact = _identifier(binding["artifact_id"]) + _require(node in graph_nodes and artifact in selected) + roles = _bounded_list(binding["roles"], 1, len(ROLES)) + _require(all(type(role) is str and role in ROLES for role in roles)) + _require(len(set(roles)) == len(roles)) + pair = (node, artifact) + _require(pair not in pairs) + pairs.add(pair) + bound_nodes.add(node) + bindings.append({"node_id": node, "artifact_id": artifact, "roles": sorted(roles)}) + native = _strict_json(raw, CAPTURE_LIMIT) + native_rows = _native_rows(native, source, intervals) + _require(selected <= native_rows.keys()) + rows = [] + for artifact in sorted(selected): + source_row, values = native_rows[artifact] + rows.append({ + "artifact_id": artifact, "source_row": source_row, + "fields": {column: values[index] for column, index in zip(PUBLIC_COLUMNS, PUBLIC_INDICES)}, + }) + return { + "schema_version": 1, "scientific_effect": "NONE", + "scientific_status_authority": False, "custody": "unknown", + "source": { + "capture_id": capture["capture_id"], "captured_at": capture["captured_at"], + "spreadsheet_id": source["spreadsheet_id"], "worksheet_id": source["worksheet_id"], + "worksheet_title": source["title"], "ranges": list(source["ranges"]), + "cell_fields": source["cell_fields"], "representation": "native-api-formattedValue-json", + }, + "identities": identities, "columns": list(PUBLIC_COLUMNS), "rows": rows, + "bindings": sorted(bindings, key=lambda item: (item["node_id"], item["artifact_id"])), + "unmapped_nodes": sorted(graph_nodes - bound_nodes), + } + + +def project_artifact_index(packet, expected): + """Return the exact public projection, or raise an opaque refusal. + + Independent expected pins are mandatory; no expectation is learned from + the packet. Input objects are not mutated and private data is not returned. + """ + try: + return _project(packet, expected) + except Exception: + raise ArtifactIndexRefused() from None diff --git a/tools/artifact_index_export.py b/tools/artifact_index_export.py new file mode 100644 index 000000000..2ce248406 --- /dev/null +++ b/tools/artifact_index_export.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Emit a pinned Artifact Index public projection from stdin only.""" +from __future__ import annotations + +import os +import sys + +# Keep the CLI's own imports read-only even if a caller omits Python's -B flag. +sys.dont_write_bytecode = True +# Resolve only the trusted source location lexically, never a caller path. +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from architecture.artifact_index import ( + ArtifactIndexRefused, SHA256, STDIN_LIMIT, canonical_json, parse_packet, + project_artifact_index, +) + + +FLAGS = { + "--expected-capture-sha256": "capture_sha256", + "--expected-metadata-sha256": "metadata_sha256", + "--expected-policy-sha256": "policy_sha256", + "--expected-bindings-sha256": "bindings_sha256", + "--expected-graph-nodes-sha256": "graph_nodes_sha256", +} + + +def _arguments(arguments): + if len(arguments) != 2 * len(FLAGS): + raise ArtifactIndexRefused() + expected = {} + for index in range(0, len(arguments), 2): + flag, value = arguments[index:index + 2] + name = FLAGS.get(flag) + if name is None or name in expected or SHA256.fullmatch(value) is None: + raise ArtifactIndexRefused() + expected[name] = value + return expected + + +def main(): + try: + expected = _arguments(sys.argv[1:]) + raw = sys.stdin.buffer.read(STDIN_LIMIT + 1) + packet = parse_packet(raw) + projection = project_artifact_index(packet, expected) + output = canonical_json(projection) + b"\n" + except Exception: + sys.stderr.buffer.write(b"ARTIFACT_INDEX_REFUSED\n") + return 1 + sys.stdout.buffer.write(output) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From e46a0ef99aaa64b94bcddd93c1025e40ce1a0d33 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Wed, 14 Oct 2026 14:26:58 -0500 Subject: [PATCH 03/37] docs: clarify formal work routing and historical pilot boundaries Address N1/N4 from main#393 review5520608423 in the guide only. Actual author: OpenAI / GPT-6 Astra Pro, Research task-loop RLOOP-FORMAL-N1N4-20261014, pickup6176380603. Current-base reconciliation6176524690 preserves tested source bytes. Scientific effect NONE; no proof, manifest, gate or status changes. --- docs/FORMAL_VERIFICATION.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/FORMAL_VERIFICATION.md b/docs/FORMAL_VERIFICATION.md index acae67ccc..99239ece9 100644 --- a/docs/FORMAL_VERIFICATION.md +++ b/docs/FORMAL_VERIFICATION.md @@ -6,14 +6,16 @@ Owner directive: Dylan Roy, 27 September 2026. Scientific effect: **NONE**. This dated note is contributor routing only. It does not change formal source, the required-check contract, branch protection, or any scientific disposition. A merge or green check is not theorem acceptance. -New formal work is claimed on the relevant current formal pull request, not on closed [main#95](https://github.com/d6g8k5htny-coder/main/issues/95). Use [main#275](https://github.com/d6g8k5htny-coder/main/issues/275) and [main#307](https://github.com/d6g8k5htny-coder/main/issues/307) for discovery and coordination. Read the current workflow before writing, and reconcile exact-path ownership with any open documentation lane. +New formal work is claimed in the relevant current formal pull request or work discussion, not on closed [main#95](https://github.com/d6g8k5htny-coder/main/issues/95). Work without a pull request uses the relevant work discussion. Use [main#275](https://github.com/d6g8k5htny-coder/main/issues/275) for tasks and claims and [main#307](https://github.com/d6g8k5htny-coder/main/issues/307) for coordination. Read the [current workflow](../governance/OP-WORKFLOW-20260930.md) before writing, and reconcile exact-path ownership with any open documentation lane. Later formal companions, kept distinct from the September scalar pilot: - Landed cap companion: [Math- `frontiers/cap_first_exit_lean_20261002/README.md` at `7d2f62500ad6effba2bbdf6f3b89b0826408dc4a`](https://github.com/d6g8k5htny-coder/Math-/blob/7d2f62500ad6effba2bbdf6f3b89b0826408dc4a/frontiers/cap_first_exit_lean_20261002/README.md) (README blob `4f5e1bf09f3ae7acf8dc60289697f40baecba56c`, as cited by main#286). This is a conditional deterministic formal companion, not kernel evidence for the full probability or persistence-module theorem. - Retained formal interfaces: [Math-#193](https://github.com/d6g8k5htny-coder/Math-/issues/193). -The September pilot history below, including its original source identities and failed hosted build, stays unchanged as historical evidence. +The evidence distinctions in "One proof, several separate questions" below explain the separate questions that formal evidence addresses. The September pilot's origin, implementation, execution snapshot and standing instructions are retained as historical evidence, including their original source identities and failed hosted build. Current execution and enforcement requirements are specified in the [required-check contract](FORMAL_REQUIRED_CHECKS.md). + +**September 2026 origin — original wording:** This extends the existing [formal-ladder work item #95](https://github.com/d6g8k5htny-coder/main/issues/95). It does not renumber that ladder, replace the scientific-status authority, or retroactively describe reviewed informal proofs as formal proofs. @@ -41,6 +43,8 @@ The first hosted build exposed three compilation defects. Original source bytes ## Gate and trust boundary +*September 2026 pilot execution snapshot. The counts below are historical; current enforcement is specified in the [required-check contract](FORMAL_REQUIRED_CHECKS.md).* + The source-only gate checks hashes and inventory; it is not a Lean run. Execution additionally performs a fresh local-package build, `leanchecker`, complete `#print axioms` reports, elaborated-type capture and five real negative controls. `sorryAx`, custom axioms and native-computation axioms are rejected; the only allowed foundational axioms are `propext`, `Classical.choice` and `Quot.sound`. Actual installed dependency commits are compared with the lock. Missing evidence fails closed. The controls include false fold and power inequalities, a `sorry` proof, an indirect custom axiom and a native-computation proof. The Python gate has 38 tests in both normal and optimized mode. A receipt is emitted only after the execution checks succeed, and identifies the exact Git commit, environment, manifest, logs and results. Treat a caller-supplied JSON receipt as untrusted until matched to the actual trusted workflow. @@ -49,7 +53,7 @@ The controls include false fold and power inequalities, a `sorry` proof, an indi ## Historical standing instructions (September 2026 pilot) -The following offer table is retained as the September pilot record. It is not the current claim route. Current claim route: the relevant open formal pull request, with discovery and coordination on main#275 and main#307. Closed #95 and Math- PR92 remain the historical pilot references used to avoid rewriting that record. +The following offer table is retained as the September pilot record. It is not the current claim route. Current claim route: the relevant current formal pull request or work discussion, with tasks and claims on main#275 and coordination on main#307. Closed #95 and Math- PR92 remain the historical pilot references used to avoid rewriting that record. Use #95 and PR92 to claim work and avoid duplicate writers. The OpenAI implementation author does not supply independent review credit. Read the exact head before reviewing; changed source, scope or dependencies invalidate the prior alignment record. From 12f410efa7959a1e218e134017205697e4d425b4 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 16:43:22 +0000 Subject: [PATCH 04/37] site: allow same-origin connect-src on reproduce/cite (F1) + CSP test (F9) Co-authored-by: Dylan Roy --- docs/site/app.js | 6 ++-- docs/site/atlas.mjs | 4 +-- docs/site/brand.css | 2 +- docs/site/cite.html | 10 +++--- docs/site/cite.mjs | 2 +- docs/site/conditionals.mjs | 2 +- docs/site/current-model.mjs | 2 +- docs/site/current.mjs | 2 +- docs/site/curvature-export.mjs | 2 +- docs/site/dependencies.html | 16 ++++----- docs/site/dependencies.mjs | 2 +- docs/site/explore-models.mjs | 2 +- docs/site/explore.html | 14 ++++---- docs/site/explore.mjs | 12 +++---- docs/site/formal.html | 8 ++--- docs/site/index.html | 8 ++--- docs/site/measure.html | 14 ++++---- docs/site/measure.mjs | 2 +- docs/site/museum.html | 10 +++--- docs/site/museum.mjs | 6 ++-- .../nodes/eng.d0-packet-allowlist-fix.html | 2 +- docs/site/nodes/eng.hard-gate.html | 2 +- docs/site/nodes/eng.main-pr87-crosswalk.html | 2 +- docs/site/nodes/hist.ALLCELL-FDZ-Q4.html | 2 +- docs/site/nodes/hist.CH-LIFT.html | 2 +- ...CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html | 2 +- docs/site/nodes/hist.ENV-RESCOV.html | 2 +- docs/site/nodes/hist.LOGQ-TAIL.html | 2 +- docs/site/nodes/hist.OBL-H5-JETMOD.html | 2 +- docs/site/nodes/hist.Piece-2-annulus.html | 2 +- docs/site/nodes/hist.SYM-Fw-jet.html | 2 +- .../hist.allcell_fdz_enclosures.json.html | 2 +- docs/site/nodes/hist.lemma_closed.html | 2 +- docs/site/nodes/hist.rnu_env.py.html | 2 +- docs/site/nodes/index.html | 2 +- .../math.d1-component.congruence-erratum.html | 2 +- ...math.d1-component.marked-cylinder-cap.html | 2 +- ...th.d1-component.reconciliation-record.html | 2 +- ...1-component.section9-replacement-v1_1.html | 2 +- .../math.d5-component.annulus-proof.html | 2 +- .../math.d5-component.annulus-review.html | 2 +- .../nodes/math.d5-component.collar-proof.html | 2 +- .../math.d5-component.collar-review.html | 2 +- .../math.d5-component.i5-review-claude.html | 2 +- .../math.d5-component.i5-review-xai.html | 2 +- ...5-component.intermediate-window-proof.html | 2 +- ...component.offpin-second-moment-review.html | 2 +- ...mponent.punctured-pin-continuum-check.html | 2 +- ...ponent.punctured-pin-continuum-review.html | 2 +- ...math.d5-component.punctured-pin-proof.html | 2 +- ...d5-component.punctured-pin-review-111.html | 2 +- ...math.d5-component.remote-window-proof.html | 2 +- ...math.d5-pin-neighborhood-first-moment.html | 2 +- docs/site/nodes/math.lifetime-remainder.html | 2 +- docs/site/nodes/math.p15-full-price.html | 2 +- docs/site/nodes/math.p15-price-boundary.html | 2 +- docs/site/nodes/math.rn-count-interface.html | 2 +- .../nodes/math.rn-fixed-annulus-window.html | 2 +- .../nodes/math.rn-fixed-remote-window.html | 2 +- .../nodes/math.rn-mesoscopic-reduction.html | 2 +- .../math.rn-region.fixed-annulus-window.html | 2 +- .../nodes/math.rn-region.fixed-remote.html | 2 +- .../math.rn-region.intermediate-r-to-rho.html | 2 +- ...h.rn-region.mesoscopic-scaled-annulus.html | 2 +- .../nodes/math.rn-region.pin-collision.html | 2 +- .../math.rn-region.witness-collision.html | 2 +- .../math.rn-selector-region-crosswalk.html | 2 +- docs/site/nodes/math.side24-coefficient.html | 2 +- .../math.uniform-matrix-cap-lifetime.html | 2 +- ...regional.fixed-annulus.high-jet-route.html | 2 +- docs/site/palette-export.mjs | 4 +-- docs/site/pin-export.mjs | 4 +-- docs/site/reproduce.html | 10 +++--- docs/site/research.html | 4 +-- .../nodes/eng.d0-packet-allowlist-fix.html | 2 +- .../nodes/eng.hard-gate.html | 2 +- .../nodes/eng.main-pr87-crosswalk.html | 2 +- .../nodes/hist.ALLCELL-FDZ-Q4.html | 2 +- .../nodes/hist.CH-LIFT.html | 2 +- ...CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html | 2 +- .../nodes/hist.ENV-RESCOV.html | 2 +- .../nodes/hist.LOGQ-TAIL.html | 2 +- .../nodes/hist.OBL-H5-JETMOD.html | 2 +- .../nodes/hist.Piece-2-annulus.html | 2 +- .../nodes/hist.SYM-Fw-jet.html | 2 +- .../hist.allcell_fdz_enclosures.json.html | 2 +- .../nodes/hist.lemma_closed.html | 2 +- .../nodes/hist.rnu_env.py.html | 2 +- .../nodes/index.html | 2 +- .../math.d1-component.congruence-erratum.html | 2 +- ...math.d1-component.marked-cylinder-cap.html | 2 +- ...th.d1-component.reconciliation-record.html | 2 +- ...1-component.section9-replacement-v1_1.html | 2 +- .../math.d5-component.annulus-proof.html | 2 +- .../math.d5-component.annulus-review.html | 2 +- .../nodes/math.d5-component.collar-proof.html | 2 +- .../math.d5-component.collar-review.html | 2 +- .../math.d5-component.i5-review-claude.html | 2 +- .../math.d5-component.i5-review-xai.html | 2 +- ...5-component.intermediate-window-proof.html | 2 +- ...component.offpin-second-moment-review.html | 2 +- ...mponent.punctured-pin-continuum-check.html | 2 +- ...ponent.punctured-pin-continuum-review.html | 2 +- ...math.d5-component.punctured-pin-proof.html | 2 +- ...d5-component.punctured-pin-review-111.html | 2 +- ...math.d5-component.remote-window-proof.html | 2 +- ...math.d5-pin-neighborhood-first-moment.html | 2 +- .../nodes/math.lifetime-remainder.html | 2 +- .../nodes/math.p15-full-price.html | 2 +- .../nodes/math.p15-price-boundary.html | 2 +- .../nodes/math.rn-count-interface.html | 2 +- .../nodes/math.rn-fixed-annulus-window.html | 2 +- .../nodes/math.rn-fixed-remote-window.html | 2 +- .../nodes/math.rn-mesoscopic-reduction.html | 2 +- .../math.rn-region.fixed-annulus-window.html | 2 +- .../nodes/math.rn-region.fixed-remote.html | 2 +- .../math.rn-region.intermediate-r-to-rho.html | 2 +- ...h.rn-region.mesoscopic-scaled-annulus.html | 2 +- .../nodes/math.rn-region.pin-collision.html | 2 +- .../math.rn-region.witness-collision.html | 2 +- .../math.rn-selector-region-crosswalk.html | 2 +- .../nodes/math.side24-coefficient.html | 2 +- .../math.uniform-matrix-cap-lifetime.html | 2 +- ...regional.fixed-annulus.high-jet-route.html | 2 +- .../nodes/eng.d0-packet-allowlist-fix.html | 2 +- .../nodes/eng.hard-gate.html | 2 +- .../nodes/eng.main-pr87-crosswalk.html | 2 +- .../nodes/hist.ALLCELL-FDZ-Q4.html | 2 +- .../nodes/hist.CH-LIFT.html | 2 +- ...CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html | 2 +- .../nodes/hist.ENV-RESCOV.html | 2 +- .../nodes/hist.LOGQ-TAIL.html | 2 +- .../nodes/hist.OBL-H5-JETMOD.html | 2 +- .../nodes/hist.Piece-2-annulus.html | 2 +- .../nodes/hist.SYM-Fw-jet.html | 2 +- .../hist.allcell_fdz_enclosures.json.html | 2 +- .../nodes/hist.lemma_closed.html | 2 +- .../nodes/hist.rnu_env.py.html | 2 +- .../nodes/index.html | 2 +- .../math.d1-component.congruence-erratum.html | 2 +- ...math.d1-component.marked-cylinder-cap.html | 2 +- ...th.d1-component.reconciliation-record.html | 2 +- ...1-component.section9-replacement-v1_1.html | 2 +- .../math.d5-component.annulus-proof.html | 2 +- .../math.d5-component.annulus-review.html | 2 +- .../nodes/math.d5-component.collar-proof.html | 2 +- .../math.d5-component.collar-review.html | 2 +- .../math.d5-component.i5-review-claude.html | 2 +- .../math.d5-component.i5-review-xai.html | 2 +- ...5-component.intermediate-window-proof.html | 2 +- ...component.offpin-second-moment-review.html | 2 +- ...mponent.punctured-pin-continuum-check.html | 2 +- ...ponent.punctured-pin-continuum-review.html | 2 +- ...math.d5-component.punctured-pin-proof.html | 2 +- ...d5-component.punctured-pin-review-111.html | 2 +- ...math.d5-component.remote-window-proof.html | 2 +- ...math.d5-pin-neighborhood-first-moment.html | 2 +- .../nodes/math.lifetime-remainder.html | 2 +- .../nodes/math.p15-full-price.html | 2 +- .../nodes/math.p15-price-boundary.html | 2 +- .../nodes/math.rn-count-interface.html | 2 +- .../nodes/math.rn-fixed-annulus-window.html | 2 +- .../nodes/math.rn-fixed-remote-window.html | 2 +- .../nodes/math.rn-mesoscopic-reduction.html | 2 +- .../math.rn-region.fixed-annulus-window.html | 2 +- .../nodes/math.rn-region.fixed-remote.html | 2 +- .../math.rn-region.intermediate-r-to-rho.html | 2 +- ...h.rn-region.mesoscopic-scaled-annulus.html | 2 +- .../nodes/math.rn-region.pin-collision.html | 2 +- .../math.rn-region.witness-collision.html | 2 +- .../math.rn-selector-region-crosswalk.html | 2 +- .../nodes/math.side24-coefficient.html | 2 +- .../math.uniform-matrix-cap-lifetime.html | 2 +- ...regional.fixed-annulus.high-jet-route.html | 2 +- docs/site/workspace.html | 10 +++--- tests/test_site_csp.py | 34 +++++++++++++++++++ 176 files changed, 263 insertions(+), 229 deletions(-) create mode 100644 tests/test_site_csp.py diff --git a/docs/site/app.js b/docs/site/app.js index ea7399e5b..7205e039b 100644 --- a/docs/site/app.js +++ b/docs/site/app.js @@ -1,6 +1,6 @@ -import {verifiedJSON, verifiedBytes, validateStatus, validateCoefficient, safeSourceURL, hex40, hex64} from './core.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {connectCatalogQuery} from './catalog-query.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {prepareWorkspaceFragment} from './workspace-fragment.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {verifiedJSON, verifiedBytes, validateStatus, validateCoefficient, safeSourceURL, hex40, hex64} from './core.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import {connectCatalogQuery} from './catalog-query.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import {prepareWorkspaceFragment} from './workspace-fragment.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const finishFragment=prepareWorkspaceFragment(); const el=id=>document.getElementById(id); const node=(tag,text,cls)=>{const n=document.createElement(tag);if(text!==undefined)n.textContent=text;if(cls)n.className=cls;return n;}; diff --git a/docs/site/atlas.mjs b/docs/site/atlas.mjs index 628d55ef9..69ab25ca3 100644 --- a/docs/site/atlas.mjs +++ b/docs/site/atlas.mjs @@ -1,5 +1,5 @@ -import {currentSnapshot,element,anchor} from './current.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {hasNode,readState,neighborhood,searchGraph,downstreamReach,requiredDependencyPaths,REQUIRED_ROUTE_SEMANTICS,evidenceAxes,sourceURL,sourceForNode,nodePage} from './current-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {currentSnapshot,element,anchor} from './current.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import {hasNode,readState,neighborhood,searchGraph,downstreamReach,requiredDependencyPaths,REQUIRED_ROUTE_SEMANTICS,evidenceAxes,sourceURL,sourceForNode,nodePage} from './current-model.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const byId=id=>document.getElementById(id); const svgElement=(tag,attrs)=>{const n=document.createElementNS('http://www.w3.org/2000/svg',tag);for(const [k,v]of Object.entries(attrs))n.setAttribute(k,String(v));return n;}; function linkRecord(label,value){const p=element('p');if(typeof value==='string'){try{const u=new URL(value);if(u.protocol==='https:'&&u.hostname==='github.com'&&!u.username&&!u.password&&!u.port){p.append(anchor(label,value));return p;}}catch{}}p.textContent=`${label}: ${value||'not recorded'}`;return p;} diff --git a/docs/site/brand.css b/docs/site/brand.css index 26b6d7a0a..f063e675d 100644 --- a/docs/site/brand.css +++ b/docs/site/brand.css @@ -60,7 +60,7 @@ body > header { color: var(--ul-text); font-weight: 750; letter-spacing: .13em; position: relative; padding-left: 57px; min-height: 44px; line-height: 1.65; } -.brand::before { content: ""; position: absolute; left: 0; top: 1px; width: 42px; height: 42px; background: url("brand/mark.svg?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc") center/contain no-repeat; } +.brand::before { content: ""; position: absolute; left: 0; top: 1px; width: 42px; height: 42px; background: url("brand/mark.svg?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53") center/contain no-repeat; } .brand span { color: var(--ul-muted); font-size: 12px; letter-spacing: .16em; text-transform: uppercase; } nav { gap: 12px 24px; flex-wrap: wrap; } nav a { color: var(--ul-text); min-height: 44px; display: inline-flex; align-items: center; font-size: 13px; padding: 0 6px; margin: 0 -6px; } diff --git a/docs/site/cite.html b/docs/site/cite.html index 79060bacf..7eca73422 100644 --- a/docs/site/cite.html +++ b/docs/site/cite.html @@ -2,12 +2,12 @@ - + Cite · Universal Law - - - - + + + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/cite.mjs b/docs/site/cite.mjs index 139a92fe8..dfd11fc96 100644 --- a/docs/site/cite.mjs +++ b/docs/site/cite.mjs @@ -1,4 +1,4 @@ -import {wireReferenceForm} from './source-reference.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {wireReferenceForm} from './source-reference.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const byId = id => document.getElementById(id); wireReferenceForm({form:byId('reference-form'), repository:byId('reference-repository'), commit:byId('reference-commit'), path:byId('reference-path'), sha256:byId('reference-sha256'), output:byId('reference-output'), json:byId('reference-json'), bibtex:byId('reference-bibtex'), link:byId('reference-link'), status:byId('reference-status'), actions:byId('reference-actions'), copyText:byId('reference-copy'), copyJSON:byId('reference-copy-json'), copyBibTeX:byId('reference-copy-bibtex'), share:byId('reference-share'), clipboard:globalThis.navigator?.clipboard, location:globalThis.location, history:globalThis.history, events:globalThis.window}); byId('reference-builder').hidden = false; diff --git a/docs/site/conditionals.mjs b/docs/site/conditionals.mjs index 9fc4067e8..6d652283b 100644 --- a/docs/site/conditionals.mjs +++ b/docs/site/conditionals.mjs @@ -93,7 +93,7 @@ export function renderProjection(document,host,data,source){ el(document,'p','Generated from verified source bytes. This graph is not formal verification, a proof review, or a scientific-status register.')); host.replaceChildren(article); } -const services=()=>import('./museum.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'); +const services=()=>import('./museum.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'); // The museum module already verifies config → manifest → index/status once per // page fetch and caches every pinned byte request. This route consumes that same // verified startup, so it adds only the audited-descriptor check and projection. diff --git a/docs/site/current-model.mjs b/docs/site/current-model.mjs index 45e3bba4a..6453357de 100644 --- a/docs/site/current-model.mjs +++ b/docs/site/current-model.mjs @@ -1,4 +1,4 @@ -import {OPEN_CLASSIFICATIONS, NON_RESEARCH_KINDS} from './dependency-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {OPEN_CLASSIFICATIONS, NON_RESEARCH_KINDS} from './dependency-model.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const REPOSITORIES = new Set(['d6g8k5htny-coder/main','d6g8k5htny-coder/Math-']); const SHA = /^[0-9a-f]{40}$/; diff --git a/docs/site/current.mjs b/docs/site/current.mjs index e24b53d00..fba636169 100644 --- a/docs/site/current.mjs +++ b/docs/site/current.mjs @@ -1,4 +1,4 @@ -import {parseVerifiedSnapshot,freshness,filterSources,sourceURL} from './current-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {parseVerifiedSnapshot,freshness,filterSources,sourceURL} from './current-model.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; export function element(tag,text,className) { const e=document.createElement(tag);if(text!==undefined)e.textContent=text;if(className)e.className=className;return e; } diff --git a/docs/site/curvature-export.mjs b/docs/site/curvature-export.mjs index 4e099c092..dcb751f2d 100644 --- a/docs/site/curvature-export.mjs +++ b/docs/site/curvature-export.mjs @@ -1,6 +1,6 @@ // Bounded, local export of the Peaks and saddles teaching diagram. No source fetch // or proof verification occurs here; the identity below is recorded provenance. -import { coneModel } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { coneModel } from './explore-models.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const SVG_NS = 'http://www.w3.org/2000/svg'; const PUBLIC_EXPLORE = 'https://d6g8k5htny-coder.github.io/main/site/explore.html'; diff --git a/docs/site/dependencies.html b/docs/site/dependencies.html index db7e31b19..334d066dc 100644 --- a/docs/site/dependencies.html +++ b/docs/site/dependencies.html @@ -7,14 +7,14 @@ Mathematics · Universal Law - - - - - - - - + + + + + + + + diff --git a/docs/site/dependencies.mjs b/docs/site/dependencies.mjs index 553478d67..7ce99de3c 100644 --- a/docs/site/dependencies.mjs +++ b/docs/site/dependencies.mjs @@ -12,7 +12,7 @@ import { recordedContextRows, recordedReviewText, unresolvedTargets, -} from './dependency-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +} from './dependency-model.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const byId = id => document.getElementById(id); diff --git a/docs/site/explore-models.mjs b/docs/site/explore-models.mjs index b148a272a..2184c316c 100644 --- a/docs/site/explore-models.mjs +++ b/docs/site/explore-models.mjs @@ -1,6 +1,6 @@ // NON-CERTIFYING educational arithmetic. These functions illustrate source // definitions; they do not simulate a field or estimate a theorem's constants. -import { annulusModel, p15Model, remoteModel } from './geometry.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { annulusModel, p15Model, remoteModel } from './geometry.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; function finite(value, name) { if (!Number.isFinite(value)) throw new RangeError(`${name} must be finite`); diff --git a/docs/site/explore.html b/docs/site/explore.html index 351e74bbf..8da4839e0 100644 --- a/docs/site/explore.html +++ b/docs/site/explore.html @@ -7,13 +7,13 @@ Explore the mathematics · Universal Law - - - - - - - + + + + + + + diff --git a/docs/site/explore.mjs b/docs/site/explore.mjs index ea550772a..fc58071bf 100644 --- a/docs/site/explore.mjs +++ b/docs/site/explore.mjs @@ -1,10 +1,10 @@ -import { coneModel, pinModel, paletteModel, applyCurvaturePreset } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { readExploreState, exploreStateURL } from './explore-state.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { coneModel, pinModel, paletteModel, applyCurvaturePreset } from './explore-models.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import { readExploreState, exploreStateURL } from './explore-state.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; -import { captureCurvatureDiagram, serializeCurvatureSVG, createCitationController } from './curvature-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { captureTeachingDiagram, createFigureCitationController } from './teaching-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializePinSVG, pinFigureCitation } from './pin-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializePaletteSVG, paletteFigureCitation } from './palette-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { captureCurvatureDiagram, serializeCurvatureSVG, createCitationController } from './curvature-export.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import { captureTeachingDiagram, createFigureCitationController } from './teaching-export.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import { serializePinSVG, pinFigureCitation } from './pin-export.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import { serializePaletteSVG, paletteFigureCitation } from './palette-export.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const ns = 'http://www.w3.org/2000/svg'; const byId = id => document.getElementById(id); diff --git a/docs/site/formal.html b/docs/site/formal.html index 4fdca62d1..87e4a5e3a 100644 --- a/docs/site/formal.html +++ b/docs/site/formal.html @@ -5,11 +5,11 @@ Formal verification · Universal Law - - - + + + - + diff --git a/docs/site/index.html b/docs/site/index.html index 116fdcd66..4436688e9 100644 --- a/docs/site/index.html +++ b/docs/site/index.html @@ -4,10 +4,10 @@ The shape of randomness · Universal Law - - - - + + + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/measure.html b/docs/site/measure.html index 2d9536951..18baee042 100644 --- a/docs/site/measure.html +++ b/docs/site/measure.html @@ -7,13 +7,13 @@ From counts to density · Universal Law - - - - - - - + + + + + + + diff --git a/docs/site/measure.mjs b/docs/site/measure.mjs index 8b7f06d39..9ce10eb83 100644 --- a/docs/site/measure.mjs +++ b/docs/site/measure.mjs @@ -1,4 +1,4 @@ -import { measurementModel, parseMeasurementInputs } from './measurement-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { measurementModel, parseMeasurementInputs } from './measurement-model.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const byId = id => document.getElementById(id); const fields = Object.fromEntries(['count', 'realizations', 'lower', 'upper'].map(name => [name, byId(`measure-${name}`)])); diff --git a/docs/site/museum.html b/docs/site/museum.html index e77825090..6d51098b5 100644 --- a/docs/site/museum.html +++ b/docs/site/museum.html @@ -5,14 +5,14 @@ Source records & exhibits · Universal Law - + - - + + - - + + diff --git a/docs/site/museum.mjs b/docs/site/museum.mjs index fb76d3b88..41a82c68f 100644 --- a/docs/site/museum.mjs +++ b/docs/site/museum.mjs @@ -1,5 +1,5 @@ -import {renderSourceQuote} from './source-quote.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {verifiedBytes, hex40, hex64} from './core.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {renderSourceQuote} from './source-quote.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import {verifiedBytes, hex40, hex64} from './core.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; export const DISCLAIMER='This canvas explains the pinned source. It is not a proof and does not change status.'; const REVIEWED_IDS=['d2-lifetime-remainder','d3-side24-coefficient','d4-fixed-remote-rn','d5-all-height-annulus','d5-height-window-annulus','d5-two-scale','d5-inner-belt-density','d5-fixed-transverse','cumulative-transfer-correction','p15-demand-one-counterexample','d6-p15-full-price']; @@ -264,7 +264,7 @@ function prepareClaimFragment(document,window,currentHash) { return true; }; } -export async function startMuseum({document=globalThis.document,window=globalThis.window,fetcher=globalThis.fetch,search=globalThis.location?.search||'',geometryLoader=()=>import('./geometry.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'),currentHash=()=>globalThis.location?.hash||''}={}){ +export async function startMuseum({document=globalThis.document,window=globalThis.window,fetcher=globalThis.fetch,search=globalThis.location?.search||'',geometryLoader=()=>import('./geometry.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'),currentHash=()=>globalThis.location?.hash||''}={}){ const ids=['museum-state','claim-cards','lifetime-fixture','packet-cards','active-exhibit']; const containers=Object.fromEntries(ids.map(id=>{const node=document.getElementById(id);if(!node)throw Error(`Missing museum container: ${id}`);return [id,node];})); const finishFragment=prepareClaimFragment(document,window,currentHash); diff --git a/docs/site/nodes/eng.d0-packet-allowlist-fix.html b/docs/site/nodes/eng.d0-packet-allowlist-fix.html index 0fcf618d8..1b541d01d 100644 --- a/docs/site/nodes/eng.d0-packet-allowlist-fix.html +++ b/docs/site/nodes/eng.d0-packet-allowlist-fix.html @@ -4,7 +4,7 @@ eng.d0-packet-allowlist-fix · Current research dependency atlas - +
diff --git a/docs/site/nodes/eng.hard-gate.html b/docs/site/nodes/eng.hard-gate.html index e6f97385f..b39da4c12 100644 --- a/docs/site/nodes/eng.hard-gate.html +++ b/docs/site/nodes/eng.hard-gate.html @@ -4,7 +4,7 @@ eng.hard-gate · Current research dependency atlas - +
diff --git a/docs/site/nodes/eng.main-pr87-crosswalk.html b/docs/site/nodes/eng.main-pr87-crosswalk.html index 662e4cb78..5a0c7e833 100644 --- a/docs/site/nodes/eng.main-pr87-crosswalk.html +++ b/docs/site/nodes/eng.main-pr87-crosswalk.html @@ -4,7 +4,7 @@ eng.main-pr87-crosswalk · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html b/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html index 784dd9366..892333f3e 100644 --- a/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html +++ b/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html @@ -4,7 +4,7 @@ hist.ALLCELL-FDZ-Q4 · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.CH-LIFT.html b/docs/site/nodes/hist.CH-LIFT.html index 08c0754fc..f44f83ee3 100644 --- a/docs/site/nodes/hist.CH-LIFT.html +++ b/docs/site/nodes/hist.CH-LIFT.html @@ -4,7 +4,7 @@ hist.CH-LIFT · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html b/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html index 83260eda4..8720606cc 100644 --- a/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html +++ b/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html @@ -4,7 +4,7 @@ hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.ENV-RESCOV.html b/docs/site/nodes/hist.ENV-RESCOV.html index d8bebef21..c31d1480d 100644 --- a/docs/site/nodes/hist.ENV-RESCOV.html +++ b/docs/site/nodes/hist.ENV-RESCOV.html @@ -4,7 +4,7 @@ hist.ENV-RESCOV · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.LOGQ-TAIL.html b/docs/site/nodes/hist.LOGQ-TAIL.html index d8bef685e..db7f2ecf8 100644 --- a/docs/site/nodes/hist.LOGQ-TAIL.html +++ b/docs/site/nodes/hist.LOGQ-TAIL.html @@ -4,7 +4,7 @@ hist.LOGQ-TAIL · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.OBL-H5-JETMOD.html b/docs/site/nodes/hist.OBL-H5-JETMOD.html index c19f1ad2d..c869d52b0 100644 --- a/docs/site/nodes/hist.OBL-H5-JETMOD.html +++ b/docs/site/nodes/hist.OBL-H5-JETMOD.html @@ -4,7 +4,7 @@ hist.OBL-H5-JETMOD · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.Piece-2-annulus.html b/docs/site/nodes/hist.Piece-2-annulus.html index 38cda1b78..a68f4e16c 100644 --- a/docs/site/nodes/hist.Piece-2-annulus.html +++ b/docs/site/nodes/hist.Piece-2-annulus.html @@ -4,7 +4,7 @@ hist.Piece-2-annulus · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.SYM-Fw-jet.html b/docs/site/nodes/hist.SYM-Fw-jet.html index de3e1d5eb..adf348a1a 100644 --- a/docs/site/nodes/hist.SYM-Fw-jet.html +++ b/docs/site/nodes/hist.SYM-Fw-jet.html @@ -4,7 +4,7 @@ hist.SYM-Fw-jet · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.allcell_fdz_enclosures.json.html b/docs/site/nodes/hist.allcell_fdz_enclosures.json.html index a91b40973..9f6f3c34e 100644 --- a/docs/site/nodes/hist.allcell_fdz_enclosures.json.html +++ b/docs/site/nodes/hist.allcell_fdz_enclosures.json.html @@ -4,7 +4,7 @@ hist.allcell_fdz_enclosures.json · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.lemma_closed.html b/docs/site/nodes/hist.lemma_closed.html index 34a2e9737..247aa694f 100644 --- a/docs/site/nodes/hist.lemma_closed.html +++ b/docs/site/nodes/hist.lemma_closed.html @@ -4,7 +4,7 @@ hist.lemma_closed · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.rnu_env.py.html b/docs/site/nodes/hist.rnu_env.py.html index 5647dcfbe..8e70932b1 100644 --- a/docs/site/nodes/hist.rnu_env.py.html +++ b/docs/site/nodes/hist.rnu_env.py.html @@ -4,7 +4,7 @@ hist.rnu_env.py · Current research dependency atlas - +
diff --git a/docs/site/nodes/index.html b/docs/site/nodes/index.html index 5cc798804..5f61a96f2 100644 --- a/docs/site/nodes/index.html +++ b/docs/site/nodes/index.html @@ -4,7 +4,7 @@ Current static graph, equation excerpts and source index · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.congruence-erratum.html b/docs/site/nodes/math.d1-component.congruence-erratum.html index 8f46acf5f..5e4498ad7 100644 --- a/docs/site/nodes/math.d1-component.congruence-erratum.html +++ b/docs/site/nodes/math.d1-component.congruence-erratum.html @@ -4,7 +4,7 @@ math.d1-component.congruence-erratum · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.marked-cylinder-cap.html b/docs/site/nodes/math.d1-component.marked-cylinder-cap.html index 3d2f2426d..451e83192 100644 --- a/docs/site/nodes/math.d1-component.marked-cylinder-cap.html +++ b/docs/site/nodes/math.d1-component.marked-cylinder-cap.html @@ -4,7 +4,7 @@ math.d1-component.marked-cylinder-cap · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.reconciliation-record.html b/docs/site/nodes/math.d1-component.reconciliation-record.html index 7816664a3..c329485cb 100644 --- a/docs/site/nodes/math.d1-component.reconciliation-record.html +++ b/docs/site/nodes/math.d1-component.reconciliation-record.html @@ -4,7 +4,7 @@ math.d1-component.reconciliation-record · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html b/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html index 7c4f59224..cd3438f34 100644 --- a/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html +++ b/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html @@ -4,7 +4,7 @@ math.d1-component.section9-replacement-v1_1 · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.annulus-proof.html b/docs/site/nodes/math.d5-component.annulus-proof.html index 35f38b228..7aa361ec5 100644 --- a/docs/site/nodes/math.d5-component.annulus-proof.html +++ b/docs/site/nodes/math.d5-component.annulus-proof.html @@ -4,7 +4,7 @@ math.d5-component.annulus-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.annulus-review.html b/docs/site/nodes/math.d5-component.annulus-review.html index cfe42fb54..3c2ad7378 100644 --- a/docs/site/nodes/math.d5-component.annulus-review.html +++ b/docs/site/nodes/math.d5-component.annulus-review.html @@ -4,7 +4,7 @@ math.d5-component.annulus-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.collar-proof.html b/docs/site/nodes/math.d5-component.collar-proof.html index cd9104178..0fec1cac8 100644 --- a/docs/site/nodes/math.d5-component.collar-proof.html +++ b/docs/site/nodes/math.d5-component.collar-proof.html @@ -4,7 +4,7 @@ math.d5-component.collar-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.collar-review.html b/docs/site/nodes/math.d5-component.collar-review.html index 52487ff5d..57bc2b253 100644 --- a/docs/site/nodes/math.d5-component.collar-review.html +++ b/docs/site/nodes/math.d5-component.collar-review.html @@ -4,7 +4,7 @@ math.d5-component.collar-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.i5-review-claude.html b/docs/site/nodes/math.d5-component.i5-review-claude.html index e83b59eb8..fe3f64497 100644 --- a/docs/site/nodes/math.d5-component.i5-review-claude.html +++ b/docs/site/nodes/math.d5-component.i5-review-claude.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-claude · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.i5-review-xai.html b/docs/site/nodes/math.d5-component.i5-review-xai.html index e6ddf8f1e..57b28c418 100644 --- a/docs/site/nodes/math.d5-component.i5-review-xai.html +++ b/docs/site/nodes/math.d5-component.i5-review-xai.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-xai · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.intermediate-window-proof.html b/docs/site/nodes/math.d5-component.intermediate-window-proof.html index ef7e978a9..5c975e27a 100644 --- a/docs/site/nodes/math.d5-component.intermediate-window-proof.html +++ b/docs/site/nodes/math.d5-component.intermediate-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.intermediate-window-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.offpin-second-moment-review.html b/docs/site/nodes/math.d5-component.offpin-second-moment-review.html index 8480c26dd..b21fc5cf7 100644 --- a/docs/site/nodes/math.d5-component.offpin-second-moment-review.html +++ b/docs/site/nodes/math.d5-component.offpin-second-moment-review.html @@ -4,7 +4,7 @@ math.d5-component.offpin-second-moment-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html b/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html index edeeba30f..afdb439bb 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-check · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html b/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html index fa5e7a874..645e271dd 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-proof.html b/docs/site/nodes/math.d5-component.punctured-pin-proof.html index c5e438f44..f5a316d7a 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-proof.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-proof.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-review-111.html b/docs/site/nodes/math.d5-component.punctured-pin-review-111.html index b965270ad..4760038b1 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-review-111.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-review-111.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-review-111 · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.remote-window-proof.html b/docs/site/nodes/math.d5-component.remote-window-proof.html index 6e6849d06..35d6ca34b 100644 --- a/docs/site/nodes/math.d5-component.remote-window-proof.html +++ b/docs/site/nodes/math.d5-component.remote-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.remote-window-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html b/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html index 49da5d893..bbde27a46 100644 --- a/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html +++ b/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html @@ -4,7 +4,7 @@ math.d5-pin-neighborhood-first-moment · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.lifetime-remainder.html b/docs/site/nodes/math.lifetime-remainder.html index 10be396e9..0988a0395 100644 --- a/docs/site/nodes/math.lifetime-remainder.html +++ b/docs/site/nodes/math.lifetime-remainder.html @@ -4,7 +4,7 @@ math.lifetime-remainder · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.p15-full-price.html b/docs/site/nodes/math.p15-full-price.html index fea11fc97..75d08a193 100644 --- a/docs/site/nodes/math.p15-full-price.html +++ b/docs/site/nodes/math.p15-full-price.html @@ -4,7 +4,7 @@ math.p15-full-price · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.p15-price-boundary.html b/docs/site/nodes/math.p15-price-boundary.html index bd86a1edf..26494ef1a 100644 --- a/docs/site/nodes/math.p15-price-boundary.html +++ b/docs/site/nodes/math.p15-price-boundary.html @@ -4,7 +4,7 @@ math.p15-price-boundary · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-count-interface.html b/docs/site/nodes/math.rn-count-interface.html index 7a5b7107a..5db02bea9 100644 --- a/docs/site/nodes/math.rn-count-interface.html +++ b/docs/site/nodes/math.rn-count-interface.html @@ -4,7 +4,7 @@ math.rn-count-interface · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-fixed-annulus-window.html b/docs/site/nodes/math.rn-fixed-annulus-window.html index 496d2d947..4769a1dc0 100644 --- a/docs/site/nodes/math.rn-fixed-annulus-window.html +++ b/docs/site/nodes/math.rn-fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-fixed-annulus-window · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-fixed-remote-window.html b/docs/site/nodes/math.rn-fixed-remote-window.html index 253b023ea..609b572bb 100644 --- a/docs/site/nodes/math.rn-fixed-remote-window.html +++ b/docs/site/nodes/math.rn-fixed-remote-window.html @@ -4,7 +4,7 @@ math.rn-fixed-remote-window · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-mesoscopic-reduction.html b/docs/site/nodes/math.rn-mesoscopic-reduction.html index 4c0f307be..1164d991a 100644 --- a/docs/site/nodes/math.rn-mesoscopic-reduction.html +++ b/docs/site/nodes/math.rn-mesoscopic-reduction.html @@ -4,7 +4,7 @@ math.rn-mesoscopic-reduction · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.fixed-annulus-window.html b/docs/site/nodes/math.rn-region.fixed-annulus-window.html index f2e7e46d6..4742ca979 100644 --- a/docs/site/nodes/math.rn-region.fixed-annulus-window.html +++ b/docs/site/nodes/math.rn-region.fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-region.fixed-annulus-window · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.fixed-remote.html b/docs/site/nodes/math.rn-region.fixed-remote.html index 3f5507093..1b78dc8fb 100644 --- a/docs/site/nodes/math.rn-region.fixed-remote.html +++ b/docs/site/nodes/math.rn-region.fixed-remote.html @@ -4,7 +4,7 @@ math.rn-region.fixed-remote · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html b/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html index 361e6ca7b..8cce97e56 100644 --- a/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html +++ b/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html @@ -4,7 +4,7 @@ math.rn-region.intermediate-r-to-rho · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html b/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html index 334742938..a4d6f744a 100644 --- a/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html +++ b/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html @@ -4,7 +4,7 @@ math.rn-region.mesoscopic-scaled-annulus · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.pin-collision.html b/docs/site/nodes/math.rn-region.pin-collision.html index b7b8f32df..d06f3a59a 100644 --- a/docs/site/nodes/math.rn-region.pin-collision.html +++ b/docs/site/nodes/math.rn-region.pin-collision.html @@ -4,7 +4,7 @@ math.rn-region.pin-collision · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.witness-collision.html b/docs/site/nodes/math.rn-region.witness-collision.html index 26d1e1f6b..62bd5eab6 100644 --- a/docs/site/nodes/math.rn-region.witness-collision.html +++ b/docs/site/nodes/math.rn-region.witness-collision.html @@ -4,7 +4,7 @@ math.rn-region.witness-collision · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-selector-region-crosswalk.html b/docs/site/nodes/math.rn-selector-region-crosswalk.html index ae1d1b0a6..eedf845d5 100644 --- a/docs/site/nodes/math.rn-selector-region-crosswalk.html +++ b/docs/site/nodes/math.rn-selector-region-crosswalk.html @@ -4,7 +4,7 @@ math.rn-selector-region-crosswalk · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.side24-coefficient.html b/docs/site/nodes/math.side24-coefficient.html index cdaa4f2a3..2d8281e2a 100644 --- a/docs/site/nodes/math.side24-coefficient.html +++ b/docs/site/nodes/math.side24-coefficient.html @@ -4,7 +4,7 @@ math.side24-coefficient · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.uniform-matrix-cap-lifetime.html b/docs/site/nodes/math.uniform-matrix-cap-lifetime.html index 12d91ec04..901601a3f 100644 --- a/docs/site/nodes/math.uniform-matrix-cap-lifetime.html +++ b/docs/site/nodes/math.uniform-matrix-cap-lifetime.html @@ -4,7 +4,7 @@ math.uniform-matrix-cap-lifetime · Current research dependency atlas - +
diff --git a/docs/site/nodes/regional.fixed-annulus.high-jet-route.html b/docs/site/nodes/regional.fixed-annulus.high-jet-route.html index c262220c1..2eaa24cad 100644 --- a/docs/site/nodes/regional.fixed-annulus.high-jet-route.html +++ b/docs/site/nodes/regional.fixed-annulus.high-jet-route.html @@ -4,7 +4,7 @@ regional.fixed-annulus.high-jet-route · Current research dependency atlas - +
diff --git a/docs/site/palette-export.mjs b/docs/site/palette-export.mjs index 46cab525c..9bba11d2a 100644 --- a/docs/site/palette-export.mjs +++ b/docs/site/palette-export.mjs @@ -1,7 +1,7 @@ // Bounded teaching export of Explore's current finite P15 diagram. Source // custody is provenance; this module performs no mathematical verification. -import { paletteModel } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializeTeachingSVG } from './teaching-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { paletteModel } from './explore-models.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import { serializeTeachingSVG } from './teaching-export.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const PUBLIC_EXPLORE = 'https://d6g8k5htny-coder.github.io/main/site/explore.html'; const SOURCE = Object.freeze({ diff --git a/docs/site/pin-export.mjs b/docs/site/pin-export.mjs index 38b74ec70..bd966dd98 100644 --- a/docs/site/pin-export.mjs +++ b/docs/site/pin-export.mjs @@ -1,7 +1,7 @@ // Bounded export of the CURRENT displayed Approach-points teaching diagram. // Pinned source identities are provenance, not proof acceptance or verification. -import { pinModel } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializeTeachingSVG } from './teaching-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { pinModel } from './explore-models.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; +import { serializeTeachingSVG } from './teaching-export.mjs?site-release=89345c3c666c10e7247e5c1effbb49ef17b4f65bab75eb811abbd929079a1a53'; const PUBLIC_EXPLORE='https://d6g8k5htny-coder.github.io/main/site/explore.html'; const COMMIT='d6628da09384728992dcbe6e921cc28ba85aebb0'; diff --git a/docs/site/reproduce.html b/docs/site/reproduce.html index ee4ede451..3c9992a22 100644 --- a/docs/site/reproduce.html +++ b/docs/site/reproduce.html @@ -2,13 +2,13 @@ - + Reproduce · Universal Law - + - - - + + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/research.html b/docs/site/research.html index 04f182c4f..1f4152baa 100644 --- a/docs/site/research.html +++ b/docs/site/research.html @@ -4,8 +4,8 @@ Research · Universal Law - - + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html index 2583fa262..4d58ddf01 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html @@ -4,7 +4,7 @@ eng.d0-packet-allowlist-fix · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html index a2199e8fb..a300f60f2 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html @@ -4,7 +4,7 @@ eng.hard-gate · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html index 949464d35..42e3ac2f3 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html @@ -4,7 +4,7 @@ eng.main-pr87-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html index 044910461..c63b89bd0 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html @@ -4,7 +4,7 @@ hist.ALLCELL-FDZ-Q4 · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html index c73a3b9ec..e73b97189 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html @@ -4,7 +4,7 @@ hist.CH-LIFT · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html index dc2a152fd..41d8abaff 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html @@ -4,7 +4,7 @@ hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html index 15487886d..ed61c0832 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html @@ -4,7 +4,7 @@ hist.ENV-RESCOV · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html index ea538db45..11f66a84b 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html @@ -4,7 +4,7 @@ hist.LOGQ-TAIL · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html index aa0d42555..87e219a57 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html @@ -4,7 +4,7 @@ hist.OBL-H5-JETMOD · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html index c0199da36..3cdbf84ed 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html @@ -4,7 +4,7 @@ hist.Piece-2-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html index 071eafeb7..7b81d4401 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html @@ -4,7 +4,7 @@ hist.SYM-Fw-jet · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html index f9c8b2ba5..f5c843cae 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html @@ -4,7 +4,7 @@ hist.allcell_fdz_enclosures.json · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html index 64373849c..3997fafa3 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html @@ -4,7 +4,7 @@ hist.lemma_closed · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html index 94f1aada6..c5fbbc97c 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html @@ -4,7 +4,7 @@ hist.rnu_env.py · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html index 4633ed2cc..ac88a81ba 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html @@ -4,7 +4,7 @@ Static graph and source index · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html index 8cbbb9e1c..5ac67620d 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html @@ -4,7 +4,7 @@ math.d1-component.congruence-erratum · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html index b517de77d..3312d374b 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html @@ -4,7 +4,7 @@ math.d1-component.marked-cylinder-cap · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html index 9bf6bc010..4c5c15c60 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html @@ -4,7 +4,7 @@ math.d1-component.reconciliation-record · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html index 18efdc921..c3043e3a8 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html @@ -4,7 +4,7 @@ math.d1-component.section9-replacement-v1_1 · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html index 9fe871cd3..478bf96b9 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html @@ -4,7 +4,7 @@ math.d5-component.annulus-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html index a141011c7..b8e0ea4bb 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html @@ -4,7 +4,7 @@ math.d5-component.annulus-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html index 5551df2f4..77b482020 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html @@ -4,7 +4,7 @@ math.d5-component.collar-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html index ae1fcba7d..ec12dcd39 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html @@ -4,7 +4,7 @@ math.d5-component.collar-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html index 85a64ea1f..6a471dcef 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-claude · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html index 6f1c415d2..24942ab91 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-xai · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html index cb04c752a..da5ab8521 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.intermediate-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html index f055ffee6..ffb392f52 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html @@ -4,7 +4,7 @@ math.d5-component.offpin-second-moment-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html index cf3fb6321..68e1271c6 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-check · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html index 253c9ec7a..e562a2a18 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html index 392c43ffb..117285c49 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html index e24fda93d..d385f8b1c 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-review-111 · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html index 8723b3258..1ee792c79 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.remote-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html index c698e3b26..78670d4ae 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html @@ -4,7 +4,7 @@ math.d5-pin-neighborhood-first-moment · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html index 69200c3f4..0f9132888 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html @@ -4,7 +4,7 @@ math.lifetime-remainder · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html index 53c8f821d..be5f8cb24 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html @@ -4,7 +4,7 @@ math.p15-full-price · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html index 1033e5d12..3ced73c58 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html @@ -4,7 +4,7 @@ math.p15-price-boundary · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html index 7f55d5069..68bb39755 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html @@ -4,7 +4,7 @@ math.rn-count-interface · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html index 1b8a55ee3..3d66bbd63 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html index 70236cb8b..450a562f0 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html @@ -4,7 +4,7 @@ math.rn-fixed-remote-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html index c3159c20f..380fdb7c7 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html @@ -4,7 +4,7 @@ math.rn-mesoscopic-reduction · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html index 9623cd9e0..753ef6855 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-region.fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html index a745e017e..d0013e976 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html @@ -4,7 +4,7 @@ math.rn-region.fixed-remote · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html index 1b0e4bd16..30a7c914a 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html @@ -4,7 +4,7 @@ math.rn-region.intermediate-r-to-rho · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html index b1cc70338..647adf223 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html @@ -4,7 +4,7 @@ math.rn-region.mesoscopic-scaled-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html index 3d69b3ddb..3af9453b1 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html @@ -4,7 +4,7 @@ math.rn-region.pin-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html index dbdf0d1c1..6b68f15d6 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html @@ -4,7 +4,7 @@ math.rn-region.witness-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html index cbdf9cad8..ac423af3c 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html @@ -4,7 +4,7 @@ math.rn-selector-region-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html index 9a8f0a708..4331245e2 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html @@ -4,7 +4,7 @@ math.side24-coefficient · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html index 5e75f3547..9df3abfca 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html @@ -4,7 +4,7 @@ math.uniform-matrix-cap-lifetime · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html index aea9c2cbf..7ad0a139f 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html @@ -4,7 +4,7 @@ regional.fixed-annulus.high-jet-route · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html index cf2e14b30..5a3ce813c 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html @@ -4,7 +4,7 @@ eng.d0-packet-allowlist-fix · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html index 5b1626021..0b8cb80f2 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html @@ -4,7 +4,7 @@ eng.hard-gate · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html index 8a5d58045..b5c860cd0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html @@ -4,7 +4,7 @@ eng.main-pr87-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html index d670fc3c3..85222a170 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html @@ -4,7 +4,7 @@ hist.ALLCELL-FDZ-Q4 · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html index fd75d5f73..b8b810753 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html @@ -4,7 +4,7 @@ hist.CH-LIFT · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html index 5dc472e4c..3db221741 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html @@ -4,7 +4,7 @@ hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html index 0b3aa18cb..129200111 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html @@ -4,7 +4,7 @@ hist.ENV-RESCOV · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html index c8d41538f..082a57982 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html @@ -4,7 +4,7 @@ hist.LOGQ-TAIL · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html index ee9c888e9..d1c449d83 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html @@ -4,7 +4,7 @@ hist.OBL-H5-JETMOD · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html index f7c00f058..77109445e 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html @@ -4,7 +4,7 @@ hist.Piece-2-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html index 7eaf1265d..19d43a73a 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html @@ -4,7 +4,7 @@ hist.SYM-Fw-jet · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html index 8a932bc04..e372e3d06 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html @@ -4,7 +4,7 @@ hist.allcell_fdz_enclosures.json · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html index b38c329dc..c8e2085b0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html @@ -4,7 +4,7 @@ hist.lemma_closed · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html index 97f342980..f18b83d84 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html @@ -4,7 +4,7 @@ hist.rnu_env.py · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html index 8565248e9..a3320a2e6 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html @@ -4,7 +4,7 @@ Static graph and source index · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html index 7cf14e05a..0fbe93e95 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html @@ -4,7 +4,7 @@ math.d1-component.congruence-erratum · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html index 209bde55e..07ba1e3c5 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html @@ -4,7 +4,7 @@ math.d1-component.marked-cylinder-cap · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html index fc374061a..d0292fb16 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html @@ -4,7 +4,7 @@ math.d1-component.reconciliation-record · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html index d2ae3e5b9..04b2ed41c 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html @@ -4,7 +4,7 @@ math.d1-component.section9-replacement-v1_1 · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html index 4806d5b4b..8ca56d6a2 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html @@ -4,7 +4,7 @@ math.d5-component.annulus-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html index c48a42d1f..08cc66dab 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html @@ -4,7 +4,7 @@ math.d5-component.annulus-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html index 2fc0fad8a..021d7a0ea 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html @@ -4,7 +4,7 @@ math.d5-component.collar-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html index 61cd49927..3d0a4b7e7 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html @@ -4,7 +4,7 @@ math.d5-component.collar-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html index 6f1687125..ccb631d4c 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-claude · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html index 6533c8158..f72dad2cf 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-xai · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html index e595e7b56..6ea968d62 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.intermediate-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html index 6c06f2474..8188ffca4 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html @@ -4,7 +4,7 @@ math.d5-component.offpin-second-moment-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html index 4e63c7d26..1bc7817e6 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-check · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html index 80e85e5f2..a9c56bed1 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html index b2e4a62e8..eb7647244 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html index c82f601e6..40f52e07c 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-review-111 · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html index 430fa88c6..a27a15cd0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.remote-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html index 65acfb853..d2776c5e8 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html @@ -4,7 +4,7 @@ math.d5-pin-neighborhood-first-moment · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html index 7420bddb8..71b9562c0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html @@ -4,7 +4,7 @@ math.lifetime-remainder · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html index b0f65cf83..87310e6ec 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html @@ -4,7 +4,7 @@ math.p15-full-price · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html index 365a72d57..de1234ac1 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html @@ -4,7 +4,7 @@ math.p15-price-boundary · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html index 17d70a4ba..1f8d76968 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html @@ -4,7 +4,7 @@ math.rn-count-interface · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html index 040d37859..f63b442e7 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html index 5efc977d7..2c16df51d 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html @@ -4,7 +4,7 @@ math.rn-fixed-remote-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html index 734265499..62db20125 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html @@ -4,7 +4,7 @@ math.rn-mesoscopic-reduction · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html index bb6a48fea..2de4b9d6e 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-region.fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html index a987412d2..dcd5ef8d4 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html @@ -4,7 +4,7 @@ math.rn-region.fixed-remote · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html index 4e1429ab9..762a6f4b3 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html @@ -4,7 +4,7 @@ math.rn-region.intermediate-r-to-rho · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html index ccb5b7c83..973458395 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html @@ -4,7 +4,7 @@ math.rn-region.mesoscopic-scaled-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html index 033110d20..499b9d555 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html @@ -4,7 +4,7 @@ math.rn-region.pin-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html index 1794d96fb..23832805f 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html @@ -4,7 +4,7 @@ math.rn-region.witness-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html index c6652e8cc..c6a8b6bd4 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html @@ -4,7 +4,7 @@ math.rn-selector-region-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html index 633d1620e..a3446ea64 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html @@ -4,7 +4,7 @@ math.side24-coefficient · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html index a61a926b3..1a7e2393c 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html @@ -4,7 +4,7 @@ math.uniform-matrix-cap-lifetime · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html index 9e6855b2d..0cd9b1320 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html @@ -4,7 +4,7 @@ regional.fixed-annulus.high-jet-route · Research dependency atlas - +
diff --git a/docs/site/workspace.html b/docs/site/workspace.html index 6e3d1257c..4a78c0104 100644 --- a/docs/site/workspace.html +++ b/docs/site/workspace.html @@ -5,12 +5,12 @@ Library and research workspace · Universal Law - - - + + + - - + + diff --git a/tests/test_site_csp.py b/tests/test_site_csp.py new file mode 100644 index 000000000..f01728cad --- /dev/null +++ b/tests/test_site_csp.py @@ -0,0 +1,34 @@ +"""Pages that load current.mjs must permit its same-origin fetch of current.json.""" +import re +from pathlib import Path +import unittest + +SITE = Path(__file__).resolve().parents[1] / "docs/site" +CSP = re.compile(r']+src="current\.mjs(?:\?[^"]*)?"', re.I) + + +def connect_sources(policy): + directives = {} + for part in policy.split(";"): + words = part.split() + if words: + directives.setdefault(words[0].lower(), words[1:]) + return directives.get("connect-src", directives.get("default-src", [])) + + +class CurrentModuleCspTests(unittest.TestCase): + def test_pages_loading_current_module_allow_same_origin_connect(self): + pages = sorted(p for p in SITE.glob("*.html") if LOADS_CURRENT.search(p.read_text(encoding="utf-8"))) + self.assertTrue(pages, "no docs/site page loads current.mjs") + for page in pages: + with self.subTest(page=page.name): + policies = CSP.findall(page.read_text(encoding="utf-8")) + self.assertEqual(len(policies), 1, "expected exactly one CSP meta") + sources = connect_sources(policies[0]) + self.assertNotIn("'none'", sources) + self.assertIn("'self'", sources, "current.mjs fetches same-origin current.json") + + +if __name__ == "__main__": + unittest.main() From 5857d4c66b4636521f6d3a0506a8c21a89c4d1c1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 17:33:24 +0000 Subject: [PATCH 05/37] docs: label hardening branch as frozen legacy and pin to a01c72f1 (F3). Co-authored-by: Dylan Roy --- docs/REPRODUCE.md | 4 +++- docs/WORKSPACE.md | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/REPRODUCE.md b/docs/REPRODUCE.md index 715f18d7a..c5719166c 100644 --- a/docs/REPRODUCE.md +++ b/docs/REPRODUCE.md @@ -78,7 +78,9 @@ From the common parent directory, choose new destination directories: ```sh git clone --single-branch --branch main https://github.com/d6g8k5htny-coder/Math-.git Math- +# legacy hardening tree (frozen); pin to its last merge git clone --single-branch --branch chatgpt/drive-github-hardening-20260919 https://github.com/d6g8k5htny-coder/main.git research +git -C research checkout a01c72f1937875b94bfd78e183a6dbbdb2b04da4 ``` The named branch tracks its current tip. To inspect one work item using that @@ -268,7 +270,7 @@ This bounded readback does not crawl every external URL, inspect private sandbox ## Legacy numerical work -Use the [legacy execution guide](https://github.com/d6g8k5htny-coder/main/blob/chatgpt/drive-github-hardening-20260919/docs/RESEARCH_EXECUTION.md) in the hardening checkout. Its RN/24-jet sources, commands and predicates remain separate. Do not apply a main-cut patch onto that different tree or present navigation CI as full research CI. +Use the [legacy execution guide](https://github.com/d6g8k5htny-coder/main/blob/a01c72f1937875b94bfd78e183a6dbbdb2b04da4/docs/RESEARCH_EXECUTION.md) (pinned at `a01c72f1`) in the hardening checkout. Its RN/24-jet sources, commands and predicates remain separate. Do not apply a main-cut patch onto that different tree or present navigation CI as full research CI. ## Interpret the evidence diff --git a/docs/WORKSPACE.md b/docs/WORKSPACE.md index 475b8b2d7..5f40e326c 100644 --- a/docs/WORKSPACE.md +++ b/docs/WORKSPACE.md @@ -19,7 +19,7 @@ the last an exploratory packet whose scientific effect is NONE, which makes no claim of progress toward the Riemann Hypothesis and whose independent numerical reproduction (review slice C) is open. None of the three reports a held-out confirmation run; each README states its own scope. Two older branches remain -readable context. The [hardening research branch](https://github.com/d6g8k5htny-coder/main/tree/chatgpt/drive-github-hardening-20260919) +readable context. The legacy [hardening research branch](https://github.com/d6g8k5htny-coder/main/tree/a01c72f1937875b94bfd78e183a6dbbdb2b04da4) (`chatgpt/drive-github-hardening-20260919`, frozen; pinned tip `a01c72f1`) holds the earlier research software and evidence; its last merge was on 27 September 2026 (`a01c72f1`). The [Claude migration branch](https://github.com/d6g8k5htny-coder/main/tree/claude/drive-audit-github-migration-rrglpp) @@ -35,7 +35,7 @@ not an instruction to repeat a completed review. Use [pull requests](https://github.com/d6g8k5htny-coder/main/pulls) and [Actions](https://github.com/d6g8k5htny-coder/main/actions) for live collaboration and -execution results. The [research execution guide](https://github.com/d6g8k5htny-coder/main/blob/chatgpt/drive-github-hardening-20260919/docs/RESEARCH_EXECUTION.md) +execution results. The legacy [research execution guide](https://github.com/d6g8k5htny-coder/main/blob/a01c72f1937875b94bfd78e183a6dbbdb2b04da4/docs/RESEARCH_EXECUTION.md) (pinned at `a01c72f1`) describes the research-side commands; read it in the checkout actually being used; it describes the hardening branch. The experiments on `main` are described in [experiments/periodic_h0/README.md](../experiments/periodic_h0/README.md), @@ -108,7 +108,7 @@ git rev-parse HEAD ``` To inspect the older hardening software (last merge 27 September 2026), add -`--single-branch --branch chatgpt/drive-github-hardening-20260919`. +`--single-branch --branch chatgpt/drive-github-hardening-20260919`, then `git checkout a01c72f1937875b94bfd78e183a6dbbdb2b04da4` to read the pinned legacy tip. Current numerical work on `main` is in `experiments/periodic_h0/` and `experiments/universality/`. Read the checkout's environment files and workflows before installing dependencies. This session prefers project-local environments, identifiable upstream sources, and From 0871c117eb07ed25cf85970ea7d07356c7e32f63 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 17:33:33 +0000 Subject: [PATCH 06/37] site: load style.css before brand.css on live nodes pages (F2 dark-mode contrast) Co-authored-by: Dylan Roy --- docs/site/app.js | 6 +- docs/site/atlas.mjs | 4 +- docs/site/brand.css | 2 +- docs/site/cite.html | 8 +- docs/site/cite.mjs | 2 +- docs/site/conditionals.mjs | 2 +- docs/site/current-meta.json | 2 +- docs/site/current-model.mjs | 2 +- docs/site/current.mjs | 2 +- docs/site/curvature-export.mjs | 2 +- docs/site/dependencies.html | 16 +- docs/site/dependencies.mjs | 2 +- docs/site/explore-models.mjs | 2 +- docs/site/explore.html | 14 +- docs/site/explore.mjs | 12 +- docs/site/formal.html | 8 +- docs/site/index.html | 8 +- docs/site/measure.html | 14 +- docs/site/measure.mjs | 2 +- docs/site/museum.html | 10 +- docs/site/museum.mjs | 6 +- .../nodes/eng.d0-packet-allowlist-fix.html | 2 +- docs/site/nodes/eng.hard-gate.html | 2 +- docs/site/nodes/eng.main-pr87-crosswalk.html | 2 +- docs/site/nodes/hist.ALLCELL-FDZ-Q4.html | 2 +- docs/site/nodes/hist.CH-LIFT.html | 2 +- ...CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html | 2 +- docs/site/nodes/hist.ENV-RESCOV.html | 2 +- docs/site/nodes/hist.LOGQ-TAIL.html | 2 +- docs/site/nodes/hist.OBL-H5-JETMOD.html | 2 +- docs/site/nodes/hist.Piece-2-annulus.html | 2 +- docs/site/nodes/hist.SYM-Fw-jet.html | 2 +- .../hist.allcell_fdz_enclosures.json.html | 2 +- docs/site/nodes/hist.lemma_closed.html | 2 +- docs/site/nodes/hist.rnu_env.py.html | 2 +- docs/site/nodes/index.html | 2 +- .../math.d1-component.congruence-erratum.html | 2 +- ...math.d1-component.marked-cylinder-cap.html | 2 +- ...th.d1-component.reconciliation-record.html | 2 +- ...1-component.section9-replacement-v1_1.html | 2 +- .../math.d5-component.annulus-proof.html | 2 +- .../math.d5-component.annulus-review.html | 2 +- .../nodes/math.d5-component.collar-proof.html | 2 +- .../math.d5-component.collar-review.html | 2 +- .../math.d5-component.i5-review-claude.html | 2 +- .../math.d5-component.i5-review-xai.html | 2 +- ...5-component.intermediate-window-proof.html | 2 +- ...component.offpin-second-moment-review.html | 2 +- ...mponent.punctured-pin-continuum-check.html | 2 +- ...ponent.punctured-pin-continuum-review.html | 2 +- ...math.d5-component.punctured-pin-proof.html | 2 +- ...d5-component.punctured-pin-review-111.html | 2 +- ...math.d5-component.remote-window-proof.html | 2 +- ...math.d5-pin-neighborhood-first-moment.html | 2 +- docs/site/nodes/math.lifetime-remainder.html | 2 +- docs/site/nodes/math.p15-full-price.html | 2 +- docs/site/nodes/math.p15-price-boundary.html | 2 +- docs/site/nodes/math.rn-count-interface.html | 2 +- .../nodes/math.rn-fixed-annulus-window.html | 2 +- .../nodes/math.rn-fixed-remote-window.html | 2 +- .../nodes/math.rn-mesoscopic-reduction.html | 2 +- .../math.rn-region.fixed-annulus-window.html | 2 +- .../nodes/math.rn-region.fixed-remote.html | 2 +- .../math.rn-region.intermediate-r-to-rho.html | 2 +- ...h.rn-region.mesoscopic-scaled-annulus.html | 2 +- .../nodes/math.rn-region.pin-collision.html | 2 +- .../math.rn-region.witness-collision.html | 2 +- .../math.rn-selector-region-crosswalk.html | 2 +- docs/site/nodes/math.side24-coefficient.html | 2 +- .../math.uniform-matrix-cap-lifetime.html | 2 +- ...regional.fixed-annulus.high-jet-route.html | 2 +- docs/site/palette-export.mjs | 4 +- docs/site/pin-export.mjs | 4 +- docs/site/reproduce.html | 8 +- docs/site/research.html | 4 +- .../nodes/eng.d0-packet-allowlist-fix.html | 2 +- .../nodes/eng.hard-gate.html | 2 +- .../nodes/eng.main-pr87-crosswalk.html | 2 +- .../nodes/hist.ALLCELL-FDZ-Q4.html | 2 +- .../nodes/hist.CH-LIFT.html | 2 +- ...CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html | 2 +- .../nodes/hist.ENV-RESCOV.html | 2 +- .../nodes/hist.LOGQ-TAIL.html | 2 +- .../nodes/hist.OBL-H5-JETMOD.html | 2 +- .../nodes/hist.Piece-2-annulus.html | 2 +- .../nodes/hist.SYM-Fw-jet.html | 2 +- .../hist.allcell_fdz_enclosures.json.html | 2 +- .../nodes/hist.lemma_closed.html | 2 +- .../nodes/hist.rnu_env.py.html | 2 +- .../nodes/index.html | 2 +- .../math.d1-component.congruence-erratum.html | 2 +- ...math.d1-component.marked-cylinder-cap.html | 2 +- ...th.d1-component.reconciliation-record.html | 2 +- ...1-component.section9-replacement-v1_1.html | 2 +- .../math.d5-component.annulus-proof.html | 2 +- .../math.d5-component.annulus-review.html | 2 +- .../nodes/math.d5-component.collar-proof.html | 2 +- .../math.d5-component.collar-review.html | 2 +- .../math.d5-component.i5-review-claude.html | 2 +- .../math.d5-component.i5-review-xai.html | 2 +- ...5-component.intermediate-window-proof.html | 2 +- ...component.offpin-second-moment-review.html | 2 +- ...mponent.punctured-pin-continuum-check.html | 2 +- ...ponent.punctured-pin-continuum-review.html | 2 +- ...math.d5-component.punctured-pin-proof.html | 2 +- ...d5-component.punctured-pin-review-111.html | 2 +- ...math.d5-component.remote-window-proof.html | 2 +- ...math.d5-pin-neighborhood-first-moment.html | 2 +- .../nodes/math.lifetime-remainder.html | 2 +- .../nodes/math.p15-full-price.html | 2 +- .../nodes/math.p15-price-boundary.html | 2 +- .../nodes/math.rn-count-interface.html | 2 +- .../nodes/math.rn-fixed-annulus-window.html | 2 +- .../nodes/math.rn-fixed-remote-window.html | 2 +- .../nodes/math.rn-mesoscopic-reduction.html | 2 +- .../math.rn-region.fixed-annulus-window.html | 2 +- .../nodes/math.rn-region.fixed-remote.html | 2 +- .../math.rn-region.intermediate-r-to-rho.html | 2 +- ...h.rn-region.mesoscopic-scaled-annulus.html | 2 +- .../nodes/math.rn-region.pin-collision.html | 2 +- .../math.rn-region.witness-collision.html | 2 +- .../math.rn-selector-region-crosswalk.html | 2 +- .../nodes/math.side24-coefficient.html | 2 +- .../math.uniform-matrix-cap-lifetime.html | 2 +- ...regional.fixed-annulus.high-jet-route.html | 2 +- .../nodes/eng.d0-packet-allowlist-fix.html | 2 +- .../nodes/eng.hard-gate.html | 2 +- .../nodes/eng.main-pr87-crosswalk.html | 2 +- .../nodes/hist.ALLCELL-FDZ-Q4.html | 2 +- .../nodes/hist.CH-LIFT.html | 2 +- ...CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html | 2 +- .../nodes/hist.ENV-RESCOV.html | 2 +- .../nodes/hist.LOGQ-TAIL.html | 2 +- .../nodes/hist.OBL-H5-JETMOD.html | 2 +- .../nodes/hist.Piece-2-annulus.html | 2 +- .../nodes/hist.SYM-Fw-jet.html | 2 +- .../hist.allcell_fdz_enclosures.json.html | 2 +- .../nodes/hist.lemma_closed.html | 2 +- .../nodes/hist.rnu_env.py.html | 2 +- .../nodes/index.html | 2 +- .../math.d1-component.congruence-erratum.html | 2 +- ...math.d1-component.marked-cylinder-cap.html | 2 +- ...th.d1-component.reconciliation-record.html | 2 +- ...1-component.section9-replacement-v1_1.html | 2 +- .../math.d5-component.annulus-proof.html | 2 +- .../math.d5-component.annulus-review.html | 2 +- .../nodes/math.d5-component.collar-proof.html | 2 +- .../math.d5-component.collar-review.html | 2 +- .../math.d5-component.i5-review-claude.html | 2 +- .../math.d5-component.i5-review-xai.html | 2 +- ...5-component.intermediate-window-proof.html | 2 +- ...component.offpin-second-moment-review.html | 2 +- ...mponent.punctured-pin-continuum-check.html | 2 +- ...ponent.punctured-pin-continuum-review.html | 2 +- ...math.d5-component.punctured-pin-proof.html | 2 +- ...d5-component.punctured-pin-review-111.html | 2 +- ...math.d5-component.remote-window-proof.html | 2 +- ...math.d5-pin-neighborhood-first-moment.html | 2 +- .../nodes/math.lifetime-remainder.html | 2 +- .../nodes/math.p15-full-price.html | 2 +- .../nodes/math.p15-price-boundary.html | 2 +- .../nodes/math.rn-count-interface.html | 2 +- .../nodes/math.rn-fixed-annulus-window.html | 2 +- .../nodes/math.rn-fixed-remote-window.html | 2 +- .../nodes/math.rn-mesoscopic-reduction.html | 2 +- .../math.rn-region.fixed-annulus-window.html | 2 +- .../nodes/math.rn-region.fixed-remote.html | 2 +- .../math.rn-region.intermediate-r-to-rho.html | 2 +- ...h.rn-region.mesoscopic-scaled-annulus.html | 2 +- .../nodes/math.rn-region.pin-collision.html | 2 +- .../math.rn-region.witness-collision.html | 2 +- .../math.rn-selector-region-crosswalk.html | 2 +- .../nodes/math.side24-coefficient.html | 2 +- .../math.uniform-matrix-cap-lifetime.html | 2 +- ...regional.fixed-annulus.high-jet-route.html | 2 +- docs/site/snapshots/index.json | 200 +++++++++--------- docs/site/workspace.html | 10 +- tests/test_site_stylesheet_order.py | 35 +++ tools/current_site_build.py | 2 +- tools/current_site_history.py | 2 +- 180 files changed, 365 insertions(+), 330 deletions(-) create mode 100644 tests/test_site_stylesheet_order.py diff --git a/docs/site/app.js b/docs/site/app.js index ea7399e5b..58a1877df 100644 --- a/docs/site/app.js +++ b/docs/site/app.js @@ -1,6 +1,6 @@ -import {verifiedJSON, verifiedBytes, validateStatus, validateCoefficient, safeSourceURL, hex40, hex64} from './core.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {connectCatalogQuery} from './catalog-query.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {prepareWorkspaceFragment} from './workspace-fragment.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {verifiedJSON, verifiedBytes, validateStatus, validateCoefficient, safeSourceURL, hex40, hex64} from './core.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import {connectCatalogQuery} from './catalog-query.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import {prepareWorkspaceFragment} from './workspace-fragment.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const finishFragment=prepareWorkspaceFragment(); const el=id=>document.getElementById(id); const node=(tag,text,cls)=>{const n=document.createElement(tag);if(text!==undefined)n.textContent=text;if(cls)n.className=cls;return n;}; diff --git a/docs/site/atlas.mjs b/docs/site/atlas.mjs index 628d55ef9..b34cbf1f4 100644 --- a/docs/site/atlas.mjs +++ b/docs/site/atlas.mjs @@ -1,5 +1,5 @@ -import {currentSnapshot,element,anchor} from './current.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {hasNode,readState,neighborhood,searchGraph,downstreamReach,requiredDependencyPaths,REQUIRED_ROUTE_SEMANTICS,evidenceAxes,sourceURL,sourceForNode,nodePage} from './current-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {currentSnapshot,element,anchor} from './current.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import {hasNode,readState,neighborhood,searchGraph,downstreamReach,requiredDependencyPaths,REQUIRED_ROUTE_SEMANTICS,evidenceAxes,sourceURL,sourceForNode,nodePage} from './current-model.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const byId=id=>document.getElementById(id); const svgElement=(tag,attrs)=>{const n=document.createElementNS('http://www.w3.org/2000/svg',tag);for(const [k,v]of Object.entries(attrs))n.setAttribute(k,String(v));return n;}; function linkRecord(label,value){const p=element('p');if(typeof value==='string'){try{const u=new URL(value);if(u.protocol==='https:'&&u.hostname==='github.com'&&!u.username&&!u.password&&!u.port){p.append(anchor(label,value));return p;}}catch{}}p.textContent=`${label}: ${value||'not recorded'}`;return p;} diff --git a/docs/site/brand.css b/docs/site/brand.css index 26b6d7a0a..83f2f7be6 100644 --- a/docs/site/brand.css +++ b/docs/site/brand.css @@ -60,7 +60,7 @@ body > header { color: var(--ul-text); font-weight: 750; letter-spacing: .13em; position: relative; padding-left: 57px; min-height: 44px; line-height: 1.65; } -.brand::before { content: ""; position: absolute; left: 0; top: 1px; width: 42px; height: 42px; background: url("brand/mark.svg?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc") center/contain no-repeat; } +.brand::before { content: ""; position: absolute; left: 0; top: 1px; width: 42px; height: 42px; background: url("brand/mark.svg?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa") center/contain no-repeat; } .brand span { color: var(--ul-muted); font-size: 12px; letter-spacing: .16em; text-transform: uppercase; } nav { gap: 12px 24px; flex-wrap: wrap; } nav a { color: var(--ul-text); min-height: 44px; display: inline-flex; align-items: center; font-size: 13px; padding: 0 6px; margin: 0 -6px; } diff --git a/docs/site/cite.html b/docs/site/cite.html index 79060bacf..52e817202 100644 --- a/docs/site/cite.html +++ b/docs/site/cite.html @@ -4,10 +4,10 @@ Cite · Universal Law - - - - + + + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/cite.mjs b/docs/site/cite.mjs index 139a92fe8..34280d8a8 100644 --- a/docs/site/cite.mjs +++ b/docs/site/cite.mjs @@ -1,4 +1,4 @@ -import {wireReferenceForm} from './source-reference.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {wireReferenceForm} from './source-reference.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const byId = id => document.getElementById(id); wireReferenceForm({form:byId('reference-form'), repository:byId('reference-repository'), commit:byId('reference-commit'), path:byId('reference-path'), sha256:byId('reference-sha256'), output:byId('reference-output'), json:byId('reference-json'), bibtex:byId('reference-bibtex'), link:byId('reference-link'), status:byId('reference-status'), actions:byId('reference-actions'), copyText:byId('reference-copy'), copyJSON:byId('reference-copy-json'), copyBibTeX:byId('reference-copy-bibtex'), share:byId('reference-share'), clipboard:globalThis.navigator?.clipboard, location:globalThis.location, history:globalThis.history, events:globalThis.window}); byId('reference-builder').hidden = false; diff --git a/docs/site/conditionals.mjs b/docs/site/conditionals.mjs index 9fc4067e8..54da2b275 100644 --- a/docs/site/conditionals.mjs +++ b/docs/site/conditionals.mjs @@ -93,7 +93,7 @@ export function renderProjection(document,host,data,source){ el(document,'p','Generated from verified source bytes. This graph is not formal verification, a proof review, or a scientific-status register.')); host.replaceChildren(article); } -const services=()=>import('./museum.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'); +const services=()=>import('./museum.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'); // The museum module already verifies config → manifest → index/status once per // page fetch and caches every pinned byte request. This route consumes that same // verified startup, so it adds only the audited-descriptor check and projection. diff --git a/docs/site/current-meta.json b/docs/site/current-meta.json index c94da4047..46179c5c5 100644 --- a/docs/site/current-meta.json +++ b/docs/site/current-meta.json @@ -1,7 +1,7 @@ { "archive": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c", "bytes": 962639, - "history_manifest_sha256": "f0932cb73fc8dec9f15b930bcbb23454f3e1b9885d9b5c06bf6a21e54e788355", + "history_manifest_sha256": "dd277b7afbc61d15cfa71ef35bcaa0d32fc9655e13ad96ca5b444f54bfe59d77", "observed_at": "2026-10-13T14:56:55Z", "sha256": "560d3d4e77369835c832dbb4fd0d12f4988744045b9cbc4c7978beddb6e9d20f" } diff --git a/docs/site/current-model.mjs b/docs/site/current-model.mjs index 45e3bba4a..515cd27f4 100644 --- a/docs/site/current-model.mjs +++ b/docs/site/current-model.mjs @@ -1,4 +1,4 @@ -import {OPEN_CLASSIFICATIONS, NON_RESEARCH_KINDS} from './dependency-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {OPEN_CLASSIFICATIONS, NON_RESEARCH_KINDS} from './dependency-model.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const REPOSITORIES = new Set(['d6g8k5htny-coder/main','d6g8k5htny-coder/Math-']); const SHA = /^[0-9a-f]{40}$/; diff --git a/docs/site/current.mjs b/docs/site/current.mjs index e24b53d00..6dc367b68 100644 --- a/docs/site/current.mjs +++ b/docs/site/current.mjs @@ -1,4 +1,4 @@ -import {parseVerifiedSnapshot,freshness,filterSources,sourceURL} from './current-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {parseVerifiedSnapshot,freshness,filterSources,sourceURL} from './current-model.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; export function element(tag,text,className) { const e=document.createElement(tag);if(text!==undefined)e.textContent=text;if(className)e.className=className;return e; } diff --git a/docs/site/curvature-export.mjs b/docs/site/curvature-export.mjs index 4e099c092..9a469b2bf 100644 --- a/docs/site/curvature-export.mjs +++ b/docs/site/curvature-export.mjs @@ -1,6 +1,6 @@ // Bounded, local export of the Peaks and saddles teaching diagram. No source fetch // or proof verification occurs here; the identity below is recorded provenance. -import { coneModel } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { coneModel } from './explore-models.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const SVG_NS = 'http://www.w3.org/2000/svg'; const PUBLIC_EXPLORE = 'https://d6g8k5htny-coder.github.io/main/site/explore.html'; diff --git a/docs/site/dependencies.html b/docs/site/dependencies.html index db7e31b19..4424271b6 100644 --- a/docs/site/dependencies.html +++ b/docs/site/dependencies.html @@ -7,14 +7,14 @@ Mathematics · Universal Law - - - - - - - - + + + + + + + + diff --git a/docs/site/dependencies.mjs b/docs/site/dependencies.mjs index 553478d67..b77c2ff7b 100644 --- a/docs/site/dependencies.mjs +++ b/docs/site/dependencies.mjs @@ -12,7 +12,7 @@ import { recordedContextRows, recordedReviewText, unresolvedTargets, -} from './dependency-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +} from './dependency-model.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const byId = id => document.getElementById(id); diff --git a/docs/site/explore-models.mjs b/docs/site/explore-models.mjs index b148a272a..bc46bc93a 100644 --- a/docs/site/explore-models.mjs +++ b/docs/site/explore-models.mjs @@ -1,6 +1,6 @@ // NON-CERTIFYING educational arithmetic. These functions illustrate source // definitions; they do not simulate a field or estimate a theorem's constants. -import { annulusModel, p15Model, remoteModel } from './geometry.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { annulusModel, p15Model, remoteModel } from './geometry.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; function finite(value, name) { if (!Number.isFinite(value)) throw new RangeError(`${name} must be finite`); diff --git a/docs/site/explore.html b/docs/site/explore.html index 351e74bbf..a0b085a92 100644 --- a/docs/site/explore.html +++ b/docs/site/explore.html @@ -7,13 +7,13 @@ Explore the mathematics · Universal Law - - - - - - - + + + + + + + diff --git a/docs/site/explore.mjs b/docs/site/explore.mjs index ea550772a..d182bca44 100644 --- a/docs/site/explore.mjs +++ b/docs/site/explore.mjs @@ -1,10 +1,10 @@ -import { coneModel, pinModel, paletteModel, applyCurvaturePreset } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { readExploreState, exploreStateURL } from './explore-state.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { coneModel, pinModel, paletteModel, applyCurvaturePreset } from './explore-models.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import { readExploreState, exploreStateURL } from './explore-state.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; -import { captureCurvatureDiagram, serializeCurvatureSVG, createCitationController } from './curvature-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { captureTeachingDiagram, createFigureCitationController } from './teaching-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializePinSVG, pinFigureCitation } from './pin-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializePaletteSVG, paletteFigureCitation } from './palette-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { captureCurvatureDiagram, serializeCurvatureSVG, createCitationController } from './curvature-export.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import { captureTeachingDiagram, createFigureCitationController } from './teaching-export.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import { serializePinSVG, pinFigureCitation } from './pin-export.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import { serializePaletteSVG, paletteFigureCitation } from './palette-export.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const ns = 'http://www.w3.org/2000/svg'; const byId = id => document.getElementById(id); diff --git a/docs/site/formal.html b/docs/site/formal.html index 4fdca62d1..be87b1eb3 100644 --- a/docs/site/formal.html +++ b/docs/site/formal.html @@ -5,11 +5,11 @@ Formal verification · Universal Law - - - + + + - + diff --git a/docs/site/index.html b/docs/site/index.html index 116fdcd66..1ac3e060a 100644 --- a/docs/site/index.html +++ b/docs/site/index.html @@ -4,10 +4,10 @@ The shape of randomness · Universal Law - - - - + + + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/measure.html b/docs/site/measure.html index 2d9536951..d42b52010 100644 --- a/docs/site/measure.html +++ b/docs/site/measure.html @@ -7,13 +7,13 @@ From counts to density · Universal Law - - - - - - - + + + + + + + diff --git a/docs/site/measure.mjs b/docs/site/measure.mjs index 8b7f06d39..6b88b2454 100644 --- a/docs/site/measure.mjs +++ b/docs/site/measure.mjs @@ -1,4 +1,4 @@ -import { measurementModel, parseMeasurementInputs } from './measurement-model.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { measurementModel, parseMeasurementInputs } from './measurement-model.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const byId = id => document.getElementById(id); const fields = Object.fromEntries(['count', 'realizations', 'lower', 'upper'].map(name => [name, byId(`measure-${name}`)])); diff --git a/docs/site/museum.html b/docs/site/museum.html index e77825090..1d1310bbd 100644 --- a/docs/site/museum.html +++ b/docs/site/museum.html @@ -5,14 +5,14 @@ Source records & exhibits · Universal Law - + - - + + - - + + diff --git a/docs/site/museum.mjs b/docs/site/museum.mjs index fb76d3b88..73efe494c 100644 --- a/docs/site/museum.mjs +++ b/docs/site/museum.mjs @@ -1,5 +1,5 @@ -import {renderSourceQuote} from './source-quote.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import {verifiedBytes, hex40, hex64} from './core.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import {renderSourceQuote} from './source-quote.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import {verifiedBytes, hex40, hex64} from './core.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; export const DISCLAIMER='This canvas explains the pinned source. It is not a proof and does not change status.'; const REVIEWED_IDS=['d2-lifetime-remainder','d3-side24-coefficient','d4-fixed-remote-rn','d5-all-height-annulus','d5-height-window-annulus','d5-two-scale','d5-inner-belt-density','d5-fixed-transverse','cumulative-transfer-correction','p15-demand-one-counterexample','d6-p15-full-price']; @@ -264,7 +264,7 @@ function prepareClaimFragment(document,window,currentHash) { return true; }; } -export async function startMuseum({document=globalThis.document,window=globalThis.window,fetcher=globalThis.fetch,search=globalThis.location?.search||'',geometryLoader=()=>import('./geometry.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'),currentHash=()=>globalThis.location?.hash||''}={}){ +export async function startMuseum({document=globalThis.document,window=globalThis.window,fetcher=globalThis.fetch,search=globalThis.location?.search||'',geometryLoader=()=>import('./geometry.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'),currentHash=()=>globalThis.location?.hash||''}={}){ const ids=['museum-state','claim-cards','lifetime-fixture','packet-cards','active-exhibit']; const containers=Object.fromEntries(ids.map(id=>{const node=document.getElementById(id);if(!node)throw Error(`Missing museum container: ${id}`);return [id,node];})); const finishFragment=prepareClaimFragment(document,window,currentHash); diff --git a/docs/site/nodes/eng.d0-packet-allowlist-fix.html b/docs/site/nodes/eng.d0-packet-allowlist-fix.html index 0fcf618d8..0819fb1bd 100644 --- a/docs/site/nodes/eng.d0-packet-allowlist-fix.html +++ b/docs/site/nodes/eng.d0-packet-allowlist-fix.html @@ -4,7 +4,7 @@ eng.d0-packet-allowlist-fix · Current research dependency atlas - +
diff --git a/docs/site/nodes/eng.hard-gate.html b/docs/site/nodes/eng.hard-gate.html index e6f97385f..388a58b77 100644 --- a/docs/site/nodes/eng.hard-gate.html +++ b/docs/site/nodes/eng.hard-gate.html @@ -4,7 +4,7 @@ eng.hard-gate · Current research dependency atlas - +
diff --git a/docs/site/nodes/eng.main-pr87-crosswalk.html b/docs/site/nodes/eng.main-pr87-crosswalk.html index 662e4cb78..b58dfb929 100644 --- a/docs/site/nodes/eng.main-pr87-crosswalk.html +++ b/docs/site/nodes/eng.main-pr87-crosswalk.html @@ -4,7 +4,7 @@ eng.main-pr87-crosswalk · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html b/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html index 784dd9366..b34b501e6 100644 --- a/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html +++ b/docs/site/nodes/hist.ALLCELL-FDZ-Q4.html @@ -4,7 +4,7 @@ hist.ALLCELL-FDZ-Q4 · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.CH-LIFT.html b/docs/site/nodes/hist.CH-LIFT.html index 08c0754fc..a17094330 100644 --- a/docs/site/nodes/hist.CH-LIFT.html +++ b/docs/site/nodes/hist.CH-LIFT.html @@ -4,7 +4,7 @@ hist.CH-LIFT · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html b/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html index 83260eda4..907a4baa0 100644 --- a/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html +++ b/docs/site/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html @@ -4,7 +4,7 @@ hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.ENV-RESCOV.html b/docs/site/nodes/hist.ENV-RESCOV.html index d8bebef21..98a00dbcc 100644 --- a/docs/site/nodes/hist.ENV-RESCOV.html +++ b/docs/site/nodes/hist.ENV-RESCOV.html @@ -4,7 +4,7 @@ hist.ENV-RESCOV · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.LOGQ-TAIL.html b/docs/site/nodes/hist.LOGQ-TAIL.html index d8bef685e..8ef2e3272 100644 --- a/docs/site/nodes/hist.LOGQ-TAIL.html +++ b/docs/site/nodes/hist.LOGQ-TAIL.html @@ -4,7 +4,7 @@ hist.LOGQ-TAIL · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.OBL-H5-JETMOD.html b/docs/site/nodes/hist.OBL-H5-JETMOD.html index c19f1ad2d..b2ed17ff2 100644 --- a/docs/site/nodes/hist.OBL-H5-JETMOD.html +++ b/docs/site/nodes/hist.OBL-H5-JETMOD.html @@ -4,7 +4,7 @@ hist.OBL-H5-JETMOD · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.Piece-2-annulus.html b/docs/site/nodes/hist.Piece-2-annulus.html index 38cda1b78..7c56a093c 100644 --- a/docs/site/nodes/hist.Piece-2-annulus.html +++ b/docs/site/nodes/hist.Piece-2-annulus.html @@ -4,7 +4,7 @@ hist.Piece-2-annulus · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.SYM-Fw-jet.html b/docs/site/nodes/hist.SYM-Fw-jet.html index de3e1d5eb..9985df164 100644 --- a/docs/site/nodes/hist.SYM-Fw-jet.html +++ b/docs/site/nodes/hist.SYM-Fw-jet.html @@ -4,7 +4,7 @@ hist.SYM-Fw-jet · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.allcell_fdz_enclosures.json.html b/docs/site/nodes/hist.allcell_fdz_enclosures.json.html index a91b40973..cc95720a6 100644 --- a/docs/site/nodes/hist.allcell_fdz_enclosures.json.html +++ b/docs/site/nodes/hist.allcell_fdz_enclosures.json.html @@ -4,7 +4,7 @@ hist.allcell_fdz_enclosures.json · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.lemma_closed.html b/docs/site/nodes/hist.lemma_closed.html index 34a2e9737..c1b7b57fd 100644 --- a/docs/site/nodes/hist.lemma_closed.html +++ b/docs/site/nodes/hist.lemma_closed.html @@ -4,7 +4,7 @@ hist.lemma_closed · Current research dependency atlas - +
diff --git a/docs/site/nodes/hist.rnu_env.py.html b/docs/site/nodes/hist.rnu_env.py.html index 5647dcfbe..a95beded0 100644 --- a/docs/site/nodes/hist.rnu_env.py.html +++ b/docs/site/nodes/hist.rnu_env.py.html @@ -4,7 +4,7 @@ hist.rnu_env.py · Current research dependency atlas - +
diff --git a/docs/site/nodes/index.html b/docs/site/nodes/index.html index 5cc798804..495fae9f1 100644 --- a/docs/site/nodes/index.html +++ b/docs/site/nodes/index.html @@ -4,7 +4,7 @@ Current static graph, equation excerpts and source index · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.congruence-erratum.html b/docs/site/nodes/math.d1-component.congruence-erratum.html index 8f46acf5f..8f75c3346 100644 --- a/docs/site/nodes/math.d1-component.congruence-erratum.html +++ b/docs/site/nodes/math.d1-component.congruence-erratum.html @@ -4,7 +4,7 @@ math.d1-component.congruence-erratum · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.marked-cylinder-cap.html b/docs/site/nodes/math.d1-component.marked-cylinder-cap.html index 3d2f2426d..93b413027 100644 --- a/docs/site/nodes/math.d1-component.marked-cylinder-cap.html +++ b/docs/site/nodes/math.d1-component.marked-cylinder-cap.html @@ -4,7 +4,7 @@ math.d1-component.marked-cylinder-cap · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.reconciliation-record.html b/docs/site/nodes/math.d1-component.reconciliation-record.html index 7816664a3..cf463a2b5 100644 --- a/docs/site/nodes/math.d1-component.reconciliation-record.html +++ b/docs/site/nodes/math.d1-component.reconciliation-record.html @@ -4,7 +4,7 @@ math.d1-component.reconciliation-record · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html b/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html index 7c4f59224..6236db37a 100644 --- a/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html +++ b/docs/site/nodes/math.d1-component.section9-replacement-v1_1.html @@ -4,7 +4,7 @@ math.d1-component.section9-replacement-v1_1 · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.annulus-proof.html b/docs/site/nodes/math.d5-component.annulus-proof.html index 35f38b228..510a32d36 100644 --- a/docs/site/nodes/math.d5-component.annulus-proof.html +++ b/docs/site/nodes/math.d5-component.annulus-proof.html @@ -4,7 +4,7 @@ math.d5-component.annulus-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.annulus-review.html b/docs/site/nodes/math.d5-component.annulus-review.html index cfe42fb54..438e5d462 100644 --- a/docs/site/nodes/math.d5-component.annulus-review.html +++ b/docs/site/nodes/math.d5-component.annulus-review.html @@ -4,7 +4,7 @@ math.d5-component.annulus-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.collar-proof.html b/docs/site/nodes/math.d5-component.collar-proof.html index cd9104178..2cdcdebbc 100644 --- a/docs/site/nodes/math.d5-component.collar-proof.html +++ b/docs/site/nodes/math.d5-component.collar-proof.html @@ -4,7 +4,7 @@ math.d5-component.collar-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.collar-review.html b/docs/site/nodes/math.d5-component.collar-review.html index 52487ff5d..8bb534132 100644 --- a/docs/site/nodes/math.d5-component.collar-review.html +++ b/docs/site/nodes/math.d5-component.collar-review.html @@ -4,7 +4,7 @@ math.d5-component.collar-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.i5-review-claude.html b/docs/site/nodes/math.d5-component.i5-review-claude.html index e83b59eb8..7ba28ad88 100644 --- a/docs/site/nodes/math.d5-component.i5-review-claude.html +++ b/docs/site/nodes/math.d5-component.i5-review-claude.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-claude · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.i5-review-xai.html b/docs/site/nodes/math.d5-component.i5-review-xai.html index e6ddf8f1e..a4411e6c0 100644 --- a/docs/site/nodes/math.d5-component.i5-review-xai.html +++ b/docs/site/nodes/math.d5-component.i5-review-xai.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-xai · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.intermediate-window-proof.html b/docs/site/nodes/math.d5-component.intermediate-window-proof.html index ef7e978a9..95af84d70 100644 --- a/docs/site/nodes/math.d5-component.intermediate-window-proof.html +++ b/docs/site/nodes/math.d5-component.intermediate-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.intermediate-window-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.offpin-second-moment-review.html b/docs/site/nodes/math.d5-component.offpin-second-moment-review.html index 8480c26dd..3a9a95504 100644 --- a/docs/site/nodes/math.d5-component.offpin-second-moment-review.html +++ b/docs/site/nodes/math.d5-component.offpin-second-moment-review.html @@ -4,7 +4,7 @@ math.d5-component.offpin-second-moment-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html b/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html index edeeba30f..d2f95e5a7 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-continuum-check.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-check · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html b/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html index fa5e7a874..0354fb148 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-continuum-review.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-review · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-proof.html b/docs/site/nodes/math.d5-component.punctured-pin-proof.html index c5e438f44..399da5f01 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-proof.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-proof.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.punctured-pin-review-111.html b/docs/site/nodes/math.d5-component.punctured-pin-review-111.html index b965270ad..a229bb09b 100644 --- a/docs/site/nodes/math.d5-component.punctured-pin-review-111.html +++ b/docs/site/nodes/math.d5-component.punctured-pin-review-111.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-review-111 · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-component.remote-window-proof.html b/docs/site/nodes/math.d5-component.remote-window-proof.html index 6e6849d06..90b8c67a1 100644 --- a/docs/site/nodes/math.d5-component.remote-window-proof.html +++ b/docs/site/nodes/math.d5-component.remote-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.remote-window-proof · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html b/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html index 49da5d893..67b11e002 100644 --- a/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html +++ b/docs/site/nodes/math.d5-pin-neighborhood-first-moment.html @@ -4,7 +4,7 @@ math.d5-pin-neighborhood-first-moment · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.lifetime-remainder.html b/docs/site/nodes/math.lifetime-remainder.html index 10be396e9..9f9b3710a 100644 --- a/docs/site/nodes/math.lifetime-remainder.html +++ b/docs/site/nodes/math.lifetime-remainder.html @@ -4,7 +4,7 @@ math.lifetime-remainder · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.p15-full-price.html b/docs/site/nodes/math.p15-full-price.html index fea11fc97..7169b7311 100644 --- a/docs/site/nodes/math.p15-full-price.html +++ b/docs/site/nodes/math.p15-full-price.html @@ -4,7 +4,7 @@ math.p15-full-price · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.p15-price-boundary.html b/docs/site/nodes/math.p15-price-boundary.html index bd86a1edf..271bd0d6b 100644 --- a/docs/site/nodes/math.p15-price-boundary.html +++ b/docs/site/nodes/math.p15-price-boundary.html @@ -4,7 +4,7 @@ math.p15-price-boundary · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-count-interface.html b/docs/site/nodes/math.rn-count-interface.html index 7a5b7107a..11754984c 100644 --- a/docs/site/nodes/math.rn-count-interface.html +++ b/docs/site/nodes/math.rn-count-interface.html @@ -4,7 +4,7 @@ math.rn-count-interface · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-fixed-annulus-window.html b/docs/site/nodes/math.rn-fixed-annulus-window.html index 496d2d947..d8a10a233 100644 --- a/docs/site/nodes/math.rn-fixed-annulus-window.html +++ b/docs/site/nodes/math.rn-fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-fixed-annulus-window · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-fixed-remote-window.html b/docs/site/nodes/math.rn-fixed-remote-window.html index 253b023ea..68606afff 100644 --- a/docs/site/nodes/math.rn-fixed-remote-window.html +++ b/docs/site/nodes/math.rn-fixed-remote-window.html @@ -4,7 +4,7 @@ math.rn-fixed-remote-window · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-mesoscopic-reduction.html b/docs/site/nodes/math.rn-mesoscopic-reduction.html index 4c0f307be..b1db6e74e 100644 --- a/docs/site/nodes/math.rn-mesoscopic-reduction.html +++ b/docs/site/nodes/math.rn-mesoscopic-reduction.html @@ -4,7 +4,7 @@ math.rn-mesoscopic-reduction · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.fixed-annulus-window.html b/docs/site/nodes/math.rn-region.fixed-annulus-window.html index f2e7e46d6..3d6531c5e 100644 --- a/docs/site/nodes/math.rn-region.fixed-annulus-window.html +++ b/docs/site/nodes/math.rn-region.fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-region.fixed-annulus-window · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.fixed-remote.html b/docs/site/nodes/math.rn-region.fixed-remote.html index 3f5507093..fea087bd7 100644 --- a/docs/site/nodes/math.rn-region.fixed-remote.html +++ b/docs/site/nodes/math.rn-region.fixed-remote.html @@ -4,7 +4,7 @@ math.rn-region.fixed-remote · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html b/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html index 361e6ca7b..4b74a55db 100644 --- a/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html +++ b/docs/site/nodes/math.rn-region.intermediate-r-to-rho.html @@ -4,7 +4,7 @@ math.rn-region.intermediate-r-to-rho · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html b/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html index 334742938..6cd58c4b0 100644 --- a/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html +++ b/docs/site/nodes/math.rn-region.mesoscopic-scaled-annulus.html @@ -4,7 +4,7 @@ math.rn-region.mesoscopic-scaled-annulus · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.pin-collision.html b/docs/site/nodes/math.rn-region.pin-collision.html index b7b8f32df..bee99b49c 100644 --- a/docs/site/nodes/math.rn-region.pin-collision.html +++ b/docs/site/nodes/math.rn-region.pin-collision.html @@ -4,7 +4,7 @@ math.rn-region.pin-collision · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-region.witness-collision.html b/docs/site/nodes/math.rn-region.witness-collision.html index 26d1e1f6b..ca272395f 100644 --- a/docs/site/nodes/math.rn-region.witness-collision.html +++ b/docs/site/nodes/math.rn-region.witness-collision.html @@ -4,7 +4,7 @@ math.rn-region.witness-collision · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.rn-selector-region-crosswalk.html b/docs/site/nodes/math.rn-selector-region-crosswalk.html index ae1d1b0a6..70fd74917 100644 --- a/docs/site/nodes/math.rn-selector-region-crosswalk.html +++ b/docs/site/nodes/math.rn-selector-region-crosswalk.html @@ -4,7 +4,7 @@ math.rn-selector-region-crosswalk · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.side24-coefficient.html b/docs/site/nodes/math.side24-coefficient.html index cdaa4f2a3..7b92d47b7 100644 --- a/docs/site/nodes/math.side24-coefficient.html +++ b/docs/site/nodes/math.side24-coefficient.html @@ -4,7 +4,7 @@ math.side24-coefficient · Current research dependency atlas - +
diff --git a/docs/site/nodes/math.uniform-matrix-cap-lifetime.html b/docs/site/nodes/math.uniform-matrix-cap-lifetime.html index 12d91ec04..8bd4ab2b7 100644 --- a/docs/site/nodes/math.uniform-matrix-cap-lifetime.html +++ b/docs/site/nodes/math.uniform-matrix-cap-lifetime.html @@ -4,7 +4,7 @@ math.uniform-matrix-cap-lifetime · Current research dependency atlas - +
diff --git a/docs/site/nodes/regional.fixed-annulus.high-jet-route.html b/docs/site/nodes/regional.fixed-annulus.high-jet-route.html index c262220c1..a29760ad1 100644 --- a/docs/site/nodes/regional.fixed-annulus.high-jet-route.html +++ b/docs/site/nodes/regional.fixed-annulus.high-jet-route.html @@ -4,7 +4,7 @@ regional.fixed-annulus.high-jet-route · Current research dependency atlas - +
diff --git a/docs/site/palette-export.mjs b/docs/site/palette-export.mjs index 46cab525c..1b4f3393e 100644 --- a/docs/site/palette-export.mjs +++ b/docs/site/palette-export.mjs @@ -1,7 +1,7 @@ // Bounded teaching export of Explore's current finite P15 diagram. Source // custody is provenance; this module performs no mathematical verification. -import { paletteModel } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializeTeachingSVG } from './teaching-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { paletteModel } from './explore-models.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import { serializeTeachingSVG } from './teaching-export.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const PUBLIC_EXPLORE = 'https://d6g8k5htny-coder.github.io/main/site/explore.html'; const SOURCE = Object.freeze({ diff --git a/docs/site/pin-export.mjs b/docs/site/pin-export.mjs index 38b74ec70..969fc822e 100644 --- a/docs/site/pin-export.mjs +++ b/docs/site/pin-export.mjs @@ -1,7 +1,7 @@ // Bounded export of the CURRENT displayed Approach-points teaching diagram. // Pinned source identities are provenance, not proof acceptance or verification. -import { pinModel } from './explore-models.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; -import { serializeTeachingSVG } from './teaching-export.mjs?site-release=4764cf2cfa0123b97aca3ec6ff8a1aba79e9ad1b5506d8616775b59c20e65ebc'; +import { pinModel } from './explore-models.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; +import { serializeTeachingSVG } from './teaching-export.mjs?site-release=26e0bb50332f00417238a791a79b8058fe1fac84174b0b020c89dd66d4a56eaa'; const PUBLIC_EXPLORE='https://d6g8k5htny-coder.github.io/main/site/explore.html'; const COMMIT='d6628da09384728992dcbe6e921cc28ba85aebb0'; diff --git a/docs/site/reproduce.html b/docs/site/reproduce.html index ee4ede451..8e1402932 100644 --- a/docs/site/reproduce.html +++ b/docs/site/reproduce.html @@ -4,11 +4,11 @@ Reproduce · Universal Law - + - - - + + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/research.html b/docs/site/research.html index 04f182c4f..47d732d6f 100644 --- a/docs/site/research.html +++ b/docs/site/research.html @@ -4,8 +4,8 @@ Research · Universal Law - - + +
UNIVERSAL LAW MATHEMATICS IN THE OPEN
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html index 2583fa262..95e9501c4 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.d0-packet-allowlist-fix.html @@ -4,7 +4,7 @@ eng.d0-packet-allowlist-fix · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html index a2199e8fb..f6d8912b2 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.hard-gate.html @@ -4,7 +4,7 @@ eng.hard-gate · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html index 949464d35..c10db2eaa 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/eng.main-pr87-crosswalk.html @@ -4,7 +4,7 @@ eng.main-pr87-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html index 044910461..c02e10239 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ALLCELL-FDZ-Q4.html @@ -4,7 +4,7 @@ hist.ALLCELL-FDZ-Q4 · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html index c73a3b9ec..283ddd647 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CH-LIFT.html @@ -4,7 +4,7 @@ hist.CH-LIFT · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html index dc2a152fd..1e8553afe 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html @@ -4,7 +4,7 @@ hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html index 15487886d..42a63df44 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.ENV-RESCOV.html @@ -4,7 +4,7 @@ hist.ENV-RESCOV · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html index ea538db45..c88031810 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.LOGQ-TAIL.html @@ -4,7 +4,7 @@ hist.LOGQ-TAIL · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html index aa0d42555..f71d8f67a 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.OBL-H5-JETMOD.html @@ -4,7 +4,7 @@ hist.OBL-H5-JETMOD · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html index c0199da36..dd0771e79 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.Piece-2-annulus.html @@ -4,7 +4,7 @@ hist.Piece-2-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html index 071eafeb7..046d8a4a8 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.SYM-Fw-jet.html @@ -4,7 +4,7 @@ hist.SYM-Fw-jet · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html index f9c8b2ba5..a0eeb7062 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.allcell_fdz_enclosures.json.html @@ -4,7 +4,7 @@ hist.allcell_fdz_enclosures.json · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html index 64373849c..d7388b213 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.lemma_closed.html @@ -4,7 +4,7 @@ hist.lemma_closed · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html index 94f1aada6..4a106dabd 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/hist.rnu_env.py.html @@ -4,7 +4,7 @@ hist.rnu_env.py · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html index 4633ed2cc..e6242a3cf 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/index.html @@ -4,7 +4,7 @@ Static graph and source index · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html index 8cbbb9e1c..94b960d0f 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.congruence-erratum.html @@ -4,7 +4,7 @@ math.d1-component.congruence-erratum · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html index b517de77d..6950e99fa 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.marked-cylinder-cap.html @@ -4,7 +4,7 @@ math.d1-component.marked-cylinder-cap · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html index 9bf6bc010..28fd16a93 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.reconciliation-record.html @@ -4,7 +4,7 @@ math.d1-component.reconciliation-record · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html index 18efdc921..ba24f98e4 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d1-component.section9-replacement-v1_1.html @@ -4,7 +4,7 @@ math.d1-component.section9-replacement-v1_1 · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html index 9fe871cd3..2e9990843 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-proof.html @@ -4,7 +4,7 @@ math.d5-component.annulus-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html index a141011c7..3d1a0dac4 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.annulus-review.html @@ -4,7 +4,7 @@ math.d5-component.annulus-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html index 5551df2f4..522d63738 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-proof.html @@ -4,7 +4,7 @@ math.d5-component.collar-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html index ae1fcba7d..fb072498c 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.collar-review.html @@ -4,7 +4,7 @@ math.d5-component.collar-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html index 85a64ea1f..cbecf34df 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-claude.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-claude · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html index 6f1c415d2..15a3c7bc9 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.i5-review-xai.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-xai · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html index cb04c752a..28fc9493d 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.intermediate-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.intermediate-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html index f055ffee6..b845ab133 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.offpin-second-moment-review.html @@ -4,7 +4,7 @@ math.d5-component.offpin-second-moment-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html index cf3fb6321..db6cc1e39 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-check.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-check · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html index 253c9ec7a..997af3d93 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-continuum-review.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html index 392c43ffb..65855a2a8 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-proof.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html index e24fda93d..81946bd24 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.punctured-pin-review-111.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-review-111 · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html index 8723b3258..e64a51ef4 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-component.remote-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.remote-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html index c698e3b26..8d1ec09e7 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.d5-pin-neighborhood-first-moment.html @@ -4,7 +4,7 @@ math.d5-pin-neighborhood-first-moment · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html index 69200c3f4..eaa1cce61 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.lifetime-remainder.html @@ -4,7 +4,7 @@ math.lifetime-remainder · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html index 53c8f821d..36ecbbc32 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-full-price.html @@ -4,7 +4,7 @@ math.p15-full-price · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html index 1033e5d12..3fd7128ca 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.p15-price-boundary.html @@ -4,7 +4,7 @@ math.p15-price-boundary · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html index 7f55d5069..9d662aa53 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-count-interface.html @@ -4,7 +4,7 @@ math.rn-count-interface · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html index 1b8a55ee3..8391c2b90 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html index 70236cb8b..dbf9b04cc 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-fixed-remote-window.html @@ -4,7 +4,7 @@ math.rn-fixed-remote-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html index c3159c20f..4ef756bd7 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-mesoscopic-reduction.html @@ -4,7 +4,7 @@ math.rn-mesoscopic-reduction · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html index 9623cd9e0..a47aa7df9 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-region.fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html index a745e017e..a8693aec5 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.fixed-remote.html @@ -4,7 +4,7 @@ math.rn-region.fixed-remote · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html index 1b0e4bd16..cf179ef0d 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.intermediate-r-to-rho.html @@ -4,7 +4,7 @@ math.rn-region.intermediate-r-to-rho · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html index b1cc70338..36cb91476 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.mesoscopic-scaled-annulus.html @@ -4,7 +4,7 @@ math.rn-region.mesoscopic-scaled-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html index 3d69b3ddb..d66b249bd 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.pin-collision.html @@ -4,7 +4,7 @@ math.rn-region.pin-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html index dbdf0d1c1..88e401062 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-region.witness-collision.html @@ -4,7 +4,7 @@ math.rn-region.witness-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html index cbdf9cad8..5661ced36 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.rn-selector-region-crosswalk.html @@ -4,7 +4,7 @@ math.rn-selector-region-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html index 9a8f0a708..181385be7 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.side24-coefficient.html @@ -4,7 +4,7 @@ math.side24-coefficient · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html index 5e75f3547..13da96a99 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/math.uniform-matrix-cap-lifetime.html @@ -4,7 +4,7 @@ math.uniform-matrix-cap-lifetime · Research dependency atlas - +
diff --git a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html index aea9c2cbf..d34be8e54 100644 --- a/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html +++ b/docs/site/snapshots/38ac44c585feb2f9a480d8e54ad1a7fe56ad35aff19e2eab929861ea81974644/nodes/regional.fixed-annulus.high-jet-route.html @@ -4,7 +4,7 @@ regional.fixed-annulus.high-jet-route · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html index cf2e14b30..edad38474 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.d0-packet-allowlist-fix.html @@ -4,7 +4,7 @@ eng.d0-packet-allowlist-fix · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html index 5b1626021..9dddf9c93 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.hard-gate.html @@ -4,7 +4,7 @@ eng.hard-gate · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html index 8a5d58045..3c20f2025 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/eng.main-pr87-crosswalk.html @@ -4,7 +4,7 @@ eng.main-pr87-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html index d670fc3c3..36d938eb1 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ALLCELL-FDZ-Q4.html @@ -4,7 +4,7 @@ hist.ALLCELL-FDZ-Q4 · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html index fd75d5f73..208026131 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CH-LIFT.html @@ -4,7 +4,7 @@ hist.CH-LIFT · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html index 5dc472e4c..c2d04a097 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html @@ -4,7 +4,7 @@ hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html index 0b3aa18cb..a5b483c3f 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.ENV-RESCOV.html @@ -4,7 +4,7 @@ hist.ENV-RESCOV · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html index c8d41538f..99e758526 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.LOGQ-TAIL.html @@ -4,7 +4,7 @@ hist.LOGQ-TAIL · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html index ee9c888e9..0a5a25a03 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.OBL-H5-JETMOD.html @@ -4,7 +4,7 @@ hist.OBL-H5-JETMOD · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html index f7c00f058..d20965b4d 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.Piece-2-annulus.html @@ -4,7 +4,7 @@ hist.Piece-2-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html index 7eaf1265d..1cb4f64da 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.SYM-Fw-jet.html @@ -4,7 +4,7 @@ hist.SYM-Fw-jet · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html index 8a932bc04..090ebf1b6 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.allcell_fdz_enclosures.json.html @@ -4,7 +4,7 @@ hist.allcell_fdz_enclosures.json · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html index b38c329dc..533c641e0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.lemma_closed.html @@ -4,7 +4,7 @@ hist.lemma_closed · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html index 97f342980..09c0aba07 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/hist.rnu_env.py.html @@ -4,7 +4,7 @@ hist.rnu_env.py · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html index 8565248e9..f2d2d42dc 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/index.html @@ -4,7 +4,7 @@ Static graph and source index · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html index 7cf14e05a..2b128eea0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.congruence-erratum.html @@ -4,7 +4,7 @@ math.d1-component.congruence-erratum · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html index 209bde55e..d2c77897b 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.marked-cylinder-cap.html @@ -4,7 +4,7 @@ math.d1-component.marked-cylinder-cap · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html index fc374061a..21f0e49f0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.reconciliation-record.html @@ -4,7 +4,7 @@ math.d1-component.reconciliation-record · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html index d2ae3e5b9..9b45f6691 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d1-component.section9-replacement-v1_1.html @@ -4,7 +4,7 @@ math.d1-component.section9-replacement-v1_1 · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html index 4806d5b4b..96ef50816 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-proof.html @@ -4,7 +4,7 @@ math.d5-component.annulus-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html index c48a42d1f..ef9431fb5 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.annulus-review.html @@ -4,7 +4,7 @@ math.d5-component.annulus-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html index 2fc0fad8a..ddbb2d243 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-proof.html @@ -4,7 +4,7 @@ math.d5-component.collar-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html index 61cd49927..dfaa7b959 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.collar-review.html @@ -4,7 +4,7 @@ math.d5-component.collar-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html index 6f1687125..8b3854509 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-claude.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-claude · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html index 6533c8158..8385b0b99 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.i5-review-xai.html @@ -4,7 +4,7 @@ math.d5-component.i5-review-xai · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html index e595e7b56..a58353ca0 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.intermediate-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.intermediate-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html index 6c06f2474..4d7833c35 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.offpin-second-moment-review.html @@ -4,7 +4,7 @@ math.d5-component.offpin-second-moment-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html index 4e63c7d26..04201c817 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-check.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-check · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html index 80e85e5f2..62ce06a6f 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-continuum-review.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-continuum-review · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html index b2e4a62e8..ecf36643a 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-proof.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html index c82f601e6..dfcf1fc02 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.punctured-pin-review-111.html @@ -4,7 +4,7 @@ math.d5-component.punctured-pin-review-111 · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html index 430fa88c6..995f9d7c3 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-component.remote-window-proof.html @@ -4,7 +4,7 @@ math.d5-component.remote-window-proof · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html index 65acfb853..c4c94f0ce 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.d5-pin-neighborhood-first-moment.html @@ -4,7 +4,7 @@ math.d5-pin-neighborhood-first-moment · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html index 7420bddb8..64388f01c 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.lifetime-remainder.html @@ -4,7 +4,7 @@ math.lifetime-remainder · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html index b0f65cf83..7abd26087 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-full-price.html @@ -4,7 +4,7 @@ math.p15-full-price · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html index 365a72d57..c5bb81d52 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.p15-price-boundary.html @@ -4,7 +4,7 @@ math.p15-price-boundary · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html index 17d70a4ba..3f8149931 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-count-interface.html @@ -4,7 +4,7 @@ math.rn-count-interface · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html index 040d37859..b7b66cf1e 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html index 5efc977d7..4b53cb489 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-fixed-remote-window.html @@ -4,7 +4,7 @@ math.rn-fixed-remote-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html index 734265499..f770ed70e 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-mesoscopic-reduction.html @@ -4,7 +4,7 @@ math.rn-mesoscopic-reduction · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html index bb6a48fea..8f8a48455 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-annulus-window.html @@ -4,7 +4,7 @@ math.rn-region.fixed-annulus-window · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html index a987412d2..251e0e15a 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.fixed-remote.html @@ -4,7 +4,7 @@ math.rn-region.fixed-remote · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html index 4e1429ab9..82c86a8b9 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.intermediate-r-to-rho.html @@ -4,7 +4,7 @@ math.rn-region.intermediate-r-to-rho · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html index ccb5b7c83..57d0e3b7c 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.mesoscopic-scaled-annulus.html @@ -4,7 +4,7 @@ math.rn-region.mesoscopic-scaled-annulus · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html index 033110d20..42a8eb01d 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.pin-collision.html @@ -4,7 +4,7 @@ math.rn-region.pin-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html index 1794d96fb..09d433ae8 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-region.witness-collision.html @@ -4,7 +4,7 @@ math.rn-region.witness-collision · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html index c6652e8cc..1dedf52ef 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.rn-selector-region-crosswalk.html @@ -4,7 +4,7 @@ math.rn-selector-region-crosswalk · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html index 633d1620e..6e638553e 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.side24-coefficient.html @@ -4,7 +4,7 @@ math.side24-coefficient · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html index a61a926b3..9856f4407 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/math.uniform-matrix-cap-lifetime.html @@ -4,7 +4,7 @@ math.uniform-matrix-cap-lifetime · Research dependency atlas - +
diff --git a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html index 9e6855b2d..a2a3b4857 100644 --- a/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html +++ b/docs/site/snapshots/7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c/nodes/regional.fixed-annulus.high-jet-route.html @@ -4,7 +4,7 @@ regional.fixed-annulus.high-jet-route · Research dependency atlas - +
diff --git a/docs/site/snapshots/index.json b/docs/site/snapshots/index.json index c34fff7bc..97c8de7be 100644 --- a/docs/site/snapshots/index.json +++ b/docs/site/snapshots/index.json @@ -4,350 +4,350 @@ "binding": "current_observation", "bytes": 5155, "path": "nodes/eng.d0-packet-allowlist-fix.html", - "sha256": "fb94e57ed1a5761adb2fa369f961f45443a1ff177ec0e25d6f4adae778acea61", + "sha256": "60e9c100dd96b0ea220344a0ef733784d67992f68f55a01305fcd11059cde0a5", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4609, "path": "nodes/eng.hard-gate.html", - "sha256": "ac388fe17e5325e03510b7d148c0c5fa061d3db3ac8b52067c1d2e6654e929e7", + "sha256": "262d718d8a8f81dab60a82f126f318be40b32c92ee9e52f0b0849709541a1c7b", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4900, "path": "nodes/eng.main-pr87-crosswalk.html", - "sha256": "2afe17a3003c05bf9d1d61b7f1fe085c61da25308108165390c529c85b0a8ed4", + "sha256": "9f85d0c79f2a8f5a6c87dd899e54afa99ec065959ff22c4d9d4646eb1d555834", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4651, "path": "nodes/hist.ALLCELL-FDZ-Q4.html", - "sha256": "a7caa1a8d9e56246717f25fa8a8947cc0ed80d6048e1b955e2a98f355f39915e", + "sha256": "5c2d942729e29651d435bc0c7debfa4d65b8ba948ca48b8865c54dee62be3f24", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4852, "path": "nodes/hist.CH-LIFT.html", - "sha256": "d7f70be50b9a45b4cf93857a8808124eb821ecaefd378b7c4baeecce6bdb659c", + "sha256": "2fed77dcb9de9d52bbe34238966b43981f05171c160829d3122f4f5d821c0e63", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4618, "path": "nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html", - "sha256": "3cb21bda158399d20d334bf14d29b0dc1089f1b557c6d6c71850689eecc80390", + "sha256": "978dd934eaea60208b9cdeac6fa0a76300ffc5fa20f62790de0d7110ddfa1b6c", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4620, "path": "nodes/hist.ENV-RESCOV.html", - "sha256": "2ae93e638722e6fdb0e9990e8a59e5a7265f4a042ccee1cb7046fcba4399b319", + "sha256": "921c9be527f92f94da8bfddfed730b1b61f76bb0391a4b301262f26932152a19", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4400, "path": "nodes/hist.LOGQ-TAIL.html", - "sha256": "abb293f57956e86aae44fb4999e5f070f561a3c9ed743e3a30d64d806380ce08", + "sha256": "815c76ce3338646beaf99cee37c60daec17152d8d115294a1d1fe3968a5f1254", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4655, "path": "nodes/hist.OBL-H5-JETMOD.html", - "sha256": "e890b1d66903b0680922f5d0dc6bf3ea20c5acc28218547838ef980a5aa28748", + "sha256": "9eb048a34a6eadab642b4d7c7986889534b71a59c1c85256f7af2aecb9444660", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4892, "path": "nodes/hist.Piece-2-annulus.html", - "sha256": "c4d09c1f81b45f09430cc37593f4081d07329746290a5c617eafe828690352a0", + "sha256": "9ce39caa8f871f9a22582b4950f8a0290af991daded259d96885f7fb583a749b", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4687, "path": "nodes/hist.SYM-Fw-jet.html", - "sha256": "0826577ff1482484bb0f80298a1917cdc8a2706632bddc5b00137be3c0ee565a", + "sha256": "7163c4482a36ffe9861acb9c50fac3bbce6f242f976c8e5feebe336731271308", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4608, "path": "nodes/hist.allcell_fdz_enclosures.json.html", - "sha256": "b77e56474e9479607a64131e4ff3c877c5e610442ff0540cc684d6437c499e70", + "sha256": "7b6ba985d24b35cb7f60b3c4cd1c21e078eb5456d38acd2ee532051096182f62", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4394, "path": "nodes/hist.lemma_closed.html", - "sha256": "0525cf5376183ffd17781f8f2c4aa3f8a3ab75ff1eea8d12a374ee645c0e8665", + "sha256": "6a7ed0c0438921821a882026ea3ffbfe5703503ede9bcdc1e24f8989faf9da29", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4571, "path": "nodes/hist.rnu_env.py.html", - "sha256": "ba0aab5167d4652c37f392a5646b735dcea007f6c732538c681500d4fa42edc3", + "sha256": "4e167332c1d3f6fac63dc381e8522fc0425713ca9d1dd865763d08d23dc3bbf6", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 838014, "path": "nodes/index.html", - "sha256": "2f07748a76be68df9e5d2ff123a70393c9d0f60a99350afcc4a9bf5dcd849aaf", + "sha256": "23aaf08879b6e6579d7b135ffe4355abf29f95d7e90530557354c3dab0fdebaa", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6172, "path": "nodes/math.d1-component.congruence-erratum.html", - "sha256": "0adebad24592f45254a320d4f901bd5b976f3f1a52f8738f9c6fcf65bcb4089b", + "sha256": "a85c6e299d34de35a9c72e27dc61522a5b52972e9befab44b8127f33ae030686", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6204, "path": "nodes/math.d1-component.marked-cylinder-cap.html", - "sha256": "766f39cb9aeb398c2d0f2a03c489a16e9ca387509b5e27de1d5a6f96c96585c0", + "sha256": "b3e8ec3dc3f21c162789ec2cf45e5c1fd2d69dc78e8c335d1f32785254e87208", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6763, "path": "nodes/math.d1-component.reconciliation-record.html", - "sha256": "b9b41d401a95818cca6d762946d8d62fac69dc3a3396b84852ee05cab840a88c", + "sha256": "f171e22cfa1be38bad902486fbc7d4f1071ffe661a8dba8f06406a0e57ce7a4e", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6175, "path": "nodes/math.d1-component.section9-replacement-v1_1.html", - "sha256": "2752bf661c52837b3cbe66a124978fe1b4156b838e83a5009ac1bf32f9d233d7", + "sha256": "4a2d3adf67a5b70965523145083e70c12eb691f6cc0d89d3328af46615ab870c", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5703, "path": "nodes/math.d5-component.annulus-proof.html", - "sha256": "e7b6f13e873b684c0201ab514f593380b523c961a36e4ea36b5fc5c4dd5001e3", + "sha256": "589e9f899a9acb773c539410d47e5c9ab6c6333b3afae05306f49e9fd82d572d", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5488, "path": "nodes/math.d5-component.annulus-review.html", - "sha256": "692188bf610ce4d7ea9855749e27dfef5eafb09da062ac400cb92d32401a1f82", + "sha256": "d5c145442027180fe30b31ff953080c37db82e80d9e021c2720b53695cbb7c67", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6182, "path": "nodes/math.d5-component.collar-proof.html", - "sha256": "08c95c5159a143ecc8fe6bbf64f11040ea6c5992c083712b20024b795585f6bf", + "sha256": "f10a42b51ee34bc510d7c5b582bdab473b0aaf2ed8a5671d40f35c41bcc80d33", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5690, "path": "nodes/math.d5-component.collar-review.html", - "sha256": "c0ecea09db3c90217429e991bc9edca642c6697ef5c8301d0a8541b0ca986b7b", + "sha256": "fd1353a3e3eb85bbfee9c0a37039072d9a46683702869c45091b38afbc859882", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5490, "path": "nodes/math.d5-component.i5-review-claude.html", - "sha256": "f2e114ab246157c77cbb0028dfff3dbf82b8873fdd59969370518961bdd0d549", + "sha256": "69bb8c3fbc15f439109c2d6ec6094fb593188285b985c32ffee6a5e9a52378fe", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5427, "path": "nodes/math.d5-component.i5-review-xai.html", - "sha256": "2183b7d37a2ba3ca4c6c280ea44f482e29b015d6d1d0dc12d776acb13f8248ef", + "sha256": "5b588a59fd5fe52ca1102bd0032d731e606bb8b7033fe6748a59206d35253e47", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5967, "path": "nodes/math.d5-component.intermediate-window-proof.html", - "sha256": "30669567f39d0756554a7295a381fd03ded06778d5e88f541d5c9ada70a57361", + "sha256": "a80f1cf63d9e4f87c515d4d39961a2326b857a7a63fd44fbb7048cfaf990c51f", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5226, "path": "nodes/math.d5-component.offpin-second-moment-review.html", - "sha256": "da8f23fe48da609367ea3af80c128c6ead1d4844a1b0689fc35ae5d284ec95da", + "sha256": "bdd8aaad9909140006116cd4c100e90c13ad31fc53521c3c0fbfe2f61e12956f", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5851, "path": "nodes/math.d5-component.punctured-pin-continuum-check.html", - "sha256": "0e0f533d0da7a27945f4d030fe3f098b546e970e1757e3429d55162630d743ed", + "sha256": "2406eda228166217a47210c7541c891bd9878b0a10fc5334f7419d0dafa3fbd3", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5819, "path": "nodes/math.d5-component.punctured-pin-continuum-review.html", - "sha256": "7b5c95af8a62c557effd063efe115847dfe33d82bd6eb299a35841d88e01514c", + "sha256": "4b6eee6774a6e0b0f34b1630f42989b868a679e5270abd4c49cc704301ac773a", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6231, "path": "nodes/math.d5-component.punctured-pin-proof.html", - "sha256": "22c2067285ace36d25759c5c0dd5f22b0ba30ecba04e69f61ba5628798ce9bbc", + "sha256": "57c0430e791302549b8342e04bba114524fc4242b17ce541998aa6f4929fecf7", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5762, "path": "nodes/math.d5-component.punctured-pin-review-111.html", - "sha256": "83a1096a5f280fed9f6e565c3c14749143f36c438443dc7fffc66a5d742d6053", + "sha256": "7e0b8e3357481c128d70428bfa6b505fd0f223529f28b3fb06c15b0d3a38b39c", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5432, "path": "nodes/math.d5-component.remote-window-proof.html", - "sha256": "56edb72719c1400b2b3dcaffb138b30f0395afbc17adda14c4942149d2348229", + "sha256": "8ca775e598790ce5042ab405faa2d1fa353c523447c5f23e27eca1f04f75afa8", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 7973, "path": "nodes/math.d5-pin-neighborhood-first-moment.html", - "sha256": "0627ec69c109dc313c8358a5fd9f8c2a4fb75961d8adc2ae3eca0b0fa549e538", + "sha256": "130ee3058ca23b7ed71e0226146787b8d39d9611173a3534a742abbef5acbaf9", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5710, "path": "nodes/math.lifetime-remainder.html", - "sha256": "c5aff8eb9de618bc0c9d572c7c5a821ffb66095df7e7aee80626a339394a9229", + "sha256": "efae23d045606d8338945bb1dc76ce86d7569f542f8f8e267cb1c97ac59e0305", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5053, "path": "nodes/math.p15-full-price.html", - "sha256": "f96526ce67843e8d35c797a67357ce8aba851d5ef71151bca1e64af39f802e0c", + "sha256": "e9d04028343daea7ab4eafc3da329676b7b7b541169b646c68bbaed1948ea226", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5028, "path": "nodes/math.p15-price-boundary.html", - "sha256": "b4aa66c3aa5c2b59dc3fae4ceb959b4f274a011724909c0876e03cb5ab717182", + "sha256": "ddaa5c9976aa01b0e18f197fde3c71545cd431e8dbe6222e404ed9e7d4fd51d7", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5589, "path": "nodes/math.rn-count-interface.html", - "sha256": "0da02fe064f930848c50ec9e63943653ca1b5fca8468d30dc76e47c791d0956f", + "sha256": "0c566e318f36e3c0f83af2149be319fff9d2395985cf3f97a05aedfec25d81f1", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6445, "path": "nodes/math.rn-fixed-annulus-window.html", - "sha256": "684cba2171fc16e4eeb116b70c0425ba270e87bd2db258485aae9ed09526fe1a", + "sha256": "138b374cbcfce350fe40a28dc5313c40d2d2034323b7cd8221bb30601c88525b", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5754, "path": "nodes/math.rn-fixed-remote-window.html", - "sha256": "07d4640eebe8ed9f5e71dda526529e9a96bfb62bbc754564d0489fe1dd21c9c5", + "sha256": "1e2ee0e75288ca9700921cd7f8e9baae7b5daa5d9797424eef89be2d47744c2e", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5601, "path": "nodes/math.rn-mesoscopic-reduction.html", - "sha256": "c6bcb525919b672bb627abc79e99aa10a04d1275e1d9200edb324513dfc22290", + "sha256": "ac42a1abe4b83afa93c7402c9677e10ae50620eea8e83d12cc746d8eecbf4b11", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4867, "path": "nodes/math.rn-region.fixed-annulus-window.html", - "sha256": "567538d3e0257e090c67fa8c1ca65db28ff3b2ee2360def44c3abcc379697e98", + "sha256": "dced100eaf66674a47529380597f6d86e13a2a7d82978ea038029fa18865bbd0", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 4730, "path": "nodes/math.rn-region.fixed-remote.html", - "sha256": "88515b06a036583b5a397ff8940f1a5e4cc220fcf918e34fe38578c1074c94ba", + "sha256": "7c6bd5c7fa983df5377a77b6b3ff7e7fe8f8e7922253cd7da5287ae16f527708", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6016, "path": "nodes/math.rn-region.intermediate-r-to-rho.html", - "sha256": "e36fb684c387ec69a763c3a9e468472d4a2563bb9abae76a9c3d2dc2477ddc03", + "sha256": "0c19660a4c0bd0e6063abb8d0b0a8f067307a1f8a6a9804f92b889f8dd2f0735", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 7979, "path": "nodes/math.rn-region.mesoscopic-scaled-annulus.html", - "sha256": "425892762a5d94d3871e2bef5285d8a8c5a0ca3a23bc600dfb1e9388ee8a9815", + "sha256": "ac9be6a0323c86a1eda0d6aae0a8bbd15d135d0a7df9c7ccf76610e92fd665ad", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 6962, "path": "nodes/math.rn-region.pin-collision.html", - "sha256": "465bb28f7274e3c1095d7a05431add15885b01aff105c398cc7b78838b70cfa6", + "sha256": "77433d6158da862a72a3cdbde896a904b4903980a4d5342c46fbc8390c1ec6e2", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5442, "path": "nodes/math.rn-region.witness-collision.html", - "sha256": "3904bf59fa21e9e0c38d6848241cc8bd16dc4a0c6296cc063d1726c3915d4378", + "sha256": "fee8ae980611cc7147936d097fd0593ea63a8c0dc82dfe4b7d7cbd47117055ff", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5301, "path": "nodes/math.rn-selector-region-crosswalk.html", - "sha256": "cbcf06d2c6813616bdac428930bbafa3a0ccf161a059c20c1c324ba7cf87b827", + "sha256": "c3e90970a9428d07a439e2e3f52ab9d5c29434081329c966db40b3656d99eab4", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5676, "path": "nodes/math.side24-coefficient.html", - "sha256": "6682debd6f44355ce931117d33f2f9bbce9d3778c428150d9ac48923513cb893", + "sha256": "7d02fc5dcd9c7ac81477b71d1ce3cf1caf47adf6e30678d363de9e0dad4ebd6f", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 8004, "path": "nodes/math.uniform-matrix-cap-lifetime.html", - "sha256": "435b4f9b666c23da39b5265a6c24b2925be15147701edad52ab2090edb461661", + "sha256": "bfd19ad4b8d1ed0602e0d4e04f9ed824e94b1433b926dad6d6b934b915908211", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" }, { "binding": "current_observation", "bytes": 5603, "path": "nodes/regional.fixed-annulus.high-jet-route.html", - "sha256": "da5f33b417abe174f0a9c3935fa30a7babedcb2faccd950574b89d5dcfd6166c", + "sha256": "19cad107cb93351516085ef2f779cf1509056551ed12db01e74fe534a980b476", "snapshot": "7c583e28878d2bf2c94bf37325820bd5eb1e7f3f557e8a78dd27881a27f6548c" } ], @@ -1416,252 +1416,252 @@ { "bytes": 5155, "path": "nodes/eng.d0-packet-allowlist-fix.html", - "sha256": "fb94e57ed1a5761adb2fa369f961f45443a1ff177ec0e25d6f4adae778acea61" + "sha256": "60e9c100dd96b0ea220344a0ef733784d67992f68f55a01305fcd11059cde0a5" }, { "bytes": 4609, "path": "nodes/eng.hard-gate.html", - "sha256": "ac388fe17e5325e03510b7d148c0c5fa061d3db3ac8b52067c1d2e6654e929e7" + "sha256": "262d718d8a8f81dab60a82f126f318be40b32c92ee9e52f0b0849709541a1c7b" }, { "bytes": 4900, "path": "nodes/eng.main-pr87-crosswalk.html", - "sha256": "2afe17a3003c05bf9d1d61b7f1fe085c61da25308108165390c529c85b0a8ed4" + "sha256": "9f85d0c79f2a8f5a6c87dd899e54afa99ec065959ff22c4d9d4646eb1d555834" }, { "bytes": 4651, "path": "nodes/hist.ALLCELL-FDZ-Q4.html", - "sha256": "a7caa1a8d9e56246717f25fa8a8947cc0ed80d6048e1b955e2a98f355f39915e" + "sha256": "5c2d942729e29651d435bc0c7debfa4d65b8ba948ca48b8865c54dee62be3f24" }, { "bytes": 4852, "path": "nodes/hist.CH-LIFT.html", - "sha256": "d7f70be50b9a45b4cf93857a8808124eb821ecaefd378b7c4baeecce6bdb659c" + "sha256": "2fed77dcb9de9d52bbe34238966b43981f05171c160829d3122f4f5d821c0e63" }, { "bytes": 4618, "path": "nodes/hist.CL_ANTHROPIC_BUNDLE_2026-09-17_v5.zip.html", - "sha256": "3cb21bda158399d20d334bf14d29b0dc1089f1b557c6d6c71850689eecc80390" + "sha256": "978dd934eaea60208b9cdeac6fa0a76300ffc5fa20f62790de0d7110ddfa1b6c" }, { "bytes": 4620, "path": "nodes/hist.ENV-RESCOV.html", - "sha256": "2ae93e638722e6fdb0e9990e8a59e5a7265f4a042ccee1cb7046fcba4399b319" + "sha256": "921c9be527f92f94da8bfddfed730b1b61f76bb0391a4b301262f26932152a19" }, { "bytes": 4400, "path": "nodes/hist.LOGQ-TAIL.html", - "sha256": "abb293f57956e86aae44fb4999e5f070f561a3c9ed743e3a30d64d806380ce08" + "sha256": "815c76ce3338646beaf99cee37c60daec17152d8d115294a1d1fe3968a5f1254" }, { "bytes": 4655, "path": "nodes/hist.OBL-H5-JETMOD.html", - "sha256": "e890b1d66903b0680922f5d0dc6bf3ea20c5acc28218547838ef980a5aa28748" + "sha256": "9eb048a34a6eadab642b4d7c7986889534b71a59c1c85256f7af2aecb9444660" }, { "bytes": 4892, "path": "nodes/hist.Piece-2-annulus.html", - "sha256": "c4d09c1f81b45f09430cc37593f4081d07329746290a5c617eafe828690352a0" + "sha256": "9ce39caa8f871f9a22582b4950f8a0290af991daded259d96885f7fb583a749b" }, { "bytes": 4687, "path": "nodes/hist.SYM-Fw-jet.html", - "sha256": "0826577ff1482484bb0f80298a1917cdc8a2706632bddc5b00137be3c0ee565a" + "sha256": "7163c4482a36ffe9861acb9c50fac3bbce6f242f976c8e5feebe336731271308" }, { "bytes": 4608, "path": "nodes/hist.allcell_fdz_enclosures.json.html", - "sha256": "b77e56474e9479607a64131e4ff3c877c5e610442ff0540cc684d6437c499e70" + "sha256": "7b6ba985d24b35cb7f60b3c4cd1c21e078eb5456d38acd2ee532051096182f62" }, { "bytes": 4394, "path": "nodes/hist.lemma_closed.html", - "sha256": "0525cf5376183ffd17781f8f2c4aa3f8a3ab75ff1eea8d12a374ee645c0e8665" + "sha256": "6a7ed0c0438921821a882026ea3ffbfe5703503ede9bcdc1e24f8989faf9da29" }, { "bytes": 4571, "path": "nodes/hist.rnu_env.py.html", - "sha256": "ba0aab5167d4652c37f392a5646b735dcea007f6c732538c681500d4fa42edc3" + "sha256": "4e167332c1d3f6fac63dc381e8522fc0425713ca9d1dd865763d08d23dc3bbf6" }, { "bytes": 838014, "path": "nodes/index.html", - "sha256": "2f07748a76be68df9e5d2ff123a70393c9d0f60a99350afcc4a9bf5dcd849aaf" + "sha256": "23aaf08879b6e6579d7b135ffe4355abf29f95d7e90530557354c3dab0fdebaa" }, { "bytes": 6172, "path": "nodes/math.d1-component.congruence-erratum.html", - "sha256": "0adebad24592f45254a320d4f901bd5b976f3f1a52f8738f9c6fcf65bcb4089b" + "sha256": "a85c6e299d34de35a9c72e27dc61522a5b52972e9befab44b8127f33ae030686" }, { "bytes": 6204, "path": "nodes/math.d1-component.marked-cylinder-cap.html", - "sha256": "766f39cb9aeb398c2d0f2a03c489a16e9ca387509b5e27de1d5a6f96c96585c0" + "sha256": "b3e8ec3dc3f21c162789ec2cf45e5c1fd2d69dc78e8c335d1f32785254e87208" }, { "bytes": 6763, "path": "nodes/math.d1-component.reconciliation-record.html", - "sha256": "b9b41d401a95818cca6d762946d8d62fac69dc3a3396b84852ee05cab840a88c" + "sha256": "f171e22cfa1be38bad902486fbc7d4f1071ffe661a8dba8f06406a0e57ce7a4e" }, { "bytes": 6175, "path": "nodes/math.d1-component.section9-replacement-v1_1.html", - "sha256": "2752bf661c52837b3cbe66a124978fe1b4156b838e83a5009ac1bf32f9d233d7" + "sha256": "4a2d3adf67a5b70965523145083e70c12eb691f6cc0d89d3328af46615ab870c" }, { "bytes": 5703, "path": "nodes/math.d5-component.annulus-proof.html", - "sha256": "e7b6f13e873b684c0201ab514f593380b523c961a36e4ea36b5fc5c4dd5001e3" + "sha256": "589e9f899a9acb773c539410d47e5c9ab6c6333b3afae05306f49e9fd82d572d" }, { "bytes": 5488, "path": "nodes/math.d5-component.annulus-review.html", - "sha256": "692188bf610ce4d7ea9855749e27dfef5eafb09da062ac400cb92d32401a1f82" + "sha256": "d5c145442027180fe30b31ff953080c37db82e80d9e021c2720b53695cbb7c67" }, { "bytes": 6182, "path": "nodes/math.d5-component.collar-proof.html", - "sha256": "08c95c5159a143ecc8fe6bbf64f11040ea6c5992c083712b20024b795585f6bf" + "sha256": "f10a42b51ee34bc510d7c5b582bdab473b0aaf2ed8a5671d40f35c41bcc80d33" }, { "bytes": 5690, "path": "nodes/math.d5-component.collar-review.html", - "sha256": "c0ecea09db3c90217429e991bc9edca642c6697ef5c8301d0a8541b0ca986b7b" + "sha256": "fd1353a3e3eb85bbfee9c0a37039072d9a46683702869c45091b38afbc859882" }, { "bytes": 5490, "path": "nodes/math.d5-component.i5-review-claude.html", - "sha256": "f2e114ab246157c77cbb0028dfff3dbf82b8873fdd59969370518961bdd0d549" + "sha256": "69bb8c3fbc15f439109c2d6ec6094fb593188285b985c32ffee6a5e9a52378fe" }, { "bytes": 5427, "path": "nodes/math.d5-component.i5-review-xai.html", - "sha256": "2183b7d37a2ba3ca4c6c280ea44f482e29b015d6d1d0dc12d776acb13f8248ef" + "sha256": "5b588a59fd5fe52ca1102bd0032d731e606bb8b7033fe6748a59206d35253e47" }, { "bytes": 5967, "path": "nodes/math.d5-component.intermediate-window-proof.html", - "sha256": "30669567f39d0756554a7295a381fd03ded06778d5e88f541d5c9ada70a57361" + "sha256": "a80f1cf63d9e4f87c515d4d39961a2326b857a7a63fd44fbb7048cfaf990c51f" }, { "bytes": 5226, "path": "nodes/math.d5-component.offpin-second-moment-review.html", - "sha256": "da8f23fe48da609367ea3af80c128c6ead1d4844a1b0689fc35ae5d284ec95da" + "sha256": "bdd8aaad9909140006116cd4c100e90c13ad31fc53521c3c0fbfe2f61e12956f" }, { "bytes": 5851, "path": "nodes/math.d5-component.punctured-pin-continuum-check.html", - "sha256": "0e0f533d0da7a27945f4d030fe3f098b546e970e1757e3429d55162630d743ed" + "sha256": "2406eda228166217a47210c7541c891bd9878b0a10fc5334f7419d0dafa3fbd3" }, { "bytes": 5819, "path": "nodes/math.d5-component.punctured-pin-continuum-review.html", - "sha256": "7b5c95af8a62c557effd063efe115847dfe33d82bd6eb299a35841d88e01514c" + "sha256": "4b6eee6774a6e0b0f34b1630f42989b868a679e5270abd4c49cc704301ac773a" }, { "bytes": 6231, "path": "nodes/math.d5-component.punctured-pin-proof.html", - "sha256": "22c2067285ace36d25759c5c0dd5f22b0ba30ecba04e69f61ba5628798ce9bbc" + "sha256": "57c0430e791302549b8342e04bba114524fc4242b17ce541998aa6f4929fecf7" }, { "bytes": 5762, "path": "nodes/math.d5-component.punctured-pin-review-111.html", - "sha256": "83a1096a5f280fed9f6e565c3c14749143f36c438443dc7fffc66a5d742d6053" + "sha256": "7e0b8e3357481c128d70428bfa6b505fd0f223529f28b3fb06c15b0d3a38b39c" }, { "bytes": 5432, "path": "nodes/math.d5-component.remote-window-proof.html", - "sha256": "56edb72719c1400b2b3dcaffb138b30f0395afbc17adda14c4942149d2348229" + "sha256": "8ca775e598790ce5042ab405faa2d1fa353c523447c5f23e27eca1f04f75afa8" }, { "bytes": 7973, "path": "nodes/math.d5-pin-neighborhood-first-moment.html", - "sha256": "0627ec69c109dc313c8358a5fd9f8c2a4fb75961d8adc2ae3eca0b0fa549e538" + "sha256": "130ee3058ca23b7ed71e0226146787b8d39d9611173a3534a742abbef5acbaf9" }, { "bytes": 5710, "path": "nodes/math.lifetime-remainder.html", - "sha256": "c5aff8eb9de618bc0c9d572c7c5a821ffb66095df7e7aee80626a339394a9229" + "sha256": "efae23d045606d8338945bb1dc76ce86d7569f542f8f8e267cb1c97ac59e0305" }, { "bytes": 5053, "path": "nodes/math.p15-full-price.html", - "sha256": "f96526ce67843e8d35c797a67357ce8aba851d5ef71151bca1e64af39f802e0c" + "sha256": "e9d04028343daea7ab4eafc3da329676b7b7b541169b646c68bbaed1948ea226" }, { "bytes": 5028, "path": "nodes/math.p15-price-boundary.html", - "sha256": "b4aa66c3aa5c2b59dc3fae4ceb959b4f274a011724909c0876e03cb5ab717182" + "sha256": "ddaa5c9976aa01b0e18f197fde3c71545cd431e8dbe6222e404ed9e7d4fd51d7" }, { "bytes": 5589, "path": "nodes/math.rn-count-interface.html", - "sha256": "0da02fe064f930848c50ec9e63943653ca1b5fca8468d30dc76e47c791d0956f" + "sha256": "0c566e318f36e3c0f83af2149be319fff9d2395985cf3f97a05aedfec25d81f1" }, { "bytes": 6445, "path": "nodes/math.rn-fixed-annulus-window.html", - "sha256": "684cba2171fc16e4eeb116b70c0425ba270e87bd2db258485aae9ed09526fe1a" + "sha256": "138b374cbcfce350fe40a28dc5313c40d2d2034323b7cd8221bb30601c88525b" }, { "bytes": 5754, "path": "nodes/math.rn-fixed-remote-window.html", - "sha256": "07d4640eebe8ed9f5e71dda526529e9a96bfb62bbc754564d0489fe1dd21c9c5" + "sha256": "1e2ee0e75288ca9700921cd7f8e9baae7b5daa5d9797424eef89be2d47744c2e" }, { "bytes": 5601, "path": "nodes/math.rn-mesoscopic-reduction.html", - "sha256": "c6bcb525919b672bb627abc79e99aa10a04d1275e1d9200edb324513dfc22290" + "sha256": "ac42a1abe4b83afa93c7402c9677e10ae50620eea8e83d12cc746d8eecbf4b11" }, { "bytes": 4867, "path": "nodes/math.rn-region.fixed-annulus-window.html", - "sha256": "567538d3e0257e090c67fa8c1ca65db28ff3b2ee2360def44c3abcc379697e98" + "sha256": "dced100eaf66674a47529380597f6d86e13a2a7d82978ea038029fa18865bbd0" }, { "bytes": 4730, "path": "nodes/math.rn-region.fixed-remote.html", - "sha256": "88515b06a036583b5a397ff8940f1a5e4cc220fcf918e34fe38578c1074c94ba" + "sha256": "7c6bd5c7fa983df5377a77b6b3ff7e7fe8f8e7922253cd7da5287ae16f527708" }, { "bytes": 6016, "path": "nodes/math.rn-region.intermediate-r-to-rho.html", - "sha256": "e36fb684c387ec69a763c3a9e468472d4a2563bb9abae76a9c3d2dc2477ddc03" + "sha256": "0c19660a4c0bd0e6063abb8d0b0a8f067307a1f8a6a9804f92b889f8dd2f0735" }, { "bytes": 7979, "path": "nodes/math.rn-region.mesoscopic-scaled-annulus.html", - "sha256": "425892762a5d94d3871e2bef5285d8a8c5a0ca3a23bc600dfb1e9388ee8a9815" + "sha256": "ac9be6a0323c86a1eda0d6aae0a8bbd15d135d0a7df9c7ccf76610e92fd665ad" }, { "bytes": 6962, "path": "nodes/math.rn-region.pin-collision.html", - "sha256": "465bb28f7274e3c1095d7a05431add15885b01aff105c398cc7b78838b70cfa6" + "sha256": "77433d6158da862a72a3cdbde896a904b4903980a4d5342c46fbc8390c1ec6e2" }, { "bytes": 5442, "path": "nodes/math.rn-region.witness-collision.html", - "sha256": "3904bf59fa21e9e0c38d6848241cc8bd16dc4a0c6296cc063d1726c3915d4378" + "sha256": "fee8ae980611cc7147936d097fd0593ea63a8c0dc82dfe4b7d7cbd47117055ff" }, { "bytes": 5301, "path": "nodes/math.rn-selector-region-crosswalk.html", - "sha256": "cbcf06d2c6813616bdac428930bbafa3a0ccf161a059c20c1c324ba7cf87b827" + "sha256": "c3e90970a9428d07a439e2e3f52ab9d5c29434081329c966db40b3656d99eab4" }, { "bytes": 5676, "path": "nodes/math.side24-coefficient.html", - "sha256": "6682debd6f44355ce931117d33f2f9bbce9d3778c428150d9ac48923513cb893" + "sha256": "7d02fc5dcd9c7ac81477b71d1ce3cf1caf47adf6e30678d363de9e0dad4ebd6f" }, { "bytes": 8004, "path": "nodes/math.uniform-matrix-cap-lifetime.html", - "sha256": "435b4f9b666c23da39b5265a6c24b2925be15147701edad52ab2090edb461661" + "sha256": "bfd19ad4b8d1ed0602e0d4e04f9ed824e94b1433b926dad6d6b934b915908211" }, { "bytes": 5603, "path": "nodes/regional.fixed-annulus.high-jet-route.html", - "sha256": "da5f33b417abe174f0a9c3935fa30a7babedcb2faccd950574b89d5dcfd6166c" + "sha256": "19cad107cb93351516085ef2f779cf1509056551ed12db01e74fe534a980b476" } ], "payload": { diff --git a/docs/site/workspace.html b/docs/site/workspace.html index 6e3d1257c..ef1aa5bad 100644 --- a/docs/site/workspace.html +++ b/docs/site/workspace.html @@ -5,12 +5,12 @@ Library and research workspace · Universal Law - - - + + + - - + + diff --git a/tests/test_site_stylesheet_order.py b/tests/test_site_stylesheet_order.py new file mode 100644 index 000000000..6a8d940f0 --- /dev/null +++ b/tests/test_site_stylesheet_order.py @@ -0,0 +1,35 @@ +"""Live generated node pages load style.css before brand.css (F2: brand.css dark/reduced-motion rules must win).""" +import re +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +SITE = ROOT / "docs/site" +LINK = re.compile(r'")] + with self.subTest(tool=tool): + self.assertLess(body.index("style.css"), body.index("brand.css")) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/current_site_build.py b/tools/current_site_build.py index d492d2e77..e88d69333 100644 --- a/tools/current_site_build.py +++ b/tools/current_site_build.py @@ -287,7 +287,7 @@ def static_page(data, meta, title, body, *, archived=False, node_id=None): '\n' '\n' f'{escape(title)} · Research dependency atlas\n' - f'\n' + f'\n' '
\n' f'\n' + current_section(data, meta, prefix=site_prefix, search=False, diff --git a/tools/current_site_history.py b/tools/current_site_history.py index 8907ddab4..380b53e05 100644 --- a/tools/current_site_history.py +++ b/tools/current_site_history.py @@ -1470,7 +1470,7 @@ def _live_v2_static_page(data, meta, title, body): '\n' '\n' f'{_v1_escape(title)} · Current research dependency atlas\n' - '\n' + '\n' '
\n' '\n' + _live_v2_current_section(data, meta) From e2c454af9ecbfbcdbc00c8c819549bfc67a70372 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 17:35:10 +0000 Subject: [PATCH 07/37] ci(current-site): full-history build checkout so reader-link identity tests run Co-authored-by: Dylan Roy --- .github/workflows/current-site.yml | 1 + tests/test_current_site_publication.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/current-site.yml b/.github/workflows/current-site.yml index 01b94fdd4..a9a5b19a2 100644 --- a/.github/workflows/current-site.yml +++ b/.github/workflows/current-site.yml @@ -55,6 +55,7 @@ jobs: with: ref: ${{ github.sha }} persist-credentials: false + fetch-depth: 0 - name: Restore and admit all previously published public history env: GITHUB_TOKEN: ${{ github.token }} diff --git a/tests/test_current_site_publication.py b/tests/test_current_site_publication.py index 58922ca30..a94f7bd8b 100644 --- a/tests/test_current_site_publication.py +++ b/tests/test_current_site_publication.py @@ -276,6 +276,8 @@ def test_workflow_has_pr_specific_concurrency_and_separate_metadata_handoff(self self.assertNotIn("pip install", deploy) self.assertLess(deploy.index(" prepare "), deploy.index("actions/deploy-pages@")) self.assertGreater(deploy.index(" observe "), deploy.index("actions/deploy-pages@")) + build_checkout = raw.split(" build:\n", 1)[1].split(" deploy:\n", 1)[0].split(" - name:", 1)[0] + self.assertIn("fetch-depth: 0", build_checkout) def test_http_clients_bound_responses_and_keep_credentials_in_fixed_api_headers(self): class Response(io.BytesIO): From 260d7f71a09bb190beeb50e6bbdeb32c738aaf3a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 18:24:55 +0000 Subject: [PATCH 08/37] docs: address #414 AMEND (zeta_fold_exploration pointer; pinned-tip wording) Co-authored-by: Dylan Roy --- docs/REPRODUCE.md | 2 +- docs/WORKSPACE.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/REPRODUCE.md b/docs/REPRODUCE.md index c5719166c..6eb1c2728 100644 --- a/docs/REPRODUCE.md +++ b/docs/REPRODUCE.md @@ -83,7 +83,7 @@ git clone --single-branch --branch chatgpt/drive-github-hardening-20260919 https git -C research checkout a01c72f1937875b94bfd78e183a6dbbdb2b04da4 ``` -The named branch tracks its current tip. To inspect one work item using that +The checkout is pinned to the frozen tip `a01c72f1`. To inspect one work item using that checkout's existing dispatcher: ```sh diff --git a/docs/WORKSPACE.md b/docs/WORKSPACE.md index 5f40e326c..8338c0ff1 100644 --- a/docs/WORKSPACE.md +++ b/docs/WORKSPACE.md @@ -108,7 +108,7 @@ git rev-parse HEAD ``` To inspect the older hardening software (last merge 27 September 2026), add -`--single-branch --branch chatgpt/drive-github-hardening-20260919`, then `git checkout a01c72f1937875b94bfd78e183a6dbbdb2b04da4` to read the pinned legacy tip. Current numerical work on `main` is in `experiments/periodic_h0/` and `experiments/universality/`. +`--single-branch --branch chatgpt/drive-github-hardening-20260919`, then `git checkout a01c72f1937875b94bfd78e183a6dbbdb2b04da4` to read the pinned legacy tip. Current numerical work on `main` is in `experiments/periodic_h0/`, `experiments/universality/`, and `experiments/zeta_fold_exploration/`. Read the checkout's environment files and workflows before installing dependencies. This session prefers project-local environments, identifiable upstream sources, and From 55a1703f3577c5c01b132929e7a2243e983e338a Mon Sep 17 00:00:00 2001 From: Grok Bot agent 16 Date: Thu, 15 Oct 2026 12:33:13 -0500 Subject: [PATCH 09/37] public intake: report events queued before merge as not evaluated, not rejected An event queued while the PR was open but executed after the merge failed with 'PR is not open' (e.g. runs 37139813163 for #246, 37843755359 for #319, 37023939734 for #232). Only a closed+merged PR whose live head equals the event head is skipped; closed-unmerged PRs, head drift and non-boolean merged values still reject. --- tests/test_public_intake.py | 21 +++++++++++++++++++++ tools/public_intake_check.py | 11 +++++++++++ 2 files changed, 32 insertions(+) diff --git a/tests/test_public_intake.py b/tests/test_public_intake.py index 4730501aa..e64f9b8c0 100644 --- a/tests/test_public_intake.py +++ b/tests/test_public_intake.py @@ -360,6 +360,27 @@ def test_non_open_pr_and_wrong_base_are_refused(self): self.pr['base']['ref'] = 'other' self.reject('targets main') + def test_event_queued_before_merge_is_not_a_rejection(self): + # Observed on main (runs 37139813163, 37843755359): an event for the open PR + # ran seconds after the merge and failed with 'PR is not open'. + self.pr['state'] = 'closed' + self.pr['merged'] = True + result = self.run_check() + self.assertEqual(result['result'], 'SKIPPED_MERGED_BEFORE_CHECK') + self.assertEqual(result['lane'], 'not-evaluated') + self.assertEqual(self.api.calls, [f'/repos/{REPO}/pulls/7']) + + def test_merged_pr_with_different_head_or_unmerged_close_still_refused(self): + self.pr['state'] = 'closed' + self.pr['merged'] = False + self.reject('not open') + self.pr['merged'] = True + self.pr['head']['sha'] = 'e' * 40 + self.reject('not open') + self.pr['head']['sha'] = HEAD + self.pr['merged'] = 'true' # only the JSON boolean counts + self.reject('not open') + def test_cli_pass_and_failure_are_distinct_without_network(self): with tempfile.TemporaryDirectory() as folder: event_file = Path(folder) / 'event.json' diff --git a/tools/public_intake_check.py b/tools/public_intake_check.py index b96674d4d..4f2e1b310 100644 --- a/tools/public_intake_check.py +++ b/tools/public_intake_check.py @@ -385,6 +385,17 @@ def check(event, api, repository): number = integer(event.get('number'), 1, 10000000, 'invalid PR number') pr = api.get(f'/repos/{repository}/pulls/{number}') require(pr.get('number') == number, 'PR number mismatch') + event_pr = event.get('pull_request') + if (isinstance(pr, dict) and pr.get('state') == 'closed' and pr.get('merged') is True + and isinstance(event_pr, dict) and isinstance(event_pr.get('head'), dict) + and isinstance(pr.get('head'), dict) and event_pr['head'].get('sha') == pr['head'].get('sha') + and isinstance(event_pr['head'].get('sha'), str) and HEX40.fullmatch(event_pr['head']['sha'])): + # An event that was queued before the merge but ran after it: the merged head was + # already gated by its own earlier run, and nothing here can block a landed merge. + # Report that nothing was evaluated rather than a spurious rejection. A closed but + # unmerged (reopenable) PR, or a head that differs from the event, still rejects. + return {'head': pr['head']['sha'], 'scientific_effect': 'NONE', 'lane': 'not-evaluated', + 'result': 'SKIPPED_MERGED_BEFORE_CHECK'} original = snapshot(pr, repository) head, base, head_repo, labels, count = original event_pr = event.get('pull_request') From d12f6ac93645f933ca1bed7a6d1bde4a4fa15b01 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 19:00:09 +0000 Subject: [PATCH 10/37] public intake: do not record success when merged before check SKIPPED_MERGED_BEFORE_CHECK still means the package was not evaluated. main() now exits 78 for that result only. The workflow records a separate neutral check and exits 78, so the required public-intake job cannot succeed. Co-authored-by: Dylan Roy --- .github/workflows/public-intake.yml | 20 +++- tests/test_public_intake.py | 150 ++++++++++++++++++++++++++++ tools/public_intake_check.py | 69 ++++++++++++- 3 files changed, 234 insertions(+), 5 deletions(-) diff --git a/.github/workflows/public-intake.yml b/.github/workflows/public-intake.yml index 401ee3228..f37525e04 100644 --- a/.github/workflows/public-intake.yml +++ b/.github/workflows/public-intake.yml @@ -8,6 +8,8 @@ on: permissions: contents: read pull-requests: read + # Only for the neutral "not evaluated" check run. Submitted code is never executed. + checks: write jobs: public-intake: name: public-intake @@ -28,4 +30,20 @@ jobs: - name: Verify intake from API bytes without checking out the PR env: GH_TOKEN: ${{ github.token }} - run: python3 -B -I tools/public_intake_check.py + PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + set +e + python3 -B -I tools/public_intake_check.py + code=$? + set -e + # Actions cannot mark this job neutral. Skipping the job can count as a + # passing required check, and a zero status would make public-intake + # green without package verification. Record a separate neutral check, + # then exit 78 so this job is failure, not success. A failed post + # still reaches that same nonzero status. + if [ "$code" -eq 78 ]; then + echo "not evaluated: merged before check" + python3 -B -I tools/public_intake_check.py --publish-not-evaluated-check || true + exit 78 + fi + exit "$code" diff --git a/tests/test_public_intake.py b/tests/test_public_intake.py index e64f9b8c0..f274f42a5 100644 --- a/tests/test_public_intake.py +++ b/tests/test_public_intake.py @@ -8,7 +8,9 @@ import io import os import struct +import subprocess import tempfile +import textwrap from unittest import mock from pathlib import Path import unicodedata @@ -381,6 +383,154 @@ def test_merged_pr_with_different_head_or_unmerged_close_still_refused(self): self.pr['merged'] = 'true' # only the JSON boolean counts self.reject('not open') + def test_merged_before_check_exits_78_and_is_not_success(self): + self.pr['state'] = 'closed' + self.pr['merged'] = True + with tempfile.TemporaryDirectory() as folder: + event_file = Path(folder) / 'event.json' + event_file.write_text(json.dumps(self.event)) + env = {'GITHUB_EVENT_NAME': 'pull_request_target', 'GITHUB_REPOSITORY': REPO, 'GH_TOKEN': 'test-only'} + with mock.patch.dict(os.environ, env), mock.patch.object(intake, 'API', return_value=self.api), \ + mock.patch.object(intake, 'publish_not_evaluated_check') as publish, \ + contextlib.redirect_stdout(io.StringIO()) as output: + code = intake.main(['--event', str(event_file)]) + publish.assert_not_called() + self.assertEqual(code, 78) + self.assertEqual(code, intake.EXIT_NOT_EVALUATED) + self.assertNotEqual(code, 0) + payload = json.loads(output.getvalue()) + self.assertEqual(payload['result'], 'SKIPPED_MERGED_BEFORE_CHECK') + self.assertEqual(payload['lane'], 'not-evaluated') + self.assertNotIn('success', output.getvalue()) + + def test_closed_unmerged_still_exits_1(self): + self.pr['state'] = 'closed' + self.pr['merged'] = False + with tempfile.TemporaryDirectory() as folder: + event_file = Path(folder) / 'event.json' + event_file.write_text(json.dumps(self.event)) + env = {'GITHUB_EVENT_NAME': 'pull_request_target', 'GITHUB_REPOSITORY': REPO, 'GH_TOKEN': 'test-only'} + with mock.patch.dict(os.environ, env), mock.patch.object(intake, 'API', return_value=self.api), \ + contextlib.redirect_stdout(io.StringIO()) as output: + code = intake.main(['--event', str(event_file)]) + self.assertEqual(code, 1) + self.assertEqual(json.loads(output.getvalue())['reason'], 'PR is not open') + + def test_not_evaluated_check_is_neutral_and_never_success(self): + class Response: + def __init__(self, payload): + self.payload = payload + + def read(self, limit): + return self.payload[:limit] + + def __enter__(self): + return self + + def __exit__(self, *args): + return False + + class Opener: + def __init__(self, payload): + self.payload = payload + self.requests = [] + + def open(self, request, timeout=30): + self.requests.append(request) + return Response(self.payload) + + body = intake.not_evaluated_check_body(HEAD) + self.assertEqual(body['conclusion'], 'neutral') + self.assertNotEqual(body['conclusion'], 'success') + self.assertEqual(body['name'], 'public-intake (not evaluated: merged before check)') + self.assertNotEqual(body['name'], 'public-intake') + self.assertEqual(body['output']['title'], 'not evaluated: merged before check') + neutral = json.dumps({'conclusion': 'neutral', 'name': intake.NOT_EVALUATED_CHECK_NAME}).encode() + opener = Opener(neutral) + recorded = intake.publish_not_evaluated_check(REPO, HEAD, 'test-only', opener) + self.assertEqual(recorded['conclusion'], 'neutral') + self.assertNotEqual(recorded['conclusion'], 'success') + request = opener.requests[0] + self.assertEqual(request.full_url, 'https://api.github.com/repos/d6g8k5htny-coder/main/check-runs') + self.assertEqual(request.get_method(), 'POST') + self.assertEqual(request.get_header('Authorization'), 'Bearer test-only') + sent = json.loads(request.data.decode()) + self.assertEqual(sent['conclusion'], 'neutral') + self.assertNotEqual(sent['conclusion'], 'success') + self.assertNotEqual(sent['name'], 'public-intake') + self.assertNotIn('test-only', request.data.decode()) + refused = Opener(json.dumps({'conclusion': 'success', 'name': intake.NOT_EVALUATED_CHECK_NAME}).encode()) + with self.assertRaisesRegex(ValueError, 'did not record neutral'): + intake.publish_not_evaluated_check(REPO, HEAD, 'test-only', refused) + self.assertEqual(json.loads(refused.requests[0].data.decode())['conclusion'], 'neutral') + untouched = Opener(neutral) + with self.assertRaisesRegex(ValueError, 'invalid head sha'): + intake.publish_not_evaluated_check(REPO, 'not-a-sha', 'test-only', untouched) + with self.assertRaisesRegex(ValueError, 'wrong repository'): + intake.publish_not_evaluated_check('other/repo', HEAD, 'test-only', untouched) + self.assertEqual(untouched.requests, []) + + def test_publish_flag_failure_is_not_a_successful_intake(self): + env = {'GITHUB_REPOSITORY': REPO, 'PR_HEAD_SHA': 'not-a-sha', 'GH_TOKEN': 'test-only-secret'} + with mock.patch.dict(os.environ, env), contextlib.redirect_stdout(io.StringIO()) as output: + code = intake.main(['--publish-not-evaluated-check']) + self.assertEqual(code, 1) + self.assertNotEqual(code, 0) + self.assertIn('NOT_EVALUATED_CHECK_UNPUBLISHED', output.getvalue()) + self.assertNotIn('test-only-secret', output.getvalue()) + self.assertNotIn('success', output.getvalue()) + + def test_workflow_maps_exit_78_to_neutral_and_never_success(self): + workflow = (Path(__file__).resolve().parents[1] / '.github/workflows/public-intake.yml').read_text() + self.assertIn('checks: write', workflow) + self.assertIn('\n name: public-intake\n', workflow) + self.assertNotIn('continue-on-error', workflow) + self.assertNotIn('exit 0', workflow) + lines = [] + capture = False + for line in workflow.splitlines(): + if line.strip() == 'set +e': + capture = True + if capture: + lines.append(line) + if capture and line.strip() == 'exit "$code"': + break + script = textwrap.dedent('\n'.join(lines) + '\n') + self.assertIn('exit 78', script) + self.assertNotIn('exit 0', script) + publish_at = script.index('--publish-not-evaluated-check') + exit_78 = script.index('\n exit 78\n') + self.assertLess(script.index('if [ "$code" -eq 78 ]; then'), publish_at) + self.assertLess(publish_at, exit_78) + self.assertLess(exit_78, script.index('exit "$code"')) + with tempfile.TemporaryDirectory() as folder: + bin_dir = Path(folder) / 'bin' + bin_dir.mkdir() + log = Path(folder) / 'calls' + stub = bin_dir / 'python3' + stub.write_text('#!/bin/sh\nprintf "%s\\n" "$*" >> "$STUB_LOG"\n' + 'if [ "$4" = "--publish-not-evaluated-check" ]; then exit 0; fi\n' + 'exit "$STUB_CODE"\n') + stub.chmod(0o755) + env = dict(os.environ) + env['PATH'] = str(bin_dir) + os.pathsep + env.get('PATH', '') + env['STUB_LOG'] = str(log) + for stub_code, expected in ((0, 0), (1, 1), (78, 78), (2, 2)): + with self.subTest(stub_code=stub_code): + log.write_text('') + result = subprocess.run(['bash', '-c', script], env={**env, 'STUB_CODE': str(stub_code)}, + capture_output=True, text=True) + self.assertEqual(result.returncode, expected) + calls = log.read_text().splitlines() + if stub_code == 78: + self.assertNotEqual(result.returncode, 0) + self.assertIn('not evaluated: merged before check', result.stdout) + self.assertEqual(calls, ['-B -I tools/public_intake_check.py', + '-B -I tools/public_intake_check.py --publish-not-evaluated-check']) + else: + self.assertEqual(calls, ['-B -I tools/public_intake_check.py']) + self.assertNotIn('--publish-not-evaluated-check', log.read_text()) + def test_cli_pass_and_failure_are_distinct_without_network(self): with tempfile.TemporaryDirectory() as folder: event_file = Path(folder) / 'event.json' diff --git a/tools/public_intake_check.py b/tools/public_intake_check.py index 4f2e1b310..b554aad22 100644 --- a/tools/public_intake_check.py +++ b/tools/public_intake_check.py @@ -3,6 +3,7 @@ No submitted file is checked out, imported, rendered, or executed. The limited credential-pattern scan is not a guarantee that a submission contains no secret. A pass means packaging checks passed; scientific effect remains NONE. +A merged-before-check run did not verify the package: it exits 78, not 0. """ from __future__ import annotations @@ -30,6 +31,9 @@ MAX_PNG_SIDE = 16384 MAX_PNG_PIXELS = 1 << 24 HEX40 = re.compile(r'[0-9a-f]{40}\Z') +# Distinct from rejection (1). Nonzero so the required public-intake job cannot succeed. +EXIT_NOT_EVALUATED = 78 +NOT_EVALUATED_CHECK_NAME = 'public-intake (not evaluated: merged before check)' HEX64 = re.compile(r'[0-9a-f]{64}\Z') REPOSITORY = re.compile(r'[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+\Z') SAFE_PATH = re.compile(r'[A-Za-z0-9_][A-Za-z0-9_. /-]*\Z') @@ -390,10 +394,11 @@ def check(event, api, repository): and isinstance(event_pr, dict) and isinstance(event_pr.get('head'), dict) and isinstance(pr.get('head'), dict) and event_pr['head'].get('sha') == pr['head'].get('sha') and isinstance(event_pr['head'].get('sha'), str) and HEX40.fullmatch(event_pr['head']['sha'])): - # An event that was queued before the merge but ran after it: the merged head was - # already gated by its own earlier run, and nothing here can block a landed merge. - # Report that nothing was evaluated rather than a spurious rejection. A closed but - # unmerged (reopenable) PR, or a head that differs from the event, still rejects. + # Queued while the PR was open, executed after the merge. Package verification + # did not run. This does not prove an earlier successful intake of this head. + # main() returns EXIT_NOT_EVALUATED so the required job cannot record success. + # A closed but unmerged (reopenable) PR, or a head that differs from the event, + # still rejects. return {'head': pr['head']['sha'], 'scientific_effect': 'NONE', 'lane': 'not-evaluated', 'result': 'SKIPPED_MERGED_BEFORE_CHECK'} original = snapshot(pr, repository) @@ -412,15 +417,71 @@ def check(event, api, repository): return result +def not_evaluated_check_body(head_sha): + """Neutral Checks API body. Not a successful public-intake result.""" + sha40(head_sha, 'invalid head sha') + require(NOT_EVALUATED_CHECK_NAME != 'public-intake', 'neutral check must not reuse the required check name') + body = { + 'name': NOT_EVALUATED_CHECK_NAME, + 'head_sha': head_sha, + 'status': 'completed', + 'conclusion': 'neutral', + 'output': { + 'title': 'not evaluated: merged before check', + 'summary': 'The pull request merged before public-intake verified the package. ' + 'Nothing was evaluated. This is not a successful intake result.', + }, + } + require(body['conclusion'] == 'neutral', 'not-evaluated check must stay neutral') + return body + + +def publish_not_evaluated_check(repository, head_sha, token, opener=None): + """POST one neutral check run. Refuses any recorded conclusion other than neutral.""" + require(repository == 'd6g8k5htny-coder/main', 'wrong repository') + require(isinstance(token, str) and token, 'read-only GitHub token missing') + body = not_evaluated_check_body(head_sha) + request = urllib.request.Request( + 'https://api.github.com/repos/' + repository + '/check-runs', + data=json.dumps(body).encode(), method='POST', headers={ + 'Authorization': 'Bearer ' + token, 'Accept': 'application/vnd.github+json', + 'Content-Type': 'application/json', 'X-GitHub-Api-Version': '2022-11-28', + 'User-Agent': 'public-intake-not-evaluated'}) + if opener is None: + opener = urllib.request.build_opener(NoRedirect()) + with opener.open(request, timeout=30) as response: + raw = response.read(MAX_RESPONSE_BYTES + 1) + require(len(raw) <= MAX_RESPONSE_BYTES, 'API response exceeds safe limit') + recorded = strict_json(raw) + require(isinstance(recorded, dict) and recorded.get('conclusion') == 'neutral', 'API did not record neutral') + require(recorded.get('name') == NOT_EVALUATED_CHECK_NAME, 'API check name mismatch') + return recorded + + def main(argv=None): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--event', type=Path, default=Path(os.environ.get('GITHUB_EVENT_PATH', '/nonexistent-event'))) + parser.add_argument('--publish-not-evaluated-check', action='store_true') args = parser.parse_args(argv) + if args.publish_not_evaluated_check: + # Exit 0 here means only that the neutral check was recorded. The workflow + # still exits EXIT_NOT_EVALUATED, so the required job does not succeed. + try: + recorded = publish_not_evaluated_check( + os.environ.get('GITHUB_REPOSITORY', ''), os.environ.get('PR_HEAD_SHA', ''), os.environ.get('GH_TOKEN', '')) + print(json.dumps({'conclusion': recorded.get('conclusion'), 'name': recorded.get('name'), + 'result': 'NOT_EVALUATED_RECORDED'}, sort_keys=True)) + return 0 + except (ValueError, OSError, TypeError, KeyError, UnicodeError, RecursionError) as error: + print(json.dumps({'reason': str(error), 'result': 'NOT_EVALUATED_CHECK_UNPUBLISHED', 'scientific_effect': 'NONE'})) + return 1 try: require(os.environ.get('GITHUB_EVENT_NAME') == 'pull_request_target', 'CI requires trusted pull_request_target context') event = strict_json(args.event.read_bytes()) result = check(event, API(os.environ.get('GH_TOKEN', '')), os.environ.get('GITHUB_REPOSITORY', '')) print(json.dumps(result, sort_keys=True)) + if result.get('result') == 'SKIPPED_MERGED_BEFORE_CHECK': + return EXIT_NOT_EVALUATED return 0 except (ValueError, OSError, TypeError, KeyError, UnicodeError, RecursionError) as error: # Never print response bodies, submitted file contents, or credentials. From 156920db05284e5652f88a63ed128cd6b2a30b6d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 19:12:23 +0000 Subject: [PATCH 11/37] public intake: scope checks write to the public-intake job The workflow permissions block matches main again: contents and pull-requests read. The job replaces that set, so it repeats those reads and keeps checks write for the neutral check run. Co-authored-by: Dylan Roy --- .github/workflows/public-intake.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/public-intake.yml b/.github/workflows/public-intake.yml index f37525e04..383e409ff 100644 --- a/.github/workflows/public-intake.yml +++ b/.github/workflows/public-intake.yml @@ -8,11 +8,14 @@ on: permissions: contents: read pull-requests: read - # Only for the neutral "not evaluated" check run. Submitted code is never executed. - checks: write jobs: public-intake: name: public-intake + permissions: + contents: read + pull-requests: read + # Only for the neutral "not evaluated" check run. Submitted code is never executed. + checks: write # Skip metadata edits only for terminal merged PRs. Reopenable PRs must # still pass the live checker, including closure and head-drift checks. if: ${{ !(github.event.pull_request.state == 'closed' && toJSON(github.event.pull_request.merged) == 'true') }} From e4c585e1f7be118870730f5bca74d0090830387f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 19:16:55 +0000 Subject: [PATCH 12/37] site: load style.css before brand.css on removed-node live routes Co-authored-by: Dylan Roy --- tests/test_current_site_stylesheet_order.py | 73 +++++++++++++++++++++ tests/test_site_stylesheet_order.py | 35 ---------- tools/current_site_history.py | 6 +- 3 files changed, 77 insertions(+), 37 deletions(-) create mode 100644 tests/test_current_site_stylesheet_order.py delete mode 100644 tests/test_site_stylesheet_order.py diff --git a/tests/test_current_site_stylesheet_order.py b/tests/test_current_site_stylesheet_order.py new file mode 100644 index 000000000..3a81beca7 --- /dev/null +++ b/tests/test_current_site_stylesheet_order.py @@ -0,0 +1,73 @@ +"""Live generated node pages load style.css before brand.css (F2: brand.css dark/reduced-motion rules must win).""" +import json +import re +import sys +import unittest +from pathlib import Path +from tempfile import TemporaryDirectory + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "tools")) +SITE = ROOT / "docs/site" +LINK = re.compile(r'")] + with self.subTest(tool=tool): + self.assertLess(body.index("style.css"), body.index("brand.css")) + + def test_removed_node_live_route_loads_style_before_brand_and_archive_stays(self): + # A later observation that drops a v2 node republishes nodes/.html + # through render_static_v2(..., archived=False). That convenience route + # must follow the live order. The immutable snapshot keeps brand.css first. + import test_current_site_build as build_controls + import current_site_history as history + + controls = build_controls.CurrentSiteBuildTests() + with TemporaryDirectory() as tmp: + site, payload = controls.prepare(Path(tmp)) + first = controls.run_build(site, payload) + self.assertEqual(first.returncode, 0, first.stderr) + digest = history.mathematical_digest(build_controls.fixture()) + archive = site / "snapshots" / digest + archived_before = {p.relative_to(archive).as_posix(): p.read_bytes() + for p in archive.rglob("*") if p.is_file()} + self.assertEqual(self.order(archive / "nodes/beta.html"), ["brand.css", "style.css", "current.css"]) + data = build_controls.fixture() + data["observed_at"] = "2026-10-13T13:00:00Z" + data["graph"]["data"]["nodes"].pop("beta") + data["graph"]["data"]["edges"] = [ + edge for edge in data["graph"]["data"]["edges"] + if edge["from"] != "beta" and edge["to"] != "beta"] + payload.write_bytes(json.dumps(data, ensure_ascii=False, indent=2).encode() + b"\n") + second = controls.run_build(site, payload) + self.assertEqual(second.returncode, 0, second.stderr) + live = site / "nodes/beta.html" + self.assertIn("Historical removed-node static route", live.read_text(encoding="utf-8")) + self.assertEqual(self.order(live), ["style.css", "brand.css", "current.css"]) + self.assertEqual(self.order(archive / "nodes/beta.html"), ["brand.css", "style.css", "current.css"]) + archived_after = {p.relative_to(archive).as_posix(): p.read_bytes() + for p in archive.rglob("*") if p.is_file()} + self.assertEqual(archived_before, archived_after) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_site_stylesheet_order.py b/tests/test_site_stylesheet_order.py deleted file mode 100644 index 6a8d940f0..000000000 --- a/tests/test_site_stylesheet_order.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Live generated node pages load style.css before brand.css (F2: brand.css dark/reduced-motion rules must win).""" -import re -import unittest -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -SITE = ROOT / "docs/site" -LINK = re.compile(r'")] - with self.subTest(tool=tool): - self.assertLess(body.index("style.css"), body.index("brand.css")) - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/current_site_history.py b/tools/current_site_history.py index 380b53e05..7988abfd6 100644 --- a/tools/current_site_history.py +++ b/tools/current_site_history.py @@ -1381,8 +1381,10 @@ def _v2_static_page(projection, meta, title, body, *, archived, node_id=None): '\n' '\n' f'{_v1_escape(title)} · Historical mathematical dependency atlas\n' - f'\n' - '
\n' + + (f'\n' + if archived else + f'\n') + + '
\n' f'\n' + _v2_material_section(projection, meta, site_prefix=site_prefix, snapshot_prefix=snapshot_prefix) + '\n' + disclosure From 4bf8da2f62901ee523b4e0bb57bb6dd439ac5c32 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 14:30:58 -0500 Subject: [PATCH 13/37] test: use running interpreter in formal shell probe fixtures --- tests/test_formal_workflow_shell.py | 30 +++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/test_formal_workflow_shell.py b/tests/test_formal_workflow_shell.py index 1fcf7dcc8..298017240 100644 --- a/tests/test_formal_workflow_shell.py +++ b/tests/test_formal_workflow_shell.py @@ -1,11 +1,14 @@ """Regression controls for the actual formal workflow shell and failure summary.""" import os +import shutil +import sys from pathlib import Path import re import subprocess import tempfile import textwrap import unittest +from unittest import mock WORKFLOW = Path(__file__).resolve().parents[1] / '.github/workflows/formal-verification.yml' PROBE_NAME = 'Verify actual shell rejects a failing producer' @@ -44,8 +47,14 @@ def run_probe(self, pipefail): if pipefail: cmd += ['-o', 'pipefail'] cmd.append(str(script)) - return subprocess.run(cmd, env={**os.environ, 'RUNNER_TEMP': tmp}, - capture_output=True, text=True, timeout=20) + # Hosted Python setup provides `python`; minimal external runners + # may expose only `python3`. Test the unchanged shell with the same + # running interpreter rather than changing its exit-code contract. + (Path(tmp) / 'python').symlink_to(Path(sys.executable).resolve()) + env = {**os.environ, 'RUNNER_TEMP': tmp, + 'PATH': tmp + os.pathsep + os.environ.get('PATH', '')} + return subprocess.run(cmd, env=env, capture_output=True, + text=True, timeout=20) def test_actual_probe_accepts_fail_closed_shell(self): result = self.run_probe(True) @@ -57,6 +66,23 @@ def test_actual_probe_rejects_original_fail_open_shell(self): self.assertNotEqual(result.returncode, 0, result.stdout+result.stderr) self.assertIn('PIPELINE_FAILURE_PROPAGATION_FAIL', result.stdout) + def test_probe_when_parent_path_has_no_python_alias(self): + # The shell still needs Bash and tee, but not a preinstalled `python`. + with tempfile.TemporaryDirectory() as tool_dir: + for command in ('bash', 'tee'): + source = shutil.which(command) + self.assertIsNotNone(source, f'{command} unavailable') + (Path(tool_dir) / command).symlink_to(source) + with mock.patch.dict(os.environ, {'PATH': tool_dir}): + fail_closed = self.run_probe(True) + fail_open = self.run_probe(False) + self.assertEqual(fail_closed.returncode, 0, + fail_closed.stdout + fail_closed.stderr) + self.assertIn('PIPELINE_FAILURE_PROPAGATION_PASS', fail_closed.stdout) + self.assertNotEqual(fail_open.returncode, 0, + fail_open.stdout + fail_open.stderr) + self.assertIn('PIPELINE_FAILURE_PROPAGATION_FAIL', fail_open.stdout) + def test_summary_does_not_claim_success_unconditionally(self): self.assertIn('if [ "${{ job.status }}" = "success" ] && [ -s formal/.lake/formal-evidence/receipt.json ]; then', self.text) self.assertIn('No successful kernel-verification claim is made for this run.', self.text) From 0d0de7aa0d1d4e62936906812091f255b61a9626 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 19:34:00 +0000 Subject: [PATCH 14/37] site: restore predecessor removed-node pages in their published stylesheet order Committed docs/site/snapshots/index.json and the deployed Pages manifest (https://d6g8k5htny-coder.github.io/main/site/snapshots/index.json) are both schema 2 with 50 current_observation aliases and 0 archive bindings. Both archives are research-static-v1, so restore reads those alias bytes from the bundle instead of re-rendering them. Neither manifest contains a removed-node page, in the old order or the new one. restore_history still re-renders a v2 binding=archive alias and requires an exact descriptor match. canonical_bytes strips only the site-release query, not stylesheet order. A predecessor v2 removed-node page was brand.css then style.css; this branch re-renders style.css then brand.css, so that restore would fail. Accept the predecessor rendering only when its descriptor equals the published alias. Any other byte difference still fails that exact check. New removed-node routes and live pages keep style.css before brand.css. Archived snapshot pages stay brand.css before style.css. Co-authored-by: Dylan Roy --- tests/test_current_site_stylesheet_order.py | 76 +++++++++++++++++++++ tools/current_site_history.py | 49 ++++++++++--- 2 files changed, 117 insertions(+), 8 deletions(-) diff --git a/tests/test_current_site_stylesheet_order.py b/tests/test_current_site_stylesheet_order.py index 3a81beca7..1742683c8 100644 --- a/tests/test_current_site_stylesheet_order.py +++ b/tests/test_current_site_stylesheet_order.py @@ -1,4 +1,6 @@ """Live generated node pages load style.css before brand.css (F2: brand.css dark/reduced-motion rules must win).""" +import copy +import hashlib import json import re import sys @@ -68,6 +70,80 @@ def test_removed_node_live_route_loads_style_before_brand_and_archive_stays(self for p in archive.rglob("*") if p.is_file()} self.assertEqual(archived_before, archived_after) + def test_restore_keeps_predecessor_removed_node_order_and_live_pages_stay_new(self): + # A v2 archive alias published brand-first must restore. Swapping only + # the stylesheet links keeps every other byte, so the published + # descriptor still identifies that exact predecessor page. A further + # non-stylesheet edit must still be refused. Live pages stay style-first. + import test_current_site_build as build_controls + import test_current_site_history as history_controls + import current_site_history as history + + harness = history_controls.CurrentSiteHistoryTests() + harness.history = history + harness.build = build_controls.CurrentSiteBuildTests() + with TemporaryDirectory() as tmp: + root = Path(tmp) + (root / "public").mkdir() + (root / "runner").mkdir() + public, payload = harness.prepare(root / "public") + harness.publish(public) + data = build_controls.fixture() + data["observed_at"] = "2026-10-13T13:00:00Z" + data["graph"]["data"]["nodes"].pop("beta") + data["graph"]["data"]["edges"] = [ + edge for edge in data["graph"]["data"]["edges"] + if edge["from"] != "beta" and edge["to"] != "beta"] + payload.write_bytes(json.dumps(data, ensure_ascii=False).encode()) + self.assertEqual(harness.build.run_build(public, payload).returncode, 0) + manifest = harness.publish(public) + alias = next(row for row in manifest["aliases"] if row["path"] == "nodes/beta.html") + self.assertEqual(alias["binding"], "archive") + self.assertEqual(self.order(public / "nodes/beta.html"), ["style.css", "brand.css", "current.css"]) + self.assertEqual(self.order(public / "nodes/alpha.html"), ["style.css", "brand.css", "current.css"]) + current = (public / "nodes/beta.html").read_bytes() + predecessor = current.replace( + b'', + b'', + 1) + self.assertEqual(len(predecessor), len(current)) + self.assertNotEqual(predecessor, current) + self.assertIn(b"Historical removed-node static route", predecessor) + files = harness.public_files(public) + published = json.loads(files["snapshots/index.json"]) + rewritten = copy.deepcopy(published) + for row in rewritten["aliases"]: + if row["path"] == "nodes/beta.html": + row["sha256"] = hashlib.sha256(predecessor).hexdigest() + pred_files = dict(files) + pred_files["nodes/beta.html"] = predecessor + harness.rebind_manifest(pred_files, rewritten) + snapshot_id = alias["snapshot"] + archived = {name: blob for name, blob in pred_files.items() if name.startswith(f"snapshots/{snapshot_id}/")} + runner, _ = harness.prepare(root / "runner") + history.restore_history(runner, history_controls.PublicFixtureReader(pred_files)) + restored = (runner / "nodes/beta.html").read_bytes() + self.assertEqual(restored, predecessor) + self.assertEqual(self.order(runner / "nodes/beta.html"), ["brand.css", "style.css", "current.css"]) + self.assertEqual(self.order(runner / "nodes/alpha.html"), ["style.css", "brand.css", "current.css"]) + for name, blob in archived.items(): + self.assertEqual((runner / name).read_bytes(), blob, name) + tampered = predecessor.replace(b"HOLD", b"OPEN", 1) + self.assertEqual(len(tampered), len(predecessor)) + self.assertNotEqual(tampered, predecessor) + forged = copy.deepcopy(rewritten) + for row in forged["aliases"]: + if row["path"] == "nodes/beta.html": + row["sha256"] = hashlib.sha256(tampered).hexdigest() + bad_files = dict(pred_files) + bad_files["nodes/beta.html"] = tampered + harness.rebind_manifest(bad_files, forged) + (root / "runner-tampered").mkdir() + refused, _ = harness.prepare(root / "runner-tampered") + with self.assertRaises(ValueError) as caught: + history.restore_history(refused, history_controls.PublicFixtureReader(bad_files)) + self.assertIn("published alias differs", str(caught.exception)) + if __name__ == "__main__": unittest.main() diff --git a/tools/current_site_history.py b/tools/current_site_history.py index 7988abfd6..e8f5a3623 100644 --- a/tools/current_site_history.py +++ b/tools/current_site_history.py @@ -1005,6 +1005,30 @@ def remote_metadata(reader, *, missing_allowed=False): return meta +def _alias_descriptor(alias): + return {k: alias[k] for k in ("path", "bytes", "sha256")} + + +def _restore_v2_historical_pages(data, meta, aliases): + """Re-render v2 removed-node convenience pages for an exact published match. + + New routes emit style.css before brand.css. A predecessor publication of the + same route emitted brand.css before style.css. Keep the predecessor bytes + only when their descriptor equals the published alias. Any other difference + stays in the new rendering so the caller's exact descriptor check still fails. + """ + pages = render_static_v2(data, meta, archived=False) + pending = [alias for alias in aliases if descriptor(alias["path"], pages.get(alias["path"], b"")) != _alias_descriptor(alias)] + if not pending: + return pages + legacy = render_static_v2(data, meta, archived=False, style_first=False) + for alias in pending: + content = legacy.get(alias["path"]) + if content is not None and descriptor(alias["path"], content) == _alias_descriptor(alias): + pages[alias["path"]] = content + return pages + + def restore_history(site, reader=None, expected_manifest_sha=None): site = Path(site).resolve() if expected_manifest_sha is not None: @@ -1086,7 +1110,10 @@ def restore_history(site, reader=None, expected_manifest_sha=None): members = members_by_id[snapshot] archived_meta = parse_json(members["current-meta.json"]) historical[snapshot] = ({n[len("aliases/"):]: b for n, b in members.items() if n.startswith("aliases/")} - if entry.get("archive_version", 1) == 1 else render_static_v2(data_by_id[snapshot], archived_meta, archived=False)) + if entry.get("archive_version", 1) == 1 else + _restore_v2_historical_pages(data_by_id[snapshot], archived_meta, + [alias for alias in manifest["aliases"] + if alias["snapshot"] == snapshot and alias["binding"] == "archive"])) for alias in manifest["aliases"]: content = live.get(alias["path"]) if alias["binding"] == "current_observation" else historical[alias["snapshot"]].get(alias["path"]) if content is None or descriptor(alias["path"], content) != {k: alias[k] for k in ("path", "bytes", "sha256")}: @@ -1367,8 +1394,14 @@ def _v2_node_sources(projection, node): return "\n".join(lines) -def _v2_static_page(projection, meta, title, body, *, archived, node_id=None): +def _v2_static_page(projection, meta, title, body, *, archived, node_id=None, style_first=None): site_prefix = "../../../" if archived else "../" + # Immutable snapshot pages stay brand-first. Live removed-node routes are + # style-first unless a predecessor publication is being matched exactly. + if archived: + style_first = False + elif style_first is None: + style_first = True archive_id = meta["mathematical_sha256"] snapshot_prefix = "../" if archived else f"../snapshots/{archive_id}/" record = f"{node_id}.html" if node_id is not None else "index.html" @@ -1381,9 +1414,9 @@ def _v2_static_page(projection, meta, title, body, *, archived, node_id=None): '\n' '\n' f'{_v1_escape(title)} · Historical mathematical dependency atlas\n' - + (f'\n' - if archived else - f'\n') + + (f'\n' + if style_first else + f'\n') + '
\n' f'\n' + _v2_material_section(projection, meta, site_prefix=site_prefix, snapshot_prefix=snapshot_prefix) @@ -1412,7 +1445,7 @@ def _v2_equation_collection(projection): return "\n".join(parts) -def render_static_v2(projection, meta, *, archived=True): +def render_static_v2(projection, meta, *, archived=True, style_first=None): """Render frozen research-static-v2 compact mathematical-material pages. The archived form is retained in v2 bundles. The convenience form is used @@ -1432,7 +1465,7 @@ def render_static_v2(projection, meta, *, archived=True): + '\n

Original node metadata

'
                 + _v1_escape(json.dumps(node, ensure_ascii=False, indent=2, sort_keys=True)) + '
\n' + _v1_neighbors(projection, node_id, prefix=node_prefix)) - pages[f"nodes/{node_id}.html"] = _v2_static_page(projection, meta, node_id, body, archived=archived, node_id=node_id) + pages[f"nodes/{node_id}.html"] = _v2_static_page(projection, meta, node_id, body, archived=archived, node_id=node_id, style_first=style_first) items = "\n".join(f'
  • {_v1_escape(node_id)} · {_v1_escape(node.get("kind", "not_recorded"))} · {_v1_escape(node.get("classification", "not_recorded"))}
  • ' for node_id, node in graph["nodes"].items()) required = sum(edge["required"] for edge in graph["edges"]) @@ -1443,7 +1476,7 @@ def render_static_v2(projection, meta, *, archived=True): f'

    {len(projection["sources"])} selected graph, node source/review and equation source files are retained in this mathematical-material-only projection.

    \n
      \n' + _v1_source_list(projection["sources"]) + '\n
    \n' + _v2_equation_collection(projection)) - pages["nodes/index.html"] = _v2_static_page(projection, meta, "Historical graph, equation excerpts and selected sources", body, archived=archived) + pages["nodes/index.html"] = _v2_static_page(projection, meta, "Historical graph, equation excerpts and selected sources", body, archived=archived, style_first=style_first) return pages From f645dbc6ce69e6c8a3e48408db62265daa689ef3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 19:47:58 +0000 Subject: [PATCH 15/37] docs: describe the public-intake job token The job token is read-only for contents and pull requests, with checks write used only to post the neutral not-evaluated check run. Co-authored-by: Dylan Roy --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df6b94c82..1fd09dbd5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -111,7 +111,7 @@ HTML, SVG, archives, executable files, symlinks and submodules are refused here. For code or a notebook proposal, describe it in an issue; a maintainer can sponsor a separate engineering PR. Do not encode a refused file inside an allowed format. -`public-intake` runs trusted default-branch code with a read-only token. It reads +`public-intake` runs trusted default-branch code; the job's token is read-only for contents and pull requests, plus `checks: write` used solely to post the neutral 'not evaluated: merged before check' check run, and submitted code is never checked out or executed. It reads PR metadata and blobs through the GitHub API, checks complete path lists and source identities, and fails on missing information or a changing PR. It never checks out or executes submitted code. The credential scan catches a small documented From 239d8b3ebb5ee689d429adef0903229040d765ea Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:21:40 -0500 Subject: [PATCH 16/37] docs(agents): point new coordination to board #419 --- AGENTS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index cbc0a137b..0899d8381 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,6 +7,12 @@ Carry both links into task handoffs and new-agent onboarding. Use the [current workflow](governance/OP-WORKFLOW-20260930.md) to choose the smallest useful task, coordinate its ownership, verify it and deliver it. +As of 15 October 2026, direct new claims, reviews, handoffs and releases to +[Agent Message Board #419](https://github.com/d6g8k5htny-coder/main/issues/419). +Earlier [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and +[#229](https://github.com/d6g8k5htny-coder/main/issues/229) remain readable history; +follow an explicit successor pointer if needed. Moving the board does not +transfer, renew, or release any existing claim. Dylan's current explicit instruction resumes the requested reader experience and workflow improvements, including implementation, review and integration. The [September 27 stop](governance/OWNER_STOP_20260927.md) is no longer in effect From ddb67cbb8ca5d2278c0f7b5f9880edf83ed6e01b Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:22:18 -0500 Subject: [PATCH 17/37] ci: run required public-intake job on terminal merged events --- .github/workflows/public-intake.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/public-intake.yml b/.github/workflows/public-intake.yml index 383e409ff..d1b421ea9 100644 --- a/.github/workflows/public-intake.yml +++ b/.github/workflows/public-intake.yml @@ -16,9 +16,9 @@ jobs: pull-requests: read # Only for the neutral "not evaluated" check run. Submitted code is never executed. checks: write - # Skip metadata edits only for terminal merged PRs. Reopenable PRs must - # still pass the live checker, including closure and head-drift checks. - if: ${{ !(github.event.pull_request.state == 'closed' && toJSON(github.event.pull_request.merged) == 'true') }} + # Never skip this required job based on event metadata: skipped checks can + # appear passing without validation. The checker handles merged-before-check + # events by posting a separate neutral result and returning nonzero (78). runs-on: ubuntu-24.04 timeout-minutes: 5 steps: From 2703b55534b78f8936948d894f2aaf165b4f49ee Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:22:20 -0500 Subject: [PATCH 18/37] test: refuse public-intake job-level metadata skips --- tests/test_public_intake.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_public_intake.py b/tests/test_public_intake.py index f274f42a5..85d2d8a7e 100644 --- a/tests/test_public_intake.py +++ b/tests/test_public_intake.py @@ -480,6 +480,18 @@ def test_publish_flag_failure_is_not_a_successful_intake(self): self.assertNotIn('test-only-secret', output.getvalue()) self.assertNotIn('success', output.getvalue()) + def test_required_intake_job_cannot_skip_merged_event_payload(self): + workflow = (Path(__file__).resolve().parents[1] / '.github/workflows/public-intake.yml').read_text() + self.assertEqual(workflow.count('\n public-intake:\n'), 1) + job = workflow.split('\n public-intake:\n', 1)[1] + self.assertIn('\n steps:\n', job) + header = job.split('\n steps:\n', 1)[0] + self.assertIn(' name: public-intake\n', header) + self.assertNotRegex(header, r'(?m)^ if\s*:') + self.assertIn(' runs-on: ubuntu-24.04\n', header) + self.assertIn('exit 78', job) + self.assertIn('--publish-not-evaluated-check', job) + def test_workflow_maps_exit_78_to_neutral_and_never_success(self): workflow = (Path(__file__).resolve().parents[1] / '.github/workflows/public-intake.yml').read_text() self.assertIn('checks: write', workflow) From fd1db80ec9c7312bcf6b002bb8f1b505f96d7a6f Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:32:06 -0500 Subject: [PATCH 19/37] docs: route research guide coordination to board 419 --- docs/RESEARCH_INDEX.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/RESEARCH_INDEX.md b/docs/RESEARCH_INDEX.md index eb8b1f307..1573628f2 100644 --- a/docs/RESEARCH_INDEX.md +++ b/docs/RESEARCH_INDEX.md @@ -30,7 +30,7 @@ The [public-text catalog](PUBLIC_MATHEMATICS.md) counts 2,138 files at its decla |---|---| | Read or extend mathematics | The topic sections below and [Math-](https://github.com/d6g8k5htny-coder/Math-) | | Run a calculation | [Reproduction guide](REPRODUCE.md) | -| Review or claim work | [Task queue and claims, main #275](https://github.com/d6g8k5htny-coder/main/issues/275), the [Agent Message Board, main #307](https://github.com/d6g8k5htny-coder/main/issues/307), and the relevant issue or PR; [Open work](#open-work) gives each front's current records and remaining obligations | +| Review or claim work | [Task queue and claims, main #275](https://github.com/d6g8k5htny-coder/main/issues/275), the [active Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419), the historical boards [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and [#229](https://github.com/d6g8k5htny-coder/main/issues/229), and the relevant issue or PR; [Open work](#open-work) gives each front's current records and remaining obligations | | Locate exact source bytes | [Catalog](https://github.com/d6g8k5htny-coder/meta-framework/blob/main/registry.json) and [query tool](https://github.com/d6g8k5htny-coder/query-) | | Work on the larger numerical tree | [Hardening branch](https://github.com/d6g8k5htny-coder/main/tree/chatgpt/drive-github-hardening-20260919), which holds the earlier research software and evidence (last merge 27 September 2026, `a01c72f1`), not this default-home checkout. Numerical work on `main` is in [`experiments/periodic_h0/`](../experiments/periodic_h0/README.md) and [`experiments/universality/`](../experiments/universality/README.md) | | Explore zeta zeros, de Bruijn–Newman folds and a CUE short-bar control | [Zeta fold exploration packet](../experiments/zeta_fold_exploration/README.md): exploratory, scientific effect NONE, no claim of progress toward the Riemann Hypothesis | @@ -118,7 +118,7 @@ Still open: arbitrary downsets and the unrestricted prize; overlap patterns outs ## Open work -Each row gives a front's current label and what remains open; the topic sections hold scopes and review details. Claim tasks on [main #275](https://github.com/d6g8k5htny-coder/main/issues/275) and coordinate on the [Agent Message Board, main #307](https://github.com/d6g8k5htny-coder/main/issues/307); the earlier board [#229](https://github.com/d6g8k5htny-coder/main/issues/229) keeps its [working guidance](https://github.com/d6g8k5htny-coder/main/issues/229#issuecomment-6038554880). The review discussions #63, #65, #67, #74 and #76, the downstream-first queue [#86](https://github.com/d6g8k5htny-coder/main/issues/86) and formal work item [#95](https://github.com/d6g8k5htny-coder/main/issues/95) are closed records, not open assignments; a closed issue does not by itself complete its mathematics. A review record does not by itself change the Math- [register](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/frontiers/downstream_gate_20260925/GRAPH.json), which is executed separately and may still show an earlier classification. +Each row gives a front's current label and what remains open; the topic sections hold scopes and review details. Claim tasks on [main #275](https://github.com/d6g8k5htny-coder/main/issues/275) and coordinate new work on the [active Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419); the earlier boards [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and [#229](https://github.com/d6g8k5htny-coder/main/issues/229) remain readable history, with #229 retaining its [working guidance](https://github.com/d6g8k5htny-coder/main/issues/229#issuecomment-6038554880). The review discussions #63, #65, #67, #74 and #76, the downstream-first queue [#86](https://github.com/d6g8k5htny-coder/main/issues/86) and formal work item [#95](https://github.com/d6g8k5htny-coder/main/issues/95) are closed records, not open assignments; a closed issue does not by itself complete its mathematics. A review record does not by itself change the Math- [register](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/frontiers/downstream_gate_20260925/GRAPH.json), which is executed separately and may still show an earlier classification. | Front | Current state and remaining work | Records | |---|---|---| From 0ea60493c5348511263e8cb36eadb6dddec128c6 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:49:40 -0500 Subject: [PATCH 20/37] test: reject public-intake guards after steps --- tests/test_public_intake.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/test_public_intake.py b/tests/test_public_intake.py index 85d2d8a7e..04e3afe72 100644 --- a/tests/test_public_intake.py +++ b/tests/test_public_intake.py @@ -487,10 +487,15 @@ def test_required_intake_job_cannot_skip_merged_event_payload(self): self.assertIn('\n steps:\n', job) header = job.split('\n steps:\n', 1)[0] self.assertIn(' name: public-intake\n', header) - self.assertNotRegex(header, r'(?m)^ if\s*:') + self.assertNotRegex(job, r'(?m)^ if\s*:') self.assertIn(' runs-on: ubuntu-24.04\n', header) self.assertIn('exit 78', job) self.assertIn('--publish-not-evaluated-check', job) + after_steps_mutant = job.rstrip() + ( + "\n if: ${{ github.event.pull_request.state != 'closed' }}\n" + ) + with self.assertRaises(AssertionError): + self.assertNotRegex(after_steps_mutant, r'(?m)^ if\s*:') def test_workflow_maps_exit_78_to_neutral_and_never_success(self): workflow = (Path(__file__).resolve().parents[1] / '.github/workflows/public-intake.yml').read_text() @@ -1192,3 +1197,4 @@ def test_landed_packets_keep_passing_the_credential_scan(self): if __name__ == '__main__': unittest.main() + From 1cf79c8a4885b07dc8035719992a21c5831beccd Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:50:19 -0500 Subject: [PATCH 21/37] chore: preserve test file terminal newline --- tests/test_public_intake.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_public_intake.py b/tests/test_public_intake.py index 04e3afe72..628ead7b6 100644 --- a/tests/test_public_intake.py +++ b/tests/test_public_intake.py @@ -1197,4 +1197,3 @@ def test_landed_packets_keep_passing_the_credential_scan(self): if __name__ == '__main__': unittest.main() - From b4a40bcb3a1dd2971293bd4e3116d532326226fe Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 15:59:31 -0500 Subject: [PATCH 22/37] docs(research): correct remaining current-claims board reference Fix M423-ROUTE-03 under task-local pickup 6202152656. Preserve the previously reviewed two clauses and all other source bytes. Source amendment by OpenAI/Codex foreground invocation; separate review and integration remain required. Scientific effect NONE. --- docs/RESEARCH_INDEX.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/RESEARCH_INDEX.md b/docs/RESEARCH_INDEX.md index 1573628f2..949bad10c 100644 --- a/docs/RESEARCH_INDEX.md +++ b/docs/RESEARCH_INDEX.md @@ -132,7 +132,7 @@ Each row gives a front's current label and what remains open; the topic sections | P15 | Theorem F, the full-range price theorem (OpenAI author), has an xAI/Grok nonauthor ACCEPT, reconciled on #74 for the realized disjoint family with demands `d_i >= 2`, every independent probability, `c_v <= phi(p_v)` and the same palette. The bipartite-overlap/even-capacity and tail/weighted-load successors (OpenAI authors) have an Anthropic/Claude scoped ACCEPT and landed through [Math- #124](https://github.com/d6g8k5htny-coder/Math-/pull/124). Open: arbitrary downsets and any unrestricted prize statement; demand one remains an obstruction | [Full-price review](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/reviews/p15_full_price_nonauthor_20260926/REVIEW.md), [overlap/tail review](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/reviews/p15_overlap_tail_claude_20260928/REVIEW.md), [integration record](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/docs/integration/2026-09-28-reviewed-mathematics.md), [#74](https://github.com/d6g8k5htny-coder/main/issues/74), [#67](https://github.com/d6g8k5htny-coder/main/issues/67) (closed review discussions) | | Formalization (Layer 1) | Independent alignment review of the 13 Math- pilot targets and the 31 main-side SIDE24 targets (cross-provider); the remaining "Numerical formalizer" steps — exact `c_{d,ref}` definition and a proof-producing enclosure — in the Mathlib package; D6 Theorem F's constant `ρ*` as the next full-theorem target | [Guide](FORMAL_VERIFICATION.md), [work item #95](https://github.com/d6g8k5htny-coder/main/issues/95), [Formal README](../formal/README.md), [review lane](../formal/REVIEW_LANE.md), [rollout record](FORMAL_VERIFICATION_ROLLOUT_20260927.md) | -Check current claims on #275 and #307 before writing, and release completed work. Offered reviews are not accepted tasks or evidence of active agents. This table routes to source and review records; it is not a status register. +Check current claims on #275 and [active board #419](https://github.com/d6g8k5htny-coder/main/issues/419) before writing, and release completed work. Offered reviews are not accepted tasks or evidence of active agents. This table routes to source and review records; it is not a status register. The [discovery / priority ledger](DISCOVERY_PRIORITY_LEDGER_20260925.md) and its [reconnaissance memo](RECON_NOVELTY_20260925.md) record candidate contributions, nearest prior art and source bindings. They are novelty bookkeeping, not status; "apparently novel" is not "accepted". The ledger's "current state" cells were last aligned on 27 September 2026, with `STATUS.md` of 26 September; the rows above give later records. From 03c2ff2066b86e8eb8272a93c443ca596c765278 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 16:11:28 -0500 Subject: [PATCH 23/37] docs(research): keep new claims and unresolved legacy custody distinct Address Ready-review findings 4288300477 and 4288300486 under pickup6202355742. Route new coordination records to419, keep275 for discussion, and retain unresolved historical claims and successor pointers in pre-write checks. All unrelated research text is preserved. Source amendment by OpenAI/Codex foreground; separate review and integration required. --- docs/RESEARCH_INDEX.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/RESEARCH_INDEX.md b/docs/RESEARCH_INDEX.md index 949bad10c..2ad724ac1 100644 --- a/docs/RESEARCH_INDEX.md +++ b/docs/RESEARCH_INDEX.md @@ -30,7 +30,7 @@ The [public-text catalog](PUBLIC_MATHEMATICS.md) counts 2,138 files at its decla |---|---| | Read or extend mathematics | The topic sections below and [Math-](https://github.com/d6g8k5htny-coder/Math-) | | Run a calculation | [Reproduction guide](REPRODUCE.md) | -| Review or claim work | [Task queue and claims, main #275](https://github.com/d6g8k5htny-coder/main/issues/275), the [active Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419), the historical boards [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and [#229](https://github.com/d6g8k5htny-coder/main/issues/229), and the relevant issue or PR; [Open work](#open-work) gives each front's current records and remaining obligations | +| Review or claim work | The [active Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419) for new claims and coordination; [task and architecture discussion, main #275](https://github.com/d6g8k5htny-coder/main/issues/275) and the relevant issue or PR for task context; historical boards [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and [#229](https://github.com/d6g8k5htny-coder/main/issues/229) for earlier records. [Open work](#open-work) gives each front's current records and remaining obligations | | Locate exact source bytes | [Catalog](https://github.com/d6g8k5htny-coder/meta-framework/blob/main/registry.json) and [query tool](https://github.com/d6g8k5htny-coder/query-) | | Work on the larger numerical tree | [Hardening branch](https://github.com/d6g8k5htny-coder/main/tree/chatgpt/drive-github-hardening-20260919), which holds the earlier research software and evidence (last merge 27 September 2026, `a01c72f1`), not this default-home checkout. Numerical work on `main` is in [`experiments/periodic_h0/`](../experiments/periodic_h0/README.md) and [`experiments/universality/`](../experiments/universality/README.md) | | Explore zeta zeros, de Bruijn–Newman folds and a CUE short-bar control | [Zeta fold exploration packet](../experiments/zeta_fold_exploration/README.md): exploratory, scientific effect NONE, no claim of progress toward the Riemann Hypothesis | @@ -118,7 +118,7 @@ Still open: arbitrary downsets and the unrestricted prize; overlap patterns outs ## Open work -Each row gives a front's current label and what remains open; the topic sections hold scopes and review details. Claim tasks on [main #275](https://github.com/d6g8k5htny-coder/main/issues/275) and coordinate new work on the [active Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419); the earlier boards [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and [#229](https://github.com/d6g8k5htny-coder/main/issues/229) remain readable history, with #229 retaining its [working guidance](https://github.com/d6g8k5htny-coder/main/issues/229#issuecomment-6038554880). The review discussions #63, #65, #67, #74 and #76, the downstream-first queue [#86](https://github.com/d6g8k5htny-coder/main/issues/86) and formal work item [#95](https://github.com/d6g8k5htny-coder/main/issues/95) are closed records, not open assignments; a closed issue does not by itself complete its mathematics. A review record does not by itself change the Math- [register](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/frontiers/downstream_gate_20260925/GRAPH.json), which is executed separately and may still show an earlier classification. +Each row gives a front's current label and what remains open; the topic sections hold scopes and review details. Discuss tasks and architecture on [main #275](https://github.com/d6g8k5htny-coder/main/issues/275); post new claims, reviews, handoffs and releases on the [active Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419), linking the relevant issue or PR; the earlier boards [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and [#229](https://github.com/d6g8k5htny-coder/main/issues/229) remain readable history, with #229 retaining its [working guidance](https://github.com/d6g8k5htny-coder/main/issues/229#issuecomment-6038554880). The review discussions #63, #65, #67, #74 and #76, the downstream-first queue [#86](https://github.com/d6g8k5htny-coder/main/issues/86) and formal work item [#95](https://github.com/d6g8k5htny-coder/main/issues/95) are closed records, not open assignments; a closed issue does not by itself complete its mathematics. A review record does not by itself change the Math- [register](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/frontiers/downstream_gate_20260925/GRAPH.json), which is executed separately and may still show an earlier classification. | Front | Current state and remaining work | Records | |---|---|---| @@ -132,7 +132,7 @@ Each row gives a front's current label and what remains open; the topic sections | P15 | Theorem F, the full-range price theorem (OpenAI author), has an xAI/Grok nonauthor ACCEPT, reconciled on #74 for the realized disjoint family with demands `d_i >= 2`, every independent probability, `c_v <= phi(p_v)` and the same palette. The bipartite-overlap/even-capacity and tail/weighted-load successors (OpenAI authors) have an Anthropic/Claude scoped ACCEPT and landed through [Math- #124](https://github.com/d6g8k5htny-coder/Math-/pull/124). Open: arbitrary downsets and any unrestricted prize statement; demand one remains an obstruction | [Full-price review](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/reviews/p15_full_price_nonauthor_20260926/REVIEW.md), [overlap/tail review](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/reviews/p15_overlap_tail_claude_20260928/REVIEW.md), [integration record](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/docs/integration/2026-09-28-reviewed-mathematics.md), [#74](https://github.com/d6g8k5htny-coder/main/issues/74), [#67](https://github.com/d6g8k5htny-coder/main/issues/67) (closed review discussions) | | Formalization (Layer 1) | Independent alignment review of the 13 Math- pilot targets and the 31 main-side SIDE24 targets (cross-provider); the remaining "Numerical formalizer" steps — exact `c_{d,ref}` definition and a proof-producing enclosure — in the Mathlib package; D6 Theorem F's constant `ρ*` as the next full-theorem target | [Guide](FORMAL_VERIFICATION.md), [work item #95](https://github.com/d6g8k5htny-coder/main/issues/95), [Formal README](../formal/README.md), [review lane](../formal/REVIEW_LANE.md), [rollout record](FORMAL_VERIFICATION_ROLLOUT_20260927.md) | -Check current claims on #275 and [active board #419](https://github.com/d6g8k5htny-coder/main/issues/419) before writing, and release completed work. Offered reviews are not accepted tasks or evidence of active agents. This table routes to source and review records; it is not a status register. +Before writing, check current claims on [active board #419](https://github.com/d6g8k5htny-coder/main/issues/419) and the relevant issue or PR, including unresolved claims in existing task records and on earlier boards [#307](https://github.com/d6g8k5htny-coder/main/issues/307) and [#229](https://github.com/d6g8k5htny-coder/main/issues/229), or their explicit successor pointers. Moving the board does not transfer, renew or release any existing claim. Release completed work. Offered reviews are not accepted tasks or evidence of active agents. This table routes to source and review records; it is not a status register. The [discovery / priority ledger](DISCOVERY_PRIORITY_LEDGER_20260925.md) and its [reconnaissance memo](RECON_NOVELTY_20260925.md) record candidate contributions, nearest prior art and source bindings. They are novelty bookkeeping, not status; "apparently novel" is not "accepted". The ledger's "current state" cells were last aligned on 27 September 2026, with `STATUS.md` of 26 September; the rows above give later records. From 7fcbe0c8900421c46d80b7945f90d38ae4686e5e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 22:09:57 +0000 Subject: [PATCH 24/37] governance: apply agent 3 claim-ownership checks to OP-WORKFLOW MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verbatim +26/−0 patch from main#419 comment 6203253357, written against base 7a7704fe. Author of record: Grok Bot agent 3. Co-authored-by: Dylan Roy --- governance/OP-WORKFLOW-20260930.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/governance/OP-WORKFLOW-20260930.md b/governance/OP-WORKFLOW-20260930.md index 08289c492..6643c999b 100644 --- a/governance/OP-WORKFLOW-20260930.md +++ b/governance/OP-WORKFLOW-20260930.md @@ -100,6 +100,32 @@ acknowledgement and activation stand alone; an unidentified second successor doe delay the first. Retained stops are carried by name. None of this adds a register, a scheduler, a permission gate, a forced release or independence credit. +Four checks bracket every claim, mutation and verdict: + +1. Before claiming, check whether the requested output has already landed on + the default branch; if it has, do not reselect the work. +2. Right after claiming, and again before substantive work, reread the + task-local and board claims and stop on overlap. There is no fixed wait. + "Earliest created_at wins" applies only to genuinely equivalent scopes, after + the already-landed check; a claimant withdraws only its own claim. +3. Before mutating, recheck current state and use an expected-head guard. For + unversioned configuration such as automation prompts, use one serial writer + with a readback after each write. +4. Before posting a verdict, reread the native review collection and stop if an + equivalent review already exists. + +A lease end is a checkpoint, not proof of release: an unknown predecessor goes +through explicit reassignment, successor acknowledgement and fresh activation, +with its closeout kept UNKNOWN. Do not post separate third-party collision +notices; reuse one existing notice and add only materially new evidence. Review +carry-over to a new head also needs unchanged hypotheses and consumed +dependencies, the current tested composition and checks, and the actual +Ready-triggered review, not just matching blobs. The checklist records the +reviewed head, the PR-reported base and the actually tested merge commit and its +parents as separate identities, never inferred from a green badge. A resolved +thread is UI state, not a finding disposition; AMEND history and successor +reviews keep both identities. + Maintain one short current disposition in the PR body or a linked comment: current head, owner, completed review scopes, unresolved finding IDs, validation and next action. Update it on material change; link detailed evidence instead From 1dba018e01edf085bc805ab128eba71c5d7a59b0 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 22:40:01 +0000 Subject: [PATCH 25/37] governance: amend OP-WORKFLOW claim checks for M424-NOTICE-01 and M424-ORDER-02 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verbatim +11/−4 patch from main#424 comment 6203729177 on head 7fcbe0c8. Author of record: Grok Bot agent 3. Co-authored-by: Dylan Roy --- governance/OP-WORKFLOW-20260930.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/governance/OP-WORKFLOW-20260930.md b/governance/OP-WORKFLOW-20260930.md index 6643c999b..9c433f415 100644 --- a/governance/OP-WORKFLOW-20260930.md +++ b/governance/OP-WORKFLOW-20260930.md @@ -106,8 +106,13 @@ Four checks bracket every claim, mutation and verdict: the default branch; if it has, do not reselect the work. 2. Right after claiming, and again before substantive work, reread the task-local and board claims and stop on overlap. There is no fixed wait. - "Earliest created_at wins" applies only to genuinely equivalent scopes, after - the already-landed check; a claimant withdraws only its own claim. + Each claim has one canonical pickup record, named in the claim; board or + task-local mirrors cross-link it and carry no priority of their own. + "Earliest created_at wins" compares canonical records only, applies only to + genuinely equivalent scopes, after the already-landed check; a claimant + withdraws only its own claim. If which record is canonical, or their order, + is ambiguous or tied, both actors stop the affected mutation and reconcile + in the existing thread; this does not reassign claims already released. 3. Before mutating, recheck current state and use an expected-head guard. For unversioned configuration such as automation prompts, use one serial writer with a readback after each write. @@ -116,8 +121,10 @@ Four checks bracket every claim, mutation and verdict: A lease end is a checkpoint, not proof of release: an unknown predecessor goes through explicit reassignment, successor acknowledgement and fresh activation, -with its closeout kept UNKNOWN. Do not post separate third-party collision -notices; reuse one existing notice and add only materially new evidence. Review +with its closeout kept UNKNOWN. Reuse an existing collision notice where +possible. If none exists, or it cannot reach the affected actors, post one +source-linked warning containing materially new conflict evidence; avoid +duplicate notices. Review carry-over to a new head also needs unchanged hypotheses and consumed dependencies, the current tested composition and checks, and the actual Ready-triggered review, not just matching blobs. The checklist records the From 9a5e68c922abeb10e63019cd50dad0de1b3dd1a2 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:28:24 -0500 Subject: [PATCH 26/37] docs: route README contributors to active coordination board #419 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91ad07eee..c64d7ab07 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The [research workspace](https://d6g8k5htny-coder.github.io/main/site/workspace. | [query-](https://github.com/d6g8k5htny-coder/query-) | Read-only exact-source lookup | | [Universal-Law-Workspace](https://github.com/d6g8k5htny-coder/Universal-Law-Workspace) | Repository map | -[Reproduction guide](docs/REPRODUCE.md) · [Agent entry](AGENTS.md) · [Current workflow](governance/OP-WORKFLOW-20260930.md) · [Active coordination board, main #307](https://github.com/d6g8k5htny-coder/main/issues/307) · [Historical #229 working guidance](https://github.com/d6g8k5htny-coder/main/issues/229#issuecomment-6038554880) · [Tasks and claims, main #275](https://github.com/d6g8k5htny-coder/main/issues/275) +[Reproduction guide](docs/REPRODUCE.md) · [Agent entry](AGENTS.md) · [Current workflow](governance/OP-WORKFLOW-20260930.md) · [Active coordination board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419) · [Prior board #307 (history)](https://github.com/d6g8k5htny-coder/main/issues/307) · [Historical #229 working guidance](https://github.com/d6g8k5htny-coder/main/issues/229#issuecomment-6038554880) · [Tasks and claims, main #275](https://github.com/d6g8k5htny-coder/main/issues/275) From a16a511a2abdd4576e7fbb7fc4c69455e6ae08ec Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:55:24 -0500 Subject: [PATCH 27/37] experiments: freeze Reactor A finite amplitude control Engineering-only deterministic control under the RTW-REACTOR-A-FREEZE-20261015 pickup. No sampler, theorem conclusion, campaign result, or scientific-status change. --- .github/workflows/reactor-v0-controls.yml | 36 +++++ experiments/reactor_v0/README.md | 44 ++++++ experiments/reactor_v0/closure.json | 13 ++ experiments/reactor_v0/control.json | 13 ++ experiments/reactor_v0/evaluator.py | 55 +++++++ experiments/reactor_v0/exact_helpers.py | 99 +++++++++++++ experiments/reactor_v0/fixture.json | 7 + experiments/reactor_v0/mutation_harness.py | 91 ++++++++++++ experiments/reactor_v0/run_control.py | 29 ++++ experiments/reactor_v0/source_manifest.json | 27 ++++ experiments/reactor_v0/test_reactor_v0.py | 103 +++++++++++++ experiments/reactor_v0/validator.py | 154 ++++++++++++++++++++ 12 files changed, 671 insertions(+) create mode 100644 .github/workflows/reactor-v0-controls.yml create mode 100644 experiments/reactor_v0/README.md create mode 100644 experiments/reactor_v0/closure.json create mode 100644 experiments/reactor_v0/control.json create mode 100644 experiments/reactor_v0/evaluator.py create mode 100644 experiments/reactor_v0/exact_helpers.py create mode 100644 experiments/reactor_v0/fixture.json create mode 100644 experiments/reactor_v0/mutation_harness.py create mode 100644 experiments/reactor_v0/run_control.py create mode 100644 experiments/reactor_v0/source_manifest.json create mode 100644 experiments/reactor_v0/test_reactor_v0.py create mode 100644 experiments/reactor_v0/validator.py diff --git a/.github/workflows/reactor-v0-controls.yml b/.github/workflows/reactor-v0-controls.yml new file mode 100644 index 000000000..7f29d53a5 --- /dev/null +++ b/.github/workflows/reactor-v0-controls.yml @@ -0,0 +1,36 @@ +name: reactor-v0-controls + +on: + pull_request: + paths: + - 'experiments/reactor_v0/**' + - '.github/workflows/reactor-v0-controls.yml' + push: + branches: [main] + paths: + - 'experiments/reactor_v0/**' + - '.github/workflows/reactor-v0-controls.yml' + +permissions: + contents: read + +jobs: + finite-control: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Normal tests and control + run: | + python3 -B -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v + python3 -B experiments/reactor_v0/mutation_harness.py + python3 -B experiments/reactor_v0/run_control.py + - name: Optimized tests and control + run: | + python3 -B -O -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v + python3 -B -O experiments/reactor_v0/mutation_harness.py + python3 -B -O experiments/reactor_v0/run_control.py + - name: Frozen run stage is read-only + run: git diff --exit-code -- experiments/reactor_v0 .github/workflows/reactor-v0-controls.yml diff --git a/experiments/reactor_v0/README.md b/experiments/reactor_v0/README.md new file mode 100644 index 000000000..3ac5e5b47 --- /dev/null +++ b/experiments/reactor_v0/README.md @@ -0,0 +1,44 @@ +# Reactor v0 — finite amplitude-transform control freeze + +This directory freezes one deterministic, engineering-only regression control. +It does **not** sample a random field, run a campaign, consume a Gaussian or +asymptotic theorem conclusion, alter a scientific status, or execute Reactor B. + +The 4×4 periodic integer grid in `fixture.json` has positive finite ordinary +superlevel H0 bars `[[1, 0], [8, 0]]` and essential birth `27`. The essential +class is excluded. For the declared whole-field amplitude law parameters +`alpha = 2/3`, `a = 2`, and `t = 1/4`, the exact exposed regression control is + +```text +sum_i min((t / (a * lifetime_i))**alpha, 1) = 1/4 + 1/16 = 5/16. +``` + +Only rational powers whose required rational roots are exact are supported; +other inputs raise `ValueError`. Positive finite-bar selection uses the +inclusive rule `birth - death <= t` in the grid's input units. Expected answers +are exposed regression controls, not blind discoveries. + +`source_manifest.json` allowlists the two open parent proof commits and records +raw-byte SHA-256 separately from Git blob membership. Both entries explicitly +say that no theorem conclusion is consumed. `closure.json` pins every consumed +helper, fixture, test, validator, runner, mutation harness, README, manifest, +and path-scoped workflow by raw SHA-256; it intentionally cannot hash itself. + +Run the complete frozen controls from the repository root: + +```sh +python3 -B -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v +python3 -B -O -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v +python3 -B experiments/reactor_v0/mutation_harness.py +python3 -B -O experiments/reactor_v0/mutation_harness.py +python3 -B experiments/reactor_v0/run_control.py +python3 -B -O experiments/reactor_v0/run_control.py +``` + +The workflow has read-only repository permissions, is triggered only by this +directory or its own workflow file, and ends with a clean-worktree check so the +run stage cannot silently edit the evaluator, tests, or any other tracked input. + +Canonical coordination: [Reactor A pickup](https://github.com/d6g8k5htny-coder/main/issues/419#issuecomment-6204609205), +[owner mandate](https://github.com/d6g8k5htny-coder/main/blob/b665307520948308a53d190d7341bf301df3b3a2/governance/OWNER_MANDATE_20261015.md), +and [standing delegation](https://github.com/d6g8k5htny-coder/main/blob/main/governance/OP-AUTONOMY-20260923-v2.1.md). diff --git a/experiments/reactor_v0/closure.json b/experiments/reactor_v0/closure.json new file mode 100644 index 000000000..6dfb58000 --- /dev/null +++ b/experiments/reactor_v0/closure.json @@ -0,0 +1,13 @@ +{ + ".github/workflows/reactor-v0-controls.yml": "64507243afbe7af49ff6be3d4ad07da45bc0608a0b60fbac3e36b93d8b0ebcb8", + "experiments/reactor_v0/README.md": "2a50cb3efb4b14338e1cad20e0f09c26778a21a4683d75708fb6b80356dc8e3a", + "experiments/reactor_v0/control.json": "ad7066c7f8b7073edb5da910250f714f969bae2e164646a4c8c7cecffa9b43a1", + "experiments/reactor_v0/evaluator.py": "92fe4dd24be870c1651b59a2e9f2a110a8b008d99f6c601efb60e11a6922c5dd", + "experiments/reactor_v0/exact_helpers.py": "2569978f248a28b3754dad8d6ba4d80b47febf338a7db925f17f53723145cb61", + "experiments/reactor_v0/fixture.json": "8fd0ffb74fc98ccb022c0f4652922bd2881dae11ef11902b7d4e79235b7f94ea", + "experiments/reactor_v0/mutation_harness.py": "0acb0a4300cb04eae12c3001c178eb32aac78ec8ae06de4c387cd48c11d09556", + "experiments/reactor_v0/run_control.py": "6af0e3ab778dbe980860fb4d7d78d83f00bd67844c882ad72876b94d050854e3", + "experiments/reactor_v0/source_manifest.json": "86c55b140acc6cf8219915f16df995085eafd95c61c249a6cde29b73a83f9c8d", + "experiments/reactor_v0/test_reactor_v0.py": "eb53592024f9cdb47ec253e564749fe174e4e7997f85ac700b2a97d904bf29e4", + "experiments/reactor_v0/validator.py": "b7fc075db19457b50a42c2295f7fbf39d045176c72577f86aff5ad0a5613b3af" +} diff --git a/experiments/reactor_v0/control.json b/experiments/reactor_v0/control.json new file mode 100644 index 000000000..52b867310 --- /dev/null +++ b/experiments/reactor_v0/control.json @@ -0,0 +1,13 @@ +{ + "alpha": {"denominator": 3, "numerator": 2}, + "amplitude_scale": {"denominator": 1, "numerator": 2}, + "campaign_status": "B_UNRESOLVED_NO_RUN", + "closure": "closure.json", + "expected_control": {"denominator": 16, "numerator": 5}, + "fixture": "fixture.json", + "schema_version": 1, + "scientific_status_effect": "NONE", + "scope": "ENGINEERING_ONLY_FINITE_AMPLITUDE_TRANSFORM_CONTROL", + "sources": "source_manifest.json", + "threshold": {"denominator": 4, "numerator": 1} +} diff --git a/experiments/reactor_v0/evaluator.py b/experiments/reactor_v0/evaluator.py new file mode 100644 index 000000000..b25a6332a --- /dev/null +++ b/experiments/reactor_v0/evaluator.py @@ -0,0 +1,55 @@ +"""Finite amplitude-transform regression control; no sampler or theorem use.""" + +from fractions import Fraction + +from exact_helpers import exact_periodic_h0, rational_power_exact + + +def short_bar_lifetimes(barcode, threshold): + """Select positive finite bars with inclusive lifetime threshold.""" + if type(threshold) is not Fraction or threshold < 0: + raise ValueError("nonnegative exact Fraction threshold required") + intervals = barcode.get("intervals") + if type(intervals) is not list: + raise ValueError("finite intervals list required") + lifetimes = [] + for pair in intervals: + if (type(pair) is not list or len(pair) != 2 or + any(type(endpoint) is not int for endpoint in pair)): + raise ValueError("strict integer finite-bar endpoints required") + lifetime = pair[0] - pair[1] + if lifetime <= 0: + raise ValueError("positive finite bars required") + if Fraction(lifetime) <= threshold: + lifetimes.append(lifetime) + return tuple(lifetimes) + + +def _fraction(document): + return Fraction(document["numerator"], document["denominator"]) + + +def evaluate_package(package): + fixture = package["fixture"] + control = package["control"] + barcode = exact_periodic_h0(fixture["values"], fixture["grid_side"]) + if barcode != fixture["expected_barcode"]: + raise ValueError("exact barcode differs from frozen regression fixture") + threshold = _fraction(control["threshold"]) + alpha = _fraction(control["alpha"]) + amplitude_scale = _fraction(control["amplitude_scale"]) + finite_lifetimes = tuple(birth - death for birth, death in barcode["intervals"]) + # The finite transform integrates each declared positive finite lifetime. + terms = [] + for lifetime in finite_lifetimes: + base = threshold / (amplitude_scale * lifetime) + terms.append(min(rational_power_exact(base, alpha), Fraction(1))) + expected = sum(terms, Fraction(0)) + if expected != _fraction(control["expected_control"]): + raise ValueError("declared expected control differs from exact evaluation") + return { + "finite_bars": tuple(tuple(pair) for pair in barcode["intervals"]), + "essential_birth": barcode["essential"][0], + "included_lifetimes": finite_lifetimes, + "expected_short_bar_count": expected, + } diff --git a/experiments/reactor_v0/exact_helpers.py b/experiments/reactor_v0/exact_helpers.py new file mode 100644 index 000000000..59d19cbb2 --- /dev/null +++ b/experiments/reactor_v0/exact_helpers.py @@ -0,0 +1,99 @@ +"""Copied exact helpers consumed by the Reactor A finite control only.""" + +from array import array +from fractions import Fraction + + +def _require(condition, message): + if not condition: + raise ValueError(message) + + +def exact_periodic_h0(values, side): + """Return positive finite superlevel H0 bars and the essential birth. + + This is the consumed union-find core of ``periodic_h0/exact_h0.py``. + Endpoints remain in strict integer input units and axis edges wrap. + """ + _require(type(side) is int and side >= 3, "integer grid side >= 3 required") + _require(type(values) in (list, tuple) and len(values) == side * side, + "flat square list or tuple required") + _require(all(type(value) is int for value in values), + "strict integer samples required") + count = len(values) + parent = array("i", [-1]) * count + sizes = array("I", [0]) * count + eldest = array("I", [0]) * count + order = sorted(range(count), key=values.__getitem__, reverse=True) + records = [] + + def root(index): + while parent[index] != index: + parent[index] = parent[parent[index]] + index = parent[index] + return index + + for vertex in order: + parent[vertex] = vertex + sizes[vertex] = 1 + eldest[vertex] = vertex + row, column = divmod(vertex, side) + neighbors = ( + ((row - 1) % side) * side + column, + ((row + 1) % side) * side + column, + row * side + (column - 1) % side, + row * side + (column + 1) % side, + ) + for neighbor in neighbors: + if parent[neighbor] < 0: + continue + left, right = root(vertex), root(neighbor) + if left == right: + continue + survivor, dying = eldest[left], eldest[right] + if (values[survivor] < values[dying] or + (values[survivor] == values[dying] and survivor > dying)): + survivor, dying = dying, survivor + birth, death = values[dying], values[vertex] + if birth > death: + records.append((birth, death, dying)) + if sizes[left] < sizes[right]: + left, right = right, left + parent[right] = left + sizes[left] += sizes[right] + eldest[left] = survivor + records.sort() + essential_vertex = eldest[root(0)] + return { + "intervals": [[birth, death] for birth, death, _ in records], + "essential": [values[essential_vertex]], + } + + +def _integer_root_exact(value, order): + _require(type(value) is int and value >= 0, "nonnegative integer radicand required") + _require(type(order) is int and order > 0, "positive integer root order required") + low, high = 0, value + 1 + while low + 1 < high: + middle = (low + high) // 2 + if middle ** order <= value: + low = middle + else: + high = middle + if low ** order != value: + raise ValueError("rational root is not exact; exact control refused") + return low + + +def rational_power_exact(value, exponent): + """Return ``value**exponent`` only when the rational root is exact.""" + _require(type(value) in (int, Fraction) and value >= 0, + "nonnegative exact rational base required") + _require(type(exponent) is Fraction and exponent > 0, + "positive Fraction exponent required") + value = Fraction(value) + root = Fraction( + _integer_root_exact(value.numerator, exponent.denominator), + _integer_root_exact(value.denominator, exponent.denominator), + ) + return root ** exponent.numerator diff --git a/experiments/reactor_v0/fixture.json b/experiments/reactor_v0/fixture.json new file mode 100644 index 000000000..7e847e005 --- /dev/null +++ b/experiments/reactor_v0/fixture.json @@ -0,0 +1,7 @@ +{ + "exclusions": ["essential_class"], + "expected_barcode": {"essential": [27], "intervals": [[1, 0], [8, 0]]}, + "grid_side": 4, + "schema_version": 1, + "values": [27, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] +} diff --git a/experiments/reactor_v0/mutation_harness.py b/experiments/reactor_v0/mutation_harness.py new file mode 100644 index 000000000..75d47128b --- /dev/null +++ b/experiments/reactor_v0/mutation_harness.py @@ -0,0 +1,91 @@ +"""Kill seeded one-point mutations of the strict package validator.""" + +import copy +import json +from pathlib import Path +import subprocess +import sys +import tempfile + + +HERE = Path(__file__).resolve().parent +VALIDATOR = HERE / "validator.py" + + +MUTANTS = { + "allow_missing_field": ( + "set(document) == expected", + "set(document) <= expected", + "missing", + ), + "allow_scientific_status_promotion": ( + 'document["scientific_status_effect"] == "NONE"', + 'document["scientific_status_effect"] in ("NONE", "ACCEPTED")', + "status", + ), + "allow_theorem_consumption": ( + 'source["theorem_conclusion_consumed"] is False', + 'source["theorem_conclusion_consumed"] in (False, True)', + "theorem", + ), + "allow_incomplete_closure": ( + "set(closure) == REQUIRED_CLOSURE", + "set(closure) <= REQUIRED_CLOSURE", + "closure", + ), +} + + +PROBE = r'''import copy, importlib.util, json, pathlib, sys +spec = importlib.util.spec_from_file_location("mutated_validator", sys.argv[1]) +module = importlib.util.module_from_spec(spec) +spec.loader.exec_module(module) +here = pathlib.Path(sys.argv[2]) +kind = sys.argv[3] +control = json.loads((here / "control.json").read_text()) +sources = json.loads((here / "source_manifest.json").read_text()) +try: + if kind == "missing": + del control["scientific_status_effect"] + module.validate_document(control) + elif kind == "status": + control["scientific_status_effect"] = "ACCEPTED" + module.validate_document(control) + elif kind == "theorem": + sources["sources"][0]["theorem_conclusion_consumed"] = True + module._validate_sources(sources) + elif kind == "closure": + module.verify_closure(here, {}) + else: + raise RuntimeError("unknown probe") +except ValueError: + raise SystemExit(0) +raise SystemExit(1) +''' + + +def run(): + source = VALIDATOR.read_text(encoding="utf-8") + killed = [] + for name, (old, new, probe) in MUTANTS.items(): + if source.count(old) != 1: + raise RuntimeError(name + " mutation point is not unique") + mutated = source.replace(old, new, 1) + with tempfile.TemporaryDirectory(prefix="reactor-v0-mutant-") as temporary: + path = Path(temporary) / "validator.py" + path.write_text(mutated, encoding="utf-8") + completed = subprocess.run( + [sys.executable, "-O", "-B", "-c", PROBE, str(path), str(HERE), probe], + text=True, + capture_output=True, + check=False, + ) + if completed.returncode != 0: + killed.append(name) + else: + raise RuntimeError(name + " survived its negative probe") + return killed + + +if __name__ == "__main__": + print(json.dumps({"killed": run()}, sort_keys=True)) diff --git a/experiments/reactor_v0/run_control.py b/experiments/reactor_v0/run_control.py new file mode 100644 index 000000000..6430a901d --- /dev/null +++ b/experiments/reactor_v0/run_control.py @@ -0,0 +1,29 @@ +"""Validate and run the frozen deterministic Reactor A control.""" + +from fractions import Fraction +import json +from pathlib import Path + +from evaluator import evaluate_package +from validator import load_and_validate + + +def _render(value): + if type(value) is Fraction: + return str(value) + if type(value) is tuple: + return [_render(item) for item in value] + return value + + +if __name__ == "__main__": + directory = Path(__file__).resolve().parent + package = load_and_validate(directory) + result = {key: _render(value) for key, value in evaluate_package(package).items()} + result.update({ + "scope": package["control"]["scope"], + "scientific_status_effect": package["control"]["scientific_status_effect"], + "campaign_status": package["control"]["campaign_status"], + "validated": True, + }) + print(json.dumps(result, sort_keys=True, indent=2)) diff --git a/experiments/reactor_v0/source_manifest.json b/experiments/reactor_v0/source_manifest.json new file mode 100644 index 000000000..7780809a1 --- /dev/null +++ b/experiments/reactor_v0/source_manifest.json @@ -0,0 +1,27 @@ +{ + "schema_version": 1, + "sources": [ + { + "byte_length": 42478, + "commit": "88ff9223e57bf38c7fc33cb3559a88793a7b5087", + "git_blob_sha": "72c8964740731a50c461d7d2b2eb2599fdfdc16d", + "path": "experiments/universality/spectral_gaussian_admission/PROOF.md", + "pull_request": 330, + "raw_sha256": "6c0f34cb318d337b3b8c2c306f3b965f5e5a9d2fe38d5e001b8044de74b7f225", + "repository": "d6g8k5htny-coder/main", + "source_status": "OPEN_UNMERGED_AT_FREEZE", + "theorem_conclusion_consumed": false + }, + { + "byte_length": 37461, + "commit": "6bd133d591e43e75a9292463bb4bfde7a34984dc", + "git_blob_sha": "5a8b9c525277dcdabdedc372d2ae2f0f39a0cc54", + "path": "experiments/universality/spectral_amplitude_crossover/PROOF.md", + "pull_request": 334, + "raw_sha256": "aeea6b55a1876c357d9beeeb5a96ee54a5b17b53c6138e2993c454f1117f65d5", + "repository": "d6g8k5htny-coder/main", + "source_status": "OPEN_UNMERGED_AT_FREEZE", + "theorem_conclusion_consumed": false + } + ] +} diff --git a/experiments/reactor_v0/test_reactor_v0.py b/experiments/reactor_v0/test_reactor_v0.py new file mode 100644 index 000000000..438916e3f --- /dev/null +++ b/experiments/reactor_v0/test_reactor_v0.py @@ -0,0 +1,103 @@ +import copy +import json +import os +from fractions import Fraction +from pathlib import Path +import subprocess +import sys +import unittest + + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] +if str(HERE) not in sys.path: + sys.path.insert(0, str(HERE)) + + +class ReactorFreezeTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + from evaluator import evaluate_package + from validator import load_and_validate + + cls.evaluate_package = staticmethod(evaluate_package) + cls.load_and_validate = staticmethod(load_and_validate) + cls.package = load_and_validate(HERE) + + def test_exposed_control_is_exact_five_sixteenths(self): + result = self.evaluate_package(self.package) + self.assertEqual(result["expected_short_bar_count"], Fraction(5, 16)) + self.assertEqual(result["finite_bars"], ((1, 0), (8, 0))) + self.assertEqual(result["essential_birth"], 27) + self.assertEqual(result["included_lifetimes"], (1, 8)) + + def test_tampered_expected_control_is_rejected(self): + package = copy.deepcopy(self.package) + package["control"]["expected_control"] = {"numerator": 1, "denominator": 2} + with self.assertRaisesRegex(ValueError, "declared expected control"): + self.evaluate_package(package) + + def test_threshold_is_inclusive_and_essential_class_is_excluded(self): + from evaluator import short_bar_lifetimes + + barcode = {"intervals": [[3, 1], [8, 0]], "essential": [27]} + self.assertEqual(short_bar_lifetimes(barcode, Fraction(2)), (2,)) + + def test_unsupported_exact_root_is_refused(self): + from exact_helpers import rational_power_exact + + with self.assertRaisesRegex(ValueError, "rational root"): + rational_power_exact(Fraction(1, 2), Fraction(2, 3)) + + def test_schema_rejects_missing_extra_wrong_type_and_status_effect(self): + from validator import validate_document + + good = json.loads((HERE / "control.json").read_text(encoding="utf-8")) + mutations = [] + missing = copy.deepcopy(good) + del missing["scientific_status_effect"] + mutations.append(missing) + extra = copy.deepcopy(good) + extra["unexpected"] = False + mutations.append(extra) + wrong_type = copy.deepcopy(good) + wrong_type["threshold"] = 1.0 + mutations.append(wrong_type) + wrong_status = copy.deepcopy(good) + wrong_status["scientific_status_effect"] = "ACCEPTED" + mutations.append(wrong_status) + for document in mutations: + with self.subTest(document=document), self.assertRaises(ValueError): + validate_document(document) + + def test_source_manifest_separates_raw_hash_from_git_membership(self): + sources = self.package["sources"] + self.assertEqual(len(sources), 2) + for source in sources: + self.assertEqual(source["repository"], "d6g8k5htny-coder/main") + self.assertEqual(len(source["commit"]), 40) + self.assertEqual(len(source["raw_sha256"]), 64) + self.assertEqual(len(source["git_blob_sha"]), 40) + self.assertFalse(source["theorem_conclusion_consumed"]) + + def test_consumed_closure_hashes_match_exact_bytes(self): + from validator import verify_closure + + self.assertTrue(verify_closure(HERE, self.package["closure"])) + + def test_optimized_child_process_runs_validator_and_evaluator(self): + completed = subprocess.run( + [sys.executable, "-O", "-B", str(HERE / "run_control.py")], + cwd=ROOT, + text=True, + capture_output=True, + check=False, + ) + self.assertEqual(completed.returncode, 0, completed.stderr) + payload = json.loads(completed.stdout) + self.assertEqual(payload["expected_short_bar_count"], "5/16") + self.assertTrue(payload["validated"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/experiments/reactor_v0/validator.py b/experiments/reactor_v0/validator.py new file mode 100644 index 000000000..adfc61391 --- /dev/null +++ b/experiments/reactor_v0/validator.py @@ -0,0 +1,154 @@ +"""Strict validator for the Reactor A freeze package.""" + +import hashlib +import json +from pathlib import Path + + +CONTROL_KEYS = { + "schema_version", "scope", "scientific_status_effect", "fixture", + "sources", "closure", "alpha", "amplitude_scale", "threshold", + "expected_control", "campaign_status", +} +SOURCE_KEYS = { + "repository", "commit", "path", "byte_length", "raw_sha256", + "git_blob_sha", "pull_request", "theorem_conclusion_consumed", + "source_status", +} +RATIONAL_KEYS = {"numerator", "denominator"} +REQUIRED_CLOSURE = { + ".github/workflows/reactor-v0-controls.yml", + "experiments/reactor_v0/README.md", + "experiments/reactor_v0/control.json", + "experiments/reactor_v0/source_manifest.json", + "experiments/reactor_v0/fixture.json", + "experiments/reactor_v0/exact_helpers.py", + "experiments/reactor_v0/evaluator.py", + "experiments/reactor_v0/validator.py", + "experiments/reactor_v0/run_control.py", + "experiments/reactor_v0/test_reactor_v0.py", + "experiments/reactor_v0/mutation_harness.py", +} + + +def _require(condition, message): + if not condition: + raise ValueError(message) + + +def _object(pairs): + result = {} + for key, value in pairs: + if key in result: + raise ValueError("duplicate JSON key: " + key) + result[key] = value + return result + + +def _load_json(path): + try: + return json.loads(path.read_text(encoding="utf-8"), object_pairs_hook=_object) + except (json.JSONDecodeError, UnicodeDecodeError) as error: + raise ValueError("invalid UTF-8 JSON: " + str(path)) from error + + +def _strict_keys(document, expected, name): + _require(type(document) is dict and set(document) == expected, + name + " has missing or extra fields") + + +def _rational(document, name): + _strict_keys(document, RATIONAL_KEYS, name) + _require(type(document["numerator"]) is int and + type(document["denominator"]) is int and + document["denominator"] > 0, name + " must be an exact rational") + + +def validate_document(document): + _strict_keys(document, CONTROL_KEYS, "control") + _require(document["schema_version"] == 1 and type(document["schema_version"]) is int, + "unsupported control schema") + _require(document["scope"] == "ENGINEERING_ONLY_FINITE_AMPLITUDE_TRANSFORM_CONTROL", + "unexpected control scope") + _require(document["scientific_status_effect"] == "NONE", + "scientific_status_effect must be NONE") + _require(document["campaign_status"] == "B_UNRESOLVED_NO_RUN", + "campaign B must remain UNRESOLVED/no-run") + for key in ("fixture", "sources", "closure"): + _require(type(document[key]) is str and document[key] and "/" not in document[key], + key + " must be a local filename") + for key in ("alpha", "amplitude_scale", "threshold", "expected_control"): + _rational(document[key], key) + return True + + +def _validate_fixture(document): + expected = {"schema_version", "grid_side", "values", "expected_barcode", "exclusions"} + _strict_keys(document, expected, "fixture") + _require(document["schema_version"] == 1 and type(document["schema_version"]) is int, + "unsupported fixture schema") + side = document["grid_side"] + values = document["values"] + _require(type(side) is int and side == 4, "exact 4x4 fixture required") + _require(type(values) is list and len(values) == 16 and + all(type(value) is int for value in values), "strict 4x4 integer values required") + _require(document["expected_barcode"] == {"intervals": [[1, 0], [8, 0]], "essential": [27]}, + "unexpected exposed barcode oracle") + _require(document["exclusions"] == ["essential_class"], + "essential class must be excluded") + + +def _validate_sources(document): + _require(type(document) is dict and set(document) == {"schema_version", "sources"}, + "source manifest has missing or extra fields") + _require(document["schema_version"] == 1 and type(document["schema_version"]) is int, + "unsupported source manifest schema") + sources = document["sources"] + _require(type(sources) is list and len(sources) == 2, "exactly two parent sources required") + for source in sources: + _strict_keys(source, SOURCE_KEYS, "source") + _require(source["repository"] == "d6g8k5htny-coder/main", "unexpected source repository") + _require(type(source["commit"]) is str and len(source["commit"]) == 40, + "full source commit required") + _require(type(source["path"]) is str and source["path"].endswith("/PROOF.md"), + "proof source path required") + _require(type(source["byte_length"]) is int and source["byte_length"] > 0, + "positive source byte length required") + _require(type(source["raw_sha256"]) is str and len(source["raw_sha256"]) == 64, + "raw SHA-256 required") + _require(type(source["git_blob_sha"]) is str and len(source["git_blob_sha"]) == 40, + "Git blob membership identity required separately") + _require(type(source["pull_request"]) is int and source["pull_request"] in (330, 334), + "parent PR allowlist mismatch") + _require(source["theorem_conclusion_consumed"] is False, + "A may consume no theorem conclusion") + _require(source["source_status"] == "OPEN_UNMERGED_AT_FREEZE", + "source status must remain explicit") + return sources + + +def verify_closure(package_directory, closure): + repository_root = Path(package_directory).resolve().parents[1] + _require(type(closure) is dict and set(closure) == REQUIRED_CLOSURE, + "consumed closure path set mismatch") + for relative, digest in closure.items(): + _require(type(digest) is str and len(digest) == 64, + "closure SHA-256 must be 64 lowercase hex characters") + path = repository_root / relative + _require(path.is_file(), "missing closure path: " + relative) + actual = hashlib.sha256(path.read_bytes()).hexdigest() + _require(actual == digest, "closure hash mismatch: " + relative) + return True + + +def load_and_validate(package_directory): + directory = Path(package_directory).resolve() + control = _load_json(directory / "control.json") + validate_document(control) + fixture = _load_json(directory / control["fixture"]) + _validate_fixture(fixture) + source_manifest = _load_json(directory / control["sources"]) + sources = _validate_sources(source_manifest) + closure = _load_json(directory / control["closure"]) + verify_closure(directory, closure) + return {"control": control, "fixture": fixture, "sources": sources, "closure": closure} From d1fdf077435190831314b5960807ef2c195e2f41 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 20:09:28 -0500 Subject: [PATCH 28/37] fix: close Reactor A review findings Bind exact parent source objects, harden negative and freeze controls, add amplitude scaling coverage, and clarify counted-event semantics. Engineering-only; no campaign run or scientific-status change. --- .github/workflows/reactor-v0-controls.yml | 73 +++++- experiments/reactor_v0/README.md | 8 +- experiments/reactor_v0/closure.json | 10 +- experiments/reactor_v0/mutation_harness.py | 45 ++-- experiments/reactor_v0/test_reactor_v0.py | 273 +++++++++++++++++++++ experiments/reactor_v0/validator.py | 115 ++++++++- 6 files changed, 486 insertions(+), 38 deletions(-) diff --git a/.github/workflows/reactor-v0-controls.yml b/.github/workflows/reactor-v0-controls.yml index 7f29d53a5..ea0bef9b8 100644 --- a/.github/workflows/reactor-v0-controls.yml +++ b/.github/workflows/reactor-v0-controls.yml @@ -17,11 +17,75 @@ permissions: jobs: finite-control: runs-on: ubuntu-latest + timeout-minutes: 10 + env: + REACTOR_VERIFY_SOURCES: '1' steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + with: + fetch-depth: 0 + persist-credentials: false + - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 with: python-version: '3.11' + - name: Fetch and bind exact parent source objects + run: | + git fetch --no-tags --depth=1 origin \ + 88ff9223e57bf38c7fc33cb3559a88793a7b5087 \ + 6bd133d591e43e75a9292463bb4bfde7a34984dc + - name: Preserve an existing frozen closure + if: github.event_name == 'pull_request' + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + run: | + python3 -B - <<'PY' + import hashlib + import json + from pathlib import Path + import os + import subprocess + + closure_path = "experiments/reactor_v0/closure.json" + closure_file = Path(closure_path) + package = Path("experiments/reactor_v0") + package_entries = list(package.rglob("*")) + if (closure_file.is_symlink() or package.is_symlink() or + any(path.is_symlink() for path in package_entries)): + raise SystemExit("frozen package may not contain symlinks") + base = os.environ["BASE_SHA"] + prior = subprocess.run( + ["git", "show", base + ":" + closure_path], + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + check=False, + ) + if prior.returncode != 0: + print("Base has no Reactor A freeze; introduction is permitted.") + raise SystemExit(0) + current = closure_file.read_bytes() + if current != prior.stdout: + raise SystemExit("frozen closure.json differs from pull-request base") + closure = json.loads(prior.stdout) + expected_package = { + Path(path).relative_to("experiments/reactor_v0").as_posix() + for path in closure + if path.startswith("experiments/reactor_v0/") + } | {"closure.json"} + actual_package = { + path.relative_to(package).as_posix() + for path in package_entries + if not path.is_dir() + } + if actual_package != expected_package: + raise SystemExit("frozen package file set differs from pull-request base") + for relative, expected in closure.items(): + path = Path(relative) + if path.is_symlink(): + raise SystemExit("frozen closure member may not be a symlink: " + relative) + actual = hashlib.sha256(path.read_bytes()).hexdigest() + if actual != expected: + raise SystemExit("frozen byte mismatch: " + relative) + PY - name: Normal tests and control run: | python3 -B -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v @@ -33,4 +97,7 @@ jobs: python3 -B -O experiments/reactor_v0/mutation_harness.py python3 -B -O experiments/reactor_v0/run_control.py - name: Frozen run stage is read-only - run: git diff --exit-code -- experiments/reactor_v0 .github/workflows/reactor-v0-controls.yml + run: | + git diff --exit-code -- experiments/reactor_v0 .github/workflows/reactor-v0-controls.yml + test -z "$(git status --porcelain --untracked-files=all --ignored -- \ + experiments/reactor_v0 .github/workflows/reactor-v0-controls.yml)" diff --git a/experiments/reactor_v0/README.md b/experiments/reactor_v0/README.md index 3ac5e5b47..184ab0c56 100644 --- a/experiments/reactor_v0/README.md +++ b/experiments/reactor_v0/README.md @@ -14,9 +14,11 @@ sum_i min((t / (a * lifetime_i))**alpha, 1) = 1/4 + 1/16 = 5/16. ``` Only rational powers whose required rational roots are exact are supported; -other inputs raise `ValueError`. Positive finite-bar selection uses the -inclusive rule `birth - death <= t` in the grid's input units. Expected answers -are exposed regression controls, not blind discoveries. +other inputs raise `ValueError`. The counted event is +`A * (birth - death) <= t` (inclusive), so every positive finite bar contributes +`min((t / (a * lifetime))**alpha, 1)`; the inclusive selector +`short_bar_lifetimes` applies to a fixed realised barcode. Expected answers are +exposed regression controls, not blind discoveries. `source_manifest.json` allowlists the two open parent proof commits and records raw-byte SHA-256 separately from Git blob membership. Both entries explicitly diff --git a/experiments/reactor_v0/closure.json b/experiments/reactor_v0/closure.json index 6dfb58000..8d8c68329 100644 --- a/experiments/reactor_v0/closure.json +++ b/experiments/reactor_v0/closure.json @@ -1,13 +1,13 @@ { - ".github/workflows/reactor-v0-controls.yml": "64507243afbe7af49ff6be3d4ad07da45bc0608a0b60fbac3e36b93d8b0ebcb8", - "experiments/reactor_v0/README.md": "2a50cb3efb4b14338e1cad20e0f09c26778a21a4683d75708fb6b80356dc8e3a", + ".github/workflows/reactor-v0-controls.yml": "602293812abea738dfc8ae300a68bdae027d23be717db6a907133e248074705e", + "experiments/reactor_v0/README.md": "cde3ed5286a254ea8d817ad1cd92c71e8d4ba58670046e67fa4eb5df4f9bb474", "experiments/reactor_v0/control.json": "ad7066c7f8b7073edb5da910250f714f969bae2e164646a4c8c7cecffa9b43a1", "experiments/reactor_v0/evaluator.py": "92fe4dd24be870c1651b59a2e9f2a110a8b008d99f6c601efb60e11a6922c5dd", "experiments/reactor_v0/exact_helpers.py": "2569978f248a28b3754dad8d6ba4d80b47febf338a7db925f17f53723145cb61", "experiments/reactor_v0/fixture.json": "8fd0ffb74fc98ccb022c0f4652922bd2881dae11ef11902b7d4e79235b7f94ea", - "experiments/reactor_v0/mutation_harness.py": "0acb0a4300cb04eae12c3001c178eb32aac78ec8ae06de4c387cd48c11d09556", + "experiments/reactor_v0/mutation_harness.py": "ea74ee40a6ace0b6ee5152e67876be4841c2643a0646a658ab7d6758f441e78e", "experiments/reactor_v0/run_control.py": "6af0e3ab778dbe980860fb4d7d78d83f00bd67844c882ad72876b94d050854e3", "experiments/reactor_v0/source_manifest.json": "86c55b140acc6cf8219915f16df995085eafd95c61c249a6cde29b73a83f9c8d", - "experiments/reactor_v0/test_reactor_v0.py": "eb53592024f9cdb47ec253e564749fe174e4e7997f85ac700b2a97d904bf29e4", - "experiments/reactor_v0/validator.py": "b7fc075db19457b50a42c2295f7fbf39d045176c72577f86aff5ad0a5613b3af" + "experiments/reactor_v0/test_reactor_v0.py": "9a0dbd7d7a9e903466d6834f19e3917ce2877ea9b832cc8fffc119f131b86d68", + "experiments/reactor_v0/validator.py": "2d39c1bd844f49d43aa380443fa384f8e3a0aeb9df6173a3fcf9eeaeb150bef3" } diff --git a/experiments/reactor_v0/mutation_harness.py b/experiments/reactor_v0/mutation_harness.py index 75d47128b..713f6d9e8 100644 --- a/experiments/reactor_v0/mutation_harness.py +++ b/experiments/reactor_v0/mutation_harness.py @@ -13,10 +13,10 @@ MUTANTS = { - "allow_missing_field": ( + "allow_extra_field": ( "set(document) == expected", - "set(document) <= expected", - "missing", + "set(document) >= expected", + "extra", ), "allow_scientific_status_promotion": ( 'document["scientific_status_effect"] == "NONE"', @@ -36,17 +36,17 @@ } -PROBE = r'''import copy, importlib.util, json, pathlib, sys +PROBE = r'''import importlib.util, json, pathlib, sys, traceback spec = importlib.util.spec_from_file_location("mutated_validator", sys.argv[1]) module = importlib.util.module_from_spec(spec) -spec.loader.exec_module(module) here = pathlib.Path(sys.argv[2]) kind = sys.argv[3] control = json.loads((here / "control.json").read_text()) sources = json.loads((here / "source_manifest.json").read_text()) try: - if kind == "missing": - del control["scientific_status_effect"] + spec.loader.exec_module(module) + if kind == "extra": + control["unexpected"] = False module.validate_document(control) elif kind == "status": control["scientific_status_effect"] = "ACCEPTED" @@ -60,7 +60,10 @@ raise RuntimeError("unknown probe") except ValueError: raise SystemExit(0) -raise SystemExit(1) +except Exception: + traceback.print_exc() + raise SystemExit(4) +raise SystemExit(3) ''' @@ -74,16 +77,30 @@ def run(): with tempfile.TemporaryDirectory(prefix="reactor-v0-mutant-") as temporary: path = Path(temporary) / "validator.py" path.write_text(mutated, encoding="utf-8") + command = [ + sys.executable, "-O", "-B", "-c", PROBE, + str(path), str(HERE), probe, + ] + baseline = subprocess.run( + command[:5] + [str(VALIDATOR)] + command[6:], + text=True, capture_output=True, check=False, + ) + if baseline.returncode != 0: + raise RuntimeError( + name + " probe does not reject under the original validator: " + + baseline.stderr + ) completed = subprocess.run( - [sys.executable, "-O", "-B", "-c", PROBE, str(path), str(HERE), probe], - text=True, - capture_output=True, - check=False, + command, text=True, capture_output=True, check=False, ) - if completed.returncode != 0: + if completed.returncode == 3: killed.append(name) + elif completed.returncode == 4: + raise RuntimeError(name + " crashed instead of accepting its probe: " + + completed.stderr) else: - raise RuntimeError(name + " survived its negative probe") + raise RuntimeError(name + " returned unexpected probe status " + + str(completed.returncode)) return killed diff --git a/experiments/reactor_v0/test_reactor_v0.py b/experiments/reactor_v0/test_reactor_v0.py index 438916e3f..8aee242d0 100644 --- a/experiments/reactor_v0/test_reactor_v0.py +++ b/experiments/reactor_v0/test_reactor_v0.py @@ -1,10 +1,13 @@ import copy +import hashlib import json import os from fractions import Fraction from pathlib import Path +import shutil import subprocess import sys +import tempfile import unittest @@ -31,6 +34,27 @@ def test_exposed_control_is_exact_five_sixteenths(self): self.assertEqual(result["essential_birth"], 27) self.assertEqual(result["included_lifetimes"], (1, 8)) + def test_positive_integer_amplitude_scaling_scales_barcode_endpoints(self): + from exact_helpers import exact_periodic_h0 + + fixture = self.package["fixture"] + barcode = exact_periodic_h0(fixture["values"], fixture["grid_side"]) + for scale in (2, 3, 5, 7, 11): + with self.subTest(scale=scale): + scaled = exact_periodic_h0( + [scale * value for value in fixture["values"]], + fixture["grid_side"], + ) + self.assertEqual( + scaled["intervals"], + [[scale * birth, scale * death] + for birth, death in barcode["intervals"]], + ) + self.assertEqual( + scaled["essential"], + [scale * birth for birth in barcode["essential"]], + ) + def test_tampered_expected_control_is_rejected(self): package = copy.deepcopy(self.package) package["control"]["expected_control"] = {"numerator": 1, "denominator": 2} @@ -99,5 +123,254 @@ def test_optimized_child_process_runs_validator_and_evaluator(self): self.assertTrue(payload["validated"]) +class ValidatorNegativeTests(unittest.TestCase): + def setUp(self): + self.control = json.loads((HERE / "control.json").read_text(encoding="utf-8")) + self.fixture = json.loads((HERE / "fixture.json").read_text(encoding="utf-8")) + self.sources = json.loads( + (HERE / "source_manifest.json").read_text(encoding="utf-8") + ) + + def test_control_rejects_wrong_constants_types_and_local_names(self): + from validator import validate_document + + mutations = [] + for value in ("PROMOTED", "none", None, ["NONE"]): + document = copy.deepcopy(self.control) + document["scientific_status_effect"] = value + mutations.append(document) + for key, value in ( + ("schema_version", True), + ("scope", "OTHER"), + ("campaign_status", "RAN")): + document = copy.deepcopy(self.control) + document[key] = value + mutations.append(document) + for value in ("a/b", ".", ".."): + document = copy.deepcopy(self.control) + document["fixture"] = value + mutations.append(document) + document = copy.deepcopy(self.control) + document["alpha"]["numerator"] = True + mutations.append(document) + document = copy.deepcopy(self.control) + document["alpha"]["denominator"] = 0 + mutations.append(document) + for document in mutations: + with self.subTest(document=document), self.assertRaises(ValueError): + validate_document(document) + + def test_control_rejects_out_of_domain_rationals(self): + from validator import validate_document + + cases = ( + ("alpha", {"numerator": 0, "denominator": 1}), + ("alpha", {"numerator": -1, "denominator": 1}), + ("amplitude_scale", {"numerator": 0, "denominator": 1}), + ("amplitude_scale", {"numerator": -2, "denominator": 1}), + ("threshold", {"numerator": -1, "denominator": 4}), + ("expected_control", {"numerator": -1, "denominator": 16}), + ) + for key, value in cases: + document = copy.deepcopy(self.control) + document[key] = value + with self.subTest(key=key, value=value), self.assertRaises(ValueError): + validate_document(document) + + def test_fixture_rejects_each_wrong_contract_field(self): + from validator import _validate_fixture + + mutations = [] + for key, value in ( + ("schema_version", True), + ("grid_side", 5), + ("values", [0] * 15), + ("expected_barcode", {"intervals": [[1, 0]], "essential": [27]}), + ("exclusions", [])): + document = copy.deepcopy(self.fixture) + document[key] = value + mutations.append(document) + for document in mutations: + with self.subTest(document=document), self.assertRaises(ValueError): + _validate_fixture(document) + + def test_source_manifest_rejects_malformed_or_rebound_identities(self): + from validator import _validate_sources + + mutations = [] + replacements = ( + ("repository", "other/repository"), + ("commit", "z" * 40), + ("raw_sha256", "z" * 64), + ("git_blob_sha", "z" * 40), + ("theorem_conclusion_consumed", True), + ("theorem_conclusion_consumed", 0), + ("theorem_conclusion_consumed", "false"), + ("source_status", "MERGED"), + ) + for key, value in replacements: + document = copy.deepcopy(self.sources) + document["sources"][0][key] = value + mutations.append(document) + swapped = copy.deepcopy(self.sources) + swapped["sources"][0]["pull_request"] = 334 + swapped["sources"][1]["pull_request"] = 330 + mutations.append(swapped) + duplicate = copy.deepcopy(self.sources) + duplicate["sources"][1] = copy.deepcopy(duplicate["sources"][0]) + mutations.append(duplicate) + for value in ([], {}): + unhashable = copy.deepcopy(self.sources) + unhashable["sources"][0]["pull_request"] = value + mutations.append(unhashable) + widened = copy.deepcopy(self.sources) + widened["sources"].append(copy.deepcopy(widened["sources"][0])) + mutations.append(widened) + for document in mutations: + with self.subTest(document=document), self.assertRaises(ValueError): + _validate_sources(document) + + def test_duplicate_json_key_is_rejected(self): + from validator import _load_json + + with tempfile.TemporaryDirectory(prefix="reactor-duplicate-") as temporary: + path = Path(temporary) / "duplicate.json" + path.write_text('{"a": 1, "a": 2}\n', encoding="utf-8") + with self.assertRaisesRegex(ValueError, "duplicate JSON key"): + _load_json(path) + + def test_source_object_verifier_checks_bytes_length_hash_and_git_blob(self): + from validator import verify_source_objects + + with tempfile.TemporaryDirectory(prefix="reactor-source-git-") as temporary: + root = Path(temporary) + subprocess.run(["git", "init", "-q"], cwd=root, check=True) + subprocess.run(["git", "config", "user.name", "Reactor Test"], cwd=root, check=True) + subprocess.run( + ["git", "config", "user.email", "reactor@example.invalid"], + cwd=root, + check=True, + ) + source_path = root / "source.txt" + raw = b"source-bound bytes\n" + source_path.write_bytes(raw) + subprocess.run(["git", "add", "source.txt"], cwd=root, check=True) + subprocess.run(["git", "commit", "-qm", "source fixture"], cwd=root, check=True) + commit = subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=root, text=True + ).strip() + blob = subprocess.check_output( + ["git", "rev-parse", "HEAD:source.txt"], cwd=root, text=True + ).strip() + record = { + "commit": commit, + "path": "source.txt", + "byte_length": len(raw), + "raw_sha256": hashlib.sha256(raw).hexdigest(), + "git_blob_sha": blob, + } + self.assertTrue(verify_source_objects(root, [record])) + for key, value in ( + ("byte_length", len(raw) + 1), + ("raw_sha256", "0" * 64), + ("git_blob_sha", "0" * 40)): + changed = copy.deepcopy(record) + changed[key] = value + with self.subTest(key=key), self.assertRaises(ValueError): + verify_source_objects(root, [changed]) + + +class ClosureAndWorkflowTests(unittest.TestCase): + def _copy_frozen_tree(self, root): + from validator import REQUIRED_CLOSURE + + for relative in REQUIRED_CLOSURE: + source = ROOT / relative + target = root / relative + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(source, target) + closure = root / "experiments/reactor_v0/closure.json" + closure.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(HERE / "closure.json", closure) + return closure.parent + + def test_tampered_closure_byte_is_rejected_directly_and_by_loader(self): + from validator import load_and_validate, verify_closure + + with tempfile.TemporaryDirectory(prefix="reactor-closure-") as temporary: + root = Path(temporary) + package = self._copy_frozen_tree(root) + readme = package / "README.md" + readme.write_bytes(readme.read_bytes() + b"tampered\n") + closure = json.loads((package / "closure.json").read_text(encoding="utf-8")) + with self.assertRaisesRegex(ValueError, "closure hash mismatch"): + verify_closure(package, closure) + with self.assertRaisesRegex(ValueError, "closure hash mismatch"): + load_and_validate(package) + + def test_extra_package_file_is_rejected(self): + from validator import verify_closure + + with tempfile.TemporaryDirectory(prefix="reactor-extra-") as temporary: + root = Path(temporary) + package = self._copy_frozen_tree(root) + (package / "fractions.py").write_text("raise RuntimeError('shadowed')\n") + closure = json.loads((package / "closure.json").read_text(encoding="utf-8")) + with self.assertRaisesRegex(ValueError, "package file set"): + verify_closure(package, closure) + + def test_package_symlinks_are_rejected(self): + from validator import load_and_validate, verify_closure + + with tempfile.TemporaryDirectory(prefix="reactor-symlink-") as temporary: + root = Path(temporary) + outside = root / "outside" + outside.mkdir() + package = self._copy_frozen_tree(root / "copy") + closure = json.loads((package / "closure.json").read_text(encoding="utf-8")) + + (package / "extra-directory").symlink_to(outside, target_is_directory=True) + with self.assertRaisesRegex(ValueError, "symlink"): + verify_closure(package, closure) + (package / "extra-directory").unlink() + + package_link = root / "package-link" + package_link.symlink_to(package, target_is_directory=True) + with self.assertRaisesRegex(ValueError, "symlink"): + load_and_validate(package_link) + + readme = package / "README.md" + outside_readme = outside / "README.md" + outside_readme.write_bytes(readme.read_bytes()) + readme.unlink() + readme.symlink_to(outside_readme) + with self.assertRaisesRegex(ValueError, "symlink"): + verify_closure(package, closure) + + def test_workflow_hardens_actions_sources_and_freeze_boundary(self): + workflow = (ROOT / ".github/workflows/reactor-v0-controls.yml").read_text( + encoding="utf-8" + ) + required = ( + "actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1", + "actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97", + "persist-credentials: false", + "timeout-minutes:", + "REACTOR_VERIFY_SOURCES: '1'", + "git fetch --no-tags --depth=1 origin", + "git status --porcelain --untracked-files=all --ignored", + "github.event.pull_request.base.sha", + "is_symlink()", + "closure.json", + ) + for text in required: + with self.subTest(text=text): + self.assertIn(text, workflow) + self.assertLess( + workflow.index("is_symlink()"), + workflow.index("Base has no Reactor A freeze"), + ) + + if __name__ == "__main__": unittest.main() diff --git a/experiments/reactor_v0/validator.py b/experiments/reactor_v0/validator.py index adfc61391..fb4d8419b 100644 --- a/experiments/reactor_v0/validator.py +++ b/experiments/reactor_v0/validator.py @@ -2,7 +2,11 @@ import hashlib import json +import os from pathlib import Path +import re +import subprocess +from fractions import Fraction CONTROL_KEYS = { @@ -29,6 +33,17 @@ "experiments/reactor_v0/test_reactor_v0.py", "experiments/reactor_v0/mutation_harness.py", } +SOURCE_PINS = { + 330: ( + "88ff9223e57bf38c7fc33cb3559a88793a7b5087", + "experiments/universality/spectral_gaussian_admission/PROOF.md", + ), + 334: ( + "6bd133d591e43e75a9292463bb4bfde7a34984dc", + "experiments/universality/spectral_amplitude_crossover/PROOF.md", + ), +} +LOWER_HEX = re.compile(r"[0-9a-f]+\Z") def _require(condition, message): @@ -62,6 +77,7 @@ def _rational(document, name): _require(type(document["numerator"]) is int and type(document["denominator"]) is int and document["denominator"] > 0, name + " must be an exact rational") + return Fraction(document["numerator"], document["denominator"]) def validate_document(document): @@ -75,10 +91,17 @@ def validate_document(document): _require(document["campaign_status"] == "B_UNRESOLVED_NO_RUN", "campaign B must remain UNRESOLVED/no-run") for key in ("fixture", "sources", "closure"): - _require(type(document[key]) is str and document[key] and "/" not in document[key], + _require(type(document[key]) is str and document[key] not in ("", ".", "..") and + "/" not in document[key] and "\\" not in document[key], key + " must be a local filename") - for key in ("alpha", "amplitude_scale", "threshold", "expected_control"): - _rational(document[key], key) + alpha = _rational(document["alpha"], "alpha") + amplitude_scale = _rational(document["amplitude_scale"], "amplitude_scale") + threshold = _rational(document["threshold"], "threshold") + expected_control = _rational(document["expected_control"], "expected_control") + _require(alpha > 0, "alpha must be positive") + _require(amplitude_scale > 0, "amplitude_scale must be positive") + _require(threshold >= 0, "threshold must be nonnegative") + _require(expected_control >= 0, "expected_control must be nonnegative") return True @@ -105,36 +128,97 @@ def _validate_sources(document): "unsupported source manifest schema") sources = document["sources"] _require(type(sources) is list and len(sources) == 2, "exactly two parent sources required") + commits = [] + pull_requests = [] for source in sources: _strict_keys(source, SOURCE_KEYS, "source") _require(source["repository"] == "d6g8k5htny-coder/main", "unexpected source repository") - _require(type(source["commit"]) is str and len(source["commit"]) == 40, + _require(type(source["pull_request"]) is int and + source["pull_request"] in SOURCE_PINS, + "parent PR allowlist mismatch") + pull_requests.append(source["pull_request"]) + _require(type(source["commit"]) is str and len(source["commit"]) == 40 and + LOWER_HEX.fullmatch(source["commit"]) is not None, "full source commit required") - _require(type(source["path"]) is str and source["path"].endswith("/PROOF.md"), - "proof source path required") + _require((source["commit"], source["path"]) == + SOURCE_PINS[source["pull_request"]], + "source PR, commit, and path pin mismatch") + commits.append(source["commit"]) _require(type(source["byte_length"]) is int and source["byte_length"] > 0, "positive source byte length required") - _require(type(source["raw_sha256"]) is str and len(source["raw_sha256"]) == 64, + _require(type(source["raw_sha256"]) is str and len(source["raw_sha256"]) == 64 and + LOWER_HEX.fullmatch(source["raw_sha256"]) is not None, "raw SHA-256 required") - _require(type(source["git_blob_sha"]) is str and len(source["git_blob_sha"]) == 40, + _require(type(source["git_blob_sha"]) is str and len(source["git_blob_sha"]) == 40 and + LOWER_HEX.fullmatch(source["git_blob_sha"]) is not None, "Git blob membership identity required separately") - _require(type(source["pull_request"]) is int and source["pull_request"] in (330, 334), - "parent PR allowlist mismatch") _require(source["theorem_conclusion_consumed"] is False, "A may consume no theorem conclusion") _require(source["source_status"] == "OPEN_UNMERGED_AT_FREEZE", "source status must remain explicit") + _require(set(pull_requests) == set(SOURCE_PINS) and + len(set(pull_requests)) == len(pull_requests), + "parent PR identities must be unique and exact") + _require(len(set(commits)) == len(commits), "parent source commits must be unique") return sources +def _git(repo_root, *arguments): + completed = subprocess.run( + ["git", *arguments], + cwd=repo_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=False, + ) + _require(completed.returncode == 0, + "git source-object verification failed: " + + completed.stderr.decode("utf-8", errors="replace").strip()) + return completed.stdout + + +def verify_source_objects(repository_root, sources): + root = Path(repository_root).resolve() + for source in sources: + object_name = source["commit"] + ":" + source["path"] + raw = _git(root, "cat-file", "blob", object_name) + blob = _git(root, "rev-parse", object_name).decode("ascii").strip() + _require(len(raw) == source["byte_length"], + "source byte length mismatch: " + object_name) + _require(hashlib.sha256(raw).hexdigest() == source["raw_sha256"], + "source raw SHA-256 mismatch: " + object_name) + _require(blob == source["git_blob_sha"], + "source Git blob mismatch: " + object_name) + return True + + def verify_closure(package_directory, closure): - repository_root = Path(package_directory).resolve().parents[1] + package_directory = Path(package_directory) + _require(not package_directory.is_symlink(), "package directory symlink is forbidden") + repository_root = package_directory.resolve().parents[1] _require(type(closure) is dict and set(closure) == REQUIRED_CLOSURE, "consumed closure path set mismatch") + expected_package_files = { + Path(relative).relative_to("experiments/reactor_v0").as_posix() + for relative in REQUIRED_CLOSURE + if relative.startswith("experiments/reactor_v0/") + } | {"closure.json"} + package_entries = list(package_directory.rglob("*")) + _require(all(not path.is_symlink() for path in package_entries), + "package symlink is forbidden") + actual_package_files = { + path.relative_to(package_directory).as_posix() + for path in package_entries + if not path.is_dir() + } + _require(actual_package_files == expected_package_files, + "package file set differs from frozen closure") for relative, digest in closure.items(): - _require(type(digest) is str and len(digest) == 64, + _require(type(digest) is str and len(digest) == 64 and + LOWER_HEX.fullmatch(digest) is not None, "closure SHA-256 must be 64 lowercase hex characters") path = repository_root / relative + _require(not path.is_symlink(), "closure member symlink is forbidden: " + relative) _require(path.is_file(), "missing closure path: " + relative) actual = hashlib.sha256(path.read_bytes()).hexdigest() _require(actual == digest, "closure hash mismatch: " + relative) @@ -142,7 +226,10 @@ def verify_closure(package_directory, closure): def load_and_validate(package_directory): - directory = Path(package_directory).resolve() + supplied_directory = Path(package_directory) + _require(not supplied_directory.is_symlink(), + "package directory symlink is forbidden") + directory = supplied_directory.resolve() control = _load_json(directory / "control.json") validate_document(control) fixture = _load_json(directory / control["fixture"]) @@ -151,4 +238,6 @@ def load_and_validate(package_directory): sources = _validate_sources(source_manifest) closure = _load_json(directory / control["closure"]) verify_closure(directory, closure) + if os.environ.get("REACTOR_VERIFY_SOURCES") == "1": + verify_source_objects(directory.parents[1], sources) return {"control": control, "fixture": fixture, "sources": sources, "closure": closure} From 21cb96777acf71c5327fff33da5feb69c8c4a0b8 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 20:12:20 -0500 Subject: [PATCH 29/37] Reproduce CLI import and stdout boundaries before product fixes Add four external CLI regression methods with calibrated synthetic sibling-package canaries and real closed-reader pipes, including the graph reader's buffered-flush boundary. Preserve both affected product CLIs unchanged. Run the focused diagnostic in both Python modes on the exact experimental branch, with original context/results retained. This diagnostic does not replace the required full suite. Scientific effect: NONE. --- .../architecture-cli-boundary-regression.yml | 135 +++++++++++ tests/test_architecture_cli_boundaries.py | 225 ++++++++++++++++++ 2 files changed, 360 insertions(+) create mode 100644 .github/workflows/architecture-cli-boundary-regression.yml create mode 100644 tests/test_architecture_cli_boundaries.py diff --git a/.github/workflows/architecture-cli-boundary-regression.yml b/.github/workflows/architecture-cli-boundary-regression.yml new file mode 100644 index 000000000..784fb27dd --- /dev/null +++ b/.github/workflows/architecture-cli-boundary-regression.yml @@ -0,0 +1,135 @@ +name: Architecture CLI boundary diagnostic + +'on': + push: + branches: + - codex/architecture-cli-boundary-red-20261016 + pull_request: + paths: + - architecture/artifact_index.py + - architecture/graph_artifact_readback.py + - tools/artifact_index_export.py + - tools/architecture_graph_artifact_readback.py + - tests/test_architecture_artifact_index.py + - tests/test_architecture_graph_artifact_readback.py + - tests/test_architecture_cli_boundaries.py + - .github/workflows/architecture-cli-boundary-regression.yml + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: architecture-cli-boundary-${{ github.run_id }}-${{ github.run_attempt }} + cancel-in-progress: false + +jobs: + cli-boundaries: + name: architecture-cli-boundary-${{ matrix.mode }} + runs-on: ubuntu-24.04 + timeout-minutes: 6 + strategy: + fail-fast: false + matrix: + mode: [normal, optimized] + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + timeout-minutes: 1 + with: + persist-credentials: false + fetch-depth: 1 + + - name: Record diagnostic native context before running controls + timeout-minutes: 1 + env: + DIAGNOSTIC_MODE: ${{ matrix.mode }} + run: | + set -euo pipefail + evidence="$RUNNER_TEMP/architecture-cli-boundary-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT-$DIAGNOSTIC_MODE" + mkdir -m 700 "$evidence" + git rev-parse HEAD > "$evidence/checked-commit.txt" + python3 -I -B -S - "$evidence" <<'PY' + from datetime import datetime, timezone + import hashlib + import json + import os + from pathlib import Path + import platform + import sys + root = Path(os.environ['GITHUB_WORKSPACE']) + destination = Path(sys.argv[1]) + paths = ( + '.github/workflows/architecture-cli-boundary-regression.yml', + 'tests/test_architecture_cli_boundaries.py', + 'tests/test_architecture_artifact_index.py', + 'tests/test_architecture_graph_artifact_readback.py', + 'tools/artifact_index_export.py', + 'tools/architecture_graph_artifact_readback.py', + 'architecture/artifact_index.py', + 'architecture/graph_artifact_readback.py', + 'docs/site/dependency-source/GRAPH.json', + ) + sources = {} + for name in paths: + raw = (root / name).read_bytes() + sources[name] = {'bytes': len(raw), 'sha256': hashlib.sha256(raw).hexdigest()} + context = { + 'schema': 'architecture-cli-boundary-diagnostic/v1', + 'recorded_at': datetime.now(timezone.utc).isoformat(), + 'repository': os.environ['GITHUB_REPOSITORY'], + 'event_name': os.environ['GITHUB_EVENT_NAME'], + 'workflow_ref': os.environ['GITHUB_WORKFLOW_REF'], + 'workflow_sha': os.environ['GITHUB_WORKFLOW_SHA'], + 'event_sha': os.environ['GITHUB_SHA'], + 'checked_commit': (destination / 'checked-commit.txt').read_text().strip(), + 'run_id': os.environ['GITHUB_RUN_ID'], + 'run_attempt': os.environ['GITHUB_RUN_ATTEMPT'], + 'mode': os.environ['DIAGNOSTIC_MODE'], + 'python': sys.version, + 'platform': platform.platform(), + 'source_identities': sources, + 'scope': 'four CLI boundary methods only; required full suite remains separate', + 'scientific_effect': 'NONE', + 'scientific_status_authority': False, + } + (destination / 'native-context.json').write_text( + json.dumps(context, sort_keys=True, indent=2) + '\n', encoding='utf-8') + PY + + - name: Run only the four external CLI boundary controls + timeout-minutes: 3 + env: + DIAGNOSTIC_MODE: ${{ matrix.mode }} + ARCHITECTURE_CLI_BOUNDARY_REPORT: ${{ runner.temp }}/architecture-cli-boundary-${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.mode }}/child-results.jsonl + run: | + set -euo pipefail + evidence="$RUNNER_TEMP/architecture-cli-boundary-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT-$DIAGNOSTIC_MODE" + flags=(-I -B -S) + if [ "$DIAGNOSTIC_MODE" = optimized ]; then + flags+=(-O) + fi + printf '%q ' timeout --signal=TERM --kill-after=5s 150s \ + python3 "${flags[@]}" -m unittest discover -s tests -p test_architecture_cli_boundaries.py -v \ + > "$evidence/test-command.txt" + printf '\n' >> "$evidence/test-command.txt" + set +e + timeout --signal=TERM --kill-after=5s 150s \ + python3 "${flags[@]}" -m unittest discover -s tests -p test_architecture_cli_boundaries.py -v \ + > "$evidence/tests.stdout" 2> "$evidence/tests.stderr" + status=$? + set -e + printf '%s\n' "$status" > "$evidence/test-exit-status.txt" + cat "$evidence/tests.stdout" + cat "$evidence/tests.stderr" >&2 + exit "$status" + + - name: Retain separate diagnostic originals on every conclusion + if: always() + timeout-minutes: 1 + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 + with: + name: architecture-cli-boundary-${{ matrix.mode }}-${{ github.run_id }}-${{ github.run_attempt }} + path: ${{ runner.temp }}/architecture-cli-boundary-${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.mode }}/ + if-no-files-found: error + retention-days: 90 + compression-level: 6 diff --git a/tests/test_architecture_cli_boundaries.py b/tests/test_architecture_cli_boundaries.py new file mode 100644 index 000000000..9b526cae5 --- /dev/null +++ b/tests/test_architecture_cli_boundaries.py @@ -0,0 +1,225 @@ +"""External CLI boundary regressions; execute only in hosted isolation. + +The sibling package and its private-input canary are trusted, synthetic TEST +instruments. They never refer to an actual private capture or user file. Existing +fixture modules are imported as modules, so their TestCases are not rediscovered +or inherited by these four controls. A passing diagnostic is not the full suite. +""" + +import json +import os +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest + +import test_architecture_artifact_index as artifact_fixtures +import test_architecture_graph_artifact_readback as graph_fixtures + + +ROOT = Path(__file__).resolve().parents[1] +ARTIFACT_CLI = ROOT / "tools/artifact_index_export.py" +GRAPH_CLI = ROOT / "tools/architecture_graph_artifact_readback.py" +CHILD_DEADLINE_SECONDS = 20 +PRIVATE_CANARY = b"TEST_ONLY_SYNTHETIC_PRIVATE_INPUT_CANARY" +# Trusted test instrument: the real stdout descriptor receives a real Python +# buffered stream. No exception, captured value or product result is fabricated. +BUFFERED_STDOUT_LAUNCHER = r''' +import io +import runpy +import sys +capacity, cli = int(sys.argv[1]), sys.argv[2] +sys.stdout = io.TextIOWrapper( + io.BufferedWriter(io.FileIO(1, mode="wb", closefd=False), buffer_size=capacity), + encoding="utf-8", newline="\n") +sys.argv = [cli, *sys.argv[3:]] +runpy.run_path(cli, run_name="__main__") +''' + + +class ArchitectureCliBoundaryContract(unittest.TestCase): + def setUp(self): + temporary = tempfile.TemporaryDirectory(prefix="TEST-cli-boundary-") + self.addCleanup(temporary.cleanup) + self.cwd = Path(temporary.name) + self.environment = dict(os.environ) + for name in ("PYTHONPATH", "PYTHONHOME", "PYTHONOPTIMIZE", "PYTHONUNBUFFERED"): + self.environment.pop(name, None) + + def python_flags(self): + flags = ["-I", "-B", "-S"] + if sys.flags.optimize: + flags.append("-" + "O" * sys.flags.optimize) + return flags + + def invoke(self, command, raw=b"", *, closed_stdout=False): + """Launch the real child, optionally with a pipe that has no reader. + + The reader is closed before Popen, so no child write or shutdown flush + can race a parent read/close. Parent and child each close their writer. + """ + writer = None + if closed_stdout: + reader, writer = os.pipe() + os.close(reader) + try: + process = subprocess.Popen( + command, stdin=subprocess.PIPE, + stdout=writer if closed_stdout else subprocess.PIPE, + stderr=subprocess.PIPE, cwd=self.cwd, env=self.environment, + ) + finally: + if writer is not None: + os.close(writer) + try: + stdout, stderr = process.communicate(raw, timeout=CHILD_DEADLINE_SECONDS) + except subprocess.TimeoutExpired: + process.kill() + # Killing the child closes its pipes; keep cleanup bounded as well. + process.communicate(timeout=5) + self.fail("CLI child exceeded its 20-second deadline") + return subprocess.CompletedProcess(command, process.returncode, stdout or b"", stderr) + + def artifact_case(self): + packet = artifact_fixtures.synthetic_packet() + expected = artifact_fixtures.pins_for(packet) + arguments = [part for name, flag in artifact_fixtures.PIN_FLAGS.items() + for part in (flag, expected[name])] + return ARTIFACT_CLI, arguments, artifact_fixtures.canonical(packet) + b"\n" + + def graph_case(self): + # Reuse the existing fixture builder and its source-pin assertions, + # without inheriting or executing any of its test methods. + fixture = graph_fixtures.ArchitectureGraphArtifactReadbackContract() + self.addCleanup(fixture.doCleanups) + fixture.setUp() + raw = graph_fixtures.classic_zip(fixture.entries()) + archive = fixture.cwd / "TEST-cli-boundary-input.zip" + archive.write_bytes(raw) + return GRAPH_CLI, fixture.arguments(archive, fixture.expected(raw)), b"" + + def command(self, cli, arguments): + self.assertTrue(cli.is_file(), "required external CLI is absent") + return [sys.executable, *self.python_flags(), str(cli), *arguments] + + def accepted_baseline(self, case): + cli, arguments, raw = case + result = self.invoke(self.command(cli, arguments), raw) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stderr, b"") + document = json.loads(result.stdout) + self.assertEqual(document["scientific_effect"], "NONE") + self.assertIs(document["scientific_status_authority"], False) + self.assertEqual(document["custody"], "unknown") + return result.stdout + + def symlink_does_not_select_sibling_package(self, case): + cli, arguments, raw = case + baseline = self.accepted_baseline(case) + attack_root = self.cwd / "TEST-attacker-source-root" + tools = attack_root / "tools" + package = attack_root / "architecture" + tools.mkdir(parents=True) + package.mkdir() + secret = self.cwd / "TEST-synthetic-private-input" + marker = self.cwd / "TEST-sibling-package-read-marker" + secret.write_bytes(PRIVATE_CANARY) + observed = PRIVATE_CANARY + b"\nOPTIMIZE=" + str(sys.flags.optimize).encode("ascii") + package.joinpath("__init__.py").write_text( + "from pathlib import Path\n" + "import sys\n" + "Path(" + repr(str(marker)) + ").write_bytes(\n" + " Path(" + repr(str(secret)) + ").read_bytes()\n" + " + b'\\nOPTIMIZE=' + str(sys.flags.optimize).encode('ascii'))\n" + "raise RuntimeError('TEST_SYNTHETIC_SIBLING_PACKAGE_EXECUTED')\n", + encoding="utf-8", + ) + linked_cli = tools / cli.name + linked_cli.symlink_to(cli) + + # Positive calibration deliberately imports this trusted TEST package. + # It proves the marker detects a synthetic private read in this mode. + calibration = self.invoke([ + sys.executable, *self.python_flags(), "-c", + "import sys; sys.path.insert(0, sys.argv[1]); import architecture", + str(attack_root), + ]) + self.record_diagnostic_child("synthetic-sibling-package-calibration", calibration) + self.assertNotEqual(calibration.returncode, 0) + self.assertIn(b"TEST_SYNTHETIC_SIBLING_PACKAGE_EXECUTED", calibration.stderr) + self.assertEqual(marker.read_bytes(), observed, "sibling-package observer was not live") + marker.unlink() + + result = self.invoke(self.command(linked_cli, arguments), raw) + self.record_diagnostic_child("symlinked-cli-with-synthetic-sibling", result) + self.assertEqual(secret.read_bytes(), PRIVATE_CANARY) + self.assertFalse(marker.exists(), "symlink-selected sibling package read the synthetic private input") + self.assertNotIn(PRIVATE_CANARY, result.stdout + result.stderr) + self.assertEqual(result.returncode, 0, result.stderr) + self.assertEqual(result.stderr, b"") + self.assertEqual(result.stdout, baseline, "symlink invocation changed the validated public unit") + + def record_diagnostic_child(self, variant, result): + # Only the focused hosted workflow sets this path. Do not print between + # unittest's progress and result tokens in the required full-suite log. + report = self.environment.get("ARCHITECTURE_CLI_BOUNDARY_REPORT") + if report is not None: + record = { + "test_id": self.id(), "variant": variant, + "optimize": sys.flags.optimize, "returncode": result.returncode, + "stdout_bytes": len(result.stdout), + "stderr": result.stderr.decode("utf-8", errors="backslashreplace"), + } + with open(report, "ab") as stream: + stream.write((json.dumps(record, sort_keys=True) + "\n").encode("utf-8")) + + def assert_opaque_refusal(self, result, refusal): + self.assertEqual(result.returncode, 1, result.stderr) + self.assertEqual(result.stdout, b"") + self.assertEqual(result.stderr, refusal) + + def broken_stdout_has_opaque_refusal(self, case, refusal, *, buffered_flush=False): + # This positive run ensures an unrelated argument/fixture refusal cannot + # satisfy the closed-reader protocol assertion below. + baseline = self.accepted_baseline(case) + cli, arguments, raw = case + with self.subTest(stdout_boundary="direct CLI"): + result = self.invoke(self.command(cli, arguments), raw, closed_stdout=True) + self.record_diagnostic_child("direct-closed-reader", result) + self.assert_opaque_refusal(result, refusal) + if buffered_flush: + # The graph unit can exceed Python's default buffer and fail during + # direct write, leaving no bytes for shutdown to flush. A larger + # real buffer exercises flush-time failure instead. Its capacity is + # derived from the already accepted bounded synthetic unit only. + capacity = len(baseline) + 1 + self.assertLessEqual(capacity, 16 * 1024 * 1024 + 1) + command = [sys.executable, *self.python_flags(), "-c", BUFFERED_STDOUT_LAUNCHER, + str(capacity), str(cli), *arguments] + calibration = self.invoke(command, raw) + self.record_diagnostic_child("buffered-open-reader-calibration", calibration) + self.assertEqual(calibration.returncode, 0, calibration.stderr) + self.assertEqual(calibration.stderr, b"") + self.assertEqual(calibration.stdout, baseline) + with self.subTest(stdout_boundary="real buffered flush"): + result = self.invoke(command, raw, closed_stdout=True) + self.record_diagnostic_child("buffered-closed-reader", result) + self.assert_opaque_refusal(result, refusal) + + def test_artifact_index_symlink_cannot_read_synthetic_private_input(self): + self.symlink_does_not_select_sibling_package(self.artifact_case()) + + def test_graph_readback_symlink_cannot_read_synthetic_private_input(self): + self.symlink_does_not_select_sibling_package(self.graph_case()) + + def test_artifact_index_broken_stdout_has_one_opaque_refusal_and_exit_one(self): + self.broken_stdout_has_opaque_refusal(self.artifact_case(), b"ARTIFACT_INDEX_REFUSED\n") + + def test_graph_readback_broken_stdout_has_one_opaque_refusal_and_exit_one(self): + self.broken_stdout_has_opaque_refusal( + self.graph_case(), b"ARCHITECTURE_GRAPH_READBACK_REFUSED\n", buffered_flush=True) + + +if __name__ == "__main__": + unittest.main() From 580a5c22eb41ff571e96011590a7bacda5fec715 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 20:15:47 -0500 Subject: [PATCH 30/37] Fix CLI trust roots and broken-pipe refusals after hosted RED Resolve each CLI's actual source path before importing trusted modules. Keep terminal stdout errors to the existing fixed refusal and status1 without a residual interpreter shutdown flush. Preserve accepted output bytes and all source/admission limits. Retain the four regression methods and diagnostic workflow from the genuine normal/optimized RED at run38833849114. Increase only the combined architecture command/step/job envelope to900s/16m/49m after the retained600s run stopped during optimized execution; physical resources, security controls and custody gates remain unchanged. Scientific effect: NONE. --- .github/workflows/research-architecture.yml | 8 ++++---- tools/architecture_graph_artifact_readback.py | 9 ++++++--- tools/artifact_index_export.py | 16 +++++++++++++--- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/.github/workflows/research-architecture.yml b/.github/workflows/research-architecture.yml index d59679046..8739e26fd 100644 --- a/.github/workflows/research-architecture.yml +++ b/.github/workflows/research-architecture.yml @@ -36,8 +36,8 @@ jobs: graph: name: research-architecture runs-on: ubuntu-24.04 - # Complete stage ceiling: 19 preparation + 11 tests + fourteen 1-minute stages. - timeout-minutes: 44 + # Complete stage ceiling: 19 preparation + 16 tests + fourteen 1-minute stages. + timeout-minutes: 49 outputs: checked_commit: ${{ steps.accepted.outputs.checked_commit }} repository: ${{ steps.accepted.outputs.repository }} @@ -311,13 +311,13 @@ jobs: printf '%s\n' "$GITHUB_RUN_ATTEMPT" > "$RUNNER_TEMP/architecture-publish/run-attempt.txt" - name: Run controls and export in ephemeral restricted container id: architecture_controls - timeout-minutes: 11 + timeout-minutes: 16 env: IMAGE: python:3.11.14-slim-bookworm@sha256:83f339c1be6340ae1096010fdccf6552ac932d8f410d45d206014916bdf37e48 run: | set -euo pipefail set +e - timeout --signal=TERM --kill-after=10s 600s docker run --pull=never --rm --log-driver none --name architecture-controls \ + timeout --signal=TERM --kill-after=10s 900s docker run --pull=never --rm --log-driver none --name architecture-controls \ --network none --read-only --user 65532:65532 --cpus 2 --memory 1g --pids-limit 128 \ --cap-drop ALL --security-opt no-new-privileges \ --env ARCHITECTURE_SANDBOX=1 \ diff --git a/tools/architecture_graph_artifact_readback.py b/tools/architecture_graph_artifact_readback.py index 9a8a0b822..5df3c59b6 100644 --- a/tools/architecture_graph_artifact_readback.py +++ b/tools/architecture_graph_artifact_readback.py @@ -9,7 +9,7 @@ import sys sys.dont_write_bytecode = True -ROOT = Path(__file__).parent.parent +ROOT = Path(__file__).resolve().parent.parent sys.path.insert(0, str(ROOT)) from architecture.graph_artifact_readback import ( # noqa: E402 RAW_LIMIT, _encoded, read_graph_archive, validate_expected, @@ -93,8 +93,11 @@ def main(argv: list[str] | None = None) -> int: raise OSError(REFUSAL) sys.stdout.buffer.flush() except OSError: - sys.stderr.write(REFUSAL) - return 1 + # This terminal output failure must not retry buffered stdout at exit. + try: + os.write(2, REFUSAL.encode("ascii")) + finally: + os._exit(1) return 0 diff --git a/tools/artifact_index_export.py b/tools/artifact_index_export.py index 2ce248406..a3f86692a 100644 --- a/tools/artifact_index_export.py +++ b/tools/artifact_index_export.py @@ -7,8 +7,8 @@ # Keep the CLI's own imports read-only even if a caller omits Python's -B flag. sys.dont_write_bytecode = True -# Resolve only the trusted source location lexically, never a caller path. -sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +# Anchor imports to the actual script target, including symlink invocation. +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) from architecture.artifact_index import ( ArtifactIndexRefused, SHA256, STDIN_LIMIT, canonical_json, parse_packet, @@ -48,7 +48,17 @@ def main(): except Exception: sys.stderr.buffer.write(b"ARTIFACT_INDEX_REFUSED\n") return 1 - sys.stdout.buffer.write(output) + try: + written = sys.stdout.buffer.write(output) + if written != len(output): + raise OSError + sys.stdout.buffer.flush() + except OSError: + # This terminal output failure must not retry buffered stdout at exit. + try: + os.write(2, b"ARTIFACT_INDEX_REFUSED\n") + finally: + os._exit(1) return 0 From 4cc17538c53569a668c9850ff5ca53cd448b65ca Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 20:48:14 -0500 Subject: [PATCH 31/37] fix: fail closed Reactor A workflow guard Run the inline guard and unittest suites in isolated Python mode, distinguish a genuine first introduction from invalid base-object and path-read errors, and add behavioral regressions. Engineering-only; no scientific-status change. --- .github/workflows/reactor-v0-controls.yml | 28 ++++-- experiments/reactor_v0/closure.json | 4 +- experiments/reactor_v0/test_reactor_v0.py | 105 ++++++++++++++++++++++ 3 files changed, 130 insertions(+), 7 deletions(-) diff --git a/.github/workflows/reactor-v0-controls.yml b/.github/workflows/reactor-v0-controls.yml index ea0bef9b8..599838aa2 100644 --- a/.github/workflows/reactor-v0-controls.yml +++ b/.github/workflows/reactor-v0-controls.yml @@ -38,7 +38,7 @@ jobs: env: BASE_SHA: ${{ github.event.pull_request.base.sha }} run: | - python3 -B - <<'PY' + python3 -I -B - <<'PY' import hashlib import json from pathlib import Path @@ -53,6 +53,25 @@ jobs: any(path.is_symlink() for path in package_entries)): raise SystemExit("frozen package may not contain symlinks") base = os.environ["BASE_SHA"] + base_commit = subprocess.run( + ["git", "cat-file", "-e", base + "^{commit}"], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + check=False, + ) + if base_commit.returncode != 0: + raise SystemExit("pull-request base is not an available commit") + base_path = subprocess.run( + ["git", "ls-tree", "-z", base, "--", closure_path], + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + check=False, + ) + if base_path.returncode != 0: + raise SystemExit("unable to inspect frozen closure at pull-request base") + if not base_path.stdout: + print("Base has no Reactor A freeze; introduction is permitted.") + raise SystemExit(0) prior = subprocess.run( ["git", "show", base + ":" + closure_path], stdout=subprocess.PIPE, @@ -60,8 +79,7 @@ jobs: check=False, ) if prior.returncode != 0: - print("Base has no Reactor A freeze; introduction is permitted.") - raise SystemExit(0) + raise SystemExit("unable to read frozen closure at pull-request base") current = closure_file.read_bytes() if current != prior.stdout: raise SystemExit("frozen closure.json differs from pull-request base") @@ -88,12 +106,12 @@ jobs: PY - name: Normal tests and control run: | - python3 -B -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v + python3 -I -B -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v python3 -B experiments/reactor_v0/mutation_harness.py python3 -B experiments/reactor_v0/run_control.py - name: Optimized tests and control run: | - python3 -B -O -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v + python3 -I -B -O -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v python3 -B -O experiments/reactor_v0/mutation_harness.py python3 -B -O experiments/reactor_v0/run_control.py - name: Frozen run stage is read-only diff --git a/experiments/reactor_v0/closure.json b/experiments/reactor_v0/closure.json index 8d8c68329..bc3a9e582 100644 --- a/experiments/reactor_v0/closure.json +++ b/experiments/reactor_v0/closure.json @@ -1,5 +1,5 @@ { - ".github/workflows/reactor-v0-controls.yml": "602293812abea738dfc8ae300a68bdae027d23be717db6a907133e248074705e", + ".github/workflows/reactor-v0-controls.yml": "117da0c992e25b788acea640f1d621036e5beb07c8274ac29b5c0adf1e2cf3b0", "experiments/reactor_v0/README.md": "cde3ed5286a254ea8d817ad1cd92c71e8d4ba58670046e67fa4eb5df4f9bb474", "experiments/reactor_v0/control.json": "ad7066c7f8b7073edb5da910250f714f969bae2e164646a4c8c7cecffa9b43a1", "experiments/reactor_v0/evaluator.py": "92fe4dd24be870c1651b59a2e9f2a110a8b008d99f6c601efb60e11a6922c5dd", @@ -8,6 +8,6 @@ "experiments/reactor_v0/mutation_harness.py": "ea74ee40a6ace0b6ee5152e67876be4841c2643a0646a658ab7d6758f441e78e", "experiments/reactor_v0/run_control.py": "6af0e3ab778dbe980860fb4d7d78d83f00bd67844c882ad72876b94d050854e3", "experiments/reactor_v0/source_manifest.json": "86c55b140acc6cf8219915f16df995085eafd95c61c249a6cde29b73a83f9c8d", - "experiments/reactor_v0/test_reactor_v0.py": "9a0dbd7d7a9e903466d6834f19e3917ce2877ea9b832cc8fffc119f131b86d68", + "experiments/reactor_v0/test_reactor_v0.py": "ad1a581ae03703cc91debd027849c655503a9f6ea908e28b2bf69c860a26b702", "experiments/reactor_v0/validator.py": "2d39c1bd844f49d43aa380443fa384f8e3a0aeb9df6173a3fcf9eeaeb150bef3" } diff --git a/experiments/reactor_v0/test_reactor_v0.py b/experiments/reactor_v0/test_reactor_v0.py index 8aee242d0..1c5a0f04b 100644 --- a/experiments/reactor_v0/test_reactor_v0.py +++ b/experiments/reactor_v0/test_reactor_v0.py @@ -4,10 +4,12 @@ import os from fractions import Fraction from pathlib import Path +import shlex import shutil import subprocess import sys import tempfile +import textwrap import unittest @@ -294,6 +296,38 @@ def _copy_frozen_tree(self, root): shutil.copy2(HERE / "closure.json", closure) return closure.parent + def _workflow_guard(self): + workflow = (ROOT / ".github/workflows/reactor-v0-controls.yml").read_text( + encoding="utf-8" + ) + lines = workflow.splitlines() + start = next( + index for index, line in enumerate(lines) + if line.strip().startswith("python3 ") and "<<'PY'" in line + ) + end = next( + index for index in range(start + 1, len(lines)) + if lines[index].strip() == "PY" + ) + command = shlex.split(lines[start].strip().split("<<", 1)[0]) + command[0] = sys.executable + script = textwrap.dedent("\n".join(lines[start + 1:end])) + "\n" + return workflow, command, script + + def _run_workflow_guard(self, root, base): + _, command, script = self._workflow_guard() + environment = os.environ.copy() + environment["BASE_SHA"] = base + return subprocess.run( + command, + cwd=root, + env=environment, + input=script, + text=True, + capture_output=True, + check=False, + ) + def test_tampered_closure_byte_is_rejected_directly_and_by_loader(self): from validator import load_and_validate, verify_closure @@ -371,6 +405,77 @@ def test_workflow_hardens_actions_sources_and_freeze_boundary(self): workflow.index("Base has no Reactor A freeze"), ) + def test_workflow_guard_and_unittests_use_isolated_python(self): + workflow, command, _ = self._workflow_guard() + with tempfile.TemporaryDirectory(prefix="reactor-root-shadow-") as temporary: + root = Path(temporary) + package = self._copy_frozen_tree(root) + subprocess.run(["git", "init", "-q"], cwd=root, check=True) + subprocess.run( + ["git", "config", "user.name", "Reactor Test"], cwd=root, check=True + ) + subprocess.run( + ["git", "config", "user.email", "reactor@example.invalid"], + cwd=root, + check=True, + ) + subprocess.run(["git", "add", "."], cwd=root, check=True) + subprocess.run(["git", "commit", "-qm", "frozen base"], cwd=root, check=True) + base = subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=root, text=True + ).strip() + + evaluator = package / "evaluator.py" + evaluator.write_bytes(evaluator.read_bytes() + b"# repinned edit\n") + closure_file = package / "closure.json" + closure = json.loads(closure_file.read_text(encoding="utf-8")) + closure["experiments/reactor_v0/evaluator.py"] = hashlib.sha256( + evaluator.read_bytes() + ).hexdigest() + closure_file.write_text( + json.dumps(closure, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + (root / "subprocess.py").write_text( + "PIPE = -1\n" + "DEVNULL = -3\n" + "class Result:\n" + " returncode = 128\n" + " stdout = b''\n" + "def run(*args, **kwargs):\n" + " return Result()\n", + encoding="utf-8", + ) + completed = self._run_workflow_guard(root, base) + self.assertNotEqual( + completed.returncode, + 0, + completed.stdout + completed.stderr, + ) + self.assertIn("-I", command) + self.assertIn( + "python3 -I -B -m unittest discover -s experiments/reactor_v0", + workflow, + ) + self.assertIn( + "python3 -I -B -O -m unittest discover -s experiments/reactor_v0", + workflow, + ) + + def test_workflow_guard_fails_closed_for_invalid_base(self): + workflow, _, _ = self._workflow_guard() + with tempfile.TemporaryDirectory(prefix="reactor-invalid-base-") as temporary: + root = Path(temporary) + self._copy_frozen_tree(root) + subprocess.run(["git", "init", "-q"], cwd=root, check=True) + completed = self._run_workflow_guard(root, "0" * 40) + self.assertNotEqual( + completed.returncode, + 0, + completed.stdout + completed.stderr, + ) + self.assertIn('["git", "cat-file", "-e", base + "^{commit}"]', workflow) + self.assertIn('["git", "ls-tree", "-z", base, "--", closure_path]', workflow) + if __name__ == "__main__": unittest.main() From 22bbffb99f6fa0280ce6f90e1bfd8b5c12250384 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 21:00:55 -0500 Subject: [PATCH 32/37] Give complete serial navigation suites a measured finite job budget Change only Navigation's outer timeout from 10 to 15 minutes. Preserve both full discovery modes, positive-count guards, checks, action pins, triggers, permissions and original-result retention. Two required runs exhausted 600 seconds. Original scoped profile38836910226 completes all832 optimized methods in505.669s; earlier normal210.162s is a different attempt. Their715.831s sum informs capacity, not an observed combined runtime. Required current-head CI still must pass; the diagnostic supplies no merge or science clearance. Scientific effect: NONE. --- .github/workflows/navigation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/navigation.yml b/.github/workflows/navigation.yml index 586d2a722..c4e157293 100644 --- a/.github/workflows/navigation.yml +++ b/.github/workflows/navigation.yml @@ -10,7 +10,7 @@ permissions: jobs: navigation: runs-on: ubuntu-latest - timeout-minutes: 10 + timeout-minutes: 15 steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 From c60c1cc9ddc208b9f1c178e8c2366594f37a3b41 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Thu, 15 Oct 2026 21:56:52 -0500 Subject: [PATCH 33/37] docs: enforce source verification in Reactor A run --- experiments/reactor_v0/README.md | 15 ++++++- experiments/reactor_v0/closure.json | 4 +- experiments/reactor_v0/test_reactor_v0.py | 51 +++++++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/experiments/reactor_v0/README.md b/experiments/reactor_v0/README.md index 184ab0c56..74f199ec3 100644 --- a/experiments/reactor_v0/README.md +++ b/experiments/reactor_v0/README.md @@ -29,14 +29,25 @@ and path-scoped workflow by raw SHA-256; it intentionally cannot hash itself. Run the complete frozen controls from the repository root: ```sh -python3 -B -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v -python3 -B -O -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v +git fetch --no-tags --depth=1 origin \ + 88ff9223e57bf38c7fc33cb3559a88793a7b5087 \ + 6bd133d591e43e75a9292463bb4bfde7a34984dc +export REACTOR_VERIFY_SOURCES=1 + +python3 -I -B -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v +python3 -I -B -O -m unittest discover -s experiments/reactor_v0 -p 'test_*.py' -v python3 -B experiments/reactor_v0/mutation_harness.py python3 -B -O experiments/reactor_v0/mutation_harness.py python3 -B experiments/reactor_v0/run_control.py python3 -B -O experiments/reactor_v0/run_control.py ``` +The two fetched commits are exact, open parent-source identities. A missing +object, unavailable origin, or source length, raw SHA-256, or Git-blob mismatch +must stop this complete sequence; do not unset the selector to continue. Runs +without `REACTOR_VERIFY_SOURCES=1` are metadata/control utility runs, not the +complete source-verified control. + The workflow has read-only repository permissions, is triggered only by this directory or its own workflow file, and ends with a clean-worktree check so the run stage cannot silently edit the evaluator, tests, or any other tracked input. diff --git a/experiments/reactor_v0/closure.json b/experiments/reactor_v0/closure.json index bc3a9e582..a88c0fc73 100644 --- a/experiments/reactor_v0/closure.json +++ b/experiments/reactor_v0/closure.json @@ -1,6 +1,6 @@ { ".github/workflows/reactor-v0-controls.yml": "117da0c992e25b788acea640f1d621036e5beb07c8274ac29b5c0adf1e2cf3b0", - "experiments/reactor_v0/README.md": "cde3ed5286a254ea8d817ad1cd92c71e8d4ba58670046e67fa4eb5df4f9bb474", + "experiments/reactor_v0/README.md": "b78a30ccdaa52a00a1dd62599ee06899cfddf87b7081f3a06dce40722ae0bc85", "experiments/reactor_v0/control.json": "ad7066c7f8b7073edb5da910250f714f969bae2e164646a4c8c7cecffa9b43a1", "experiments/reactor_v0/evaluator.py": "92fe4dd24be870c1651b59a2e9f2a110a8b008d99f6c601efb60e11a6922c5dd", "experiments/reactor_v0/exact_helpers.py": "2569978f248a28b3754dad8d6ba4d80b47febf338a7db925f17f53723145cb61", @@ -8,6 +8,6 @@ "experiments/reactor_v0/mutation_harness.py": "ea74ee40a6ace0b6ee5152e67876be4841c2643a0646a658ab7d6758f441e78e", "experiments/reactor_v0/run_control.py": "6af0e3ab778dbe980860fb4d7d78d83f00bd67844c882ad72876b94d050854e3", "experiments/reactor_v0/source_manifest.json": "86c55b140acc6cf8219915f16df995085eafd95c61c249a6cde29b73a83f9c8d", - "experiments/reactor_v0/test_reactor_v0.py": "ad1a581ae03703cc91debd027849c655503a9f6ea908e28b2bf69c860a26b702", + "experiments/reactor_v0/test_reactor_v0.py": "8beb2b19a3ce37175521113637923b3a9a925b14915ef1cb0bd5a8431ebb88b1", "experiments/reactor_v0/validator.py": "2d39c1bd844f49d43aa380443fa384f8e3a0aeb9df6173a3fcf9eeaeb150bef3" } diff --git a/experiments/reactor_v0/test_reactor_v0.py b/experiments/reactor_v0/test_reactor_v0.py index 1c5a0f04b..898bd2ad9 100644 --- a/experiments/reactor_v0/test_reactor_v0.py +++ b/experiments/reactor_v0/test_reactor_v0.py @@ -328,6 +328,57 @@ def _run_workflow_guard(self, root, base): check=False, ) + def test_documented_complete_run_verifies_sources_and_fails_closed_when_missing(self): + readme = (HERE / "README.md").read_text(encoding="utf-8") + complete = readme.split("```sh", 1)[1].split("```", 1)[0] + first_command = complete.index("python3 ") + fetch = "git fetch --no-tags --depth=1 origin" + selector = "export REACTOR_VERIFY_SOURCES=1" + self.assertIn(fetch, complete) + self.assertIn("88ff9223e57bf38c7fc33cb3559a88793a7b5087", complete) + self.assertIn("6bd133d591e43e75a9292463bb4bfde7a34984dc", complete) + self.assertIn(selector, complete) + self.assertLess(complete.index(fetch), first_command) + self.assertLess(complete.index(selector), first_command) + + with tempfile.TemporaryDirectory(prefix="reactor-missing-sources-") as temporary: + root = Path(temporary) + package = self._copy_frozen_tree(root) + subprocess.run(["git", "init", "-q"], cwd=root, check=True) + subprocess.run( + ["git", "config", "user.name", "Reactor Test"], cwd=root, check=True + ) + subprocess.run( + ["git", "config", "user.email", "reactor@example.invalid"], + cwd=root, + check=True, + ) + subprocess.run(["git", "add", "."], cwd=root, check=True) + subprocess.run(["git", "commit", "-qm", "frozen candidate"], cwd=root, check=True) + environment = os.environ.copy() + environment.pop("REACTOR_VERIFY_SOURCES", None) + name, value = selector.removeprefix("export ").split("=", 1) + environment[name] = value + for optimized in (False, True): + command = [sys.executable, "-B"] + if optimized: + command.append("-O") + command.append(str(package / "run_control.py")) + completed = subprocess.run( + command, + cwd=root, + env=environment, + text=True, + capture_output=True, + check=False, + ) + with self.subTest(optimized=optimized): + self.assertNotEqual(completed.returncode, 0, completed.stdout) + self.assertIn( + "git source-object verification failed", completed.stderr + ) + self.assertNotIn('"validated": true', completed.stdout) + def test_tampered_closure_byte_is_rejected_directly_and_by_loader(self): from validator import load_and_validate, verify_closure From a59ee3b65167e4cb0a717342023f43cddce41f5c Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Fri, 16 Oct 2026 07:29:01 -0500 Subject: [PATCH 34/37] docs: link public-math folder index from public mathematics guide --- docs/PUBLIC_MATHEMATICS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PUBLIC_MATHEMATICS.md b/docs/PUBLIC_MATHEMATICS.md index bb56823d2..b16a4e1c3 100644 --- a/docs/PUBLIC_MATHEMATICS.md +++ b/docs/PUBLIC_MATHEMATICS.md @@ -42,7 +42,7 @@ The [original P15-B localization proof](https://github.com/d6g8k5htny-coder/main The catalog contains **2,138 public files**: 54 from Math at `1e1114f5eb8ef8cdbcde591bf74126274c250f88` and 2,084 from the main research branch at `7caac254cbba5f513b2dc0afb56b78a598bc0c93`. Each entry binds a full public file by commit, path, byte count, Git blob, and SHA-256. The same mathematical text may have several retained historical versions; this count is files, not distinct theorems. -Coverage is explicit: all `.md`, `.txt`, `.tex`, `.pdf`, `.ipynb`, and `.lean` files in the declared mathematical source roots, including legacy proof/review reading copies. The [machine-readable inventory](public-math/sources.json) records the exact selection rules. Private, personal, vault, and quarantine material is outside this catalog. Research governance and operational context within the declared public source roots is retained alongside the mathematical texts. Code and binary replay packages remain available through the linked full research trees. This is not an assertion that every Drive item or every historical branch has been recovered. +Coverage is explicit: all `.md`, `.txt`, `.tex`, `.pdf`, `.ipynb`, and `.lean` files in the declared mathematical source roots, including legacy proof/review reading copies. The [machine-readable inventory](public-math/sources.json) (folder index: [public source catalog](public-math/README.md)) records the exact selection rules. Private, personal, vault, and quarantine material is outside this catalog. Research governance and operational context within the declared public source roots is retained alongside the mathematical texts. Code and binary replay packages remain available through the linked full research trees. This is not an assertion that every Drive item or every historical branch has been recovered. | Inventory page | Files | First source | Last source | |---|---:|---|---| From c4c76cf25e3d4d1883e8422c9570de9754026e3f Mon Sep 17 00:00:00 2001 From: Grok Bot agent 11 Date: Fri, 16 Oct 2026 11:35:22 -0500 Subject: [PATCH 35/37] docs: R44-D stale-pointer fixes (R43-B rows 4,6-10) --- docs/FORMAL_VERIFICATION.md | 2 +- docs/PUBLIC_MATHEMATICS.md | 2 +- docs/agents/LEAN_AUDIT_OWNER.md | 8 ++++---- docs/agents/UI_UX_OWNER.md | 2 +- governance/OP-ACCESS-20261007.md | 1 + 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/docs/FORMAL_VERIFICATION.md b/docs/FORMAL_VERIFICATION.md index c199439ad..19c959454 100644 --- a/docs/FORMAL_VERIFICATION.md +++ b/docs/FORMAL_VERIFICATION.md @@ -53,7 +53,7 @@ The controls include false fold and power inequalities, a `sorry` proof, an indi ## Historical standing instructions (September 2026 pilot) -The following offer table is retained as the September pilot record. It is not the current claim route. Current claim route: the relevant current formal pull request or work discussion, with tasks and claims on main#275 and coordination on main#307. Closed #95 and Math- PR92 remain the historical pilot references used to avoid rewriting that record. +The following offer table is retained as the September pilot record. It is not the current claim route. Current claim route: the relevant current formal pull request or work discussion, with tasks and claims on main#275 and coordination on main#419 (successor to main#307). Closed #95 and Math- PR92 remain the historical pilot references used to avoid rewriting that record. Use #95 and PR92 to claim work and avoid duplicate writers. The OpenAI implementation author does not supply independent review credit. Read the exact head before reviewing; changed source, scope or dependencies invalidate the prior alignment record. diff --git a/docs/PUBLIC_MATHEMATICS.md b/docs/PUBLIC_MATHEMATICS.md index b16a4e1c3..46374a25e 100644 --- a/docs/PUBLIC_MATHEMATICS.md +++ b/docs/PUBLIC_MATHEMATICS.md @@ -72,7 +72,7 @@ Coverage is explicit: all `.md`, `.txt`, `.tex`, `.pdf`, `.ipynb`, and `.lean` f - Fixed-remote and moving-cutoff witness pairs: the [fixed-remote collision source](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/frontiers/remote_collision_20260928/PROOF.md) and [off-pin second-moment review](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/reviews/d5_offpin_second_moment_20260928/REVIEW.md) supply the scoped `O(r^5)` window factorial estimate. The [planar moving-cutoff successor](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/frontiers/moving_remote_collision_20261003/README.md) gives the source-conditional `C r^5 rho^(-98) |E|` bound with both witnesses outside the pin ball, fixed torus, compact positive gaps, all frames and the between-pin window. Mixed inner/outer pairs, elder or barcode identification, small-gap uniformity and higher dimensions are outside that successor's scope. - Shrinking witness collisions and register execution: **reviewed source results are available; register reconciliation and execution remain separate**. The [count-level discharge](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/reviews/c6_witness_collision_reconciliation_20260929/RECONCILIATION.md) ([merged Math #160](https://github.com/d6g8k5htny-coder/Math-/pull/160)) and [leading-mass localization record](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/reviews/c6_residual_closure_20260930/RECONCILIATION.md) ([merged Math #173](https://github.com/d6g8k5htny-coder/Math-/pull/173)) retain their source-conditional fixed-dimension, fixed-torus, compact-mark window scopes and review exposure. Their declarative records do not execute the register transitions: `math.rn-region.witness-collision` is still `OPEN_ACTIVE` in the [checked graph](https://github.com/d6g8k5htny-coder/Math-/blob/79cb314d5b9f6b8b410bfd0df200414314f6b8c7/frontiers/downstream_gate_20260925/GRAPH.json). No register node is closed by this reading route. -Use [current coordination, main #307](https://github.com/d6g8k5htny-coder/main/issues/307), and [tasks and claims, main #275](https://github.com/d6g8k5htny-coder/main/issues/275), for work assignments. The [closed downstream discussion, main #86](https://github.com/d6g8k5htny-coder/main/issues/86), remains an evidence trail. +Use [current coordination, main #419](https://github.com/d6g8k5htny-coder/main/issues/419) (successor to [#307](https://github.com/d6g8k5htny-coder/main/issues/307)), and [tasks and claims, main #275](https://github.com/d6g8k5htny-coder/main/issues/275), for work assignments. The [closed downstream discussion, main #86](https://github.com/d6g8k5htny-coder/main/issues/86), remains an evidence trail. New work appears first on public branches and pull requests: [main proposals](https://github.com/d6g8k5htny-coder/main/pulls) and [Math proposals](https://github.com/d6g8k5htny-coder/Math-/pulls). The frozen inventory does not imply that these newer sources are absent. Future integrations should add full-text links and preserve superseded proofs, errata, and reviews. diff --git a/docs/agents/LEAN_AUDIT_OWNER.md b/docs/agents/LEAN_AUDIT_OWNER.md index 981b505f8..9ebda3f85 100644 --- a/docs/agents/LEAN_AUDIT_OWNER.md +++ b/docs/agents/LEAN_AUDIT_OWNER.md @@ -39,16 +39,16 @@ branches. The new auditor does not acquire Claude's or Sol's writer/integrator claims merely by accepting this role. Before any branch mutation, reconcile live claims and obtain a scoped handoff, release, or confirmed lease expiry followed by fresh refs and results. Record a precise bounded claim in the relevant PR or -active [Agent Message Board, main #307](https://github.com/d6g8k5htny-coder/main/issues/307). +active [Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419). The auditor can review disjoint scope without changing the writer's branch. If it amends a proof, it becomes a contributor to that proof and cannot supply its own nonauthor acceptance. UI/navigation, scientific registers, prizes, `lemma_closed`, controlling graph verdicts and the active C127 research lane are outside this role's write scope. Current coordination is kept on the active -[Agent Message Board, main #307](https://github.com/d6g8k5htny-coder/main/issues/307), -while the historical [main #229](https://github.com/d6g8k5htny-coder/main/issues/229) -remains preserved as the archival issue record. +[Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419), while [main #307](https://github.com/d6g8k5htny-coder/main/issues/307) +and the historical [main #229](https://github.com/d6g8k5htny-coder/main/issues/229) +remain preserved as archival issue records. ## Snapshot and evidence vocabulary diff --git a/docs/agents/UI_UX_OWNER.md b/docs/agents/UI_UX_OWNER.md index d40852345..5b807d36c 100644 --- a/docs/agents/UI_UX_OWNER.md +++ b/docs/agents/UI_UX_OWNER.md @@ -70,7 +70,7 @@ The dedicated agent coordinates public-site authored HTML/CSS/modules and applic Coordinate Home/Research navigation and index content with `next_ui_triage` / session `01a0efe9`, retaining its source/dependency scopes. The [C124 claim5974918396](https://github.com/d6g8k5htny-coder/main/issues/229#issuecomment-5974918396) and its completed release establish the current completed navigation slice only. The [retained Library/equation coordination5971960564](https://github.com/d6g8k5htny-coder/main/pull/247#issuecomment-5971960564) is not transferred by this UI role; any later pickup needs fresh native reconciliation and concrete handoff. The historical unidentified C114/WE701 closeout is separate: do not fabricate identity continuity, infer another lane's release or renew the expired claim. -Before every write, read live branch refs, current claims, delivered artifacts and pending results in the relevant existing PR or the active [Agent Message Board, main #307](https://github.com/d6g8k5htny-coder/main/issues/307). Claim only precise paths, immutable inputs, intended branch/integration owner and a finite lease (normally 120 minutes); link an R17 claim only when that task uses R17. Reconcile confirmed lease expiry against fresh execution/results. An assignment, silence or stale ledger is not an acknowledgment or completed review. Competing mutations stop the affected write for reconciliation. Use isolated branches and non-force updates; the named integration owner refreshes, reviews readiness and merges under a fresh expected-head guard. Release the completed scope through the existing coordination record, without creating another global ownership register. +Before every write, read live branch refs, current claims, delivered artifacts and pending results in the relevant existing PR or the active [Agent Message Board, main #419](https://github.com/d6g8k5htny-coder/main/issues/419). Claim only precise paths, immutable inputs, intended branch/integration owner and a finite lease (normally 120 minutes); link an R17 claim only when that task uses R17. Reconcile confirmed lease expiry against fresh execution/results. An assignment, silence or stale ledger is not an acknowledgment or completed review. Competing mutations stop the affected write for reconciliation. Use isolated branches and non-force updates; the named integration owner refreshes, reviews readiness and merges under a fresh expected-head guard. Release the completed scope through the existing coordination record, without creating another global ownership register. Scientific source/proof bodies, graph/status classifications, inventory/equation payloads, acceptance flags and Lean proof/alignment work are outside this handoff's write scope. A UI worker may identify discrepancies and offer exact source-bound findings to the owner of those surfaces. diff --git a/governance/OP-ACCESS-20261007.md b/governance/OP-ACCESS-20261007.md index be8cc9ad6..143b1d4db 100644 --- a/governance/OP-ACCESS-20261007.md +++ b/governance/OP-ACCESS-20261007.md @@ -281,6 +281,7 @@ each item below carries its own date and scope. board continues as [main#307](https://github.com/d6g8k5htny-coder/main/issues/307). Where owner actions 1 and 2 above say "report on main#229" or "reply on main#229", read main#307. + Since 15 October the board continues as [main#419](https://github.com/d6g8k5htny-coder/main/issues/419); read main#419 where this record says main#229 or main#307. - **Claude lane, a second observation.** A different Claude Code session (`017Mi3…`), activated by the coordinator as successor custodian for the thread and body tasks of #282 From 0b49b4e6da83987356fcefeeadb9c319db1a78cb Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 16 Oct 2026 18:34:04 +0000 Subject: [PATCH 36/37] docs(governance): OP-WORKFLOW overlap check and Ready check per dot ask 3 (main#419) Co-authored-by: Dylan Roy --- governance/OP-WORKFLOW-20260930.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/governance/OP-WORKFLOW-20260930.md b/governance/OP-WORKFLOW-20260930.md index 9c433f415..ff423599a 100644 --- a/governance/OP-WORKFLOW-20260930.md +++ b/governance/OP-WORKFLOW-20260930.md @@ -141,6 +141,15 @@ this shape. Closed [main #95](https://github.com/d6g8k5htny-coder/main/issues/95 is formal-rollout history; current work stays in its relevant PR. Neither issue closure nor an outdated review thread resolves an outstanding obligation. +At source pickup, run a complete by-path contender check of the paths you will +touch against open pull requests; shared generated files and consumed +dependencies count as overlap. Before any mutation, revalidate changed or new +pull request heads. An exact-head, complete, paginated inventory may be reused, +refreshing only changed entries and pull requests merged since the candidate +base; a full repository recrawl is not required before every small docs edit. +Link a compact overlap record from the pull request instead of copying a long +list. Unresolved ownership still stops the affected write. + This is cooperative coordination. It does not install a distributed lock or claim that every agent has acknowledged a notice. A competing mutation stops the affected update and requires reconciliation, not a second competing write. @@ -223,6 +232,15 @@ to finish and reconcile its findings before merging; an earlier automatic review of the same head does not replace it. If it cannot finish, say so on the pull request and settle the next step there instead of merging past it. +Where `public-intake` is required, verify its actual trusted workflow and event +identity and its current head, as CONTRIBUTING requires, as well as its +success. A check name and head alone cannot establish the Ready-event binding. +On an ordinary pending-required-check 405, re-read current refs, ownership, and +protection and check state. One retry at the same expected head is appropriate +only after the missing requirement has actually succeeded and no other stop +applies. This does not waive the separate Ready-triggered review, approve +security changes, or authorize retrying platform denials. + Follow [the required formal checks](../docs/FORMAL_REQUIRED_CHECKS.md) and [release operations](../docs/RELEASE_OPERATIONS.md). A base change can change the tested merge; old CI is not rebound to it. Missing, skipped or failed checks From 179712bdd9a784bd6d6795429c7ddf3684ce6992 Mon Sep 17 00:00:00 2001 From: Dylan Roy <249851642+d6g8k5htny-coder@users.noreply.github.com> Date: Sat, 17 Oct 2026 18:02:59 -0500 Subject: [PATCH 37/37] Register the fixed native reader admission workflow Bind the manual caller to the reviewed immutable reader runner, candidate and external admission data. Ordinary current-Main checks remain required; fixed-control execution requires its separate exact runtime admission. --- .../workflows/canvas-reader-native-admission.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/workflows/canvas-reader-native-admission.yml diff --git a/.github/workflows/canvas-reader-native-admission.yml b/.github/workflows/canvas-reader-native-admission.yml new file mode 100644 index 000000000..f4811ee26 --- /dev/null +++ b/.github/workflows/canvas-reader-native-admission.yml @@ -0,0 +1,13 @@ +name: Admit fixed native reader controls +'on': + workflow_dispatch: +permissions: + contents: read +jobs: + reader: + uses: d6g8k5htny-coder/main/.github/workflows/architecture-canvas-tests.yml@c5e64bb61a5c0f49d08e0255a6a07a22a2326e17 + with: + candidate_commit: c5e64bb61a5c0f49d08e0255a6a07a22a2326e17 + runner_commit: c5e64bb61a5c0f49d08e0255a6a07a22a2326e17 + admission_commit: 73d00f71634712e91c951f14e490b816e84bf657 + admission_sha256: c9e332696b81754121c5605b1f679159b738916a20798ee7009a7bc220c3ede4